Calculadora de cambio
Dado un conjunto de entidades con restricciones, calcule un cronograma de cambios para ellos que respeta al máximo esas restricciones.
Uso
Asegúrese de que su computadora tenga instalado Python ejecutando python --version
en la línea de comandos.
Si no es así, puede descargar Python aquí: https://www.python.org/downloads
Al instalar Python:
- Windows puede intentar que instale Python desde la App Store, debe ignorar esto e instalar desde python.org, ya que de lo contrario no puede personalizar la instalación. Debe poder personalizar la instalación para que pueda:
- ¡Marque la casilla para agregarla a la ruta! Esto permitirá que su terminal de línea de comando encuentre Python al intentar ejecutar el programa.
Para ejecutar el programa:
- Descargue el archivo
calculateShifts.py
de las versiones (también puede encontrar sampleEntities.csv
útil). - Navegue a la carpeta que contiene
calculateShifts.py
- Haga clic en "Archivo" en la parte superior izquierda y "Abra en Windows PowerShell".
- Escriba su comando. (Vea abajo.)
Este programa se ejecuta desde la línea de comandos. Toma un archivo de entrada y registra el cronograma generado en un archivo de salida. Se requieren los siguientes argumentos:
- Entidades Nombre de archivo (por ejemplo, foo.csv): este es su archivo de entrada, consulte los requisitos a continuación para ver cómo debería ser.
- Fecha de inicio (aaa yyy-mm-dd)
- Número de semanas
- Días con turnos, usando nombres de día en minúsculas y acortados separados con semicolones (por ejemplo, viernes; sat; sol)
- Número mínimo de días entre turnos
Por ejemplo:
python calculateShifts.py sampleEntities.csv 2021-08-01 10 "fri;sat;sun" 6
Requisitos de archivo de entidades
El archivo de entidades debe ser un archivo de valores separados por comas (CSV) con las siguientes columnas:
- Nombre
- Grupo: actualmente no utiliza el programa, pero se incluirá en la salida en caso de que desee ver cómo se distribuyen los diferentes grupos en el cronograma.
- Días no disponibles: especifique qué días de la semana esta entidad no está disponible utilizando nombres de día en minúsculas y acortados separados con semicolones (por ejemplo, viernes; sat; sol).
Ver sampleentities.csv para un ejemplo!
Producción
El programa emitirá un archivo output.csv con las siguientes columnas:
- Fecha
- Día de la semana
- Grupo
- Nombre
El cronograma intentará minimizar las violaciones de restricciones, pero dado que estas limitaciones pueden entrar en conflicto, el horario no será perfecto. Recomendamos permitir sustituciones si usa este horario directamente.
Además, el programa imprimirá alguna salida de depuración en la consola. Para cada entidad, compartirá el nunmber de veces que sus limitaciones se vieron comprometidas y la distribución de sus cambios en los diferentes días.
Plan de implementación
A continuación se presentan algunos detalles sobre cómo funciona el programa, si está interesado.
Restricciones
Este programa no garantiza que todas las restricciones se cumplan perfectamente, ya que eso requeriría que las entradas sean completamente no contradictorias. En cambio, prioriza los tipos proporcionados de restricciones e intentos de minimizar y distribuir uniformemente violaciones de esas limitaciones en las entidades programadas.
En orden de prioridad:
- Días no disponibles: una entidad nunca debe programarse durante un día en que no esté disponible.
- Distribución de turnos: asegúrese de que todas las entidades tengan un número aproximadamente igual de turnos durante todo el período.
- Número mínimo de días entre turnos: intente respetar la cantidad mínima de tiempo entre los turnos.
- Distribución del día: trate de asegurarse de que cada entidad tenga cambios en una variedad de días que estén disponibles.
Pseudocódigo
- Genere la lista de todos los cambios.
- Inicialmente, clasifique las entidades de la mayoría de las restricciones de día menos.
- Para cada entidad que no está "hecho":
- Busque el próximo cambio ideal.
- Si está desocupado, tómalo.
- Si está ocupado, relaje una restricción y busque un nuevo cambio ideal. Incrementa el conteo de compromiso de esta entidad en 1.
- Si estamos en la última restricción (días disponibles), omita esta entidad y marque como "hecho" en lugar de violar esa restricción.
- Compruebe si todavía hay turnos no asignados y entidades que no están "hechas".
- Si es así, clasifique las entidades por número de compromisos de la mayoría a menos, y luego vuelva a atravesarlas. Esto asegura que las entidades que se han comprometido más obtienen la primera ronda.
- Emitir el cronograma a salida.csv.
Estructuras de datos requeridas:
- Lista de turnos con fecha, día y entidad asignada
- Lista de entidades con nombre, grupo, días no disponibles, número de compromisos y marcador hecho