Сдвиг калькулятор
Учитывая набор сущностей с ограничениями, рассчитайте график смен для них, которые максимально уважают эти ограничения.
Использование
Убедитесь, что на вашем компьютере установлен Python, запустив python --version
в командной строке.
Если это не так, вы можете скачать Python здесь: https://www.python.org/downloads
При установке Python:
- Windows может попытаться установить Python из App Store, вы должны игнорировать это и установить с python.org, поскольку в противном случае вы не можете настроить установку. Вы должны иметь возможность настроить установку, чтобы вы могли:
- Установите флажок, чтобы добавить его в путь! Это позволит вашему терминалу командной строки найти Python при попытке запустить программу.
Чтобы запустить программу:
- Загрузите файл
calculateShifts.py
из выпусков (вы также можете найти sampleEntities.csv
полезным). - Перейдите к папке, содержащей
calculateShifts.py
- Нажмите «Файл» в левом верхнем углу и «Откройте в Windows PowerShell».
- Введите свою команду. (См. ниже.)
Эта программа запускается из командной строки. Он принимает входной файл и записывает сгенерированное расписание в выходном файле. Требуются следующие аргументы:
- Имя файла объектов (например, foo.csv) - это ваш входной файл, см. Приведенные ниже требования для того, как он должен выглядеть.
- Дата начала (yyyy-mm-dd)
- Количество недель
- Дни с сдвигами, используя строчные, сокращенные дни имена, разделенные полуколонами (например, Sat; Sun)
- Минимальное количество дней между смены
Например:
python calculateShifts.py sampleEntities.csv 2021-08-01 10 "fri;sat;sun" 6
Предприятия подают требования
Файл объектов должен быть файлом, разделенными запятыми значениями (CSV) со следующими столбцами:
- Имя
- Группа - в настоящее время не используется программой, но будет включена в вывод, если вы хотите увидеть, как различные группы распределены в расписании.
- Дни недоступны - укажите, в какие дни недели эта организация недоступна с использованием строчных, сокращенных дневных имен, разделенных с полуколонами (например, Sat; Sun).
См. SampleTentities.csv для примера!
Выход
Программа выведет файл output.csv со следующими столбцами:
- Дата
- День недели
- Группа
- Имя
График попытается минимизировать нарушения ограничения, но, поскольку эти ограничения могут вступить в конфликт, график не будет идеальным. Мы рекомендуем разрешить замены, если вы используете это расписание напрямую.
Кроме того, программа напечатает некоторые выводы отладки в консоли. Для каждой организации он будет делиться монастырями раз, когда их ограничения были скомпрометированы, и распределение их сдвигов в разные дни.
План реализации
Ниже приведены некоторые подробности о том, как работает программа, если вы заинтересованы.
Ограничения
Эта программа не гарантирует, что все ограничения идеально выполнены, так как это потребовало бы, чтобы входные данные были полностью неконтролируемыми. Вместо этого он отдает приоритет предоставленных типам ограничений и попыток минимизировать и равномерно распределять нарушения этих ограничений в запланированных объектах.
В порядке приоритета:
- Дни недоступны - организация никогда не должна быть запланирована на день, когда он недоступен.
- Распределение смены - убедитесь, что все сущности имеют примерно одинаковое количество сдвигов в течение всего периода.
- Минимальное количество дней между сдвигами - Попытка уважать минимальное количество времени между сдвигами.
- Дневное распределение - постарайтесь убедиться, что у каждого объекта есть сдвиги в разные дни, которые они доступны.
Псевдокод
- Создайте список всех смен.
- Первоначально сортируют сущности с наименее дневные ограничения.
- Для каждой сущности, которая не «сделана»:
- Ищите следующий идеальный сдвиг.
- Если это незанято, возьмите это.
- Если он занят, расслабьте ограничение и найдите новый идеальный сдвиг. Увеличьте компромисс этого объекта подсчетом на 1.
- Если мы находимся на последнем ограничении (доступны), пропустите эту сущность и отметьте его как «сделанное», а не нарушать это ограничение.
- Проверьте, есть ли еще смены, и сущности, которые не «сделаны».
- Если это так, сортируйте сущности по количеству компромиссов от большинства до наименьшего, а затем снова проберите их. Это гарантирует, что сущности, которые поставили под угрозу наибольшее количество выборов первого выбора каждый раунд.
- Вывод графика для вывода.csv.
Требуемые структуры данных:
- Список смен с датой, днем и назначенной сущностью
- Список объектов с именем, группой, дни недоступны, количество компромиссов и маркер выполненных