Настройка: У меня есть два задания (Патруль и Контрольно-пропускные пункты), выполняемые параллельно. Смены почасовые.
- Назначение А (Патруль): 08:00, 09:00, 10:00...
- Назначение Б (КПП): 08:00, 09:00, 10:00...
Мое ограничение Логика: Мой компилятор сортирует все слоты в списке по времени начала. Когда назначения параллельны, последовательность выглядит следующим образом: [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]
Мобильная версия