Формулировка модели расписания медсестер в AMPL

Я работал над проблемой планирования медсестер в AMPL для следующих условий:

Всего нет. Медсестер = 20

Всего нет. of shits = 3 # утро, день, ночь

Planning Horizon 7 дней: допустим, Пт Вт Р П Сб Вс

Наряду со следующими ограничениями:

  1. Макс нет. рабочих дней в неделю: 5
  2. Дни отдыха после 4-х непрерывных ночных смен.
  3. Последовательные ночные и утренние смены не допускаются.
  4. Спрос в смену - 7 медсестер.
  5. Медсестра может работать только в одну смену в день, то есть утром, ночью, днем.

Сценарии затрат:

Morning shift: $12
Day shift: $13
Night shift : $15

Целевая функция - минимизировать стоимость операции в соответствии с предпочтениями медсестры.

Может ли кто-нибудь дать мне представление о том, как можно сформулировать эту проблему?


person Utkarsh Ranjan    schedule 13.11.2015    source источник


Ответы (2)


Итак, сначала некоторые вещи необычные в вашем определении проблемы:

  1. Это не настоящая проблема оптимизации, поскольку ваша целевая функция фиксирована для каждого определения (в каждой смене 7 медсестер, и каждая медсестра имеет равную цену за смену)
  2. В вашей Задаче вы определили 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
comment
как мы можем примириться с ограничением, когда медсестра не работает посменно? Например. медсестра, работающая в ночную смену в понедельник, не может работать в утреннюю смену во вторник - person darkage; 23.11.2018

person    schedule
comment
как мы можем примириться с ограничением, когда медсестра не работает посменно? Например. медсестра, работающая в ночную смену в понедельник, не может работать в утреннюю смену во вторник - person darkage; 23.11.2018