Projektwerkstatt — elf eigene Anwendungen
📌 Auf einen Blick
Worum geht es? Um den Schritt, auf den der ganze Kurs zuläuft: eine eigene Anwendung bauen. Elf vollständig ausgearbeitete Projektaufträge, jeder mit Datenquellen, Modellskizze, Abnahmekriterien und Stolperfallen. P1–P8 bauen je ein Modell; P9–P11 setzen dort an, wo eines schon steht — wenn es zu langsam wird, wenn zwei Ziele gegeneinanderstehen, wenn es jemand anderes benutzen soll.
Voraussetzungen: je Projekt angegeben.
Zeitbedarf: 10–25 Stunden je Projekt.
Wie Sie ein Projekt bearbeiten
Halten Sie sich an diese Reihenfolge — sie ist aus vielen gescheiterten und einigen gelungenen Projekten destilliert:
| Phase | Dauer | Ergebnis | Häufigster Fehler |
|---|---|---|---|
| 1. Zerlegen | 10 % | Ausgefüllte Bausteine-Vorlage (Abschnitt 1.6) auf Papier | Sofort programmieren |
| 2. Kleinstinstanz | 15 % | Modell mit 3–5 Elementen, Lösung von Hand geprüft | Gleich mit echten Daten anfangen |
| 3. Daten | 20 % | Echte Daten geladen, validiert, dokumentiert | Datenqualität unterschätzen |
| 4. Skalieren | 20 % | Volles Modell läuft im Zeitlimit | Zu viele harte Bedingungen |
| 5. Erklärbar machen | 20 % | Report, den ein Fachanwender versteht | Ganz weglassen |
| 6. Abnahme | 15 % | Kriterien geprüft, Grenzen dokumentiert | „Läuft ja“ als Abnahme |
🎯 Die wichtigste Regel Phase 2 ist nicht optional. Ein Modell, das Sie an drei Mitarbeitenden und vier Schichten nicht von Hand nachrechnen können, werden Sie an 200 Mitarbeitenden nie debuggen. Jede Stunde in Phase 2 spart drei in Phase 4.
P1 — Vertretungsplaner für eine Schule
Schwierigkeit: ⭐⭐ · Kapitel: Kapitel 1, Kapitel 6, Kapitel 7, Kapitel 22 · Zeit: ca. 15 Stunden
Ausgangslage. Morgens um 7:15 Uhr meldet sich die dritte Lehrkraft krank. Die stellvertretende Schulleitung hat 20 Minuten, um einen Vertretungsplan zu erstellen, der Qualifikationen, Arbeitszeiten, bereits geleistete Vertretungen und persönliche Wünsche berücksichtigt.
Daten. Stundenplan (CSV: Klasse, Tag, Stunde, Fach, Lehrkraft, Raum) — in diesem Projektordner erzeugen die Skripte stundenplan*.py genau solche Dateien und eignen sich als Datenquelle. Zusätzlich: Qualifikationsmatrix, Deputate, Abwesenheitsmeldungen.
Modellskizze. * Variablen: x_{p,s} \in \{0,1\} — Person p übernimmt Slot s. * Hart: genau eine Person je Slot; Qualifikation; keine Doppelbelegung; Höchstzahl Vertretungsstunden; Ruhezeiten. * Weich: Vorbelastung, Freistundenlöcher, Fachnähe, Wünsche, Fairness über die Woche. * Solver: CP-SAT.
Abnahmekriterien. - [ ] Läuft in unter 10 Sekunden für eine ganze Schule (60 Lehrkräfte, 30 Slots). - [ ] Liefert immer einen Plan — auch wenn nicht alle Slots besetzbar sind (Relaxation). - [ ] Weist je Zuweisung eine Begründung aus. - [ ] Ausgabe als CSV und als lesbare Tagestabelle. - [ ] Vergleich gegen die manuelle Lösung: Wie viele Wünsche werden erfüllt?
Stolperfallen. * Zu viele harte Regeln → INFEASIBLE an genau dem Tag, an dem man das System braucht. * Fairness nur über einen Tag statt über die Woche → dieselbe Person trifft es ständig. * Akzeptanz: Ohne Begründungsanzeige wird der Plan überschrieben.
Erweiterungen. Mehrtagesplanung; Raumkonflikte; Springerstunden; Schnittstelle zum Schulverwaltungsprogramm.
P2 — Schichtplanung für ein Pflegeteam
Schwierigkeit: ⭐⭐⭐ · Kapitel: Kapitel 6, Kapitel 7, Kapitel 22 · Zeit: ca. 20 Stunden
Ausgangslage. 25 Pflegekräfte, drei Schichten täglich, 28-Tage-Zyklus. Es gelten Arbeitszeitgesetz, Tarifvertrag, Qualifikationsmix und individuelle Wünsche.
Modellskizze. * Variablen: x_{p,t,s} \in \{0,1\} — Person, Tag, Schicht. * Hart: Mindestbesetzung je Schicht und Qualifikationsmix (mindestens eine examinierte Kraft); nach Nachtschicht ≥ 2 freie Tage; höchstens 6 Arbeitstage in Folge; monatliche Sollstunden ± 10 %. * Weich: Wunschfrei, gleichmäßige Wochenendverteilung, ungeteilte Dienste, stabile Schichtfolgen (nicht Früh–Nacht–Früh). * Solver: CP-SAT mit Intervall- und Cumulative-Constraints.
Abnahmekriterien. - [ ] Alle gesetzlichen Regeln nachweislich eingehalten (per assert geprüft). - [ ] Wunscherfüllungsquote wird ausgewiesen und ist fair verteilt (Gini-Koeffizient). - [ ] Läuft in unter 60 Sekunden. - [ ] Bei Unlösbarkeit: Notfallplan plus benannte Ursache.
Stolperfallen. Der 28-Tage-Zyklus erzeugt viele Variablen (25 × 28 × 3 = 2100) — Symmetriebrechung und gute Suchheuristiken werden wichtig. Fairness über einen Monat ist etwas anderes als Fairness über eine Woche.
P3 — Tourenplanung für einen Lieferdienst
Schwierigkeit: ⭐⭐ · Kapitel: Kapitel 8 · Zeit: ca. 12 Stunden
Ausgangslage. Ein regionaler Lieferdienst fährt täglich 40–80 Adressen mit 4 Fahrzeugen an. Kunden haben Zeitfenster, Fahrzeuge Kapazitäten, Fahrer Arbeitszeiten.
Daten. Adressen aus einer CSV; Entfernungen über OpenStreetMap (osmnx, openrouteservice) oder als Luftlinie mit Umwegfaktor 1,3 als Näherung.
Modellskizze. OR-Tools Routing-Bibliothek mit Kapazitäts- und Zeitdimension; Metaheuristik GUIDED_LOCAL_SEARCH, Zeitlimit 30 Sekunden.
Abnahmekriterien. - [ ] Alle Kunden werden innerhalb ihrer Zeitfenster beliefert. - [ ] Vergleich gegen die bisherige manuelle Tourenplanung: Ersparnis in km und Minuten. - [ ] Kartendarstellung der Touren (folium). - [ ] Robust gegen Ausfall eines Fahrzeugs (Neuplanung in unter 30 s).
Stolperfallen. Luftlinie unterschätzt Fahrzeiten systematisch — mit realistischem Umwegfaktor arbeiten oder echte Routing-Distanzen holen. Zeitfenster, die physisch nicht erreichbar sind, führen zu „keine Lösung“ ohne Erklärung: Vorabprüfung einbauen (siehe Kapitel 8).
P4 — Standort- und Lagernetzplanung
Schwierigkeit: ⭐⭐⭐ · Kapitel: Kapitel 6, Kapitel 8 · Zeit: ca. 15 Stunden
Ausgangslage. Ein Handelsunternehmen prüft, welche von 12 möglichen Lagerstandorten eröffnet werden sollen, um 60 Filialen zu versorgen.
Modellskizze. Kombiniertes Standort- und Transportproblem: * y_j \in \{0,1\} — Lager j eröffnen (Fixkosten). * x_{ij} \ge 0 — Menge von Lager j zu Filiale i. * Kopplung: x_{ij} \le M\,y_j; Kapazität je Lager; Bedarfsdeckung je Filiale. * Ziel: Fixkosten + Transportkosten minimieren.
Abnahmekriterien. - [ ] Sensitivitätsanalyse: Wie verändert sich die Lösung bei ±20 % Transportkosten? - [ ] Was-wäre-wenn: Standort X wird politisch vorgegeben — was kostet das? - [ ] Kartendarstellung mit Zuordnungslinien. - [ ] Amortisationsrechnung über 10 Jahre.
Stolperfallen. Big-M zu groß wählen (Kapitel 6) — hier ist die Lagerkapazität die natürliche Wahl. Fixkosten sind einmalig, Transportkosten laufend: Barwerte rechnen, nicht einfach addieren.
P5 — Produktionsplanung mit Rüstkosten
Schwierigkeit: ⭐⭐⭐ · Kapitel: Kapitel 5, Kapitel 6, Kapitel 7 · Zeit: ca. 18 Stunden
Ausgangslage. Eine Fertigung produziert 15 Varianten auf 4 Maschinen. Jeder Produktwechsel kostet Rüstzeit; die Rüstzeit hängt von der Reihenfolge ab.
Modellskizze. Los- und Reihenfolgeplanung: * Variablen: Produktionsmengen, Rüstentscheidungen, Reihenfolge (Intervallvariablen). * Hart: Bedarfsdeckung je Periode, Maschinenkapazität, Mindestlosgrößen. * Ziel: Rüst- + Lager- + Fehlmengenkosten minimieren. * Solver: CP-SAT mit AddNoOverlap und reihenfolgeabhängigen Übergangszeiten.
Abnahmekriterien. - [ ] Gantt-Diagramm der Maschinenbelegung. - [ ] Vergleich gegen die aktuelle Praxis (Ersparnis in Rüststunden). - [ ] Schattenpreise: Welche Maschine ist der Engpass, was wäre eine zusätzliche Schicht wert?
P6 — Portfolio-Rebalancer für ein Privatdepot
Schwierigkeit: ⭐⭐⭐ · Kapitel: Kapitel 18 bis Kapitel 21 · Zeit: ca. 20 Stunden
⚠️ Keine Anlageberatung. Dieses Projekt dient dem Methodenverständnis. Setzen Sie kein echtes Geld auf ein selbstgebautes Modell, dessen Grenzen Sie nicht vollständig verstehen.
Ausgangslage. Ein Privatdepot aus 10–15 ETFs und Einzeltiteln soll quartalsweise zurückgeführt werden — unter Berücksichtigung von Ordergebühren, Mindestordergrößen und der Steuerfreibetragsnutzung.
Modellskizze. * Variablen: Zielgewichte w_i; Binärvariablen für „Position wird gehandelt“. * Hart: Vollinvestition, keine Leerverkäufe, Positionsobergrenzen, Mindestordergröße (semikontinuierlich, Kapitel 6), höchstens K Transaktionen je Rebalancing. * Ziel: erwartete Rendite − Risikoterm − Transaktionskosten − Steuerwirkung. * Solver: CVXPY (konvexer Teil) oder MIQP für die Kardinalität.
Abnahmekriterien. - [ ] Toleranzband: Es wird nur gehandelt, wenn die Abweichung > 5 Prozentpunkte beträgt. - [ ] Alle Kosten (Ordergebühr, Spread, Steuer) sind explizit ausgewiesen. - [ ] Backtest über 5 Jahre mit Lookahead-Selbsttest. - [ ] Vergleich gegen: nie rebalancen, jährlich rebalancen, Gleichgewichtung. - [ ] Bericht, den ein Nicht-Fachmann versteht.
Stolperfallen. Steuern sind pfadabhängig (FIFO, Freibetrag) und passen nicht sauber in ein einperiodiges Modell — Näherung wählen und die Näherung dokumentieren. Und: Wenn Ihre Strategie die Gleichgewichtung nicht schlägt, ist das ein Ergebnis, kein Misserfolg.
P7 — Risikoreport mit CVaR und Stresstests
Schwierigkeit: ⭐⭐ · Kapitel: Kapitel 12, Kapitel 18, Kapitel 20 · Zeit: ca. 12 Stunden
Ausgangslage. Für ein bestehendes Portfolio soll ein monatlicher Risikobericht entstehen.
Inhalte des Berichts. * VaR und CVaR auf 95 % und 99 %, historisch und Monte-Carlo-simuliert. * Risikobeiträge je Position (marginal CVaR): Wer treibt das Risiko? * Stresstests: Was passiert bei −20 % Aktienmarkt, +200 Basispunkten Zins, Korrelationsanstieg auf 0,9? * Historische Szenarien nachspielen (2008, März 2020). * Konzentrationskennzahlen (Herfindahl-Index, effektive Titelzahl).
Abnahmekriterien. - [ ] Bericht als PDF, automatisch erzeugt. - [ ] Alle Kennzahlen mit zwei unabhängigen Methoden berechnet und verglichen. - [ ] Klartext-Zusammenfassung: „Im schlechtesten Prozent der Monate verlieren Sie typischerweise X €.“
Stolperfallen. Die Wurzel-Zeit-Regel bei CVaR (Kapitel 20) — nicht blind anwenden. Korrelationen sind in Krisen andere als im Mittel: Stresstest mit erhöhten Korrelationen rechnen.
P9 — Wenn der Solver aussteigt: Tourenplanung in Echtgröße
Schwierigkeit: ⭐⭐⭐ · Kapitel: Kapitel 8, Kapitel 9 · Zeit: ca. 18 Stunden
Ausgangslage. P3 hat funktioniert — mit 30 Kunden. Der Auftraggeber kommt mit 400 zurück, und derselbe Code liefert nach zwanzig Minuten noch keine Lösung. Das ist keine Panne, sondern der erwartbare Umschlagpunkt.
Modellskizze. Zwei Verfahren am selben Problem, verglichen unter gleichem Zeitbudget: * Exakt: MILP oder CP-SAT wie in P3, mit Zeitlimit und protokolliertem Gap. * Heuristisch: Startlösung mit einer Faustregel, dann Verbesserung durch Simulated Annealing oder Large Neighborhood Search (Kapitel 9). * Messgröße ist nicht „wer gewinnt”, sondern ab welcher Instanzgröße sich das Blatt wendet.
Abnahmekriterien. - [ ] Eine Tabelle über mindestens vier Instanzgrößen: exakt gegen heuristisch, jeweils Zielwert und Laufzeit. - [ ] Der Umschlagpunkt ist auf ±50 Kunden eingegrenzt und benannt. - [ ] Bei kleinen Instanzen wird gegen die bewiesen optimale Lösung geprüft — sonst weiß niemand, wie gut die Heuristik wirklich ist. - [ ] Fester Seed, reproduzierbarer Lauf; das Zugbudget ist fix, nicht die Uhrzeit.
⚠️ Die Falle, in die hier fast jeder tappt: die Heuristik nur auf großen Instanzen zu testen, wo man das Optimum nicht kennt. Dann sieht jede Lösung gut aus.
P10 — Zwei Ziele, eine Entscheidung: Kosten gegen CO₂
Schwierigkeit: ⭐⭐ · Kapitel: Kapitel 6, Kapitel 14 · Zeit: ca. 14 Stunden
Ausgangslage. Die Geschäftsführung will „günstiger und grüner”. Beides zugleich gibt es nicht — und die übliche Antwort, beide Ziele mit Gewichten zu verrechnen, verdeckt genau die Frage, um die es geht.
Modellskizze. Ein Transport-, Beschaffungs- oder Produktionsmodell mit zwei Zielen: * Erst beide Ziele einzeln optimieren — das gibt die Eckpunkte und damit den Rahmen. * Dann die Front über das \varepsilon-Constraint-Verfahren abfahren (Kapitel 14): ein Ziel minimieren, das andere als Nebenbedingung schrittweise verschärfen. * Ergebnis ist keine Lösung, sondern eine Kurve — plus die Angabe, was jeder eingesparte Kilogramm CO₂ an Mehrkosten bedeutet.
Abnahmekriterien. - [ ] Die Pareto-Front ist berechnet und gezeichnet, nicht nur beschrieben. - [ ] Für mindestens zwei Punkte ist der Aufpreis je eingesparter Einheit ausgerechnet. - [ ] Es ist geprüft und dokumentiert, welche Punkte der Front eine gewichtete Summe niemals finden würde — und warum. - [ ] Die Entscheidungsvorlage nennt drei Punkte zur Auswahl, nicht dreißig.
P11 — Vom Skript zum Dienst: das Modell übergeben
Schwierigkeit: ⭐⭐⭐ · Kapitel: Kapitel 22, Kapitel 23 · Zeit: ca. 16 Stunden
Ausgangslage. Ihr Modell rechnet. Jetzt soll es jemand anderes benutzen — jemand, der weder Python noch Ihr Notebook kennt, und der es auch dann noch braucht, wenn Sie im Urlaub sind. Nehmen Sie eines Ihrer eigenen Projekte P1–P10 als Grundlage; dies ist kein neues Modell, sondern der Schritt danach.
Modellskizze. Vier Schichten, jede einzeln abnehmbar: * Domäne: Eingabedaten als validierte Objekte (Pydantic), nicht als lose Dictionaries — ein falscher Wert soll beim Einlesen auffallen, nicht im Solver (Kapitel 22). * Kern: Modellaufbau und Lösung hinter einer Funktion, die ein Loesung-Objekt zurückgibt und alle Statusfälle behandelt. * Tests: eine Suite, die auch die Fälle abdeckt, in denen es keine Lösung gibt (Kapitel 23). * Schnittstelle: ein HTTP-Dienst, der ein JSON entgegennimmt und eines zurückgibt.
Abnahmekriterien. - [ ] Eine ungültige Eingabe wird vor dem Solver abgewiesen, mit einer Meldung, die den Fehler benennt. - [ ] Die Testsuite läuft grün und enthält mindestens einen INFEASIBLE-Fall. - [ ] Ein Mutationstest zeigt, dass die Tests eine absichtlich eingebaute Modelländerung auch wirklich bemerken. - [ ] Der Dienst antwortet auf eine Beispielanfrage per curl — dokumentiert samt Aufruf. - [ ] Es gibt eine Betriebsseite: Was tun, wenn der Solver INFEASIBLE meldet? Der Notfallplan gehört dazu, nicht die Fehlermeldung (Anhang C).
🎯 Der Prüfstein Geben Sie das Projekt einer Person, die nicht dabei war, zusammen mit dem README — und sagen Sie nichts. Was sie nicht allein zum Laufen bringt, ist nicht fertig.
P8 — Freies Projekt aus Ihrem eigenen Umfeld
Schwierigkeit: offen · Zeit: 10–25 Stunden
Der Auftrag. Nehmen Sie die Notiz aus der Aufgabe Eigenes Problem zerlegen (Kapitel 1) hervor — das Problem aus Ihrem eigenen Alltag oder Beruf. Bauen Sie es.
Bewährte Kandidaten aus früheren Kursen:
| Problem | Verfahren | Kapitel |
|---|---|---|
| Sitzordnung für eine Hochzeit (Sympathien/Antipathien) | CP-SAT | Kapitel 7 |
| Trainingsplan eines Sportvereins (Hallen, Trainer, Altersgruppen) | CP-SAT | Kapitel 7 |
| Budgetaufteilung auf Projekte mit Abhängigkeiten | MILP | Kapitel 6 |
| Schnittoptimierung für Zuschnitt (Holz, Blech, Stoff) | MILP / Spaltengenerierung | Kapitel 10 |
| Speiseplan unter Nährwert- und Budgetgrenzen | LP | Kapitel 5 |
| Prüfungsplanung (keine Kollisionen, Erholungspausen) | CP-SAT | Kapitel 7 |
| Ladeplanung für E-Fahrzeugflotte (Lastspitzen vermeiden) | MILP + Cumulative | Kapitel 6, Kapitel 7 |
| Bewässerungsplan im Kleingarten (Wasser, Wetterprognose) | Stochastisch | Kapitel 12 |
Abnahmekriterien (für jedes freie Projekt). - [ ] Die Bausteine-Vorlage ist ausgefüllt und liegt dem Projekt bei. - [ ] Eine Kleinstinstanz ist von Hand nachgerechnet und stimmt mit dem Solver überein. - [ ] Alle Nebenbedingungen werden nach dem Lösen per assert geprüft. - [ ] Es gibt einen Vergleich gegen die bisherige (manuelle) Lösung — mit Zahlen. - [ ] Das Ergebnis ist erklärbar: Warum diese Lösung, warum nicht die naheliegende Alternative, was würde sie verbessern? - [ ] Die Grenzen des Modells sind dokumentiert: Was bildet es nicht ab?
Eine Bitte zum Schluss
Wenn Sie ein Projekt fertig haben, machen Sie zwei Dinge:
Erstens: Zeigen Sie es jemandem, der nichts von Optimierung versteht. Wenn diese Person nach fünf Minuten sagen kann, was das Programm tut und warum sie dem Ergebnis trauen sollte, haben Sie es richtig gemacht. Wenn nicht, fehlt die Erklärbarkeit — nicht das Verständnis Ihres Gegenübers.
Zweitens: Schreiben Sie auf, was schiefgegangen ist. Jeder, der optimiert, produziert Fehler wie die in diesem Buch besprochenen (siehe z. B. Abschnitt 5.7 oder Anhang C). Wer sie dokumentiert, macht sie kein zweites Mal — und hilft dem Nächsten.
Viel Erfolg.