Google Или-инструменты планирования сотрудников .Условие не работает должным образом

#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()])
  

ссылка: https://github.com/google/or-tools/blob/aa0c6c42a523ee4c23633585b86fb6d3e090f8c8/ortools/sat/samples/bool_or_sample_sat.py#L23-L28

Комментарии:

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)]. Не()])