elterndienstplaner/README.md
Jan Hoheisel 08e5cf11bd Mehr Fuktionen fuer historische Dienste
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.
2026-01-28 20:30:14 +01:00

144 lines
4.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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