constraint ein dienst pro woche um historische dienste erweitert

This commit is contained in:
Jan Hoheisel 2025-12-23 23:00:01 +01:00
parent 0e19a3d016
commit 59a11cb854
2 changed files with 43 additions and 25 deletions

View File

@ -272,22 +272,40 @@ class Elterndienstplaner:
prob: pulp.LpProblem, prob: pulp.LpProblem,
x: Dict[Tuple[str, date, Dienst], pulp.LpVariable] x: Dict[Tuple[str, date, Dienst], pulp.LpVariable]
) -> None: ) -> None:
"""C1: Je Eltern und Dienst nur einmal die Woche""" """C1: Je Eltern und Dienst nur einmal die Woche (Woche = Montag bis Sonntag)"""
woche_start = self.tage[0] erster_tag = self.tage[0]
# weekday(): 0=Montag, 6=Sonntag
# Finde Montag am oder vor dem ersten Planungstag (für historische Dienste)
woche_start = erster_tag - timedelta(days=erster_tag.weekday())
woche_nr = 0 woche_nr = 0
while woche_start <= self.tage[-1]: letzter_tag = self.tage[-1]
woche_ende = min(woche_start + timedelta(days=6), self.tage[-1])
woche_tage = [t for t in self.tage if woche_start <= t <= woche_ende] while woche_start <= letzter_tag:
woche_ende = woche_start + timedelta(days=6) # Sonntag
for eltern in self.eltern: for eltern in self.eltern:
for dienst in self.dienste: for dienst in self.dienste:
woche_vars = [] woche_vars = []
for tag in woche_tage:
if (eltern, tag, dienst) in x:
woche_vars.append(x[eltern, tag, dienst])
# Zähle historische Dienste in dieser Woche (VOR dem Planungszeitraum)
historische_dienste_in_woche = 0
if woche_start < erster_tag:
for hist_datum, hist_eltern, hist_dienst in self.historische_dienste:
if (hist_eltern == eltern and
hist_dienst == dienst and
woche_start <= hist_datum < erster_tag):
historische_dienste_in_woche += 1
# Sammle Variablen für Planungszeitraum in dieser Woche
for tag in self.tage:
if woche_start <= tag <= woche_ende:
if (eltern, tag, dienst) in x:
woche_vars.append(x[eltern, tag, dienst])
# Constraint: Historische + geplante Dienste <= 1
if woche_vars: if woche_vars:
prob += pulp.lpSum(woche_vars) <= 1, \ prob += pulp.lpSum(woche_vars) <= 1 - historische_dienste_in_woche, \
f"C1_{eltern.replace(' ', '_')}_{dienst.kuerzel}_w{woche_nr}" f"C1_{eltern.replace(' ', '_')}_{dienst.kuerzel}_w{woche_nr}"
woche_start += timedelta(days=7) woche_start += timedelta(days=7)

View File

