Google OR-Tools CP-SAT: ограничение ротации слотов обходит параллельными назначениями в реестре ⇐ Python

Программы на Python
Anonymous
Google OR-Tools CP-SAT: ограничение ротации слотов обходит параллельными назначениями в реестре

Сообщение Anonymous »

Я создаю систему планирования охраны с помощью Google OR-Tools (CP-SAT). У меня есть ограничение «Ротация слотов», предназначенное для того, чтобы один и тот же пользователь не работал в последовательные смены.
Настройка: У меня есть два задания (Патруль и Контрольно-пропускные пункты), выполняемые параллельно. Смены почасовые.
  • Назначение А (Патруль): 08:00, 09:00, 10:00...
  • Назначение Б (КПП): 08:00, 09:00, 10:00...
Проблема: Даже при включенном ограничении «Строгая ротация» решатель назначает одному и тому же пользователю несколько часов подряд (например, usr_015 работает с 09:00 до 10:00 в Patrol, а затем с 10:00 до 11:00 в Patrol).
Мое ограничение Логика: Мой компилятор сортирует все слоты в списке по времени начала. Когда назначения параллельны, последовательность выглядит следующим образом: [Patrol_08:00, Checkpoint_08:00, Patrol_09:00, Checkpoint_09:00, Patrol_10:00...]
Я использую окно, равное 2, для ротации, что, как подсказывает логика, должно препятствовать появлению пользователя в "следующем слоте".
Питон

Код: Выделить всё

# Simplified snippet of my SlotRotationCompiler
def compile(self, block, constraint, context):
# Slots are sorted globally by startTime
sorted_slots = sorted(context.slots, key=lambda s: s.start_time)

window = block.params.get("window", 2) # consecutive = window 2

for i in range(len(sorted_slots)):
current_slot = sorted_slots[i]
# Look ahead within the window
for j in range(1, window):
if i + j < len(sorted_slots):
next_slot = sorted_slots[i + j]
# Forbid same user in current_slot and next_slot
for user_id in context.user_ids:
model.Add(user_vars[user_id, current_slot] +
user_vars[user_id, next_slot] 

Подробнее здесь: [url]https://stackoverflow.com/questions/79861004/google-or-tools-cp-sat-slot-rotation-constraint-bypassed-by-parallel-assignment[/url]

Вернуться в «Python»