Как правильно написать ограничения для нескольких индексов? - PullRequest
0 голосов
/ 29 апреля 2020

Я пытаюсь реализовать задачу планирования сотрудника (медсестры) и ищу совет о том, как реализовать конкретное ограничение c. Проблема заключается в следующем: существует набор сотрудников и дней (оба обозначены целыми числами). ). Каждому сотруднику может быть назначена дневная смена D [(i, j)], ночная смена N [(i, j)] или выходной V [(i, j)]. Это мои переменные решения:

D = LpVariable.dicts(name="Dagdienst", indexs=[(i, j) for i in employees for j in days], cat='Binary')
N = LpVariable.dicts(name="Nachtdienst", indexs=[(i, j) for i in employees for j in days], cat='Binary')
V = LpVariable.dicts(name="Vrij", indexs=[(i, j) for i in employees for j in days], cat='Binary')

Примером ограничения для составления разумных графиков является следующее.

for i in employees:
    for j in days:
        m += D[(i, j)] + N[(i, j)] + V[(i, j)] == 1

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

for i in employees:
    for j in range(1, len(days)-1):
        m += N[(i, j)] + D[(i, (j + 1))] <= 1
        m += N[(i, j)] + D[(i, (j + 2))] <= 1

Я надеюсь, что реализация вышеупомянутого ограничения говорит сама за себя. Если требуется разъяснение, пожалуйста, спросите!

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

max_consecutive_days = 4
for i in medewerkers:
    for j in range(1, (len(dagen)+1 - max_consecutive_days)):
        m += D[(i, j)] + D[(i, j + 1)] + D[(i, j + 2)] + D[(i, j + 3)] <= max_consecutive_days

Однако это, похоже, не влияет на составленные графики, поскольку сотрудникам все еще назначается 4+ дня подряд.

Что мне здесь не хватает? Заранее спасибо!

1 Ответ

1 голос
/ 29 апреля 2020

Вы можете видеть, что

D[(i, j)] + D[(i, j + 1)] + D[(i, j + 2)] + D[(i, j + 3)] <= 4

никогда не является обязательным. Я думаю, что вы хотите:

D[(i, j)] + D[(i, j + 1)] + D[(i, j + 2)] + D[(i, j + 3)] + D[(i, j + 4)] <= 4
...