@ -1,24 +1,24 @@
Datum,Wochentag,Frühstücksdienst,Putznotdienst,Essensausgabenotdienst,Kochen,Elternabend Datum,Wochentag,Frühstücksdienst,Putznotdienst,Essensausgabenotdienst,Kochen,Elternabend
2026-01-01,Donnerstag,Paula,Marie,Jonas,, 2026-01-01,Donnerstag,Ben & Nele,Marie,Jonas,,
2026-01-02,Freitag,Jonas,Ben & Nele,Laura,, 2026-01-02,Freitag,Jonas,Ben & Nele,Laura,,
2026-01-03,Samstag,Marie,Jonas,Ben & Nele,, 2026-01-03,Samstag,Marie,Jonas,Ben & Nele,,
2026-01-06,Dienstag,Laura,Paula,Erwin,, 2026-01-06,Dienstag,Laura,Jonas,Marie,,
2026-01-07,Mittwoch,Ben & Nele,Erwin,Marie,, 2026-01-07,Mittwoch,Paula,Ben & Nele,Jonas,,
2026-01-08,Donnerstag,Jonas,Paula,Marie,Ben & Nele, 2026-01-08,Donnerstag,Jonas,Paula,Erwin,Ben & Nele,
2026-01-09,Freitag,Erwin,Marie,Paula,, 2026-01-09,Freitag,Ben & Nele,Marie,Paula,,
2026-01-10,Samstag,Paula,Laura,Ben & Nele,, 2026-01-10,Samstag,Marie,Laura,Ben & Nele,,
2026-01-13,Dienstag,Ben & Nele,Jonas,Laura,, 2026-01-13,Dienstag,Ben & Nele,Jonas,Laura,,
2026-01-14,Mittwoch,Marie,Ben & Nele,Jonas,, 2026-01-14,Mittwoch,Paula,Erwin,Jonas,,
2026-01-15,Donnerstag,Laura,Jonas,Erwin,, 2026-01-15,Donnerstag,Laura,Paula,Marie,,
2026-01-16,Freitag,Marie,Laura,Ben & Nele,, 2026-01-16,Freitag,Marie,Laura,Ben & Nele,,
2026-01-17,Samstag,Jonas,Ben & Nele,Paula,, 2026-01-17,Samstag,Erwin,Ben & Nele,Paula,,
2026-01-20,Dienstag,Ben & Nele,Erwin,Marie,, 2026-01-20,Dienstag,Jonas,Erwin,Marie,,
2026-01-21,Mittwoch,Erwin,Marie,Jonas,, 2026-01-21,Mittwoch,Erwin,Ben & Nele,Jonas,,
2026-01-22,Donnerstag,Ben & Nele,Marie,Laura,Jonas, 2026-01-22,Donnerstag,Ben & Nele,Marie,Laura,Jonas,
2026-01-23,Freitag,Marie,Jonas,Ben & Nele,, 2026-01-23,Freitag,Marie,Laura,Ben & Nele,,
2026-01-24,Samstag,Laura,Erwin,Marie,,Ben & Nele Jonas 2026-01-24,Samstag,Laura,Jonas,Erwin,,Ben & Nele Marie
2026-01-27,Dienstag,Erwin,Ben & Nele,Jonas,, 2026-01-27,Dienstag,Erwin,Ben & Nele,Jonas,,
2026-01-28,Mittwoch,Jonas,Paula,Erwin,, 2026-01-28,Mittwoch,Jonas,Erwin,Marie,,
2026-01-29,Donnerstag,Marie,Ben & Nele,Jonas,, 2026-01-29,Donnerstag,Marie,Paula,Ben & Nele,,
2026-01-30,Freitag,Ben & Nele,Jonas,Paula,, 2026-01-30,Freitag,Ben & Nele,Jonas,Paula,,
2026-01-31,Samstag,Paula,Marie,Ben & Nele,, 2026-01-31,Samstag,Paula,Marie,Erwin,,

1 Datum Wochentag Frühstücksdienst Putznotdienst Essensausgabenotdienst Kochen Elternabend
2 2026-01-01 Donnerstag Paula Ben & Nele Marie Jonas
3 2026-01-02 Freitag Jonas Ben & Nele Laura
4 2026-01-03 Samstag Marie Jonas Ben & Nele
5 2026-01-06 Dienstag Laura Paula Jonas Erwin Marie
6 2026-01-07 Mittwoch Ben & Nele Paula Erwin Ben & Nele Marie Jonas
7 2026-01-08 Donnerstag Jonas Paula Marie Erwin Ben & Nele
8 2026-01-09 Freitag Erwin Ben & Nele Marie Paula
9 2026-01-10 Samstag Paula Marie Laura Ben & Nele
10 2026-01-13 Dienstag Ben & Nele Jonas Laura
11 2026-01-14 Mittwoch Marie Paula Ben & Nele Erwin Jonas
12 2026-01-15 Donnerstag Laura Jonas Paula Erwin Marie
13 2026-01-16 Freitag Marie Laura Ben & Nele
14 2026-01-17 Samstag Jonas Erwin Ben & Nele Paula
15 2026-01-20 Dienstag Ben & Nele Jonas Erwin Marie
16 2026-01-21 Mittwoch Erwin Marie Ben & Nele Jonas
17 2026-01-22 Donnerstag Ben & Nele Marie Laura Jonas
18 2026-01-23 Freitag Marie Jonas Laura Ben & Nele
19 2026-01-24 Samstag Laura Erwin Jonas Marie Erwin Ben & Nele Jonas Ben & Nele Marie
20 2026-01-27 Dienstag Erwin Ben & Nele Jonas
21 2026-01-28 Mittwoch Jonas Paula Erwin Erwin Marie
22 2026-01-29 Donnerstag Marie Ben & Nele Paula Jonas Ben & Nele
23 2026-01-30 Freitag Ben & Nele Jonas Paula
24 2026-01-31 Samstag Paula Marie Ben & Nele Erwin