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


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-інструменти ( developers.google.com/optimization ). Таким чином, все, що вам потрібно зробити, - це висловити свою проблему.
Рено М.

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

2
@RenaudM. Прикро, як мало хто з професійних програмістів розуміє цю дивовижно корисну галузь математики. Кожен раз, коли хтось пропонує моделювати відпал або генетичні алгоритми поза стороною ШІ, моя відповідь кишечника: Можливо, можна краще моделювати як лінійну оптимізацію програми
recursion.ninja

Відповіді:


14

Генетичні алгоритми та нейронні мережі тут не підходять. Вони є мета-евристикою для пошуку достатньо хорошого, приблизного рішення проблеми. Зокрема, обидва вимагають від вас знайти функцію витрат, щоб оцінити кандидатські рішення. Коли у вас є така функція витрат, може бути простіше вручну придумати алгоритм, який оптимізує цю вартість.

Це важлива думка: враховуючи два графіки, нам потрібен спосіб вирішити, чи графік А чи графік В «кращий». Ви перерахували різні критерії, але незрозуміло, як вони співвідносяться. Невдача одного критерію не відповідає цілому? Або частково відмова від обмеження просто робить його гіршим рішенням, ніж інші?

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

Щоб вибрати найкраще рішення для кандидата, вам потрібно буде їх класифікувати. Це досить просто, якщо одне м'яке обмеження має чіткий пріоритет перед усіма іншими м'якими обмеженнями, наприклад, якщо лікар не може працювати певну зміну, тому надається більше значення, ніж лікар, який не бажає працювати в цю зміну. Але я не можу визначити ці правила для вас - це управлінське рішення. Складніше, якщо два м'яких обмеження не мають чіткого пріоритету; в цьому випадку вам доведеться придумати якусь функцію витрат, яка об'єднує важливість двох обмежень в одній метриці.


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

В якості першого кроку ви можете заповнити нічну зміну у вихідні дні, намагаючись вибрати тих лікарів, які довгий час не проводили нічну зміну, також враховуючи побажання користувача "Я не можу працювати там". . Якщо припустити, що ці побажання є тижневими, а не безперервними, це означає, що лікаря, який не може працювати у вихідні вночі протягом одного тижня, буде обрано наступного тижня.

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

На жаль, я бачу кілька способів гри в цю систему: наприклад, якщо лікаря вибирають на роботу у нічну вихідну зміну, але він подає запит «не може там працювати», їх вибір затягується на тиждень - зменшуючи їх частота змін у нічні вихідні ціною своїх колег. Якщо реалізована процедура вирішення побажань, яка враховує кількість відхилених запитів, користувач може подати пару неможливих запитів, щоб збільшити один запит, через який він хоче пройти. Однак, якщо припустити добросовісність (і гнучкість лікарів змінювати зміни між собою), такий алгоритм повинен спричинити досить хороше рішення.


Дякую за Вашу відповідь, я ще більше попрацюю з цим своїм колегою :) Щоб отримати більше інформації: так, ми можемо класифікувати більшість рішень / критеріїв і можемо вирішити, чи мають деякі переваги над іншими. Крім того, вони справді працюють добросовісно, ​​і це працює добре. Вони роблять це вручну і не використовують занадто багато "я не можу працювати вдень". Дуже приємно, як вони працюють зараз, оскільки вони це роблять вручну . Тож "життєздатне" рішення вже означатиме для них світ, і заощадить їм багато часу на мозковий штурм, хто може працювати, коли
Гіл Санд

5
@Zil люди, які зараз створюють графіки, вже, ймовірно, використовують неформальний алгоритм. Ви можете просто поговорити з ними і спробувати зрозуміти процес їх прийняття рішень, а потім формалізувати та реалізувати це. Це було б простіше, ніж налаштування та навчання нейронної мережі.
амон

Ось наш перший крок: p, у нас зустріч з ними вже налаштована! Дякую за всю допомогу :)
Gil Sand

3
У цьому випадку використання алгоритми генетики послідовно поступаються пошуку табу та імітованому відпалюванню, що підтверджено міжнародними змаганнями з розширювання медсестер. (Але, звичайно, вони все ще кращі, ніж просто жадібний альго.)
Джеффрі Де Смет,

12

Можна використовувати імітований відпал .

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

Імітований відпал - це тип генетичного алгоритму, і, можливо, він не підходить теоретично (як стверджує @amon у своїй відповіді ), але він працював дуже добре на практиці, і це був приблизно той самий випадок використання, що і ваш.

Вихідний код доступний (C #), але, хоча він працює, страшно, боюся, було кілька років тому і, будучи автодидактором, я не знав нічого про ремонтопридатність. Однак це дало дуже хороші результати.

Як це працює в двох словах:

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

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

  • Мутуйте кожне рішення навмання: дозвольте лікарям міняти зміни між іншими, знімайте випадкового лікаря зі своєї зміни та ставите на нього випадкову доступну людину тощо.

  • Оцініть кожне рішення за допомогою функції фітнесу, яка визначає, наскільки воно хороше. Один хлопець працює більше ночей, ніж інший? Віднімайте штрафні бали. Хтось хотів зробити понеділок, але вони ні? Знову відняти штрафні бали.

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

  • Промийте і повторіть.

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

Що стосується мутування розчину, то імітаційний відпал вводить щось, що називається температурою. В основному це означає, що на початку вам слід мутувати свої рішення досить важко (скажімо, завжди робити 10 спроб заміни зрушень за один хід) і поступово ставати менш агресивними з подальшими ітераціями, тому вони стають більше точними налаштуваннями (скажімо, вниз лише 2 спроби налаштування за покоління).


4
Я використовував OptaPlanner (плануючий Drools Planner) із симуляційним відпалом для розкладу коледжу. Декларуйте моделі - у Shift є час і лікар. Напишіть декларативні правила щодо функції фітнесу - жорсткі обмеження (лікар не може приймати перекриття змін) та штрафи (Ен ненавидить понеділок). Напишіть декларативні (ось у чому справа!) Свопи змін. OptaPlanner створить стартовий стан навмання (може бути нездійсненним), обчислить функцію придатності за правилами і навіть керує свопами відповідно до алгоритму оптимізації. Ви можете вибрати та налаштувати такі параметри, як графік відпалу.
Jesvin Jose Jose

6

Тут застосовуються генетичні алгоритми . Під час моєї студентської програми один з моїх колег написав статтю з дуже подібною вашою проблемою.

Ви можете шукати графік роботи робочих місць, а також розклад планування роботи магазинів або планування роботи магазину може бути цікавим початковим пунктом

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

  • Різниця ночей, що призначаються між найбільш зайнятим лікарем та менш зайнятим роботою, - це пеналізація функції витрат
  • Щоразу, коли лікар працює більше 5 днів на тиждень або 1 ніч на тиждень, ви застосовуєте штраф
  • Кожне ваше обмеження тощо ...

Згенерувавши N кандидатів, ви вибрали б найкращого з них X , вони були б меншими. Працюючи з ними, схрещуючи і мутуючи протягом декількох поколінь, можна закінчити хороше рішення.

Розмовившись про все це, кожен раз, коли я використовував генетичний алгоритм, який більше покладався на мутацію, що при схрещуванні я міг би розробити імітаційний відпал, який би був набагато кращим, з легшою реалізацією. Вартість / придатність та функція мутації генетичного алгоритму, ймовірно, будуть дуже схожі на ті, які використовуються в симуляційному відпалі. Я почав би там, подивіться на відповідь @Konrad Morawski

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.