Planungszeitraum und historischer Zeitraum koennen sich jetzt ueberlappen. So lassen sich einzelne Dienste (z.B. von einer Familie) nachtraeglich neu planen. historische Dienste werden bei den Constraints 1 Dienst pro Tag und 1 Dienst pro Woche korrekt beruecksichtigt elterndienstplaner.py erzeugt jetzt ausgaben-gesamt.csv, die fuer spaetere Aufrufe als Eingabe vorherige-dienste.csv verwendet werden kann.
144 lines
4.3 KiB
Markdown
144 lines
4.3 KiB
Markdown
# 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` bzw. `ausgabe-gesamt.csv`.
|
||
Hier kann die `ausgabe-gesamt.csv`, die bei der letzten Planung generiert wurde eingespielt werden.
|
||
|
||
## Ausgabedatei
|
||
|
||
### ausgabe.csv
|
||
|
||
Die neu zugeteilten Dienste.
|
||
```csv
|
||
Datum,Wochentag,Frühstücksdienst,Putznotdienst,Essensausgabenotdienst,Kochen,Elternabend
|
||
2026-01-06,Montag,Sarah & Tim,Leon,Erika,,
|
||
```
|
||
|
||
|
||
### ausgabe-gesamt.csv
|
||
Wie `ausgabe.csv`, enthält aber neben den neu geplanten Diensten auch die historischen Dienste, die über `vorherige-ausgaben.csv` übergeben wurden. Die Datei `ausgabe-gesamt.csv` kann bei der nächsten Planung wieder als Eingabe `vorherige-ausgaben.csv` verwendet werden.
|
||
|
||
## Verwendung
|
||
|
||
```bash
|
||
./elterndienstplaner.py <eingabe.csv> <eltern.csv> <ausgabe.csv> [<vorherige-ausgaben.csv>]
|
||
```
|
||
|
||
## 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
|
||
|
||
|