# Elterndienstplaner Automatische Zuteilung von Elterndiensten im Kinderladen unter Berücksichtigung von Fairness und Präferenzen. ## Überblick Der Elterndienstplaner verteilt monatliche Dienstzuteilungen optimal auf die Eltern durch Lösung eines linearen Optimierungsproblems. Das System berücksichtigt: - **Harte Constraints (C1-C4):** Müssen immer eingehalten werden - **Fairness-Constraints (F1-F4):** Werden optimiert - **Präferenzen (P1-P2):** Werden berücksichtigt, wenn möglich ## Diensttypen - **F** - Frühstücksdienst (täglich, 1 Person) - **P** - Putznotdienst (täglich, 1 Person) - **E** - Essensausgabenotdienst (täglich, 1 Person) - **K** - Kochen (ca. alle 2 Wochen, 1 Person) - **A** - Elternabend (ca. einmal im Monat, 2 Personen) ## Eingabedateien ### eingabe.csv Tägliche Dienste und Eltern-Verfügbarkeiten/Präferenzen für den Planungsmonat. **Format:** ```csv Datum,Wochentag,Dienste,Kind1,Kind2,... 2026-01-06,Montag,FPE,x,F+,... ``` **Spalten:** - Datum (YYYY-MM-DD) - Wochentag - Dienste (Kombination aus F/P/E/K/A) - Pro Familie: `x` (abwesend), `Kürzel+` (bevorzugt), `Kürzel-` (abgelehnt), leer (verfügbar) ### eltern.csv Dienstfaktoren (Anzahl Kinder) pro Familie und Zeitraum. **Format:** ```csv Name_Kind(er),Zeitraum_Beginn,Zeitraum_Ende,Dienstfaktor,... Sarah & Tim,2024-09-01,2025-07-31,2 Leon,2024-09-01,2024-12-31,1,2025-01-01,2025-07-31,0 ``` **Hinweise:** - Dienstfaktor = Anzahl Kinder - Faktor 0 = keine Dienstpflicht (z.B. Vorstand) - Mehrere Zeiträume möglich für Änderungen im Jahr ### vorherige-ausgaben.csv (optional) Historische Dienstzuteilungen für Jahres-Fairness. Format wie `ausgabe.csv`. ## Ausgabedatei ### ausgabe.csv ```csv Datum,Wochentag,Frühstücksdienst,Putznotdienst,Essensausgabenotdienst,Kochen,Elternabend 2026-01-06,Montag,Sarah & Tim,Leon,Erika,, ``` ## Verwendung ```bash ./elterndienstplaner.py [] ``` ## Constraints ### Harte Constraints (müssen erfüllt sein) - **C1:** Maximal 1× pro Woche pro Diensttyp - **C2:** Maximal 1 Dienst pro Tag - **C3:** Nur bei Verfügbarkeit (keine `x` in eingabe.csv) - **C4:** Alle benötigten Dienste werden besetzt ### Fairness (werden optimiert) - **F1 (Global):** Faire Jahresverteilung pro Diensttyp - **F2 (Lokal):** Faire Monatsverteilung pro Diensttyp - **Besonderheit:** Abwesenheitstage = Dienstfaktor 0, werden nicht nachgeholt im selben Monat - **F3 (Global):** Ausgewogene Gesamtdienste über Jahr - **F4 (Lokal):** Ausgewogene Gesamtdienste im Monat ### Präferenzen (niedrige Gewichtung) - **P1:** Bevorzugte Dienste (`+`) werden bevorzugt zugeteilt - **P2:** Abgelehnte Dienste (`-`) werden vermieden ## Technische Details ### Optimierungsproblem **Entscheidungsvariablen:** - Binär: `x[eltern, tag, dienst]` = 1 wenn zugeteilt, 0 sonst **Zielfunktion:** Minimiert gewichtete Summe der Abweichungen von fairer Verteilung unter Berücksichtigung von Präferenzen. Lokale Fairness (aktueller Monat) hat höchste Priorität, gefolgt von globaler Fairness (ganzes Jahr). ### Lokale vs. Globale Fairness **Lokal (F2/F4):** - Nur aktueller Planungsmonat - Abwesenheitstage: Dienstfaktor = 0 - Ziel: Gleichmäßige Verteilung im Monat **Global (F1/F3):** - Historische Daten + aktueller Monat - Abwesenheitstage: Dienstfaktor wie in eltern.csv - Ziel: Ausgleich über das Kitajahr - Bereits geleistete Dienste werden abgezogen ## Programmausgabe 1. **Zuteilungen pro Familie:** Anzahl je Diensttyp 2. **Dienstfaktoren-Summe:** Im Planungszeitraum 3. **Verteilungsvergleich:** Soll (lokal/global) vs. Ist 4. **Präferenz-Verletzungen:** Anzahl abgelehnte/nicht-erfüllte Präferenzen ## Troubleshooting **"Keine optimale Lösung gefunden":** - Zu viele Abwesenheiten - Nicht genug verfügbare Eltern für benötigte Dienste **"Unfaire Verteilung":** - Dienstfaktoren in `eltern.csv` prüfen - `vorherige-ausgaben.csv` auf Korrektheit prüfen