required_skill(constraint_factory)
no_overlapping_shifts(constraint_factory)
unavailable_employee(constraint_factory)
undesired_day_for_employee(constraint_factory)
desired_day_for_employee(constraint_factory)
< /code>
Zusätzlich habe ich eine benutzerdefinierte Einschränkung implementiert: < /p>
enforce_10_hour_rest_period(constraint_factory)
< /code>
Der Einschränkungscode: < /p>
def enforce_10_hour_rest_period(constraint_factory):
return (
constraint_factory.for_each(Shift)
.filter(lambda shift: shift.employee is not None)
.group_by(
lambda shift: shift.employee, ConstraintCollectors.to_list())
.map(lambda employee_name, shifts: calculate_insufficient_breaks(employee_name, sorted(shifts, key=lambda sh: sh.start)))
.penalize(
HardSoftDecimalScore.ONE_HARD,
lambda insufficient_breaks: insufficient_breaks
)
.as_constraint("10-hour rest period after 8-hour working period")
)
< /code>
Der Helfer -Funktionscode: < /p>
def rest_period_sufficient(last_shift_end, next_shift_start):
return (next_shift_start - last_shift_end).total_seconds() >= 10 * 3600
def calculate_insufficient_breaks(employee, shifts):
filtered_shifts = [shift for shift in shifts if shift.employee.name == employee.name]
l = len(filtered_shifts)
if len(filtered_shifts) < 2:
return 0
insufficient_breaks = 0
working_period_end = filtered_shifts[0].start + timedelta(hours=8)
#delete print line
print(f"working period start: {filtered_shifts[0].start}, working period end {working_period_end}")
for i in range(1, l):
#delete print line
print(f"start: {filtered_shifts.start}, end: {filtered_shifts.end} ")
if filtered_shifts.end >= working_period_end:
if not rest_period_sufficient(working_period_end, filtered_shifts.start):
insufficient_breaks += 1
working_period_end = filtered_shifts.start + timedelta(hours=8)
return insufficient_breaks
< /code>
Fragen: < /p>
- Ausgabe: In der Funktion calculate_infaughing_breaks, wenn ich Shift.EMPLE.AMPLE.NAME -Werte i drucke i drucke. würde verschiedene Mitarbeiternamen erhalten. Während die Filterung notwendig erscheint, ist unklar, warum dies angesichts der in der Funktion bestehenden Gruppe in der Funktion ermittlung_10_hour_rest_period geschieht. Darüber hinaus habe ich festgestellt, dass das Entfernen der ersten Drucklinie - der Algorithmus (Einschränkung) nicht funktioniert, die Lücken nicht 10 Stunden. Und wenn ich die zweite Druckanweisung entferne, erhalte ich die folgende Ausnahme: TypeError: rest_period_suffing () erhielt ein unerwartetes Keyword -Argument 'Stunden'. . Warum geschieht das? Ist meine aktuelle Implementierung angemessen oder gibt es einen effizienteren Ansatz, um diese Einschränkung zu definieren? :
Ich möchte die Anzahl der Verschiebungen maximieren, die ein Arbeiter innerhalb seines 8-Stunden-Arbeitszeitraums abgeschlossen hat. Mein Plan war es, eine Helferfunktion zu erstellen, die der 10-stündigen REST-Periode-Einschränkung ähnelt, und eine Belohnung anwenden, wenn die maximale Anzahl von Verschiebungen innerhalb des 8-Stunden-Fensters erreicht wird. Konstruieren Sie diese Einschränkung in Timefold?