Итак, сначала некоторые вещи необычные в вашем определении проблемы:
- Это не настоящая проблема оптимизации, поскольку ваша целевая функция фиксирована для каждого определения (в каждой смене 7 медсестер, и каждая медсестра имеет равную цену за смену)
- В вашей Задаче вы определили 7 медсестер в смену с максимальной продолжительностью 5 рабочих дней. Итак, вам нужно 7 медсестер в три смены по семь дней. Это равняется 147 медсестрам / сменам. Но с ограничением в пять рабочих дней и только одну смену в день у вас всего 20 медсестер на 5 смен, что равняется 100 медсестрам в смену.
Я создал проблему в Mathprog, но код должен быть более или менее равным AMPL. Я начал с трех наборов для медсестер, по дням и сменам.
set shifts := {1,2,3};
set days := {1,2,3,4,5,6,7};
set nurses := {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
Расписание определяется как набор двоичных переменных:
var schedule{nurses, days, shifts}, binary;
Простая цель содержит сумму всех медсестер / смен на этой неделе с соответствующими ценами:
minimize cost: sum{i in nurses, j in days}(schedule[i,j,1]*c_morning+schedule[i,j,2]*c_day+schedule[i,j,3]*c_night);
В качестве первого ограничения можно ограничить сумму всех смен на медсестру до пяти, поскольку возможна только одна смена в день:
s.t. working_days{n in nurses}:
sum{i in days, j in shifts}(schedule[n,i,j]) <= 5;
Выходной - самая сложная часть проблемы. Для простоты я создал другой набор, содержащий только дни, в которых медсестра могла бы работать в четыре ночные смены подряд. Вы также можете сформулировать ограничение с исходным набором дней и исключить первые четыре дня.
set nigth_days := {5,6,7};
s.t. rest{n in nurses,i in nigth_days}:
(schedule[n,i-4,3]+schedule[n,i-3,3]+schedule[n,i-2,3]+schedule[n,i-1,3]+sum{j in shifts}(schedule[n,i,j])) <= 4;
Из-за отсутствия утренней смены после ночной я применил ту же попытку, что и в остальные дни. Седьмой день исключен, поскольку нет восьмого дня, когда мы могли бы искать утреннюю смену.
set yester_days := {1,2,3,4,5,6};
s.t. night_morning{i in yester_days, n in nurses}:
(schedule[n,i,3]+schedule[n,i+1,1]) <= 1;
Должна быть удовлетворена потребность в четырех медсестрах в смену (я уменьшил это число, поскольку более четырех медсестер неосуществимы из-за ограничения в 5 смен)
s.t. demand_shift{i in days, j in shifts}:
sum{n in nurses}(schedule[n,i,j]) = 4;
Пятое ограничение - ограничить количество смен в день максимум одной.
s.t. one_shift{n in nurses, i in days}:
sum{ j in shifts}(schedule[n,i,j]) <= 1;
person
Paul G.
schedule
08.12.2015