Ограничить количество диапазонов, сработавших за день - PullRequest
0 голосов
/ 10 мая 2019

Я пишу код для автоматического создания смен для моих работников. Я уже смог создать несколько ограничений:

  • Каждая смена за день назначается одному работнику
  • Каждый работник не может работать более 8 часов в день
  • Каждый работник должен работать [ # minShifts , # maxShifts ] часов в неделю
  • Каждый работник не может работать в разных комнатах одновременно
  • Каждый работник не может работать более чем в 2 разных комнатах в день

Пока все хорошо; теперь я сталкиваюсь с другим ограничением, я не могу придумать, как кодировать: каждый работник не может работать более чем на 2 разных диапазонах в день .
Я имею в виду, что я не хочу, чтобы человек работал (например,) 08.30-10.30, 12.30-13.30 и 16.30-18.30, но ограничиваю назначенные диапазоны двумя.

Учитывая, что у меня есть shifts[numWorkers, numDays, numShifts], как мне установить это ограничение?

1 Ответ

1 голос
/ 11 мая 2019

Если вы используете эти переменные для каждого блока продолжительностью два часа [смена 8 утра, смена 9 утра], создайте boolvar, который имеет значение true, если первая смена включена, а вторая выключена

end_of_shift = model.NewBoolVar('')
model.AddBoolOr([first_shift.Not(), second_shift, end_of_shift])
model.AddImplication(end_of_shift, first_shift)
model.AddImplication(end_of_shift, second_shift.Not())

# then for each day and each worker: 
model.Add(sum(end_of_shifts) <= 2)
...