Календарь / Алгоритм планирования


24

Я столкнулся с проблемой, я не уверен, как подойти. Я должен создать календарь для сотрудников, каждый из которых имеет определенные ограничения работы (некоторые личные, некоторые общие)

С чем я работаю:

  • У меня есть врачи
  • Каждый врач должен работать 5 дней в неделю.
  • Каждый врач должен работать 1 ночь / неделю
  • Каждый врач должен работать равное количество ночей по сравнению с другими врачами (или как можно ближе)
  • Каждый врач должен работать в равных количествах по четвергам и воскресеньям по сравнению с другими врачами (или как можно ближе)
  • Некоторые врачи не могут работать определенные дни / ночи (ввод пользователя)
  • Некоторые врачи хотели бы работать определенные дни / ночи (ввод пользователя)
  • Некоторые врачи хотели бы не работать определенные дни / ночи (ввод пользователя)

Рассматриваемый пользователь - человек, имеющий дело с календарем, я пытаюсь создать решение, которое будет автоматически генерировать календарь, который подчиняется всем ограничениям. Решением является большой ввод настроек «добавить врачей» и «добавить ограничения» для каждого доктора, а затем кнопка «создать календарь». Это действительно просто для пользователя.

Моя проблема :

Я не уверен, как сгенерировать фактическое планирование, я читал о нейронных сетях, генетических алгоритмах и так далее, и все они кажутся своего рода правильным решением, но тоже не совсем.

Когда я смотрю на GA, они призваны найти решение с заданной совокупностью (моя проблема), но исходная совокупность уже должна соответствовать заданному набору ограничений, которые затем будут оптимизированы. В этом случае мое начальное население уже является решением. Мне не нужно, чтобы это было "оптимизировано". Неважно, что один человек работает 3 ночи понедельника подряд, если это действительно правильно и что другие работают одинаково, это означает, что другие тоже будут работать 3 ночи понедельника, и это нормально. Это заставляет меня думать, что GA слишком «продвинуты» для меня, так как моя проблема уже решена с начальной точки GA.

Но опять же, GA действительно выглядит так, как будто они созданы для этого, так что я могу неправильно это понять?

В любом случае, поскольку я никогда не использовал ГА (или нейронные сети, или что-то в этом роде), я бы хотел быть уверенным, что я выберу правильный подход, прежде чем приступать к такой кривой обучения.

Мой вопрос :

Как вы думаете, какой подход / алгоритм / метод подходит для такой проблемы, как моя? GA-х? Нейронные сети? Что-то еще совершенно другое?

Я все уши и открыты для более подробной информации, если это необходимо, но я думаю, что я ясно дал себе понять :)


22
Вероятно, стоит взглянуть на литературу по проблеме составления списков медсестер en.wikipedia.org/wiki/Nurse_scheduling_problem
Рено М.

Такой удобный термин! Хе-хе, спасибо за вашу ссылку;)
Гил Сэнд

