Я разрабатываю приложение, которое оптимально присваивает смены медсестрам в больнице. Я считаю, что это проблема linear programming с дискретными переменными и, следовательно, вероятно, NP-hard:
- В течение каждого дня каждой медсестре (примерно 15-20) присваивается сдвиг
- Существует небольшое число (около 6) разных сдвигов
- Существует значительное количество ограничений и критериев оптимизации, касающихся дня или относительно emplyoee, например:
- Каждый день должно быть минимальное количество людей, назначенных на каждую смену.
- Некоторые смены перекрываются, так что это нормально, если у кого-то меньше людей в начале смены, если кто-то делает промежуточный сдвиг
- Некоторые люди предпочитают раннюю смену, некоторые предпочитают позднюю смену, но минимум изменений сдвига требуется, чтобы получить более высокую зарплату смены.
- Не допускается, чтобы один человек работал с задержкой в один день и с ранней сменой на следующий день (из-за минимальных правил времени отдыха).
- Встреча с назначенными рабочими неделями (разные для разных людей)
- ...
Таким образом, в основном существует большое число (от 20 * 30 = 600) переменных, каждое из которых может принимать небольшое число дискретных значений.
В настоящее время я планирую использовать измененный алгоритм Min-conflict
- начать со случайных заданий
- имеют функцию фитнеса для каждого человека и каждый день
- выберите человека или день с наихудшим значением для фитнеса
- выберите случайное одно из назначений для этого дня/человека и установите его в значение, которое приведет к оптимальному значению пригодности
- повторяется до тех пор, пока не будет достигнуто максимальное количество итераций или не будет найдено улучшения для выбранного дня/человека
Любые лучшие идеи? Я несколько обеспокоен тем, что он застрянет в локальном оптимуме. Должен ли я использовать некоторую форму имитированный отжиг? Или учитывать не только изменения в одной переменной за раз, но, в частности, переключатели сдвигов между двумя людьми (основной компонент в текущем ручном алгоритме)? Я хочу избежать адаптации алгоритма к текущим ограничениям, поскольку они могут измениться.
Изменить: нет необходимости находить строго оптимальное решение; список в настоящее время выполнен вручную, и я уверен, что результат значительно неоптимальный в большинстве случаев - не должно быть трудно превзойти его. Краткосрочные корректировки и ручные переопределения также обязательно понадобятся, но я не считаю, что это будет проблемой; Пометка прошлых и ручных назначений как "фиксированная" должна фактически упростить задачу, уменьшив пространство решения.