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]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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