8
Я не эксперт в этой области, однако, если вы ищете подход, который позволит вам сэкономить время на разработке, возможно, стоит попытаться смоделировать проблему как проблему смешанного целочисленного программирования ( en.wikipedia. org / wiki / Linear_programming # Integer_unknowns ), а затем введите его в решатель MIP или как задачу программирования ограничений, а затем введите его в решатель CP, такой как OR-tools ( developers.google.com/optimization ). Таким образом, все, что вам нужно сделать, это выразить свою проблему.
Рено М.

3
Линейное программирование гарантирует получение оптимального решения!
recursion.ninja

2
@RenaudM. Обидно, что немногие профессиональные программисты понимают эту удивительно полезную область математики. Всякий раз, когда кто-то предлагает имитировать отжиг или генетические алгоритмы вне поля ИИ, у меня есть интуитивный ответ: Вероятно, его можно лучше смоделировать как оптимизацию линейной программы
recursion.ninja

Ответы:


14

Генетические алгоритмы и нейронные сети здесь не подходят. Это метаэвристика для нахождения достаточно хорошего, приблизительного решения проблемы. В частности, оба требуют, чтобы вы нашли функцию стоимости, чтобы оценить возможные решения. Если у вас есть такая функция стоимости, может быть проще вручную придумать алгоритм, который оптимизирует эту стоимость.

Это важная мысль: учитывая два графика, нам нужен способ решить, является ли график A или график B «лучше». Вы перечислили различные критерии, но не ясно, как они соотносятся. Несоблюдение одного критерия приводит к провалу всего решения? Или частичное нарушение ограничения просто делает его худшим решением, чем другие?

На самом базовом уровне вы можете просто разделить неделю на отдельные временные интервалы и перебрать все комбинации слот-доктор. Однако вы можете использовать жесткие ограничения, чтобы уменьшить это пространство поиска до более управляемого размера. Ограничения на рабочее время и ночные смены, кажется, подходят для такого ограничения пространства поиска. Затем у вас остаются сотни возможных решений.

Чтобы выбрать лучший вариант решения, вам нужно их ранжировать. Это довольно легко, если одно мягкое ограничение имеет явный приоритет над всеми другими мягкими ограничениями, например, если врач не может работать в определенную смену, это имеет большее значение, чем врач, не желающий работать в эту смену. Но я не могу решить эти правила для вас - это управленческое решение. Сложнее, если два мягких ограничения не имеют четкого приоритета, и в этом случае вам придется придумать какую-то функцию стоимости, которая объединяет важность двух ограничений в одной метрике.


Я бы, вероятно, построил жадный алгоритм, который заполняет пустую таблицу в соответствии с некоторыми приоритетными критериями. Возможно, это не самое оптимальное решение, но это намного проще, чем философствовать о том, что на самом деле означает «оптимальный».

В качестве первого шага вы могли бы заполнить ночные смены по выходным и попытаться выбрать тех врачей, которые не выполняли ночные смены в выходные дни дольше, также принимая во внимание пожелания пользователя «Я не могу работать там» , Если предположить, что эти пожелания являются недельными и непостоянными, это означает, что на следующей неделе будет выбран врач, который не может работать в выходные дни в течение одной недели.

Аналогичную процедуру можно использовать и для других ночей: после попытки учесть пожелания пользователей вы назначаете врачей в соответствии с тем, кто не выполнял ночные смены в течение длительного времени. Процедура повторяется аналогично для временного интервала третьего типа, дня смены. Если два пожелания пользователя не могут быть согласованы, вы можете отслеживать частоту удовлетворения пожеланий пользователей, а затем расставлять приоритеты у врача с меньшим количеством удовлетворенных пожеланий.

К сожалению, я вижу несколько способов обыграть эту систему: например, если доктор будет выбран для работы в ночную смену выходного дня, но введет запрос «не может работать там», их выбор будет отложен на одну неделю, что сократит Частота выходных ночных смен за счет своих коллег. Если реализована процедура разрешения желаний, которая учитывает количество отклоненных запросов, пользователь может добавить пару невозможных запросов, чтобы увеличить один запрос, который он хочет выполнить. Однако, при условии добросовестности (и гибкости, которую врачи могут менять между собой), такой алгоритм должен привести к достаточно хорошему решению.


Спасибо за ваш ответ, я немного подробнее расскажу об этом со своим коллегой :) Чтобы дать вам больше информации: да, мы можем ранжировать большинство решений / критериев, и мы можем решить, имеют ли некоторые приоритет над другими. Кроме того, они действительно работают над добросовестностью сейчас, и это работает хорошо. Они делают это вручную и не слишком часто используют слово «я не могу работать на день». Очень хорошо, как они теперь работают, потому что они действительно делают это вручную . Таким образом, «жизнеспособное» решение уже будет означать для них мир, и сэкономит им МНОГО времени для мозгового штурма, кто может работать, когда
Гил Сэнд

5
@ Зил, люди, которые в настоящее время создают графики, вероятно, уже используют неформальный алгоритм. Вы можете просто поговорить с ними и попытаться понять их процесс принятия решений, а затем формализовать и реализовать это. Это было бы намного проще, чем настройка и обучение нейронной сети.
Амон

Это наш первый шаг: у нас встреча с ними уже настроена! Спасибо за всю вашу помощь :)
Гил Сэнд

3
Для этого варианта использования, генетические алгоритмы неизменно уступают Табу Поиску и Имитационному отжигу, что доказано исследовательскими конкурсами International Nurs Rostering Competitions. (Но, конечно, они все же лучше, чем просто жадный алгоритм.)
Джеффри Де Смет

12

Вы можете использовать имитацию отжига .

Я сделал что-то подобное до того, как получил свою первую работу - см. Https://vimeo.com/20610875 (демонстрация начинается с 2:50, алгоритм объяснен с 6:15).

