Google OR-Tools CP-SAT: Slot-Rotationsbeschränkung durch parallele Zuweisungen in Roster umgangenPython

Python-Programme
Anonymous
 Google OR-Tools CP-SAT: Slot-Rotationsbeschränkung durch parallele Zuweisungen in Roster umgangen

Post by Anonymous »

Ich baue ein Wachplanungssystem mit Google OR-Tools (CP-SAT) auf. Ich habe eine „Slot-Rotation“-Einschränkung, die sicherstellen soll, dass derselbe Benutzer nicht in aufeinanderfolgenden Schichten arbeitet.
Das Setup: Ich habe zwei Einsätze (Patrouille und Kontrollpunkte), die parallel laufen. Die Schichten sind stündlich.
  • Auftrag A (Streife): 08:00, 09:00, 10:00...
  • Auftrag B (Kontrollpunkte): 08:00, 09:00, 10:00...
Das Problem: Selbst wenn eine „Strikte Rotation“-Einschränkung aktiviert ist, weist der Solver denselben Benutzer aufeinanderfolgenden Stunden zu (z. B. arbeitet usr_015 von 09:00–10:00 Uhr in Patrol und dann von 10:00–11:00 Uhr in Patrol).
Meine Einschränkungslogik: Mein Compiler sortiert alle Slots im Dienstplan nach startTime. Bei parallelen Zuweisungen sieht die Reihenfolge wie folgt aus: [Patrol_08:00, Checkpoint_08:00, Patrol_09:00, Checkpoint_09:00, Patrol_10:00...]
Ich verwende ein Fenster von 2 für meine Rotation, was laut Logik verhindern sollte, dass ein Benutzer im „nächsten Slot“ erscheint.
Python

Code: Select all

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

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post