<aclass="brand"href="index.html"><svgclass="icon"aria-hidden="true"><usehref="#icon-book"></use></svg><span>Optimierte Entscheidungsfindung mit Python</span></a>
<navclass="sidebar"id="sidebar"aria-label="Kapitelnavigation"><divclass="sidebar-inhalt"><detailsclass="sidebar-gruppe"><summary>Einstieg</summary><ul><lidata-kapitel="vorwort.html"><ahref="vorwort.html"><spanclass="fortschritt-haken"><svgclass="icon"aria-hidden="true"><usehref="#icon-check"></use></svg></span><span>Vorwort & Lesehilfe</span></a></li><lidata-kapitel="notation.html"><ahref="notation.html"><spanclass="fortschritt-haken"><svgclass="icon"aria-hidden="true"><usehref="#icon-check"></use></svg></span><span>Notation & Abkürzungen</span></a></li></ul></details><detailsclass="sidebar-gruppe"><summary>Teil I: Grundlagen des Operations Research</summary><ul><lidata-kapitel="einfuehrung.html"><ahref="einfuehrung.html"><spanclass="fortschritt-haken"><svgclass="icon"aria-hidden="true"><usehref="#icon-check"></use></svg></span><span>Kapitel 1: Einführung in Operations Research — Vom Ursprung zur mathematischen Entscheidungsfindung</span></a></li><lidata-kapitel="fundament.html"><ahref="fundament.html"><spanclass="fortschritt-haken"><svgclass="icon"aria-hidden="true"><usehref="#icon-check"></use></svg></span><span>Kapitel 2: Das mathematische Fundament — Vektoren, Matrizen, Konvexität{idx:Konvexität}</span></a></li><lidata-kapitel="oekosystem.html"><ahref="oekosystem.html"><spanclass="fortschritt-haken"><svgclass="icon"aria-hidden="true"><usehref="#icon-check"></use></svg></span><span>Kapitel 3: Das Python-Ökosystem für OR — Solver, Bindings und Modellierungsschichten</span></a></li><lidata-kapitel="modellierung.html"><ahref="modellierung.html"><spanclass="fortschritt-haken"><svgclass="icon"aria-hidden="true"><usehref="#icon-check"></use></svg></span><span>Kapitel 4: Vom Management-Wunsch zum Modell</span></a></li><lidata-kapitel="synthese-grundlagen.html"><ahref="synthese-grundlagen.html"><spanclass="fortschritt-haken"><svgclass="icon"aria-hidden="true"><usehref="#icon-check"></use></svg></span><span>Synthese Teil I</span></a></li></ul></details><detailsclass="sidebar-gruppe"><summary>Teil II: Die Kernverfahren der deterministischen Optimierung</summary><ul><lidata-kapitel="lp.html"><ahref="lp.html"><spanclass="fortschritt-haken"><svgclass="icon"aria-hidden="true"><usehref="#icon-check"></use></svg></span><span>Kapitel 5: Lineare Programmierung — Simplex, Dualität und Schattenpreise</span></a></li><lidata-kapitel="milp.html"><ahref="milp.html"><spanclass="fortschritt-haken"><svgclass="icon"aria-hidden="true"><usehref="#icon-check"></use></svg></span><span>Kapitel 6: Gemischt-ganzzahlige Optimierung — Diskrete Entscheidungen und Branch-and-Bound{idx:Branch-and-Bound}</span></a></li><lidata-kapitel="cpsat.html"><ahref="cpsat.html"><spanclass="fortschritt-haken"><svgclass="icon"aria-hidden="true"><usehref="#icon-check"></use></svg></span><span>Kapitel 7: Constraint Programming mit CP-SAT{idx:CP-SAT} — Logik, Scheduling und Zuweisung</span></a></li><lidata-kapitel="graphen.html"><ahref="graphen.html"><spanclass="fortschritt-haken"><svgclass="icon"aria-hidden="true"><usehref="#icon-check"></use></svg></span><span>Kapitel 8: Graphen, Flüsse und Touren — Min-Cost-Flow, Matching und VRP</span></a></li><lidata-kapitel="metaheuristiken.html"><ahref="metaheuristiken.html"><spanclass="fortschritt-haken"><svgclass="icon"aria-hidden="true"><usehref="#icon-check"></use></svg></span><span>Kapitel 9: Metaheuristiken — wenn der exakte Solver aussteigt</span></a></li><lidata-kapitel="dekomposition.html"><ahref="dekomposition.html"><spanclass="fortschritt-haken"><svgclass="icon"aria-hidden="true"><usehref="#icon-check"></use></svg></span><span>Kapitel 10: Spaltengenerierung — das Modell umbauen statt die Lösung raten</span></a></li><lidata-kapitel="synthese-kernverfahren.html"><ahref="synthese-kernverfahren.html"><spanclass="fortschritt-haken"><svgclass="icon"aria-hidden="true"><usehref="#icon-check"></use></svg></span><span>Synthese Teil II</span></a></li></ul></details><detailsclass="sidebar-gruppe"><summary>Teil III:
<navclass="prev-next"><aclass="prev-next-knopf prev-next-prev"href="synthese-praxis.html"><svgclass="icon"aria-hidden="true"><usehref="#icon-chevron-left"></use></svg><span><small>Zurück</small>Synthese Teil V</span></a><aclass="prev-next-knopf prev-next-next"href="anhang-loesungen.html"><span><small>Weiter</small>Anhang A: Lösungen zu allen Übungsaufgaben</span><svgclass="icon"aria-hidden="true"><usehref="#icon-chevron-right"></use></svg></a></nav>
<h1id="projektwerkstatt-elf-eigene-anwendungen">Projektwerkstatt — elf eigene Anwendungen</h1>
<divclass="card card-blick">
<blockquote>
<p><strong>📌 Auf einen Blick</strong></p>
<p><strong>Worum geht es?</strong> Um den Schritt, auf den der ganze Kurs zuläuft: <strong>eine eigene Anwendung bauen.</strong> Elf vollständig ausgearbeitete Projektaufträge, jeder mit Datenquellen, Modellskizze, Abnahmekriterien und Stolperfallen. P1–P8 bauen je ein Modell; <strong>P9–P11 setzen dort an, wo eines schon steht</strong> — wenn es zu langsam wird, wenn zwei Ziele gegeneinanderstehen, wenn es jemand anderes benutzen soll.</p>
<p><strong>Voraussetzungen:</strong> je Projekt angegeben.</p>
<p><strong>Zeitbedarf:</strong> 10–25 Stunden je Projekt.</p>
</blockquote>
</div>
<hr/>
<h2id="wie-sie-ein-projekt-bearbeiten">Wie Sie ein Projekt bearbeiten</h2>
<p>Halten Sie sich an diese Reihenfolge — sie ist aus vielen gescheiterten und einigen gelungenen Projekten destilliert:</p>
<table>
<colgroup>
<colstyle="width: 25%"/>
<colstyle="width: 25%"/>
<colstyle="width: 25%"/>
<colstyle="width: 25%"/>
</colgroup>
<thead>
<trclass="header">
<th>Phase</th>
<th>Dauer</th>
<th>Ergebnis</th>
<th>Häufigster Fehler</th>
</tr>
</thead>
<tbody>
<trclass="odd">
<td><strong>1. Zerlegen</strong></td>
<td>10 %</td>
<td>Ausgefüllte Bausteine-Vorlage (<ahref="einfuehrung.html#sec:einfuehrung-die-vier-universellen-bausteine-jedes-or">Abschnitt 1.6</a>) auf <strong>Papier</strong></td>
<td>Sofort programmieren</td>
</tr>
<trclass="even">
<td><strong>2. Kleinstinstanz</strong></td>
<td>15 %</td>
<td>Modell mit 3–5 Elementen, Lösung <strong>von Hand</strong> geprüft</td>
<p><strong>🎯 Die wichtigste Regel</strong><strong>Phase 2 ist nicht optional.</strong> 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.</p>
</blockquote>
<hr/>
<h2id="p1-vertretungsplaner-für-eine-schule">P1 — Vertretungsplaner für eine Schule</h2>
<p><strong>Ausgangslage.</strong> 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.</p>
<p><strong>Daten.</strong> Stundenplan (CSV: Klasse, Tag, Stunde, Fach, Lehrkraft, Raum) — in diesem Projektordner erzeugen die Skripte <code>stundenplan*.py</code> genau solche Dateien und eignen sich als Datenquelle. Zusätzlich: Qualifikationsmatrix, Deputate, Abwesenheitsmeldungen.</p>
<p><strong>Modellskizze.</strong> * Variablen: <spanclass="math inline">x_{p,s} \in \{0,1\}</span> — Person <spanclass="math inline">p</span> übernimmt Slot <spanclass="math inline">s</span>. * 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. * <ahref="anhang-glossar.md#gloss:solver"class="glossar-link">Solver</a>: <ahref="anhang-glossar.md#gloss:cp-sat"class="glossar-link">CP-SAT</a>.</p>
<p><strong>Abnahmekriterien.</strong> - [ ] Läuft in unter 10 Sekunden für eine ganze Schule (60 Lehrkräfte, 30 Slots). - [ ] Liefert <strong>immer</strong> einen Plan — auch wenn nicht alle Slots besetzbar sind (<ahref="anhang-glossar.md#gloss:relaxation"class="glossar-link">Relaxation</a>). - [ ] Weist je Zuweisung eine Begründung aus. - [ ] Ausgabe als CSV <strong>und</strong> als lesbare Tagestabelle. - [ ] Vergleich gegen die manuelle Lösung: Wie viele Wünsche werden erfüllt?</p>
<p><strong>Stolperfallen.</strong> * Zu viele harte Regeln → <code>INFEASIBLE</code> 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.</p>
<p><strong>Erweiterungen.</strong> Mehrtagesplanung; Raumkonflikte; Springerstunden; Schnittstelle zum Schulverwaltungsprogramm.</p>
<hr/>
<h2id="p2-schichtplanung-für-ein-pflegeteam">P2 — Schichtplanung für ein Pflegeteam</h2>
<p><strong>Ausgangslage.</strong> 25 Pflegekräfte, drei Schichten täglich, 28-Tage-Zyklus. Es gelten Arbeitszeitgesetz, Tarifvertrag, Qualifikationsmix und individuelle Wünsche.</p>
<p><strong>Modellskizze.</strong> * Variablen: <spanclass="math inline">x_{p,t,s} \in \{0,1\}</span> — Person, Tag, Schicht. * Hart: Mindestbesetzung je Schicht <strong>und</strong> 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: <ahref="anhang-glossar.md#gloss:constraint-programming-cp"class="glossar-link">CP</a>-<ahref="anhang-glossar.md#gloss:sat-boolean-satisfiability"class="glossar-link">SAT</a> mit Intervall- und Cumulative-Constraints.</p>
<p><strong>Abnahmekriterien.</strong> - [ ] Alle gesetzlichen Regeln nachweislich eingehalten (per <code>assert</code> geprüft). - [ ] Wunscherfüllungsquote wird ausgewiesen und ist fair verteilt (<ahref="anhang-glossar.md#gloss:gini-koeffizient"class="glossar-link">Gini-Koeffizient</a>). - [ ] Läuft in unter 60 Sekunden. - [ ] Bei Unlösbarkeit: Notfallplan plus benannte Ursache.</p>
<p><strong>Stolperfallen.</strong> Der 28-Tage-Zyklus erzeugt viele Variablen (25 × 28 × 3 = 2100) — <ahref="anhang-glossar.md#gloss:symmetriebrechung"class="glossar-link">Symmetriebrechung</a> und gute Suchheuristiken werden wichtig. Fairness über einen Monat ist etwas anderes als Fairness über eine Woche.</p>
<h2id="p3-tourenplanung-für-einen-lieferdienst">P3 — Tourenplanung für einen Lieferdienst</h2>
<blockquote>
<p><strong>Schwierigkeit:</strong> ⭐⭐ · <strong>Kapitel:</strong><ahref="graphen.html#kap-graphen">Kapitel 8</a> · <strong>Zeit:</strong> ca. 12 Stunden</p>
</blockquote>
<p><strong>Ausgangslage.</strong> Ein regionaler Lieferdienst fährt täglich 40–80 Adressen mit 4 Fahrzeugen an. Kunden haben Zeitfenster, Fahrzeuge Kapazitäten, Fahrer Arbeitszeiten.</p>
<p><strong>Daten.</strong> Adressen aus einer CSV; Entfernungen über OpenStreetMap (<code>osmnx</code>, <code>openrouteservice</code>) oder als Luftlinie mit Umwegfaktor 1,3 als Näherung.</p>
<p><strong>Modellskizze.</strong><ahref="anhang-glossar.md#gloss:or-tools"class="glossar-link">OR-Tools</a><ahref="anhang-glossar.md#gloss:routing-bibliothek"class="glossar-link">Routing-Bibliothek</a> mit Kapazitäts- und Zeitdimension; <ahref="anhang-glossar.md#gloss:metaheuristik"class="glossar-link">Metaheuristik</a><code>GUIDED_LOCAL_SEARCH</code>, Zeitlimit 30 Sekunden.</p>
<p><strong>Abnahmekriterien.</strong> - [ ] Alle Kunden werden innerhalb ihrer Zeitfenster beliefert. - [ ] Vergleich gegen die bisherige manuelle Tourenplanung: Ersparnis in km und Minuten. - [ ] Kartendarstellung der Touren (<code>folium</code>). - [ ] Robust gegen Ausfall eines Fahrzeugs (Neuplanung in unter 30 s).</p>
<p><strong>Stolperfallen.</strong> 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 <ahref="graphen.html#kap-graphen">Kapitel 8</a>).</p>
<hr/>
<h2id="p4-standort--und-lagernetzplanung">P4 — Standort- und Lagernetzplanung</h2>
<p><strong>Ausgangslage.</strong> Ein Handelsunternehmen prüft, welche von 12 möglichen Lagerstandorten eröffnet werden sollen, um 60 Filialen zu versorgen.</p>
<p><strong>Modellskizze.</strong> Kombiniertes Standort- und Transportproblem: * <spanclass="math inline">y_j \in \{0,1\}</span> — Lager <spanclass="math inline">j</span> eröffnen (Fixkosten). * <spanclass="math inline">x_{ij} \ge 0</span> — Menge von Lager <spanclass="math inline">j</span> zu Filiale <spanclass="math inline">i</span>. * Kopplung: <spanclass="math inline">x_{ij} \le M\,y_j</span>; Kapazität je Lager; Bedarfsdeckung je Filiale. * Ziel: Fixkosten + Transportkosten minimieren.</p>
<p><strong>Abnahmekriterien.</strong> - [ ] <ahref="anhang-glossar.md#gloss:sensitivitaetsanalyse"class="glossar-link">Sensitivitätsanalyse</a>: 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.</p>
<p><strong>Stolperfallen.</strong> Big-M zu groß wählen (<ahref="milp.html#kap-milp">Kapitel 6</a>) — hier ist die Lagerkapazität die natürliche Wahl. Fixkosten sind einmalig, Transportkosten laufend: <strong>Barwerte rechnen</strong>, nicht einfach addieren.</p>
<hr/>
<h2id="p5-produktionsplanung-mit-rüstkosten">P5 — Produktionsplanung mit Rüstkosten</h2>
<p><strong>Ausgangslage.</strong> Eine Fertigung produziert 15 Varianten auf 4 Maschinen. Jeder Produktwechsel kostet <ahref="anhang-glossar.md#gloss:ruestzeit"class="glossar-link">Rüstzeit</a>; die Rüstzeit hängt von der Reihenfolge ab.</p>
<p><strong>Modellskizze.</strong> 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 <code>AddNoOverlap</code> und reihenfolgeabhängigen Übergangszeiten.</p>
<p><strong>Abnahmekriterien.</strong> - [ ] 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?</p>
<hr/>
<h2id="p6-portfolio-rebalancer-für-ein-privatdepot">P6 — Portfolio-Rebalancer für ein Privatdepot</h2>
<blockquote>
<p><strong>Schwierigkeit:</strong> ⭐⭐⭐ · <strong>Kapitel:</strong><ahref="finanzdaten.html#kap-finanzdaten">Kapitel 18</a> bis <ahref="handelsmaschine.html#kap-handelsmaschine">Kapitel 21</a> · <strong>Zeit:</strong> ca. 20 Stunden</p>
<p>⚠️ <strong>Keine Anlageberatung.</strong> Dieses Projekt dient dem Methodenverständnis. Setzen Sie kein echtes Geld auf ein selbstgebautes Modell, dessen Grenzen Sie nicht vollständig verstehen.</p>
</blockquote>
<p><strong>Ausgangslage.</strong> 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.</p>
<p><strong>Modellskizze.</strong> * Variablen: Zielgewichte <spanclass="math inline">w_i</span>; Binärvariablen für „Position wird gehandelt“. * Hart: Vollinvestition, keine Leerverkäufe, Positionsobergrenzen, Mindestordergröße (semikontinuierlich, <ahref="milp.html#kap-milp">Kapitel 6</a>), höchstens <spanclass="math inline">K</span> Transaktionen je <ahref="anhang-glossar.md#gloss:rebalancing"class="glossar-link">Rebalancing</a>. * Ziel: erwartete Rendite − Risikoterm −<ahref="anhang-glossar.md#gloss:transaktionskosten"class="glossar-link">Transaktionskosten</a>− Steuerwirkung. * Solver: <ahref="anhang-glossar.md#gloss:cvxpy"class="glossar-link">CVXPY</a> (konvexer Teil) oder <ahref="anhang-glossar.md#gloss:miqp"class="glossar-link">MIQP</a> für die Kardinalität.</p>
<p><strong>Abnahmekriterien.</strong> - [ ] Toleranzband: Es wird nur gehandelt, wenn die Abweichung > 5 Prozentpunkte beträgt. - [ ] Alle Kosten (Ordergebühr, Spread, Steuer) sind explizit ausgewiesen. - [ ] <ahref="anhang-glossar.md#gloss:backtest"class="glossar-link">Backtest</a> über 5 Jahre mit Lookahead-Selbsttest. - [ ] Vergleich gegen: nie rebalancen, jährlich rebalancen, Gleichgewichtung. - [ ] Bericht, den ein Nicht-Fachmann versteht.</p>
<p><strong>Stolperfallen.</strong> Steuern sind pfadabhängig (FIFO, Freibetrag) und passen nicht sauber in ein einperiodiges Modell — Näherung wählen und die Näherung <strong>dokumentieren</strong>. Und: Wenn Ihre Strategie die Gleichgewichtung nicht schlägt, ist das ein Ergebnis, kein Misserfolg.</p>
<hr/>
<h2id="p7-risikoreport-mit-cvar-und-stresstests">P7 — Risikoreport mit CVaR und Stresstests</h2>
<p><strong>Inhalte des Berichts.</strong> * <ahref="anhang-glossar.md#gloss:value-at-risk-var"class="glossar-link">VaR</a> und <ahref="anhang-glossar.md#gloss:conditional-value-at-risk-cvar"class="glossar-link">CVaR</a> auf 95 % und 99 %, historisch <strong>und</strong> Monte-Carlo-simuliert. * Risikobeiträge je Position (<em>marginal CVaR</em>): 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 (<ahref="anhang-glossar.md#gloss:herfindahl-index"class="glossar-link">Herfindahl-Index</a>, effektive Titelzahl).</p>
<p><strong>Abnahmekriterien.</strong> - [ ] 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 €.“</p>
<p><strong>Stolperfallen.</strong> Die <ahref="anhang-glossar.md#gloss:wurzel-zeit-regel"class="glossar-link">Wurzel-Zeit-Regel</a> bei CVaR (<ahref="cvar.html#kap-cvar">Kapitel 20</a>) — nicht blind anwenden. Korrelationen sind in Krisen andere als im Mittel: Stresstest mit erhöhten Korrelationen rechnen.</p>
<p><strong>Ausgangslage.</strong> 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.</p>
<p><strong>Modellskizze.</strong> Zwei Verfahren am <strong>selben</strong> Problem, verglichen unter <strong>gleichem Zeitbudget</strong>: * Exakt: <ahref="anhang-glossar.md#gloss:gemischt-ganzzahlige-optimierung-milp"class="glossar-link">MILP</a> oder CP-SAT wie in P3, mit Zeitlimit und protokolliertem Gap. * Heuristisch: Startlösung mit einer Faustregel, dann Verbesserung durch <ahref="anhang-glossar.md#gloss:simulated-annealing"class="glossar-link">Simulated Annealing</a> oder Large Neighborhood Search (<ahref="metaheuristiken.html#kap-metaheuristiken">Kapitel 9</a>). * Messgröße ist nicht „wer gewinnt”, sondern <strong>ab welcher Instanzgröße</strong> sich das Blatt wendet.</p>
<p><strong>Abnahmekriterien.</strong> - [ ] Eine Tabelle über mindestens vier Instanzgrößen: exakt gegen heuristisch, jeweils Zielwert und Laufzeit. - [ ] Der Umschlagpunkt ist auf ±50 Kunden eingegrenzt und <strong>benannt</strong>. - [ ] 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.</p>
<blockquote>
<p>⚠️ <strong>Die Falle, in die hier fast jeder tappt:</strong> die Heuristik nur auf großen Instanzen zu testen, wo man das Optimum nicht kennt. Dann sieht jede Lösung gut aus.</p>
</blockquote>
<hr/>
<h2id="p10-zwei-ziele-eine-entscheidung-kosten-gegen-co₂">P10 — Zwei Ziele, eine Entscheidung: Kosten gegen CO₂</h2>
<p><strong>Ausgangslage.</strong> Die Geschäftsführung will „günstiger <strong>und</strong> 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.</p>
<p><strong>Modellskizze.</strong> Ein Transport-, Beschaffungs- oder Produktionsmodell mit zwei Zielen: * Erst beide Ziele <strong>einzeln</strong> optimieren — das gibt die Eckpunkte und damit den Rahmen. * Dann die Front über das <spanclass="math inline">\varepsilon</span>-Constraint-Verfahren abfahren (<ahref="mehrziel.html#kap-mehrziel">Kapitel 14</a>): ein Ziel minimieren, das andere als Nebenbedingung schrittweise verschärfen. * Ergebnis ist <strong>keine Lösung, sondern eine Kurve</strong> — plus die Angabe, was jeder eingesparte Kilogramm CO₂ an Mehrkosten bedeutet.</p>
<p><strong>Abnahmekriterien.</strong> - [ ] Die <ahref="anhang-glossar.md#gloss:pareto-front"class="glossar-link">Pareto-Front</a> 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 <strong>gewichtete Summe niemals</strong> finden würde — und warum. - [ ] Die Entscheidungsvorlage nennt drei Punkte zur Auswahl, nicht dreißig.</p>
<p><strong>Ausgangslage.</strong> 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 <strong>eines Ihrer eigenen</strong> Projekte P1–P10 als Grundlage; dies ist kein neues Modell, sondern der Schritt danach.</p>
<p><strong>Modellskizze.</strong> Vier Schichten, jede einzeln abnehmbar: * <strong>Domäne:</strong> Eingabedaten als validierte Objekte (Pydantic), nicht als lose Dictionaries — ein falscher Wert soll beim Einlesen auffallen, nicht im Solver (<ahref="praxisfallen.html#kap-praxisfallen">Kapitel 22</a>). * <strong>Kern:</strong> Modellaufbau und Lösung hinter einer Funktion, die ein <code>Loesung</code>-Objekt zurückgibt und <strong>alle</strong> Statusfälle behandelt. * <strong>Tests:</strong> eine Suite, die auch die Fälle abdeckt, in denen es <em>keine</em> Lösung gibt (<ahref="testing.html#kap-testing">Kapitel 23</a>). * <strong>Schnittstelle:</strong> ein HTTP-Dienst, der ein JSON entgegennimmt und eines zurückgibt.</p>
<p><strong>Abnahmekriterien.</strong> - [ ] Eine ungültige Eingabe wird <strong>vor</strong> 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 <code>curl</code> — dokumentiert samt Aufruf. - [ ] Es gibt eine Betriebsseite: Was tun, wenn der Solver <code>INFEASIBLE</code> meldet? Der Notfallplan gehört dazu, nicht die Fehlermeldung (<ahref="anhang-fehlerdiagnose.html#anhang-fehlerdiagnose">Anhang C</a>).</p>
<blockquote>
<p><strong>🎯 Der Prüfstein</strong> 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.</p>
</blockquote>
<hr/>
<h2id="p8-freies-projekt-aus-ihrem-eigenen-umfeld">P8 — Freies Projekt aus Ihrem eigenen Umfeld</h2>
<p><strong>Der Auftrag.</strong> Nehmen Sie die Notiz aus der Aufgabe <em>Eigenes Problem zerlegen</em> (<ahref="einfuehrung.html#kap-einfuehrung">Kapitel 1</a>) hervor — das Problem aus Ihrem eigenen Alltag oder Beruf. Bauen Sie es.</p>
<p><strong>Bewährte Kandidaten aus früheren Kursen:</strong></p>
<table>
<colgroup>
<colstyle="width: 33%"/>
<colstyle="width: 33%"/>
<colstyle="width: 33%"/>
</colgroup>
<thead>
<trclass="header">
<th>Problem</th>
<th>Verfahren</th>
<th>Kapitel</th>
</tr>
</thead>
<tbody>
<trclass="odd">
<td>Sitzordnung für eine Hochzeit (Sympathien/Antipathien)</td>
<p><strong>Abnahmekriterien (für jedes freie Projekt).</strong> - [ ] 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 <code>assert</code> 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 <strong>nicht</strong> ab?</p>
<hr/>
<h2id="eine-bitte-zum-schluss">Eine Bitte zum Schluss</h2>
<p>Wenn Sie ein Projekt fertig haben, machen Sie zwei Dinge:</p>
<p><strong>Erstens: Zeigen Sie es jemandem, der nichts von Optimierung versteht.</strong> 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.</p>
<p><strong>Zweitens: Schreiben Sie auf, was schiefgegangen ist.</strong> Jeder, der optimiert, produziert Fehler wie die in diesem Buch besprochenen (siehe z. B. <ahref="lp.html#sec:lp-die-vorzeichenfalle-bei-schattenpreisen">Abschnitt 5.7</a> oder <ahref="anhang-fehlerdiagnose.html#anhang-fehlerdiagnose">Anhang C</a>). Wer sie dokumentiert, macht sie kein zweites Mal — und hilft dem Nächsten.</p>
<navclass="prev-next"><aclass="prev-next-knopf prev-next-prev"href="synthese-praxis.html"><svgclass="icon"aria-hidden="true"><usehref="#icon-chevron-left"></use></svg><span><small>Zurück</small>Synthese Teil V</span></a><aclass="prev-next-knopf prev-next-next"href="anhang-loesungen.html"><span><small>Weiter</small>Anhang A: Lösungen zu allen Übungsaufgaben</span><svgclass="icon"aria-hidden="true"><usehref="#icon-chevron-right"></use></svg></a></nav>