Имитация отжига - это разновидность генетического алгоритма, и, возможно, он не подходил теоретически (как утверждает @amon в своем ответе ), но на практике он работал очень хорошо, и это был примерно тот же вариант использования, что и у вас.

Исходный код доступен (C #), но, несмотря на то, что он работает, я боюсь, что это ужасно, это было несколько лет назад и, будучи автодидактом, я ничего не знал о возможности сопровождения. Это дало очень хорошие результаты, хотя.

Как это работает в двух словах:

  • Создайте 1 возможное (это может быть не очень хорошее, но физически возможное) расписание в качестве отправной точки. Генетический алгоритм не нужен на этом этапе - вы можете просто найти свой путь к первому решению, которое сможете найти. Я использовал возврат . Вычислительную сложность можно преодолеть, решая ротацию для каждого дня отдельно. Если решения вообще не существует (в зависимости от обстоятельств), именно в этот момент вы его обнаруживаете.

  • Создайте пул решений - скажем, 100 копий этого решения начального уровня для начала.

  • Изменяйте каждое решение случайным образом: попросите врачей поменять местами смены, выньте случайного врача из своей смены, добавьте случайного человека и т. Д.

  • Оцените каждое решение с помощью фитнес-функции, которая определяет, насколько она хороша. Один парень работает больше ночей, чем другой? Вычтите штрафные очки. Кто-то хотел сделать понедельник, но они этого не делают? Вычтите штрафные очки снова.

  • Возьмите, скажем, 20 лучших решений и скопируйте каждое из них 5 раз, переписав оставшиеся 80 с ними, перенеся их в следующее поколение. Выживание сильнейшего.

  • Промыть и повторить.

Числа, очевидно, являются произвольными, возможно, вам придется поиграться с параметрами, чтобы найти оптимальные настройки для вашего сценария.

Что касается мутации решения, имитируемый отжиг вводит то, что называется температурой. По сути, это означает, что в начале вы должны довольно сильно мутировать свои решения (скажем, всегда делать 10 попыток обмена сменами за один раз) и постепенно становиться менее агрессивными с последующими итерациями, чтобы они стали более точными (скажем, вниз). только 2 попытки настройки на поколение).


4
Я использовал OptaPlanner (урожденный Drools Planner) с имитацией отжига для расписания колледжа. Объявите модели - у смены есть время и доктор. Напишите декларативные правила для функции пригодности - жесткие ограничения (Доктор не может принимать перекрывающиеся смены) и штрафы (Энн ненавидит понедельники). Напишите декларативные (вот и все!) Свопы смен. OptaPlanner создаст начальное состояние случайным образом (может быть невозможным), вычислит функцию пригодности по правилам и даже выполнит обмены в соответствии с алгоритмом оптимизации. Вы можете выбрать и настроить параметры, такие как график отжига.
Джесвин Хосе

6

Генетические Алгоритмы применяются здесь. Во время моей программы бакалавриата один из моих коллег написал статью по очень похожей вашей проблеме.

Вы можете искать Планирование работы магазина, а также Планирование работы магазина или Планирование работы магазина, которые могут быть интересными отправными точками.

Чтобы использовать генетический алгоритм, вам не нужно идеальное решение, вы можете начать с N случайных кандидатов и применить фитнес-функцию к каждому из них, например:

  • Разница в количестве ночей между самым занятым врачом и менее занятым работником является штрафом в функции стоимости
  • Каждый раз, когда врач работает более 5 дней в неделю или 1 ночь в неделю, вы применяете штраф
  • Каждое из ваших ограничений и т.д ...

Генерируя N кандидатов, вы выберете X лучших из них , они будут теми, кто наложит ограничения, тем меньше. Работая с ними, скрещивая и мутируя на протяжении нескольких поколений, можно получить хорошее решение.

Обсудив все это, каждый раз, когда я использовал Генетический алгоритм, который больше полагался на мутации, чем на скрещивание, я мог разработать имитационный отжиг, который будет работать намного лучше, с более легкой реализацией. Цена / пригодность и функция мутации для генетического алгоритма, вероятно, будут очень похожи на те, которые используются в имитации отжига. Я бы начал там, посмотрите на @Konrad Morawski ответ

Поиск Google находит хорошие результаты для Job Shop и GA

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.