#python #scheduling #constraint-programming #or-tools
#python #планирование #ограничение-программирование #или-инструменты
Вопрос:
Я использую этот пример планирования медсестры. У меня есть 3 сотрудника по 2 смены и 7 дней, и у меня есть условие, что если сотрудник работает в смену 1, он / она не может работать на следующий день в смену 0. вот мой код, и он не работает.
for n in all_nurses:
for d in all_days:
model.Add(sum(shifts[(n, d, s)] for s in range(0,1)) sum(shifts[(n, (d 1)%6, s)] for s in range(1,2)) <= 1)
и это вывод . Медсестра 2 работала в день 0 и смену 1, а на следующий день также работала в смену 1
Комментарии:
1. — попробуйте разделить вашу команду на множество выражений генератора здесь… — если у вас две смены 0 и 1, зачем использовать
for s in range(0,1)
иfor s in range(1,2)
не уверен, что это сработало так, как вы ожидаете — ваш модуль должен быть%7
равен семи дням…2. индексы дня начинаются с 0, поэтому воскресенье равно 6. и я использую для s в диапазоне (0,1), потому что я не могу установить переменную s напрямую. когда я пытаюсь это сделать, я получаю сообщения об ошибках.
Ответ №1:
В соответствии с вашим ограничением:
for n in all_nurses:
for d in all_days:
model.Add(sum([shifts[(n, d, 1)], shifts[(n, (d 1)%7, 0)]]) <= 1)
Лучшей формулировкой было бы
for n in all_nurses:
for d in all_days:
model.AddBoolOr([shifts[(n, d, 1)].Not(), shifts[(n, (d 1) % 7, 0)].Not()])
Комментарии:
1. Большое вам спасибо за ответ. тем не менее, это не сработало, я попробовал что-то еще. ` для n во all_nurses: для d во all_days: модель. Добавьте (sum(сдвиги[(n, (d-1)% 6, s)] для s в диапазоне (1,2)) sum (сдвиги[(n, d, s)] для s в диапазоне (0,1)) <= 1) ` это сработало с этим и кодом выше
2. мой плохой, я использовал
sum(a b)...
вместоsum([a,b])...
3.
(x%7)
будет варьироваться от[0;6]
4. Должна быть модель. Добавить(сдвиги[(n, d, 1)] сдвиги[(n, (d 1)%7, 0)] <= 1). Что лучше записать как модель. AddBoolOr([сдвиги[(n, d, 1)].Not(), (сдвиги[(n, (d 1) % 7, 0)]. Не()])
5. Модель. AddBoolOr([сдвиги[(n, d, 1)].Not(), сдвиги[(n, (d 1) % 7, 0)]. Не()])