Phase 8.1: Synthese-Seiten je Teil - und die gebrochene Lesekette

Setzt Paket 5 aus Verbesserungen_02.md um (den Teil, der nicht
zurueckgestellt wurde). Fuenf neue Dateien 19_/29_/39_/49_/52_Synthese_*.md,
je eine am Ende eines Teils, mit eigener Website-Seite ueber SONDERSEITEN -
sie tragen bewusst keine "# Kapitel:"-Ueberschrift, weil sie keine Kapitel
sind, sondern der Rueckblick auf einen Teil.

Der Entwurf musste sich abgrenzen: Die Teil-Einleitungen haben bereits
Entscheidungsdiagramme. Eine zweite Matrix am Teil-Ende waere eine Dopplung
gewesen. Die Synthesen leisten deshalb, was eine Einleitung nicht kann - den
Vergleich ueber die Kapitel hinweg (Verfahren nebeneinander, mit der Spalte
"wo es aufhoert"), eine Tabelle "was dieser Teil gemessen hat" (Behauptung
gegen Messung gegen Fundstelle) und drei Fehler, die der Teil verhindert.
Zitiert wird ausschliesslich, was im Buch tatsaechlich gerechnet wird.

Drei Funde beim Einbau:

* Teil III sagte "die drei Kapitel dieses Teils", hat aber fuenf. Phase 3
  hatte Mehrziel und Predict-then-Optimize hinzugefuegt, die Einleitung
  blieb stehen.
* 50_Praxis.md verwies auf die Projektwerkstatt mit "acht eigene
  Anwendungen" - sie hat elf.
* Und der eigentliche Fund: Die Lesekette der Quelldateien fuehrte an ACHT
  Kapiteln vorbei. 12_Python_Oekosystem zeigte direkt auf
  20_Lineare_Programmierung, 23_Graphen direkt auf 30_QP, 32_Dynamische
  direkt auf 40_Finanzdaten, 50_Praxis direkt auf die Projektwerkstatt. Wer
  der Kette folgte, uebersprang acht von 23 Kapiteln - darunter
  Metaheuristiken, Spaltengenerierung, Strukturbruecke, Supply-Chain und das
  ganze Testing-Kapitel. Zehn weitere Dateien hatten gar keine
  Navigationszeile.

Zur Reichweite, damit sie nicht ueberschaetzt wird: Diese Zeilen stehen nur
in den Quelldateien. entferne_navigation() streicht sie aus dem
Gesamtdokument, und die Website baut ihre Vor/Zurueck-Knoepfe selbst aus
DATEIEN. PDF und Website waren nie betroffen - wohl aber jeder, der die
Markdown-Dateien im Repository liest, und das wird nach der
Veroeffentlichung der Normalfall sein.

Die Kette ist jetzt ueber alle 35 Uebergaenge geschlossen, und --check
bewacht sie: Fehlt eine Zeile oder zeigt sie an der in DATEIEN folgenden
Datei vorbei, ist der Lauf rot. Gegengetestet mit beiden Bruchformen.

Stand: 36 Dateien, 296 Abschnitte, 815 Querverweise, 328 Indexmarken, 76
Programme (unveraendert), 33 pytest-Tests, PDF 758 Seiten.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
dschlueter 2026-09-08 12:10:02 +02:00
commit 9c83716095
73 changed files with 2185 additions and 79 deletions

View file

@ -23,7 +23,7 @@ Dieses Verzeichnis ist die Wurzel; alle Skripte leiten ihre Pfade daraus ab
(`BASIS = dirname(dirname(__file__))` bzw. `dirname(HIER)`).
```
Operations_Research_mit_Python_Version_04/ Quelle: 31 Kapiteldateien + Build-Skripte
Operations_Research_mit_Python_Version_04/ Quelle: 36 Kapiteldateien + Build-Skripte
bilder_04/ Quelle: Diagramme + erzeuge_*.py-Generatoren
Operations_Research_mit_Python_Version_04.md generiert: Gesamtdokument
Operations_Research_mit_Python_Version_04.pdf generiert: PDF (xelatex)

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -566,6 +566,12 @@
<li><a href="#sec:modellierung-selbsttest" id="toc-sec:modellierung-selbsttest">4.10 Selbsttest</a></li>
<li><a href="#sec:modellierung-zusammenfassung" id="toc-sec:modellierung-zusammenfassung">4.11 Zusammenfassung</a></li>
</ul></li>
<li><a href="#synthese-teil-i-grundlagen-auf-einen-blick" id="toc-synthese-teil-i-grundlagen-auf-einen-blick">Synthese Teil I — Grundlagen auf einen Blick</a>
<ul>
<li><a href="#was-welches-kapitel-klärt" id="toc-was-welches-kapitel-klärt">Was welches Kapitel klärt</a></li>
<li><a href="#die-reihenfolge-ist-die-aussage" id="toc-die-reihenfolge-ist-die-aussage">Die Reihenfolge ist die Aussage</a></li>
<li><a href="#wenn-sie-nur-eines-mitnehmen" id="toc-wenn-sie-nur-eines-mitnehmen">Wenn Sie nur eines mitnehmen</a></li>
</ul></li>
<li><a href="#teil-kernverfahren" id="toc-teil-kernverfahren">Teil II: Die Kernverfahren der deterministischen Optimierung</a></li>
<li><a href="#kap-lp" id="toc-kap-lp">Kapitel 5: Lineare Programmierung — Simplex, Dualität und Schattenpreise</a>
<ul>
@ -720,6 +726,13 @@
<li><a href="#sec:dekomposition-selbsttest" id="toc-sec:dekomposition-selbsttest">10.10 Selbsttest</a></li>
<li><a href="#sec:dekomposition-zusammenfassung" id="toc-sec:dekomposition-zusammenfassung">10.11 Zusammenfassung</a></li>
</ul></li>
<li><a href="#synthese-teil-ii-die-kernverfahren-nebeneinander" id="toc-synthese-teil-ii-die-kernverfahren-nebeneinander">Synthese Teil II — Die Kernverfahren nebeneinander</a>
<ul>
<li><a href="#die-entscheidungsmatrix" id="toc-die-entscheidungsmatrix">Die Entscheidungsmatrix</a></li>
<li><a href="#was-dieser-teil-gemessen-hat" id="toc-was-dieser-teil-gemessen-hat">Was dieser Teil gemessen hat</a></li>
<li><a href="#drei-fehler-die-dieser-teil-verhindert" id="toc-drei-fehler-die-dieser-teil-verhindert">Drei Fehler, die dieser Teil verhindert</a></li>
<li><a href="#wenn-sie-nur-eines-mitnehmen-1" id="toc-wenn-sie-nur-eines-mitnehmen-1">Wenn Sie nur eines mitnehmen</a></li>
</ul></li>
<li><a href="#teil-nichtlinear" id="toc-teil-nichtlinear">Teil III: Nichtlinearität, Unsicherheit und mehrperiodige Dynamik</a></li>
<li><a href="#kap-qp-nlp" id="toc-kap-qp-nlp">Kapitel 11: Quadratische und nichtlineare Optimierung — KKT, Lagrange, Konvexität</a>
<ul>
@ -833,6 +846,13 @@
<li><a href="#sec:prognose-selbsttest" id="toc-sec:prognose-selbsttest">15.11 Selbsttest</a></li>
<li><a href="#sec:prognose-zusammenfassung" id="toc-sec:prognose-zusammenfassung">15.12 Zusammenfassung</a></li>
</ul></li>
<li><a href="#synthese-teil-iii-wenn-die-idealwelt-nicht-gilt" id="toc-synthese-teil-iii-wenn-die-idealwelt-nicht-gilt">Synthese Teil III — Wenn die Idealwelt nicht gilt</a>
<ul>
<li><a href="#welche-annahme-fällt-weg" id="toc-welche-annahme-fällt-weg">Welche Annahme fällt weg?</a></li>
<li><a href="#was-dieser-teil-gemessen-hat-1" id="toc-was-dieser-teil-gemessen-hat-1">Was dieser Teil gemessen hat</a></li>
<li><a href="#drei-fehler-die-dieser-teil-verhindert-1" id="toc-drei-fehler-die-dieser-teil-verhindert-1">Drei Fehler, die dieser Teil verhindert</a></li>
<li><a href="#wenn-sie-nur-eines-mitnehmen-2" id="toc-wenn-sie-nur-eines-mitnehmen-2">Wenn Sie nur eines mitnehmen</a></li>
</ul></li>
<li><a href="#teil-anwendungen" id="toc-teil-anwendungen">Teil IV: Anwendungen — Energiewirtschaft und Finanzmärkte</a></li>
<li><a href="#kap-bruecke" id="toc-kap-bruecke">Kapitel 16: Die Strukturbrücke — dieselbe Mathematik, zwei Welten</a>
<ul>
@ -943,6 +963,13 @@
<li><a href="#sec:handelsmaschine-selbsttest" id="toc-sec:handelsmaschine-selbsttest">21.11 Selbsttest</a></li>
<li><a href="#sec:handelsmaschine-zusammenfassung" id="toc-sec:handelsmaschine-zusammenfassung">21.12 Zusammenfassung</a></li>
</ul></li>
<li><a href="#synthese-teil-iv-zwei-domänen-dieselbe-mathematik" id="toc-synthese-teil-iv-zwei-domänen-dieselbe-mathematik">Synthese Teil IV — Zwei Domänen, dieselbe Mathematik</a>
<ul>
<li><a href="#dieselbe-struktur-andere-namen" id="toc-dieselbe-struktur-andere-namen">Dieselbe Struktur, andere Namen</a></li>
<li><a href="#was-dieser-teil-gemessen-hat-2" id="toc-was-dieser-teil-gemessen-hat-2">Was dieser Teil gemessen hat</a></li>
<li><a href="#drei-fehler-die-dieser-teil-verhindert-2" id="toc-drei-fehler-die-dieser-teil-verhindert-2">Drei Fehler, die dieser Teil verhindert</a></li>
<li><a href="#wenn-sie-nur-eines-mitnehmen-3" id="toc-wenn-sie-nur-eines-mitnehmen-3">Wenn Sie nur eines mitnehmen</a></li>
</ul></li>
<li><a href="#teil-praxis" id="toc-teil-praxis">Teil V: Praxis</a></li>
<li><a href="#kap-praxisfallen" id="toc-kap-praxisfallen">Kapitel 22: Praxisfallen und der Weg zum produktiven Einsatz</a>
<ul>
@ -1001,6 +1028,13 @@
<li><a href="#sec:testing-selbsttest" id="toc-sec:testing-selbsttest">23.11 Selbsttest</a></li>
<li><a href="#sec:testing-zusammenfassung" id="toc-sec:testing-zusammenfassung">23.12 Zusammenfassung</a></li>
</ul></li>
<li><a href="#synthese-teil-v-vom-rechnenden-modell-zum-benutzten-system" id="toc-synthese-teil-v-vom-rechnenden-modell-zum-benutzten-system">Synthese Teil V — Vom rechnenden Modell zum benutzten System</a>
<ul>
<li><a href="#was-schiefgeht-und-was-dagegen-hilft" id="toc-was-schiefgeht-und-was-dagegen-hilft">Was schiefgeht, und was dagegen hilft</a></li>
<li><a href="#was-dieser-teil-gemessen-hat-3" id="toc-was-dieser-teil-gemessen-hat-3">Was dieser Teil gemessen hat</a></li>
<li><a href="#drei-fehler-die-dieser-teil-verhindert-3" id="toc-drei-fehler-die-dieser-teil-verhindert-3">Drei Fehler, die dieser Teil verhindert</a></li>
<li><a href="#wenn-sie-nur-eines-mitnehmen-4" id="toc-wenn-sie-nur-eines-mitnehmen-4">Wenn Sie nur eines mitnehmen</a></li>
</ul></li>
<li><a href="#projektwerkstatt-elf-eigene-anwendungen" id="toc-projektwerkstatt-elf-eigene-anwendungen">Projektwerkstatt — elf eigene Anwendungen</a>
<ul>
<li><a href="#wie-sie-ein-projekt-bearbeiten" id="toc-wie-sie-ein-projekt-bearbeiten">Wie Sie ein Projekt bearbeiten</a></li>
@ -7719,6 +7753,58 @@ Lesart C (weich): loesbar - 66,000 EUR Deckungsbeitrag, 1 Stammauftrag abgelehnt
<li>Die vier Fragen — worüber wird entschieden, woran gemessen, was ist unverhandelbar, was bei Unlösbarkeit — gehören in die erste Besprechung. Der Leitfaden in <a href="#sec:modellierung-leitfaden">Abschnitt 4.5</a> macht zwölf daraus.</li>
</ul>
<hr />
<h1 id="synthese-teil-i-grundlagen-auf-einen-blick">Synthese Teil I — Grundlagen auf einen Blick</h1>
<p>Vier Kapitel, eine Frage: <strong>Was muss vorliegen, bevor ein Solver überhaupt sinnvoll gestartet werden kann?</strong> Die Antwort ist unbequem, weil das meiste davon nichts mit Programmieren zu tun hat.</p>
<h2 id="was-welches-kapitel-klärt">Was welches Kapitel klärt</h2>
<table>
<colgroup>
<col style="width: 33%" />
<col style="width: 33%" />
<col style="width: 33%" />
</colgroup>
<thead>
<tr class="header">
<th>Frage</th>
<th>Kapitel</th>
<th>Was Sie danach können</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>Was ist überhaupt ein Optimierungsmodell?</td>
<td><a href="#kap-einfuehrung">Kapitel 1</a></td>
<td>Die vier Bausteine benennen — Variablen, Zielfunktion, Nebenbedingungen, Daten — und sie in einem fremden Problem wiedererkennen</td>
</tr>
<tr class="even">
<td>Warum rechnet der Solver falsch, obwohl das Modell stimmt?</td>
<td><a href="#kap-fundament">Kapitel 2</a></td>
<td>Konvexität beurteilen, den zulässigen Bereich als Polyeder sehen, schlechte Konditionierung erkennen und beheben</td>
</tr>
<tr class="odd">
<td>Welche Bibliothek, und warum vertragen sie sich nicht?</td>
<td><a href="#kap-oekosystem">Kapitel 3</a></td>
<td>Solver, Bindings und Modellierungsschichten unterscheiden — und den HiGHS-Symbolkonflikt zwischen <code>ortools</code> und <code>highspy</code> umgehen</td>
</tr>
<tr class="even">
<td>Wie wird aus einem Satz ein Modell?</td>
<td><a href="#kap-modellierung">Kapitel 4</a></td>
<td>Die vier Fragen stellen, harte von weichen Regeln trennen, einen Besprechungssatz übersetzen (<a href="#sec:modellierung-glossar">Abschnitt 4.6</a>)</td>
</tr>
</tbody>
</table>
<h2 id="die-reihenfolge-ist-die-aussage">Die Reihenfolge ist die Aussage</h2>
<p>Dieser Teil steht bewusst <strong>vor</strong> den Verfahren. Die drei häufigsten Gründe, aus denen ein OR-Projekt scheitert, liegen alle hier — und keiner davon ist ein Solverproblem:</p>
<ol type="1">
<li><strong>Die falsche Zielgröße.</strong> Sie ist die folgenreichste Entscheidung des ganzen Projekts, und sie wird meist in den ersten zehn Minuten nebenbei getroffen. Auslastung ist ein Ergebnis, kein Ziel; „Umsatz” wird gesagt, wenn „Deckungsbeitrag” gemeint ist.</li>
<li><strong>Zu viele harte Regeln.</strong> Jede unnötig harte Bedingung ist eine Zeitbombe: Irgendwann ist sie nicht erfüllbar, und das System antwortet gar nicht mehr. Hart ist nur, was rechtlich oder physikalisch unmöglich ist.</li>
<li><strong>Ein Satz, der mehrere Lesarten hat.</strong> „Stammkunden dürfen wir nicht verlieren” lässt sich auf mindestens drei Arten modellieren, und keine ist aus dem Satz ableitbar. Die Wahl trifft man — im Zweifel unbewusst.</li>
</ol>
<h2 id="wenn-sie-nur-eines-mitnehmen">Wenn Sie nur eines mitnehmen</h2>
<blockquote>
<p><strong>🎯</strong> Ein Modell rechnet aus, was <strong>aufgeschrieben</strong> wurde, nicht was gemeint war. Die Arbeit, die darüber entscheidet, ob am Ende etwas Brauchbares herauskommt, findet vor der ersten Zeile Code statt — und sie besteht aus Fragen an andere Menschen, nicht aus Mathematik.</p>
</blockquote>
<p><strong>Vor <a href="#teil-kernverfahren">Teil II</a></strong> sollten Sie an einem eigenen Beispiel die vier Fragen aus <a href="#sec:modellierung-vier-fragen">Abschnitt 4.3</a> durchgespielt haben. Ohne das bleiben die Verfahren Technik ohne Anwendung.</p>
<hr />
<h1 id="teil-kernverfahren">Teil II: Die Kernverfahren der deterministischen Optimierung</h1>
<p>Die nächsten vier Kapitel behandeln Probleme, bei denen <strong>alle Daten bekannt</strong> sind: Kosten, Kapazitäten, Zeiten stehen fest. Das klingt nach einer starken Vereinfachung, deckt aber den größten Teil der betrieblichen Planung ab — und ist die Grundlage für alles Weitere.</p>
<p>Vier Kapitel, vier Werkzeugkästen. Welcher zu Ihrem Problem passt, entscheiden Sie mit vier Fragen:</p>
@ -15803,9 +15889,128 @@ Mutterrolle 5,600 mm, 13 bestellte Breiten, 219 Zuschnitte.
<li>Auch wo es nichts spart, liefert es die <strong>Schranke</strong> — und damit die Erlaubnis, aufzuhören.</li>
</ul>
<hr />
<h1 id="synthese-teil-ii-die-kernverfahren-nebeneinander">Synthese Teil II — Die Kernverfahren nebeneinander</h1>
<p>Sechs Kapitel, sechs Werkzeuge. Jedes einzelne wurde im Zusammenhang gezeigt; hier stehen sie zum ersten Mal <strong>nebeneinander</strong>, mit der Frage, die vor jedem Projekt zu beantworten ist: Welches nehme ich, und was bekomme ich dafür?</p>
<h2 id="die-entscheidungsmatrix">Die Entscheidungsmatrix</h2>
<table>
<colgroup>
<col style="width: 20%" />
<col style="width: 20%" />
<col style="width: 20%" />
<col style="width: 20%" />
<col style="width: 20%" />
</colgroup>
<thead>
<tr class="header">
<th>Verfahren</th>
<th>Wofür es gebaut ist</th>
<th>Was Sie bekommen</th>
<th>Wo es aufhört</th>
<th>Kapitel</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><strong>LP</strong></td>
<td>teilbare Mengen, lineare Zusammenhänge</td>
<td>beweisbares Optimum <strong>plus Schattenpreise</strong></td>
<td>sobald etwas ganzzahlig sein muss</td>
<td><a href="#kap-lp">Kapitel 5</a></td>
</tr>
<tr class="even">
<td><strong>MILP</strong></td>
<td>Ja/Nein-Entscheidungen, Fixkosten, Logik</td>
<td>beweisbares Optimum, Gap als Fortschrittsmaß</td>
<td>Laufzeit wächst mit der Zahl der Binärvariablen</td>
<td><a href="#kap-milp">Kapitel 6</a></td>
</tr>
<tr class="odd">
<td><strong>CP-SAT</strong></td>
<td>Zuweisung, Reihenfolge, Kalender, harte Logik</td>
<td>beweisbares Optimum, sehr ausdrucksstarke Bedingungen</td>
<td>keine Schattenpreise, keine stetigen Größen</td>
<td><a href="#kap-cpsat">Kapitel 7</a></td>
</tr>
<tr class="even">
<td><strong>Graphenalgorithmen</strong></td>
<td>Flüsse, Zuordnung, Touren</td>
<td>oft <strong>polynomiell</strong> statt exponentiell</td>
<td>nur, wenn die Struktur wirklich passt</td>
<td><a href="#kap-graphen">Kapitel 8</a></td>
</tr>
<tr class="odd">
<td><strong>Metaheuristiken</strong></td>
<td>wenn der exakte Solver aussteigt</td>
<td>eine gute Lösung in <strong>fester Zeit</strong></td>
<td>keine Garantie, kein Beweis, keine Schranke</td>
<td><a href="#kap-metaheuristiken">Kapitel 9</a></td>
</tr>
<tr class="even">
<td><strong>Spaltengenerierung</strong></td>
<td>Modelle mit astronomisch vielen Variablen</td>
<td>beweisbares Optimum über nie erzeugte Spalten</td>
<td>lohnt nur bei bestimmter Instanzstruktur</td>
<td><a href="#kap-dekomposition">Kapitel 10</a></td>
</tr>
</tbody>
</table>
<p><strong>Die Spalte, die am meisten wert ist, ist die vierte.</strong> Ein Verfahren zu kennen heißt zu wissen, wo es aufhört — nicht, wofür es gedacht ist.</p>
<h2 id="was-dieser-teil-gemessen-hat">Was dieser Teil gemessen hat</h2>
<table>
<colgroup>
<col style="width: 33%" />
<col style="width: 33%" />
<col style="width: 33%" />
</colgroup>
<thead>
<tr class="header">
<th>Behauptung</th>
<th>Gemessen</th>
<th>Wo</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>„Der exakte Solver ist immer besser.”</td>
<td>Bei 500 Aufträgen liefert CP-SAT eine Lösung, die <strong>5,2 % schlechter</strong> ist als die Faustregel eines Meisters</td>
<td><a href="#kap-metaheuristiken">Kapitel 9</a></td>
</tr>
<tr class="even">
<td>„Metaheuristiken sind ungenau.”</td>
<td>Faustregel 2 497 → Annealing 2 343 → Annealing plus LNS <strong>2 289</strong> Minuten Rüstzeit; untere Schranke 1 768</td>
<td><a href="#kap-metaheuristiken">Kapitel 9</a></td>
</tr>
<tr class="odd">
<td>„Man muss alle Variablen aufschreiben.”</td>
<td>28 erzeugte Muster von <strong>46 408</strong> möglichen — und die Lösung ist beweisbar optimal</td>
<td><a href="#kap-dekomposition">Kapitel 10</a></td>
</tr>
<tr class="even">
<td>„Dekomposition lohnt sich immer.”</td>
<td>Bei drei Stücken je Rolle <strong>11 %</strong> Ersparnis, bei sechs <strong>nichts</strong></td>
<td><a href="#kap-dekomposition">Kapitel 10</a></td>
</tr>
<tr class="odd">
<td>„Mit Seed ist der Lauf reproduzierbar.”</td>
<td>Schon <strong>zwei</strong> Arbeiter liefern bei identischem Seed drei verschiedene Pläne zum selben Zielwert</td>
<td><a href="#sec:cpsat-parallele-suche">Abschnitt 7.7</a></td>
</tr>
</tbody>
</table>
<h2 id="drei-fehler-die-dieser-teil-verhindert">Drei Fehler, die dieser Teil verhindert</h2>
<ol type="1">
<li><strong>Runden.</strong> Die LP-Lösung ist keine Näherung der ganzzahligen Lösung — sie kann beliebig weit danebenliegen, und gerundet sogar unzulässig werden.</li>
<li><strong>Ein zu großes Big-M.</strong> Es macht das Modell nicht falsch, sondern die Suche langsam und die Schranken wertlos. So klein wie zulässig, nie „sicherheitshalber groß”.</li>
<li><strong>Zu früh heuristisch werden.</strong> Der Umschlagpunkt, ab dem eine Metaheuristik den exakten Solver schlägt, ist eine Eigenschaft <strong>des Problems</strong> und lässt sich messen. Wer ihn nicht misst, verzichtet auf Optimalitätsgarantien, die er hätte haben können.</li>
</ol>
<h2 id="wenn-sie-nur-eines-mitnehmen-1">Wenn Sie nur eines mitnehmen</h2>
<blockquote>
<p><strong>🎯</strong> Die Frage lautet nie „welcher Solver ist der beste”, sondern „welche Garantie brauche ich, und was bin ich bereit, dafür an Laufzeit zu zahlen”. Ein Verfahren ohne Schranke liefert eine Lösung; ein Verfahren mit Schranke liefert die Erlaubnis, aufzuhören.</p>
</blockquote>
<hr />
<h1 id="teil-nichtlinear">Teil III: Nichtlinearität, Unsicherheit und mehrperiodige Dynamik</h1>
<p><a href="#teil-kernverfahren">Teil II</a> ging von festen Daten und linearen Zusammenhängen aus. Beides gilt in der Praxis oft nicht: Risiko wächst <strong>quadratisch</strong> mit dem Einsatz, Nachfrage ist erst morgen bekannt, und eine Entscheidung heute verändert, welche Möglichkeiten übermorgen noch offenstehen.</p>
<p>Die drei Kapitel dieses Teils behandeln genau diese drei Abweichungen. Welches Werkzeug Sie brauchen, hängt davon ab, <strong>welche</strong> davon bei Ihnen vorliegt:</p>
<p>Drei Kapitel dieses Teils behandeln genau diese drei Abweichungen. Welches Werkzeug Sie brauchen, hängt davon ab, <strong>welche</strong> davon bei Ihnen vorliegt:</p>
<figure>
<img src="bilder_04/teil3_solverwahl.svg" alt="Entscheidungsdiagramm: Welches Werkzeug passt zu meinem Problem? (Teil III)" />
<figcaption aria-hidden="true">Entscheidungsdiagramm: Welches Werkzeug passt zu meinem Problem? (Teil III)</figcaption>
@ -15814,6 +16019,7 @@ Mutterrolle 5,600 mm, 13 bestellte Breiten, 219 Zuschnitte.
<p><strong>🎯 Merksatz zum Diagramm</strong> Die erste Frage trennt zwei Welten, die man nicht vermischen darf. Ist die <strong>Nichtlinearität</strong> das Problem, geht es um Konvexität — und damit darum, ob Sie eine Optimalitätsgarantie bekommen oder nur ein lokales Optimum. Ist die <strong>Unsicherheit</strong> das Problem, geht es um etwas ganz anderes: Nicht der Solver ist die Schwierigkeit, sondern die Frage, was „optimal“ überhaupt heißen soll, wenn man die Daten nicht kennt.</p>
<p>Der häufigste Fehler an dieser Stelle ist, Unsicherheit durch <strong>Mittelwerte</strong> zu ersetzen und dann deterministisch zu rechnen. Warum das systematisch danebengeht, zeigt <a href="#kap-unsicherheit">Kapitel 12</a> unter dem Namen <em>Fluch des Durchschnitts</em>.</p>
</blockquote>
<p>Zwei weitere Kapitel schließen sich an, weil sie dieselbe Voraussetzung aufgeben, nur an einer anderen Stelle: <a href="#kap-mehrziel">Kapitel 14</a> gibt das <strong>eine Ziel</strong> auf, <a href="#kap-prognose">Kapitel 15</a> die Annahme, die <strong>Eingabedaten</strong> seien gegeben statt selbst geschätzt. Was dieser Teil insgesamt leistet, fasst die Synthese an seinem Ende zusammen.</p>
<hr />
<h1 id="kap-qp-nlp">Kapitel 11: Quadratische und nichtlineare Optimierung — KKT, Lagrange, Konvexität</h1>
<blockquote>
@ -20334,6 +20540,106 @@ Kosten statt auf Fehler trainiert.
<li>Ein Kennzahlenvergleich braucht eine <strong>Streuungsangabe</strong>. Bei 180 Testtagen sah das schlechtere Modell in gut jedem zehnten Fall besser aus — und wer einmal misst, hat genau eine Ziehung.</li>
</ul>
<hr />
<h1 id="synthese-teil-iii-wenn-die-idealwelt-nicht-gilt">Synthese Teil III — Wenn die Idealwelt nicht gilt</h1>
<p><a href="#teil-kernverfahren">Teil II</a> setzte voraus: feste Daten, lineare Zusammenhänge, ein Ziel, eine Periode. Dieser Teil nimmt jede dieser vier Voraussetzungen einzeln weg. Die Tabelle ordnet die Kapitel danach, <strong>welche</strong> Voraussetzung bei Ihnen verletzt ist.</p>
<h2 id="welche-annahme-fällt-weg">Welche Annahme fällt weg?</h2>
<table>
<colgroup>
<col style="width: 25%" />
<col style="width: 25%" />
<col style="width: 25%" />
<col style="width: 25%" />
</colgroup>
<thead>
<tr class="header">
<th>Was nicht gilt</th>
<th>Woran Sie es merken</th>
<th>Werkzeug</th>
<th>Kapitel</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><strong>Linearität</strong></td>
<td>Risiko wächst quadratisch, Kosten degressiv, Sättigung</td>
<td>QP, konvexe Optimierung, KKT</td>
<td><a href="#kap-qp-nlp">Kapitel 11</a></td>
</tr>
<tr class="even">
<td><strong>Feste Daten</strong></td>
<td>Nachfrage, Wind, Rendite stehen erst morgen fest</td>
<td>Monte-Carlo, Zweistufigkeit, Robustheit, Chance Constraints</td>
<td><a href="#kap-unsicherheit">Kapitel 12</a></td>
</tr>
<tr class="odd">
<td><strong>Eine Periode</strong></td>
<td>die Entscheidung heute verändert, was übermorgen möglich ist</td>
<td>Bellman-Gleichung, Rückwärtsinduktion</td>
<td><a href="#kap-dynamische-programmierung">Kapitel 13</a></td>
</tr>
<tr class="even">
<td><strong>Ein Ziel</strong></td>
<td>zwei Kennzahlen sollen gleichzeitig stimmen</td>
<td>Pareto-Front, ε-Constraint</td>
<td><a href="#kap-mehrziel">Kapitel 14</a></td>
</tr>
<tr class="odd">
<td><strong>Daten sind gegeben</strong></td>
<td>die Eingabe ist selbst eine Prognose</td>
<td>Predict-then-Optimize, entscheidungsorientiertes Lernen</td>
<td><a href="#kap-prognose">Kapitel 15</a></td>
</tr>
</tbody>
</table>
<p>Die letzte Zeile ist die unbequemste: Dort ist nicht das Modell unsicher, sondern seine <strong>Eingabe</strong> — und die kommt aus einem zweiten Modell, das nach anderen Kriterien gebaut wurde.</p>
<h2 id="was-dieser-teil-gemessen-hat-1">Was dieser Teil gemessen hat</h2>
<table>
<colgroup>
<col style="width: 33%" />
<col style="width: 33%" />
<col style="width: 33%" />
</colgroup>
<thead>
<tr class="header">
<th>Behauptung</th>
<th>Gemessen</th>
<th>Wo</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>„Mit dem Mittelwert zu rechnen ist eine brauchbare Näherung.”</td>
<td>Der Mittelwertplan hält seine Zusage in <strong>50,08 %</strong> der Fälle — per Definition</td>
<td><a href="#sec:unsicherheit-chance-constraints">Abschnitt 12.7</a></td>
</tr>
<tr class="even">
<td>„Versorgungssicherheit kostet linear.”</td>
<td>56 289 € je Prozentpunkt auf dem Weg zu 80 %, <strong>253 848 €</strong> zwischen 95 und 99 % — das 4,5-fache</td>
<td><a href="#sec:unsicherheit-chance-constraints">Abschnitt 12.7</a></td>
</tr>
<tr class="odd">
<td>„Eine Zusage aus dem Modell hält.”</td>
<td>Der 95-%-Plan hält <strong>87,44 %</strong>, sobald die Testverteilung einen Fall enthält, in dem alles zugleich ausfällt</td>
<td><a href="#sec:unsicherheit-chance-constraints">Abschnitt 12.7</a></td>
</tr>
<tr class="even">
<td>„Die bessere Prognose führt zur besseren Entscheidung.”</td>
<td>Das Modell mit dem <strong>schlechteren</strong> MSE trifft die günstigere Entscheidung</td>
<td><a href="#kap-prognose">Kapitel 15</a></td>
</tr>
</tbody>
</table>
<h2 id="drei-fehler-die-dieser-teil-verhindert-1">Drei Fehler, die dieser Teil verhindert</h2>
<ol type="1">
<li><strong>Unsicherheit durch Mittelwerte ersetzen.</strong> Der Durchschnittskunde kauft nie. Bei asymmetrischen Kosten liegt das Optimum systematisch neben dem Mittelwert, und eine Terminzusage ist ein <strong>Quantil</strong>, kein Erwartungswert.</li>
<li><strong>Konvexität voraussetzen, ohne sie zu prüfen.</strong> Ohne sie gibt es keine Optimalitätsgarantie, sondern nur ein lokales Ergebnis — und der Solver sagt das nicht von selbst.</li>
<li><strong>Zwei Ziele mit einem Gewicht verrechnen, bevor die Front bekannt ist.</strong> Ein Gewicht ist eine Antwort auf eine Frage, die noch niemand gestellt hat. Die Pareto-Front stellt sie zuerst.</li>
</ol>
<h2 id="wenn-sie-nur-eines-mitnehmen-2">Wenn Sie nur eines mitnehmen</h2>
<blockquote>
<p><strong>🎯</strong> Jede der vier Annahmen lässt sich einzeln aufgeben — aber jede kostet etwas Bestimmtes: Linearität kostet die Optimalitätsgarantie, feste Daten kosten Rechenzeit oder Vorsicht, eine Periode kostet Zustandsraum, ein Ziel kostet eine Entscheidung, die nicht der Modellierer treffen darf. Wer weiß, <strong>welche</strong> Annahme bei ihm fällt, weiß auch, welchen Preis er zahlt.</p>
</blockquote>
<hr />
<h1 id="teil-anwendungen">Teil IV: Anwendungen — Energiewirtschaft und Finanzmärkte</h1>
<p>Dieser Teil wechselt die Domäne — aber <strong>nicht</strong> die Methoden. Was hier folgt, ist die konsequente Anwendung dessen, was Sie in den Teilen II und III gelernt haben, auf zwei Gebiete, in denen viel Unsicherheit auf ein unmittelbar messbares Ergebnis trifft: die Energiewirtschaft und die Finanzmärkte.</p>
<p>Er hat drei Abschnitte, und Sie können nach jedem aufhören:</p>
@ -25248,6 +25554,104 @@ von allen Fehlversuchen genau einen: den erfolgreichsten.
</ul>
<p><strong>Ausblick.</strong> <a href="#kap-praxisfallen">Kapitel 22</a> zieht die Summe aus allen Teilen: die typischen Praxisfallen und der Weg vom Skript zum produktiven System.</p>
<hr />
<h1 id="synthese-teil-iv-zwei-domänen-dieselbe-mathematik">Synthese Teil IV — Zwei Domänen, dieselbe Mathematik</h1>
<p>Sechs Kapitel, zwei Branchen, die sich für unvergleichbar halten. Die Werkstatt plant Maschinen, das Depot plant Titel — und beide lösen dasselbe Problem: <strong>knappe Mittel auf konkurrierende Verwendungen verteilen, unter Unsicherheit.</strong></p>
<h2 id="dieselbe-struktur-andere-namen">Dieselbe Struktur, andere Namen</h2>
<table>
<colgroup>
<col style="width: 33%" />
<col style="width: 33%" />
<col style="width: 33%" />
</colgroup>
<thead>
<tr class="header">
<th>Werkstatt und Kraftwerk</th>
<th>Depot und Handel</th>
<th>Was mathematisch dahintersteht</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>Produkt, Maschinenstunde</td>
<td>Titel, Kapital</td>
<td>Entscheidungsvariable</td>
</tr>
<tr class="even">
<td>Deckungsbeitrag</td>
<td>erwartete Rendite</td>
<td>linearer Zielterm</td>
</tr>
<tr class="odd">
<td>Kapazität, Liefervertrag</td>
<td>Positionsgrenze, Sektorlimit</td>
<td>Nebenbedingung</td>
</tr>
<tr class="even">
<td>Rüstkosten, Anfahrkosten</td>
<td>Transaktionskosten</td>
<td>Fixkosten mit Binärvariable (B1)</td>
</tr>
<tr class="odd">
<td>Lastabwurf, Konventionalstrafe</td>
<td>Tail-Verlust</td>
<td>Straf- bzw. Risikoterm</td>
</tr>
<tr class="even">
<td>Wind- und Nachfrageszenarien</td>
<td>Renditeszenarien</td>
<td>Szenariomenge</td>
</tr>
</tbody>
</table>
<p><strong>Und wo die Analogie endet</strong>, benennt <a href="#kap-bruecke">Kapitel 16</a> an drei Stellen ausdrücklich — das ist der wertvollere Teil. Eine Analogie, die man nicht begrenzen kann, ist keine Erkenntnis, sondern eine Redewendung.</p>
<h2 id="was-dieser-teil-gemessen-hat-2">Was dieser Teil gemessen hat</h2>
<table>
<colgroup>
<col style="width: 33%" />
<col style="width: 33%" />
<col style="width: 33%" />
</colgroup>
<thead>
<tr class="header">
<th>Behauptung</th>
<th>Gemessen</th>
<th>Wo</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>„Planen mit der Prognose ist gut genug.”</td>
<td>Der Erwartungswert-Plan kostet <strong>149 % mehr</strong> (874 870 € statt 351 356 €) und wirft in <strong>28 von 40</strong> Szenarien Last ab</td>
<td><a href="#kap-supplychain">Kapitel 17</a></td>
</tr>
<tr class="even">
<td>„Dann sparen wir eben beim Brennstoff.”</td>
<td>Genau das tut er: 12 725 € gespart, <strong>536 239 €</strong> Lastabwurf bezahlt — das 42-fache. Die Anfahrkosten sind in beiden Plänen gleich</td>
<td><a href="#kap-supplychain">Kapitel 17</a></td>
</tr>
<tr class="odd">
<td>„Der VaR sagt, wie riskant es ist.”</td>
<td>VaR <strong>1,86 %</strong>, CVaR <strong>2,99 %</strong> — und der schlechteste Tag der Stichprobe (<strong>23,0 %</strong>) ändert am VaR <strong>nichts</strong></td>
<td><a href="#kap-cvar">Kapitel 20</a></td>
</tr>
<tr class="even">
<td>„Die Kovarianzmatrix ist eine Eingabe wie jede andere.”</td>
<td>Aus kurzen Reihen geschätzt ist sie schlecht konditioniert; die Optimierung setzt dann auf Schätzrauschen</td>
<td><a href="#kap-finanzdaten">Kapitel 18</a></td>
</tr>
</tbody>
</table>
<h2 id="drei-fehler-die-dieser-teil-verhindert-2">Drei Fehler, die dieser Teil verhindert</h2>
<ol type="1">
<li><strong>Bei Markowitz einsteigen.</strong> Wer <a href="#kap-finanzdaten">Kapitel 18</a> überspringt, optimiert seine eigenen Schätzfehler und wundert sich über Gewichte, die niemand halten würde.</li>
<li><strong>Den VaR für ein Risikomaß halten.</strong> Er sagt, <strong>ob</strong> die Schwelle gerissen wird, nicht <strong>wie schlimm</strong> es dahinter aussieht — und er ist nicht kohärent. Optimiert wird der CVaR.</li>
<li><strong>Trägheit unterschätzen.</strong> Im Kraftwerkspark ist nicht die Prognosegüte das Problem, sondern dass sich ein Block mit acht Stunden Mindestlaufzeit um 18 Uhr nicht mehr herbeirufen lässt. Dieselbe Trägheit heißt im Depot Transaktionskosten.</li>
</ol>
<h2 id="wenn-sie-nur-eines-mitnehmen-3">Wenn Sie nur eines mitnehmen</h2>
<blockquote>
<p><strong>🎯</strong> Wer die Struktur erkennt, kann sein Werkzeug mitnehmen, wenn er die Branche wechselt. Wer nur die Bibliothek kennt, fängt jedes Mal von vorn an — und wer die Grenzen der Analogie nicht kennt, überträgt irgendwann auch das, was nicht überträgt.</p>
</blockquote>
<hr />
<h1 id="teil-praxis">Teil V: Praxis</h1>
<hr />
<h1 id="kap-praxisfallen">Kapitel 22: Praxisfallen und der Weg zum produktiven Einsatz</h1>
@ -29209,6 +29613,104 @@ Das zugehoerige Dockerfile ist kurz genug, um es ganz zu zeigen:
<li>Ein <strong>Optimierungsdienst</strong> ist zweistufig: annehmen und prüfen sofort, rechnen im Hintergrund, Ergebnis mit Status und Gap abholen. Die Frage Threads oder Prozesse gehört gemessen — bei C++-Solvern genügen Threads, bei Python-Heuristiken nicht.</li>
</ul>
<hr />
<h1 id="synthese-teil-v-vom-rechnenden-modell-zum-benutzten-system">Synthese Teil V — Vom rechnenden Modell zum benutzten System</h1>
<p>Zwei Kapitel, ein Übergang: Das Modell rechnet — und muss jetzt jemand anderem übergeben werden. Was dabei schiefgeht, hat selten mit Mathematik zu tun.</p>
<h2 id="was-schiefgeht-und-was-dagegen-hilft">Was schiefgeht, und was dagegen hilft</h2>
<table>
<colgroup>
<col style="width: 33%" />
<col style="width: 33%" />
<col style="width: 33%" />
</colgroup>
<thead>
<tr class="header">
<th>Was in Produktion passiert</th>
<th>Gegenmittel</th>
<th>Wo</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><code>INFEASIBLE</code> um 3 Uhr nachts, niemand weiß warum</td>
<td>Relaxation mit gestaffelten Strafkosten (B18); Deletion Filter für die Diagnose</td>
<td><a href="#kap-praxisfallen">Kapitel 22</a>, <a href="#anhang-fehlerdiagnose">Anhang C</a></td>
</tr>
<tr class="even">
<td>Der Disponent lehnt den Plan ab, weil er ihn nicht versteht</td>
<td>Constraint-Trace für die einzelne Zuweisung; Kostenzurechnung für den ganzen Plan</td>
<td><a href="#kap-praxisfallen">Kapitel 22</a>, <a href="#sec:praxisfallen-attribution">Abschnitt 22.4</a></td>
</tr>
<tr class="odd">
<td>Der Solver läuft ins Zeitlimit und keiner merkt es</td>
<td>Status, Gap und Zeitausschöpfung protokollieren — konstante Laufzeit ist ein Warnsignal</td>
<td><a href="#kap-praxisfallen">Kapitel 22</a></td>
</tr>
<tr class="even">
<td>Ein Test wird grundlos mal rot, mal grün</td>
<td>auf Zielwert und Regeln prüfen, nicht auf die Gestalt der Lösung; <code>num_workers = 1</code> <strong>und</strong> Seed</td>
<td><a href="#sec:cpsat-parallele-suche">Abschnitt 7.7</a>, <a href="#kap-testing">Kapitel 23</a></td>
</tr>
<tr class="odd">
<td>Ein Ergebnis lässt sich später nicht mehr nachvollziehen</td>
<td>Snapshot-Prinzip: unveränderlicher Datenstand mit ID je Lauf</td>
<td><a href="#kap-praxisfallen">Kapitel 22</a></td>
</tr>
<tr class="even">
<td>Das Modell prüft sich selbst</td>
<td>Abnahmeprüfung als eigener Baustein, ohne Solver und ohne Modellvariable</td>
<td><a href="#sec:praxisfallen-or-kern">Abschnitt 22.6</a></td>
</tr>
</tbody>
</table>
<h2 id="was-dieser-teil-gemessen-hat-3">Was dieser Teil gemessen hat</h2>
<table>
<colgroup>
<col style="width: 33%" />
<col style="width: 33%" />
<col style="width: 33%" />
</colgroup>
<thead>
<tr class="header">
<th>Behauptung</th>
<th>Gemessen</th>
<th>Wo</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>„Der Solver nennt schon den Grund für <code>INFEASIBLE</code>.”</td>
<td>Er nennt gar nichts. Der Deletion Filter findet einen kleinsten Konflikt — dieses Modell enthält <strong>neun</strong> verschiedene, und welchen man sieht, steuert die Prüfreihenfolge</td>
<td><a href="#anhang-fehlerdiagnose">Anhang C</a></td>
</tr>
<tr class="even">
<td>„Bindende Bedingungen sind die teuren.”</td>
<td>Von fünf bindenden Bedingungen kostet eine <strong>0,00 €</strong></td>
<td><a href="#sec:praxisfallen-attribution">Abschnitt 22.4</a></td>
</tr>
<tr class="odd">
<td>„Der Schattenpreis sagt, was der Hebel bringt.”</td>
<td>Hochgerechnet 120 €, gemessen <strong>60 €</strong> — er gilt nur bis +15 Stunden. Die Ranglisten nach Preis und nach Wirkung drehen sich um</td>
<td><a href="#sec:praxisfallen-attribution">Abschnitt 22.4</a></td>
</tr>
<tr class="even">
<td>„Mehr Arbeiter sind proportional schneller.”</td>
<td><strong>12,3-fach</strong> bei acht Arbeitern — überlinear, weil verschiedene Strategien statt derselben Suche laufen</td>
<td><a href="#sec:cpsat-parallele-suche">Abschnitt 7.7</a></td>
</tr>
</tbody>
</table>
<h2 id="drei-fehler-die-dieser-teil-verhindert-3">Drei Fehler, die dieser Teil verhindert</h2>
<ol type="1">
<li><strong>Alles hart formulieren.</strong> Wer keine Regel brechen lässt, bekommt irgendwann eine Fehlermeldung statt eines Plans — und zwar nachts, im Batchlauf.</li>
<li><strong>Genauer optimieren als die Daten sind.</strong> Ein Gap von 2 % ist bei ±10 % Datenunsicherheit bedeutungslos. Die Rechenzeit dafür ist verschenkt.</li>
<li><strong>Einen Bericht für einen Beweis halten.</strong> Ein generierter Text erklärt das <strong>Modell</strong>, nicht die <strong>Wirklichkeit</strong>. Ist eine Eingabe falsch geschätzt, ist er überzeugend <strong>und</strong> falsch — die gefährlichste Kombination.</li>
</ol>
<h2 id="wenn-sie-nur-eines-mitnehmen-4">Wenn Sie nur eines mitnehmen</h2>
<blockquote>
<p><strong>🎯</strong> Ein Modell, das nur auf Ihrem Rechner und nur mit Ihren Daten läuft, ist ein Prototyp — kein System. Der Unterschied besteht aus drei Dingen, die alle nichts mit dem Solver zu tun haben: einer Abnahmeprüfung, einer Erklärung und einem Protokoll.</p>
</blockquote>
<p><strong>Danach:</strong> die Projektwerkstatt. Elf Aufträge, jeder mit Datenquellen, Modellskizze, Abnahmekriterien und Stolperfallen — zugeschnitten auf 10 bis 25 Stunden bis zu einem vorzeigbaren Ergebnis.</p>
<hr />
<h1 id="projektwerkstatt-elf-eigene-anwendungen">Projektwerkstatt — elf eigene Anwendungen</h1>
<blockquote>
<p><strong>📌 Auf einen Blick</strong></p>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -4649,6 +4649,36 @@ Dieselbe Barriere gibt es rückwärts. Diese Sätze haben sich bewährt, wenn ei
* Die vier Fragen — worüber wird entschieden, woran gemessen, was ist unverhandelbar, was bei Unlösbarkeit — gehören in die erste Besprechung. Der Leitfaden in [Abschnitt 4.5](#sec:modellierung-leitfaden) macht zwölf daraus.
---
# Synthese Teil I — Grundlagen auf einen Blick
Vier Kapitel, eine Frage: **Was muss vorliegen, bevor ein Solver überhaupt sinnvoll gestartet werden kann?** Die Antwort ist unbequem, weil das meiste davon nichts mit Programmieren zu tun hat.
## Was welches Kapitel klärt
| Frage | Kapitel | Was Sie danach können |
| --- | --- | --- |
| Was ist überhaupt ein Optimierungsmodell? | [Kapitel 1](#kap-einfuehrung) | Die vier Bausteine benennen — Variablen, Zielfunktion, Nebenbedingungen, Daten — und sie in einem fremden Problem wiedererkennen |
| Warum rechnet der Solver falsch, obwohl das Modell stimmt? | [Kapitel 2](#kap-fundament) | Konvexität beurteilen, den zulässigen Bereich als Polyeder sehen, schlechte Konditionierung erkennen und beheben |
| Welche Bibliothek, und warum vertragen sie sich nicht? | [Kapitel 3](#kap-oekosystem) | Solver, Bindings und Modellierungsschichten unterscheiden — und den HiGHS-Symbolkonflikt zwischen `ortools` und `highspy` umgehen |
| Wie wird aus einem Satz ein Modell? | [Kapitel 4](#kap-modellierung) | Die vier Fragen stellen, harte von weichen Regeln trennen, einen Besprechungssatz übersetzen ([Abschnitt 4.6](#sec:modellierung-glossar)) |
## Die Reihenfolge ist die Aussage
Dieser Teil steht bewusst **vor** den Verfahren. Die drei häufigsten Gründe, aus denen ein OR-Projekt scheitert, liegen alle hier — und keiner davon ist ein Solverproblem:
1. **Die falsche Zielgröße.** Sie ist die folgenreichste Entscheidung des ganzen Projekts, und sie wird meist in den ersten zehn Minuten nebenbei getroffen. Auslastung ist ein Ergebnis, kein Ziel; „Umsatz" wird gesagt, wenn „Deckungsbeitrag" gemeint ist.
2. **Zu viele harte Regeln.** Jede unnötig harte Bedingung ist eine Zeitbombe: Irgendwann ist sie nicht erfüllbar, und das System antwortet gar nicht mehr. Hart ist nur, was rechtlich oder physikalisch unmöglich ist.
3. **Ein Satz, der mehrere Lesarten hat.** „Stammkunden dürfen wir nicht verlieren" lässt sich auf mindestens drei Arten modellieren, und keine ist aus dem Satz ableitbar. Die Wahl trifft man — im Zweifel unbewusst.
## Wenn Sie nur eines mitnehmen
> **🎯** Ein Modell rechnet aus, was **aufgeschrieben** wurde, nicht was gemeint war. Die Arbeit, die darüber entscheidet, ob am Ende etwas Brauchbares herauskommt, findet vor der ersten Zeile Code statt — und sie besteht aus Fragen an andere Menschen, nicht aus Mathematik.
**Vor [Teil II](#teil-kernverfahren)** sollten Sie an einem eigenen Beispiel die vier Fragen aus [Abschnitt 4.3](#sec:modellierung-vier-fragen) durchgespielt haben. Ohne das bleiben die Verfahren Technik ohne Anwendung.
---
# Teil II: Die Kernverfahren der deterministischen Optimierung {#teil-kernverfahren}
@ -12066,13 +12096,53 @@ Und selbst dort, wo die Ersparnis null ist, liefert das Verfahren etwas, das die
* Auch wo es nichts spart, liefert es die **Schranke** — und damit die Erlaubnis, aufzuhören.
---
# Synthese Teil II — Die Kernverfahren nebeneinander
Sechs Kapitel, sechs Werkzeuge. Jedes einzelne wurde im Zusammenhang gezeigt; hier stehen sie zum ersten Mal **nebeneinander**, mit der Frage, die vor jedem Projekt zu beantworten ist: Welches nehme ich, und was bekomme ich dafür?
## Die Entscheidungsmatrix
| Verfahren | Wofür es gebaut ist | Was Sie bekommen | Wo es aufhört | Kapitel |
| --- | --- | --- | --- | --- |
| **LP** | teilbare Mengen, lineare Zusammenhänge | beweisbares Optimum **plus Schattenpreise** | sobald etwas ganzzahlig sein muss | [Kapitel 5](#kap-lp) |
| **MILP** | Ja/Nein-Entscheidungen, Fixkosten, Logik | beweisbares Optimum, Gap als Fortschrittsmaß | Laufzeit wächst mit der Zahl der Binärvariablen | [Kapitel 6](#kap-milp) |
| **CP-SAT** | Zuweisung, Reihenfolge, Kalender, harte Logik | beweisbares Optimum, sehr ausdrucksstarke Bedingungen | keine Schattenpreise, keine stetigen Größen | [Kapitel 7](#kap-cpsat) |
| **Graphenalgorithmen** | Flüsse, Zuordnung, Touren | oft **polynomiell** statt exponentiell | nur, wenn die Struktur wirklich passt | [Kapitel 8](#kap-graphen) |
| **Metaheuristiken** | wenn der exakte Solver aussteigt | eine gute Lösung in **fester Zeit** | keine Garantie, kein Beweis, keine Schranke | [Kapitel 9](#kap-metaheuristiken) |
| **Spaltengenerierung** | Modelle mit astronomisch vielen Variablen | beweisbares Optimum über nie erzeugte Spalten | lohnt nur bei bestimmter Instanzstruktur | [Kapitel 10](#kap-dekomposition) |
**Die Spalte, die am meisten wert ist, ist die vierte.** Ein Verfahren zu kennen heißt zu wissen, wo es aufhört — nicht, wofür es gedacht ist.
## Was dieser Teil gemessen hat
| Behauptung | Gemessen | Wo |
| --- | --- | --- |
| „Der exakte Solver ist immer besser." | Bei 500 Aufträgen liefert CP-SAT eine Lösung, die **5,2 % schlechter** ist als die Faustregel eines Meisters | [Kapitel 9](#kap-metaheuristiken) |
| „Metaheuristiken sind ungenau." | Faustregel 2 497 → Annealing 2 343 → Annealing plus LNS **2 289** Minuten Rüstzeit; untere Schranke 1 768 | [Kapitel 9](#kap-metaheuristiken) |
| „Man muss alle Variablen aufschreiben." | 28 erzeugte Muster von **46 408** möglichen — und die Lösung ist beweisbar optimal | [Kapitel 10](#kap-dekomposition) |
| „Dekomposition lohnt sich immer." | Bei drei Stücken je Rolle **11 %** Ersparnis, bei sechs **nichts** | [Kapitel 10](#kap-dekomposition) |
| „Mit Seed ist der Lauf reproduzierbar." | Schon **zwei** Arbeiter liefern bei identischem Seed drei verschiedene Pläne zum selben Zielwert | [Abschnitt 7.7](#sec:cpsat-parallele-suche) |
## Drei Fehler, die dieser Teil verhindert
1. **Runden.** Die LP-Lösung ist keine Näherung der ganzzahligen Lösung — sie kann beliebig weit danebenliegen, und gerundet sogar unzulässig werden.
2. **Ein zu großes Big-M.** Es macht das Modell nicht falsch, sondern die Suche langsam und die Schranken wertlos. So klein wie zulässig, nie „sicherheitshalber groß".
3. **Zu früh heuristisch werden.** Der Umschlagpunkt, ab dem eine Metaheuristik den exakten Solver schlägt, ist eine Eigenschaft **des Problems** und lässt sich messen. Wer ihn nicht misst, verzichtet auf Optimalitätsgarantien, die er hätte haben können.
## Wenn Sie nur eines mitnehmen
> **🎯** Die Frage lautet nie „welcher Solver ist der beste", sondern „welche Garantie brauche ich, und was bin ich bereit, dafür an Laufzeit zu zahlen". Ein Verfahren ohne Schranke liefert eine Lösung; ein Verfahren mit Schranke liefert die Erlaubnis, aufzuhören.
---
# Teil III: Nichtlinearität, Unsicherheit und mehrperiodige Dynamik {#teil-nichtlinear}
[Teil II](#teil-kernverfahren) ging von festen Daten und linearen Zusammenhängen aus. Beides gilt in der Praxis oft nicht: Risiko wächst **quadratisch** mit dem Einsatz, Nachfrage ist erst morgen bekannt, und eine Entscheidung heute verändert, welche Möglichkeiten übermorgen noch offenstehen.
Die drei Kapitel dieses Teils behandeln genau diese drei Abweichungen. Welches Werkzeug Sie brauchen, hängt davon ab, **welche** davon bei Ihnen vorliegt:
Drei Kapitel dieses Teils behandeln genau diese drei Abweichungen. Welches Werkzeug Sie brauchen, hängt davon ab, **welche** davon bei Ihnen vorliegt:
![Entscheidungsdiagramm: Welches Werkzeug passt zu meinem Problem? (Teil III)](bilder_04/teil3_solverwahl.svg)
@ -12080,6 +12150,8 @@ Die drei Kapitel dieses Teils behandeln genau diese drei Abweichungen. Welches W
>
> Der häufigste Fehler an dieser Stelle ist, Unsicherheit durch **Mittelwerte** zu ersetzen und dann deterministisch zu rechnen. Warum das systematisch danebengeht, zeigt [Kapitel 12](#kap-unsicherheit) unter dem Namen *Fluch des Durchschnitts*.
Zwei weitere Kapitel schließen sich an, weil sie dieselbe Voraussetzung aufgeben, nur an einer anderen Stelle: [Kapitel 14](#kap-mehrziel) gibt das **eine Ziel** auf, [Kapitel 15](#kap-prognose) die Annahme, die **Eingabedaten** seien gegeben statt selbst geschätzt. Was dieser Teil insgesamt leistet, fasst die Synthese an seinem Ende zusammen.
---
# Kapitel 11: Quadratische und nichtlineare Optimierung — KKT, Lagrange, Konvexität {#kap-qp-nlp}
@ -16369,6 +16441,44 @@ Hier war es ein einziger Parameter, mit einer Rasterschleife bestimmt. Der allge
* Ein Kennzahlenvergleich braucht eine **Streuungsangabe**. Bei 180 Testtagen sah das schlechtere Modell in gut jedem zehnten Fall besser aus — und wer einmal misst, hat genau eine Ziehung.
---
# Synthese Teil III — Wenn die Idealwelt nicht gilt
[Teil II](#teil-kernverfahren) setzte voraus: feste Daten, lineare Zusammenhänge, ein Ziel, eine Periode. Dieser Teil nimmt jede dieser vier Voraussetzungen einzeln weg. Die Tabelle ordnet die Kapitel danach, **welche** Voraussetzung bei Ihnen verletzt ist.
## Welche Annahme fällt weg?
| Was nicht gilt | Woran Sie es merken | Werkzeug | Kapitel |
| --- | --- | --- | --- |
| **Linearität** | Risiko wächst quadratisch, Kosten degressiv, Sättigung | QP, konvexe Optimierung, KKT | [Kapitel 11](#kap-qp-nlp) |
| **Feste Daten** | Nachfrage, Wind, Rendite stehen erst morgen fest | Monte-Carlo, Zweistufigkeit, Robustheit, Chance Constraints | [Kapitel 12](#kap-unsicherheit) |
| **Eine Periode** | die Entscheidung heute verändert, was übermorgen möglich ist | Bellman-Gleichung, Rückwärtsinduktion | [Kapitel 13](#kap-dynamische-programmierung) |
| **Ein Ziel** | zwei Kennzahlen sollen gleichzeitig stimmen | Pareto-Front, ε-Constraint | [Kapitel 14](#kap-mehrziel) |
| **Daten sind gegeben** | die Eingabe ist selbst eine Prognose | Predict-then-Optimize, entscheidungsorientiertes Lernen | [Kapitel 15](#kap-prognose) |
Die letzte Zeile ist die unbequemste: Dort ist nicht das Modell unsicher, sondern seine **Eingabe** — und die kommt aus einem zweiten Modell, das nach anderen Kriterien gebaut wurde.
## Was dieser Teil gemessen hat
| Behauptung | Gemessen | Wo |
| --- | --- | --- |
| „Mit dem Mittelwert zu rechnen ist eine brauchbare Näherung." | Der Mittelwertplan hält seine Zusage in **50,08 %** der Fälle — per Definition | [Abschnitt 12.7](#sec:unsicherheit-chance-constraints) |
| „Versorgungssicherheit kostet linear." | 56 289 € je Prozentpunkt auf dem Weg zu 80 %, **253 848 €** zwischen 95 und 99 % — das 4,5-fache | [Abschnitt 12.7](#sec:unsicherheit-chance-constraints) |
| „Eine Zusage aus dem Modell hält." | Der 95-%-Plan hält **87,44 %**, sobald die Testverteilung einen Fall enthält, in dem alles zugleich ausfällt | [Abschnitt 12.7](#sec:unsicherheit-chance-constraints) |
| „Die bessere Prognose führt zur besseren Entscheidung." | Das Modell mit dem **schlechteren** MSE trifft die günstigere Entscheidung | [Kapitel 15](#kap-prognose) |
## Drei Fehler, die dieser Teil verhindert
1. **Unsicherheit durch Mittelwerte ersetzen.** Der Durchschnittskunde kauft nie. Bei asymmetrischen Kosten liegt das Optimum systematisch neben dem Mittelwert, und eine Terminzusage ist ein **Quantil**, kein Erwartungswert.
2. **Konvexität voraussetzen, ohne sie zu prüfen.** Ohne sie gibt es keine Optimalitätsgarantie, sondern nur ein lokales Ergebnis — und der Solver sagt das nicht von selbst.
3. **Zwei Ziele mit einem Gewicht verrechnen, bevor die Front bekannt ist.** Ein Gewicht ist eine Antwort auf eine Frage, die noch niemand gestellt hat. Die Pareto-Front stellt sie zuerst.
## Wenn Sie nur eines mitnehmen
> **🎯** Jede der vier Annahmen lässt sich einzeln aufgeben — aber jede kostet etwas Bestimmtes: Linearität kostet die Optimalitätsgarantie, feste Daten kosten Rechenzeit oder Vorsicht, eine Periode kostet Zustandsraum, ein Ziel kostet eine Entscheidung, die nicht der Modellierer treffen darf. Wer weiß, **welche** Annahme bei ihm fällt, weiß auch, welchen Preis er zahlt.
---
# Teil IV: Anwendungen — Energiewirtschaft und Finanzmärkte {#teil-anwendungen}
@ -20984,6 +21094,45 @@ von allen Fehlversuchen genau einen: den erfolgreichsten.
**Ausblick.** [Kapitel 22](#kap-praxisfallen) zieht die Summe aus allen Teilen: die typischen Praxisfallen und der Weg vom Skript zum produktiven System.
---
# Synthese Teil IV — Zwei Domänen, dieselbe Mathematik
Sechs Kapitel, zwei Branchen, die sich für unvergleichbar halten. Die Werkstatt plant Maschinen, das Depot plant Titel — und beide lösen dasselbe Problem: **knappe Mittel auf konkurrierende Verwendungen verteilen, unter Unsicherheit.**
## Dieselbe Struktur, andere Namen
| Werkstatt und Kraftwerk | Depot und Handel | Was mathematisch dahintersteht |
| --- | --- | --- |
| Produkt, Maschinenstunde | Titel, Kapital | Entscheidungsvariable |
| Deckungsbeitrag | erwartete Rendite | linearer Zielterm |
| Kapazität, Liefervertrag | Positionsgrenze, Sektorlimit | Nebenbedingung |
| Rüstkosten, Anfahrkosten | Transaktionskosten | Fixkosten mit Binärvariable (B1) |
| Lastabwurf, Konventionalstrafe | Tail-Verlust | Straf- bzw. Risikoterm |
| Wind- und Nachfrageszenarien | Renditeszenarien | Szenariomenge |
**Und wo die Analogie endet**, benennt [Kapitel 16](#kap-bruecke) an drei Stellen ausdrücklich — das ist der wertvollere Teil. Eine Analogie, die man nicht begrenzen kann, ist keine Erkenntnis, sondern eine Redewendung.
## Was dieser Teil gemessen hat
| Behauptung | Gemessen | Wo |
| --- | --- | --- |
| „Planen mit der Prognose ist gut genug." | Der Erwartungswert-Plan kostet **149 % mehr** (874 870 € statt 351 356 €) und wirft in **28 von 40** Szenarien Last ab | [Kapitel 17](#kap-supplychain) |
| „Dann sparen wir eben beim Brennstoff." | Genau das tut er: 12 725 € gespart, **536 239 €** Lastabwurf bezahlt — das 42-fache. Die Anfahrkosten sind in beiden Plänen gleich | [Kapitel 17](#kap-supplychain) |
| „Der VaR sagt, wie riskant es ist." | VaR **1,86 %**, CVaR **2,99 %** — und der schlechteste Tag der Stichprobe (**23,0 %**) ändert am VaR **nichts** | [Kapitel 20](#kap-cvar) |
| „Die Kovarianzmatrix ist eine Eingabe wie jede andere." | Aus kurzen Reihen geschätzt ist sie schlecht konditioniert; die Optimierung setzt dann auf Schätzrauschen | [Kapitel 18](#kap-finanzdaten) |
## Drei Fehler, die dieser Teil verhindert
1. **Bei Markowitz einsteigen.** Wer [Kapitel 18](#kap-finanzdaten) überspringt, optimiert seine eigenen Schätzfehler und wundert sich über Gewichte, die niemand halten würde.
2. **Den VaR für ein Risikomaß halten.** Er sagt, **ob** die Schwelle gerissen wird, nicht **wie schlimm** es dahinter aussieht — und er ist nicht kohärent. Optimiert wird der CVaR.
3. **Trägheit unterschätzen.** Im Kraftwerkspark ist nicht die Prognosegüte das Problem, sondern dass sich ein Block mit acht Stunden Mindestlaufzeit um 18 Uhr nicht mehr herbeirufen lässt. Dieselbe Trägheit heißt im Depot Transaktionskosten.
## Wenn Sie nur eines mitnehmen
> **🎯** Wer die Struktur erkennt, kann sein Werkzeug mitnehmen, wenn er die Branche wechselt. Wer nur die Bibliothek kennt, fängt jedes Mal von vorn an — und wer die Grenzen der Analogie nicht kennt, überträgt irgendwann auch das, was nicht überträgt.
---
# Teil V: Praxis {#teil-praxis}
@ -24781,6 +24930,45 @@ Das Dockerfile ist kurz genug, um es ganz zu zeigen — es steht im Programm und
* Ein **Optimierungsdienst** ist zweistufig: annehmen und prüfen sofort, rechnen im Hintergrund, Ergebnis mit Status und Gap abholen. Die Frage Threads oder Prozesse gehört gemessen — bei C++-Solvern genügen Threads, bei Python-Heuristiken nicht.
---
# Synthese Teil V — Vom rechnenden Modell zum benutzten System
Zwei Kapitel, ein Übergang: Das Modell rechnet — und muss jetzt jemand anderem übergeben werden. Was dabei schiefgeht, hat selten mit Mathematik zu tun.
## Was schiefgeht, und was dagegen hilft
| Was in Produktion passiert | Gegenmittel | Wo |
| --- | --- | --- |
| `INFEASIBLE` um 3 Uhr nachts, niemand weiß warum | Relaxation mit gestaffelten Strafkosten (B18); Deletion Filter für die Diagnose | [Kapitel 22](#kap-praxisfallen), [Anhang C](#anhang-fehlerdiagnose) |
| Der Disponent lehnt den Plan ab, weil er ihn nicht versteht | Constraint-Trace für die einzelne Zuweisung; Kostenzurechnung für den ganzen Plan | [Kapitel 22](#kap-praxisfallen), [Abschnitt 22.4](#sec:praxisfallen-attribution) |
| Der Solver läuft ins Zeitlimit und keiner merkt es | Status, Gap und Zeitausschöpfung protokollieren — konstante Laufzeit ist ein Warnsignal | [Kapitel 22](#kap-praxisfallen) |
| Ein Test wird grundlos mal rot, mal grün | auf Zielwert und Regeln prüfen, nicht auf die Gestalt der Lösung; `num_workers = 1` **und** Seed | [Abschnitt 7.7](#sec:cpsat-parallele-suche), [Kapitel 23](#kap-testing) |
| Ein Ergebnis lässt sich später nicht mehr nachvollziehen | Snapshot-Prinzip: unveränderlicher Datenstand mit ID je Lauf | [Kapitel 22](#kap-praxisfallen) |
| Das Modell prüft sich selbst | Abnahmeprüfung als eigener Baustein, ohne Solver und ohne Modellvariable | [Abschnitt 22.6](#sec:praxisfallen-or-kern) |
## Was dieser Teil gemessen hat
| Behauptung | Gemessen | Wo |
| --- | --- | --- |
| „Der Solver nennt schon den Grund für `INFEASIBLE`." | Er nennt gar nichts. Der Deletion Filter findet einen kleinsten Konflikt — dieses Modell enthält **neun** verschiedene, und welchen man sieht, steuert die Prüfreihenfolge | [Anhang C](#anhang-fehlerdiagnose) |
| „Bindende Bedingungen sind die teuren." | Von fünf bindenden Bedingungen kostet eine **0,00 €** | [Abschnitt 22.4](#sec:praxisfallen-attribution) |
| „Der Schattenpreis sagt, was der Hebel bringt." | Hochgerechnet 120 €, gemessen **60 €** — er gilt nur bis +15 Stunden. Die Ranglisten nach Preis und nach Wirkung drehen sich um | [Abschnitt 22.4](#sec:praxisfallen-attribution) |
| „Mehr Arbeiter sind proportional schneller." | **12,3-fach** bei acht Arbeitern — überlinear, weil verschiedene Strategien statt derselben Suche laufen | [Abschnitt 7.7](#sec:cpsat-parallele-suche) |
## Drei Fehler, die dieser Teil verhindert
1. **Alles hart formulieren.** Wer keine Regel brechen lässt, bekommt irgendwann eine Fehlermeldung statt eines Plans — und zwar nachts, im Batchlauf.
2. **Genauer optimieren als die Daten sind.** Ein Gap von 2 % ist bei ±10 % Datenunsicherheit bedeutungslos. Die Rechenzeit dafür ist verschenkt.
3. **Einen Bericht für einen Beweis halten.** Ein generierter Text erklärt das **Modell**, nicht die **Wirklichkeit**. Ist eine Eingabe falsch geschätzt, ist er überzeugend **und** falsch — die gefährlichste Kombination.
## Wenn Sie nur eines mitnehmen
> **🎯** Ein Modell, das nur auf Ihrem Rechner und nur mit Ihren Daten läuft, ist ein Prototyp — kein System. Der Unterschied besteht aus drei Dingen, die alle nichts mit dem Solver zu tun haben: einer Abnahmeprüfung, einer Erklärung und einem Protokoll.
**Danach:** die Projektwerkstatt. Elf Aufträge, jeder mit Datenquellen, Modellskizze, Abnahmekriterien und Stolperfallen — zugeschnitten auf 10 bis 25 Stunden bis zu einem vorzeigbaren Ergebnis.
---
# Projektwerkstatt — elf eigene Anwendungen

View file

@ -1264,4 +1264,4 @@ Schattenpreise kommen — und was sie wirtschaftlich bedeuten.
---
*Weiter mit:* [{ref:kap:lp} — Lineare Programmierung](20_Lineare_Programmierung.md)
*Weiter mit:* [{ref:kap:modellierung} — Vom Management-Wunsch zum Modell](13_Vom_Wunsch_zum_Modell.md)

View file

@ -809,3 +809,7 @@ Kennzahlen. Zwei Seiten genügen — sie sind mehr wert als zwei Wochen Programm
* Die vier Fragen — worüber wird entschieden, woran gemessen, was ist unverhandelbar, was
bei Unlösbarkeit — gehören in die erste Besprechung. Der Leitfaden in
{ref:sec:modellierung-leitfaden} macht zwölf daraus.
---
*Weiter mit:* [Synthese Teil I](19_Synthese_Grundlagen.md)

View file

@ -0,0 +1,44 @@
# Synthese Teil I — Grundlagen auf einen Blick
Vier Kapitel, eine Frage: **Was muss vorliegen, bevor ein Solver überhaupt sinnvoll
gestartet werden kann?** Die Antwort ist unbequem, weil das meiste davon nichts mit
Programmieren zu tun hat.
## Was welches Kapitel klärt
| Frage | Kapitel | Was Sie danach können |
| --- | --- | --- |
| Was ist überhaupt ein Optimierungsmodell? | {ref:kap:einfuehrung} | Die vier Bausteine benennen — Variablen, Zielfunktion, Nebenbedingungen, Daten — und sie in einem fremden Problem wiedererkennen |
| Warum rechnet der Solver falsch, obwohl das Modell stimmt? | {ref:kap:fundament} | Konvexität beurteilen, den zulässigen Bereich als Polyeder sehen, schlechte Konditionierung erkennen und beheben |
| Welche Bibliothek, und warum vertragen sie sich nicht? | {ref:kap:oekosystem} | Solver, Bindings und Modellierungsschichten unterscheiden — und den HiGHS-Symbolkonflikt zwischen `ortools` und `highspy` umgehen |
| Wie wird aus einem Satz ein Modell? | {ref:kap:modellierung} | Die vier Fragen stellen, harte von weichen Regeln trennen, einen Besprechungssatz übersetzen ({ref:sec:modellierung-glossar}) |
## Die Reihenfolge ist die Aussage
Dieser Teil steht bewusst **vor** den Verfahren. Die drei häufigsten Gründe, aus denen ein
OR-Projekt scheitert, liegen alle hier — und keiner davon ist ein Solverproblem:
1. **Die falsche Zielgröße.** Sie ist die folgenreichste Entscheidung des ganzen Projekts,
und sie wird meist in den ersten zehn Minuten nebenbei getroffen. Auslastung ist ein
Ergebnis, kein Ziel; „Umsatz" wird gesagt, wenn „Deckungsbeitrag" gemeint ist.
2. **Zu viele harte Regeln.** Jede unnötig harte Bedingung ist eine Zeitbombe: Irgendwann
ist sie nicht erfüllbar, und das System antwortet gar nicht mehr. Hart ist nur, was
rechtlich oder physikalisch unmöglich ist.
3. **Ein Satz, der mehrere Lesarten hat.** „Stammkunden dürfen wir nicht verlieren" lässt
sich auf mindestens drei Arten modellieren, und keine ist aus dem Satz ableitbar. Die
Wahl trifft man — im Zweifel unbewusst.
## Wenn Sie nur eines mitnehmen
> **🎯** Ein Modell rechnet aus, was **aufgeschrieben** wurde, nicht was gemeint war. Die
> Arbeit, die darüber entscheidet, ob am Ende etwas Brauchbares herauskommt, findet vor der
> ersten Zeile Code statt — und sie besteht aus Fragen an andere Menschen, nicht aus
> Mathematik.
**Vor {ref:teil:kernverfahren}** sollten Sie an einem eigenen Beispiel die vier Fragen aus
{ref:sec:modellierung-vier-fragen} durchgespielt haben. Ohne das bleiben die Verfahren
Technik ohne Anwendung.
---
*Weiter mit:* [{ref:kap:lp} — Lineare Programmierung](20_Lineare_Programmierung.md)

View file

@ -1854,4 +1854,4 @@ Zeitfenstern.
---
*Weiter mit:* [{ref:kap:graphen} — Graphen, Flüsse, Touren](23_Graphen_Fluesse_Touren.md)
*Weiter mit:* [{ref:kap:graphen} — Graphen, Flüsse und Touren](23_Graphen_Fluesse_Touren.md)

View file

@ -1084,4 +1084,4 @@ und die KKT-Bedingungen ein — das mathematische Fundament der Portfoliooptimie
---
*Weiter mit:* [{ref:kap:qp-nlp} — Quadratische und nichtlineare Optimierung](30_QP_und_NLP.md)
*Weiter mit:* [{ref:kap:metaheuristiken} — Metaheuristiken](24_Metaheuristiken.md)

View file

@ -1526,3 +1526,7 @@ liegt es an der Strategie oder an der Zahl der Runden, die sie schafft?
könnte.
* **LNS** kombiniert beide: zerstören, exakt reparieren, übernehmen. Die Fenstergröße hat
ein Optimum in der Mitte und gehört gemessen.
---
*Weiter mit:* [{ref:kap:dekomposition} — Spaltengenerierung](25_Spaltengenerierung.md)

View file

@ -750,3 +750,7 @@ Spalten verzweigen kann.
Verfahren 11 %, bei sechs nichts. Diese Kennzahl lässt sich vor dem Projekt ausrechnen.
* Auch wo es nichts spart, liefert es die **Schranke** — und damit die Erlaubnis,
aufzuhören.
---
*Weiter mit:* [Synthese Teil II](29_Synthese_Kernverfahren.md)

View file

@ -0,0 +1,50 @@
# Synthese Teil II — Die Kernverfahren nebeneinander
Sechs Kapitel, sechs Werkzeuge. Jedes einzelne wurde im Zusammenhang gezeigt; hier stehen
sie zum ersten Mal **nebeneinander**, mit der Frage, die vor jedem Projekt zu beantworten
ist: Welches nehme ich, und was bekomme ich dafür?
## Die Entscheidungsmatrix
| Verfahren | Wofür es gebaut ist | Was Sie bekommen | Wo es aufhört | Kapitel |
| --- | --- | --- | --- | --- |
| **LP** | teilbare Mengen, lineare Zusammenhänge | beweisbares Optimum **plus Schattenpreise** | sobald etwas ganzzahlig sein muss | {ref:kap:lp} |
| **MILP** | Ja/Nein-Entscheidungen, Fixkosten, Logik | beweisbares Optimum, Gap als Fortschrittsmaß | Laufzeit wächst mit der Zahl der Binärvariablen | {ref:kap:milp} |
| **CP-SAT** | Zuweisung, Reihenfolge, Kalender, harte Logik | beweisbares Optimum, sehr ausdrucksstarke Bedingungen | keine Schattenpreise, keine stetigen Größen | {ref:kap:cpsat} |
| **Graphenalgorithmen** | Flüsse, Zuordnung, Touren | oft **polynomiell** statt exponentiell | nur, wenn die Struktur wirklich passt | {ref:kap:graphen} |
| **Metaheuristiken** | wenn der exakte Solver aussteigt | eine gute Lösung in **fester Zeit** | keine Garantie, kein Beweis, keine Schranke | {ref:kap:metaheuristiken} |
| **Spaltengenerierung** | Modelle mit astronomisch vielen Variablen | beweisbares Optimum über nie erzeugte Spalten | lohnt nur bei bestimmter Instanzstruktur | {ref:kap:dekomposition} |
**Die Spalte, die am meisten wert ist, ist die vierte.** Ein Verfahren zu kennen heißt zu
wissen, wo es aufhört — nicht, wofür es gedacht ist.
## Was dieser Teil gemessen hat
| Behauptung | Gemessen | Wo |
| --- | --- | --- |
| „Der exakte Solver ist immer besser." | Bei 500 Aufträgen liefert CP-SAT eine Lösung, die **5,2 % schlechter** ist als die Faustregel eines Meisters | {ref:kap:metaheuristiken} |
| „Metaheuristiken sind ungenau." | Faustregel 2 497 → Annealing 2 343 → Annealing plus LNS **2 289** Minuten Rüstzeit; untere Schranke 1 768 | {ref:kap:metaheuristiken} |
| „Man muss alle Variablen aufschreiben." | 28 erzeugte Muster von **46 408** möglichen — und die Lösung ist beweisbar optimal | {ref:kap:dekomposition} |
| „Dekomposition lohnt sich immer." | Bei drei Stücken je Rolle **11 %** Ersparnis, bei sechs **nichts** | {ref:kap:dekomposition} |
| „Mit Seed ist der Lauf reproduzierbar." | Schon **zwei** Arbeiter liefern bei identischem Seed drei verschiedene Pläne zum selben Zielwert | {ref:sec:cpsat-parallele-suche} |
## Drei Fehler, die dieser Teil verhindert
1. **Runden.** Die LP-Lösung ist keine Näherung der ganzzahligen Lösung — sie kann beliebig
weit danebenliegen, und gerundet sogar unzulässig werden.
2. **Ein zu großes Big-M.** Es macht das Modell nicht falsch, sondern die Suche langsam und
die Schranken wertlos. So klein wie zulässig, nie „sicherheitshalber groß".
3. **Zu früh heuristisch werden.** Der Umschlagpunkt, ab dem eine Metaheuristik den exakten
Solver schlägt, ist eine Eigenschaft **des Problems** und lässt sich messen. Wer ihn
nicht misst, verzichtet auf Optimalitätsgarantien, die er hätte haben können.
## Wenn Sie nur eines mitnehmen
> **🎯** Die Frage lautet nie „welcher Solver ist der beste", sondern „welche Garantie
> brauche ich, und was bin ich bereit, dafür an Laufzeit zu zahlen". Ein Verfahren ohne
> Schranke liefert eine Lösung; ein Verfahren mit Schranke liefert die Erlaubnis,
> aufzuhören.
---
*Weiter mit:* [{ref:kap:qp-nlp} — Quadratische und nichtlineare Optimierung](30_QP_und_NLP.md)

View file

@ -5,7 +5,7 @@ in der Praxis oft nicht: Risiko wächst **quadratisch** mit dem Einsatz, Nachfra
morgen bekannt, und eine Entscheidung heute verändert, welche Möglichkeiten übermorgen noch
offenstehen.
Die drei Kapitel dieses Teils behandeln genau diese drei Abweichungen. Welches Werkzeug Sie
Drei Kapitel dieses Teils behandeln genau diese drei Abweichungen. Welches Werkzeug Sie
brauchen, hängt davon ab, **welche** davon bei Ihnen vorliegt:
![Entscheidungsdiagramm: Welches Werkzeug passt zu meinem Problem? (Teil III)](bilder_04/teil3_solverwahl.svg)
@ -21,6 +21,11 @@ brauchen, hängt davon ab, **welche** davon bei Ihnen vorliegt:
> und dann deterministisch zu rechnen. Warum das systematisch danebengeht, zeigt
> {ref:kap:unsicherheit} unter dem Namen *Fluch des Durchschnitts*.
Zwei weitere Kapitel schließen sich an, weil sie dieselbe Voraussetzung aufgeben, nur an
einer anderen Stelle: {ref:kap:mehrziel} gibt das **eine Ziel** auf, {ref:kap:prognose} die
Annahme, die **Eingabedaten** seien gegeben statt selbst geschätzt. Was dieser Teil
insgesamt leistet, fasst die Synthese an seinem Ende zusammen.
---
# Kapitel: Quadratische und nichtlineare Optimierung — KKT, Lagrange, Konvexität {#kap:qp-nlp}

View file

@ -862,4 +862,4 @@ Marktdaten — und lernen zuerst, warum diese Daten trügerisch sind.
---
*Weiter mit:* [{ref:kap:finanzdaten} — Finanzdaten und Kovarianz-Shrinkage](40_Finanzdaten.md)
*Weiter mit:* [{ref:kap:mehrziel} — Mehrere Ziele](33_Mehrziel_und_Pareto.md)

View file

@ -757,3 +757,7 @@ einer Fläche. Wie ändert sich das ε-Verfahren, und warum wächst der Aufwand
dafür so sauber wie möglich" ist eine Frage, die ein Kaufmann beantworten kann.
* Die Front wird erst entscheidbar durch die Spalte **€ je kg**: Sie ist mit dem internen
CO₂-Preis vergleichbar und verwandelt eine Wertefrage in eine Rechnung.
---
*Weiter mit:* [{ref:kap:prognose} — Predict-then-Optimize](34_Predict_then_Optimize.md)

View file

@ -700,3 +700,7 @@ und zwar **in unterschiedlichem Ausmaß**? Was sagt das über den Wert eines Mer
* Ein Kennzahlenvergleich braucht eine **Streuungsangabe**. Bei 180 Testtagen sah das
schlechtere Modell in gut jedem zehnten Fall besser aus — und wer einmal misst, hat genau
eine Ziehung.
---
*Weiter mit:* [Synthese Teil III](39_Synthese_Nichtlinear.md)

View file

@ -735,3 +735,7 @@ trägt — und schreiben Sie auf, welche der drei Zeilen im Weg steht.
gegen reagierende Marktteilnehmer) und ob Teilbarkeit erlaubt ist (MILP gegen LP).
* Die erste dieser Grenzen ist die gefährlichste: Dieselbe Optimierung ist in der Werkstatt
Planung und im Depot Fehlerverstärkung.
---
*Weiter mit:* [{ref:kap:supplychain} — Supply-Chain und Energieeinsatz unter Unsicherheit](36_Supply_Chain_Energie.md)

View file

@ -785,3 +785,7 @@ und welches Verfahren aus {ref:kap:metaheuristiken} würden Sie einsetzen?
der erwarteten Kosten die Absicherung von selbst.
* Wo sie greift, liefert sie den **Preis der Vorgabe**: 46 € je vermiedener MWh — eine Zahl,
über die man verhandeln kann.
---
*Weiter mit:* [{ref:kap:finanzdaten} — Finanzdaten-Modellierung](40_Finanzdaten.md)

View file

@ -0,0 +1,52 @@
# Synthese Teil III — Wenn die Idealwelt nicht gilt
{ref:teil:kernverfahren} setzte voraus: feste Daten, lineare Zusammenhänge, ein Ziel, eine
Periode. Dieser Teil nimmt jede dieser vier Voraussetzungen einzeln weg. Die Tabelle ordnet
die Kapitel danach, **welche** Voraussetzung bei Ihnen verletzt ist.
## Welche Annahme fällt weg?
| Was nicht gilt | Woran Sie es merken | Werkzeug | Kapitel |
| --- | --- | --- | --- |
| **Linearität** | Risiko wächst quadratisch, Kosten degressiv, Sättigung | QP, konvexe Optimierung, KKT | {ref:kap:qp-nlp} |
| **Feste Daten** | Nachfrage, Wind, Rendite stehen erst morgen fest | Monte-Carlo, Zweistufigkeit, Robustheit, Chance Constraints | {ref:kap:unsicherheit} |
| **Eine Periode** | die Entscheidung heute verändert, was übermorgen möglich ist | Bellman-Gleichung, Rückwärtsinduktion | {ref:kap:dynamische-programmierung} |
| **Ein Ziel** | zwei Kennzahlen sollen gleichzeitig stimmen | Pareto-Front, ε-Constraint | {ref:kap:mehrziel} |
| **Daten sind gegeben** | die Eingabe ist selbst eine Prognose | Predict-then-Optimize, entscheidungsorientiertes Lernen | {ref:kap:prognose} |
Die letzte Zeile ist die unbequemste: Dort ist nicht das Modell unsicher, sondern seine
**Eingabe** — und die kommt aus einem zweiten Modell, das nach anderen Kriterien gebaut
wurde.
## Was dieser Teil gemessen hat
| Behauptung | Gemessen | Wo |
| --- | --- | --- |
| „Mit dem Mittelwert zu rechnen ist eine brauchbare Näherung." | Der Mittelwertplan hält seine Zusage in **50,08 %** der Fälle — per Definition | {ref:sec:unsicherheit-chance-constraints} |
| „Versorgungssicherheit kostet linear." | 56 289 € je Prozentpunkt auf dem Weg zu 80 %, **253 848 €** zwischen 95 und 99 % — das 4,5-fache | {ref:sec:unsicherheit-chance-constraints} |
| „Eine Zusage aus dem Modell hält." | Der 95-%-Plan hält **87,44 %**, sobald die Testverteilung einen Fall enthält, in dem alles zugleich ausfällt | {ref:sec:unsicherheit-chance-constraints} |
| „Die bessere Prognose führt zur besseren Entscheidung." | Das Modell mit dem **schlechteren** MSE trifft die günstigere Entscheidung | {ref:kap:prognose} |
## Drei Fehler, die dieser Teil verhindert
1. **Unsicherheit durch Mittelwerte ersetzen.** Der Durchschnittskunde kauft nie. Bei
asymmetrischen Kosten liegt das Optimum systematisch neben dem Mittelwert, und eine
Terminzusage ist ein **Quantil**, kein Erwartungswert.
2. **Konvexität voraussetzen, ohne sie zu prüfen.** Ohne sie gibt es keine
Optimalitätsgarantie, sondern nur ein lokales Ergebnis — und der Solver sagt das nicht
von selbst.
3. **Zwei Ziele mit einem Gewicht verrechnen, bevor die Front bekannt ist.** Ein Gewicht
ist eine Antwort auf eine Frage, die noch niemand gestellt hat. Die Pareto-Front stellt
sie zuerst.
## Wenn Sie nur eines mitnehmen
> **🎯** Jede der vier Annahmen lässt sich einzeln aufgeben — aber jede kostet etwas
> Bestimmtes: Linearität kostet die Optimalitätsgarantie, feste Daten kosten Rechenzeit
> oder Vorsicht, eine Periode kostet Zustandsraum, ein Ziel kostet eine Entscheidung, die
> nicht der Modellierer treffen darf. Wer weiß, **welche** Annahme bei ihm fällt, weiß
> auch, welchen Preis er zahlt.
---
*Weiter mit:* [{ref:kap:bruecke} — Die Strukturbrücke](35_Strukturbruecke.md)

View file

@ -951,4 +951,4 @@ Markowitz-Effizienzgrenze mit realistischen institutionellen Restriktionen.
---
*Weiter mit:* [{ref:kap:markowitz} — Markowitz-Portfoliotheorie](41_Markowitz.md)
*Weiter mit:* [{ref:kap:markowitz} — Die moderne Portfoliotheorie nach Markowitz](41_Markowitz.md)

View file

@ -846,4 +846,4 @@ Rebalancing und ein Walk-Forward-Backtest ohne Lookahead-Bias.
---
*Weiter mit:* [{ref:kap:handelsmaschine} — Die vollständige Handelsmaschine](43_Handelsmaschine.md)
*Weiter mit:* [{ref:kap:handelsmaschine} — Die vollständige quantitative Handelsmaschine](43_Handelsmaschine.md)

View file

@ -1047,4 +1047,4 @@ der Weg vom Skript zum produktiven System.
---
*Weiter mit:* [{ref:kap:praxisfallen} — Praxisfallen und produktiver Einsatz](50_Praxis.md)
*Weiter mit:* [Synthese Teil IV](49_Synthese_Anwendungen.md)

View file

@ -0,0 +1,50 @@
# Synthese Teil IV — Zwei Domänen, dieselbe Mathematik
Sechs Kapitel, zwei Branchen, die sich für unvergleichbar halten. Die Werkstatt plant
Maschinen, das Depot plant Titel — und beide lösen dasselbe Problem: **knappe Mittel auf
konkurrierende Verwendungen verteilen, unter Unsicherheit.**
## Dieselbe Struktur, andere Namen
| Werkstatt und Kraftwerk | Depot und Handel | Was mathematisch dahintersteht |
| --- | --- | --- |
| Produkt, Maschinenstunde | Titel, Kapital | Entscheidungsvariable |
| Deckungsbeitrag | erwartete Rendite | linearer Zielterm |
| Kapazität, Liefervertrag | Positionsgrenze, Sektorlimit | Nebenbedingung |
| Rüstkosten, Anfahrkosten | Transaktionskosten | Fixkosten mit Binärvariable (B1) |
| Lastabwurf, Konventionalstrafe | Tail-Verlust | Straf- bzw. Risikoterm |
| Wind- und Nachfrageszenarien | Renditeszenarien | Szenariomenge |
**Und wo die Analogie endet**, benennt {ref:kap:bruecke} an drei Stellen ausdrücklich — das
ist der wertvollere Teil. Eine Analogie, die man nicht begrenzen kann, ist keine Erkenntnis,
sondern eine Redewendung.
## Was dieser Teil gemessen hat
| Behauptung | Gemessen | Wo |
| --- | --- | --- |
| „Planen mit der Prognose ist gut genug." | Der Erwartungswert-Plan kostet **149 % mehr** (874 870 € statt 351 356 €) und wirft in **28 von 40** Szenarien Last ab | {ref:kap:supplychain} |
| „Dann sparen wir eben beim Brennstoff." | Genau das tut er: 12 725 € gespart, **536 239 €** Lastabwurf bezahlt — das 42-fache. Die Anfahrkosten sind in beiden Plänen gleich | {ref:kap:supplychain} |
| „Der VaR sagt, wie riskant es ist." | VaR **1,86 %**, CVaR **2,99 %** — und der schlechteste Tag der Stichprobe (**23,0 %**) ändert am VaR **nichts** | {ref:kap:cvar} |
| „Die Kovarianzmatrix ist eine Eingabe wie jede andere." | Aus kurzen Reihen geschätzt ist sie schlecht konditioniert; die Optimierung setzt dann auf Schätzrauschen | {ref:kap:finanzdaten} |
## Drei Fehler, die dieser Teil verhindert
1. **Bei Markowitz einsteigen.** Wer {ref:kap:finanzdaten} überspringt, optimiert seine
eigenen Schätzfehler und wundert sich über Gewichte, die niemand halten würde.
2. **Den VaR für ein Risikomaß halten.** Er sagt, **ob** die Schwelle gerissen wird, nicht
**wie schlimm** es dahinter aussieht — und er ist nicht kohärent. Optimiert wird der
CVaR.
3. **Trägheit unterschätzen.** Im Kraftwerkspark ist nicht die Prognosegüte das Problem,
sondern dass sich ein Block mit acht Stunden Mindestlaufzeit um 18 Uhr nicht mehr
herbeirufen lässt. Dieselbe Trägheit heißt im Depot Transaktionskosten.
## Wenn Sie nur eines mitnehmen
> **🎯** Wer die Struktur erkennt, kann sein Werkzeug mitnehmen, wenn er die Branche
> wechselt. Wer nur die Bibliothek kennt, fängt jedes Mal von vorn an — und wer die Grenzen
> der Analogie nicht kennt, überträgt irgendwann auch das, was nicht überträgt.
---
*Weiter mit:* [{ref:kap:praxisfallen} — Praxisfallen und der Weg zum produktiven Einsatz](50_Praxis.md)

View file

@ -2515,4 +2515,4 @@ sichtbar wird, und gibt Zeit zum Handeln.
---
*Weiter mit:* [Projektwerkstatt — acht eigene Anwendungen](59_Projektwerkstatt.md)
*Weiter mit:* [{ref:kap:testing} — Testen, Messen, Ausliefern](51_Testing_und_Deployment.md)

View file

@ -1636,3 +1636,7 @@ Test, der eine Instanz einreicht, die das Limit überschreitet.
* Ein **Optimierungsdienst** ist zweistufig: annehmen und prüfen sofort, rechnen im
Hintergrund, Ergebnis mit Status und Gap abholen. Die Frage Threads oder Prozesse gehört
gemessen — bei C++-Solvern genügen Threads, bei Python-Heuristiken nicht.
---
*Weiter mit:* [Synthese Teil V](52_Synthese_Praxis.md)

View file

@ -0,0 +1,48 @@
# Synthese Teil V — Vom rechnenden Modell zum benutzten System
Zwei Kapitel, ein Übergang: Das Modell rechnet — und muss jetzt jemand anderem übergeben
werden. Was dabei schiefgeht, hat selten mit Mathematik zu tun.
## Was schiefgeht, und was dagegen hilft
| Was in Produktion passiert | Gegenmittel | Wo |
| --- | --- | --- |
| `INFEASIBLE` um 3 Uhr nachts, niemand weiß warum | Relaxation mit gestaffelten Strafkosten (B18); Deletion Filter für die Diagnose | {ref:kap:praxisfallen}, {ref:anhang:fehlerdiagnose} |
| Der Disponent lehnt den Plan ab, weil er ihn nicht versteht | Constraint-Trace für die einzelne Zuweisung; Kostenzurechnung für den ganzen Plan | {ref:kap:praxisfallen}, {ref:sec:praxisfallen-attribution} |
| Der Solver läuft ins Zeitlimit und keiner merkt es | Status, Gap und Zeitausschöpfung protokollieren — konstante Laufzeit ist ein Warnsignal | {ref:kap:praxisfallen} |
| Ein Test wird grundlos mal rot, mal grün | auf Zielwert und Regeln prüfen, nicht auf die Gestalt der Lösung; `num_workers = 1` **und** Seed | {ref:sec:cpsat-parallele-suche}, {ref:kap:testing} |
| Ein Ergebnis lässt sich später nicht mehr nachvollziehen | Snapshot-Prinzip: unveränderlicher Datenstand mit ID je Lauf | {ref:kap:praxisfallen} |
| Das Modell prüft sich selbst | Abnahmeprüfung als eigener Baustein, ohne Solver und ohne Modellvariable | {ref:sec:praxisfallen-or-kern} |
## Was dieser Teil gemessen hat
| Behauptung | Gemessen | Wo |
| --- | --- | --- |
| „Der Solver nennt schon den Grund für `INFEASIBLE`." | Er nennt gar nichts. Der Deletion Filter findet einen kleinsten Konflikt — dieses Modell enthält **neun** verschiedene, und welchen man sieht, steuert die Prüfreihenfolge | {ref:anhang:fehlerdiagnose} |
| „Bindende Bedingungen sind die teuren." | Von fünf bindenden Bedingungen kostet eine **0,00 €** | {ref:sec:praxisfallen-attribution} |
| „Der Schattenpreis sagt, was der Hebel bringt." | Hochgerechnet 120 €, gemessen **60 €** — er gilt nur bis +15 Stunden. Die Ranglisten nach Preis und nach Wirkung drehen sich um | {ref:sec:praxisfallen-attribution} |
| „Mehr Arbeiter sind proportional schneller." | **12,3-fach** bei acht Arbeitern — überlinear, weil verschiedene Strategien statt derselben Suche laufen | {ref:sec:cpsat-parallele-suche} |
## Drei Fehler, die dieser Teil verhindert
1. **Alles hart formulieren.** Wer keine Regel brechen lässt, bekommt irgendwann eine
Fehlermeldung statt eines Plans — und zwar nachts, im Batchlauf.
2. **Genauer optimieren als die Daten sind.** Ein Gap von 2 % ist bei ±10 %
Datenunsicherheit bedeutungslos. Die Rechenzeit dafür ist verschenkt.
3. **Einen Bericht für einen Beweis halten.** Ein generierter Text erklärt das **Modell**,
nicht die **Wirklichkeit**. Ist eine Eingabe falsch geschätzt, ist er überzeugend **und**
falsch — die gefährlichste Kombination.
## Wenn Sie nur eines mitnehmen
> **🎯** Ein Modell, das nur auf Ihrem Rechner und nur mit Ihren Daten läuft, ist ein
> Prototyp — kein System. Der Unterschied besteht aus drei Dingen, die alle nichts mit dem
> Solver zu tun haben: einer Abnahmeprüfung, einer Erklärung und einem Protokoll.
**Danach:** die Projektwerkstatt. Elf Aufträge, jeder mit Datenquellen, Modellskizze,
Abnahmekriterien und Stolperfallen — zugeschnitten auf 10 bis 25 Stunden bis zu einem
vorzeigbaren Ergebnis.
---
*Weiter mit:* [Projektwerkstatt](59_Projektwerkstatt.md)

View file

@ -367,4 +367,4 @@ Viel Erfolg.
---
*Weiter mit:* [{ref:anhang:loesungen} — Lösungen](90_Anhang_Loesungen.md)
*Weiter mit:* [{ref:anhang:loesungen} — Lösungen zu allen Übungsaufgaben](90_Anhang_Loesungen.md)

View file

@ -3201,3 +3201,7 @@ der Solver, sondern die Bindung davor.
Eine in reinem Python geschriebene Heuristik hält den GIL; für sie braucht es Prozesse.
---
---
*Weiter mit:* [{ref:anhang:modellierungsmuster} — Katalog der Modellierungsmuster](91_Anhang_Modellierungsmuster.md)

View file

@ -438,4 +438,4 @@ Wenn mehrere Muster passen, entscheiden Sie nach dieser Reihenfolge:
---
*Weiter mit:* [{ref:anhang:fehlerdiagnose} — Fehlerdiagnose](92_Anhang_Fehlerdiagnose.md)
*Weiter mit:* [{ref:anhang:fehlerdiagnose} — Fehlerdiagnose-Handbuch](92_Anhang_Fehlerdiagnose.md)

View file

@ -95,25 +95,30 @@ DATEIEN = [
"11_Mathematisches_Fundament.md",
"12_Python_Oekosystem.md",
"13_Vom_Wunsch_zum_Modell.md",
"19_Synthese_Grundlagen.md",
"20_Lineare_Programmierung.md",
"21_MILP.md",
"22_CP_SAT.md",
"23_Graphen_Fluesse_Touren.md",
"24_Metaheuristiken.md",
"25_Spaltengenerierung.md",
"29_Synthese_Kernverfahren.md",
"30_QP_und_NLP.md",
"31_Unsicherheit.md",
"32_Dynamische_Programmierung.md",
"33_Mehrziel_und_Pareto.md",
"34_Predict_then_Optimize.md",
"39_Synthese_Nichtlinear.md",
"35_Strukturbruecke.md",
"36_Supply_Chain_Energie.md",
"40_Finanzdaten.md",
"41_Markowitz.md",
"42_CVaR.md",
"43_Handelsmaschine.md",
"49_Synthese_Anwendungen.md",
"50_Praxis.md",
"51_Testing_und_Deployment.md",
"52_Synthese_Praxis.md",
"59_Projektwerkstatt.md",
"90_Anhang_Loesungen.md",
"91_Anhang_Modellierungsmuster.md",
@ -308,6 +313,35 @@ def pruefe_dateien() -> list[str]:
f"{marken} Loesungen, das Kapitel aber {erwartet} Aufgaben.")
fehlend.append(anhang)
# Die Lesekette. Jede Datei ausser der letzten schliesst mit
# '*Weiter mit:* [...](naechste_datei.md)' - und zwar auf die Datei, die in
# DATEIEN als naechste steht.
#
# Das ist keine Formalie: Nach den acht in Phase 3 eingefuegten Kapiteln
# zeigte die Kette an ihnen VORBEI. Wer ihr folgte, uebersprang
# stillschweigend acht von 23 Kapiteln - darunter Metaheuristiken,
# Spaltengenerierung und das ganze Testing-Kapitel. Gefunden wurde das
# erst, als die Synthese-Seiten dazwischenkamen.
#
# Vorwort und Notation sind ausgenommen: Sie verweisen in eigener Form.
OHNE_KETTE = {"00_Vorwort_und_Lesehilfe.md", "01_Notation_und_Abkuerzungen.md"}
weiter_re = re.compile(r"^\*Weiter mit:\*.*?\]\((\S+?\.md)\)", re.MULTILINE)
for i, name in enumerate(DATEIEN[:-1]):
if name in OHNE_KETTE:
continue
with open(os.path.join(HIER, name), encoding="utf-8") as f:
inhalt = f.read()
treffer = weiter_re.search(inhalt)
soll = DATEIEN[i + 1]
if treffer is None:
print(f"FEHLER: {name} hat keine '*Weiter mit:*'-Zeile - die Lesekette "
f"bricht dort ab (naechste Datei waere {soll}).")
fehlend.append(name)
elif treffer.group(1) != soll:
print(f"FEHLER: {name} verweist auf '{treffer.group(1)}', in DATEIEN "
f"folgt aber '{soll}' - die Lesekette ueberspringt eine Datei.")
fehlend.append(name)
return fehlend
@ -983,6 +1017,14 @@ def baue_pdf() -> None:
SONDERSEITEN = {
"00_Vorwort_und_Lesehilfe.md": ("vorwort.html", "Vorwort & Lesehilfe"),
"01_Notation_und_Abkuerzungen.md": ("notation.html", "Notation & Abkürzungen"),
# Die fuenf Teil-Synthesen. Sie tragen bewusst keine
# '# Kapitel:'-Ueberschrift - sie sind keine Kapitel, sondern der Rueckblick
# auf einen ganzen Teil - und brauchen deshalb hier ihren Seitennamen.
"19_Synthese_Grundlagen.md": ("synthese-grundlagen.html", "Synthese Teil I"),
"29_Synthese_Kernverfahren.md": ("synthese-kernverfahren.html", "Synthese Teil II"),
"39_Synthese_Nichtlinear.md": ("synthese-nichtlinear.html", "Synthese Teil III"),
"49_Synthese_Anwendungen.md": ("synthese-anwendungen.html", "Synthese Teil IV"),
"52_Synthese_Praxis.md": ("synthese-praxis.html", "Synthese Teil V"),
"59_Projektwerkstatt.md": ("projektwerkstatt.html", "Projektwerkstatt"),
}

View file

@ -74,17 +74,17 @@ sie unerwartet ab, ist etwas kaputtgegangen.
| Kennzahl | Version 03 | Version 04 (heute) |
| --- | --- | --- |
| Kapiteldateien | 22 | **31** |
| Kapiteldateien | 22 | **36** (31 + 5 Teil-Synthesen) |
| Kapitel | 15 | **23** |
| Anhänge | 4 | **5** |
| Zeilen im Gesamtdokument | 11 082 | **28 322** |
| Größe des Gesamtdokuments | 606 KB | **1 602 KB** |
| Hauptüberschriften | 131 | **298** |
| Zeilen im Gesamtdokument | 11 082 | **28 510** |
| Größe des Gesamtdokuments | 606 KB | **1 618 KB** |
| Hauptüberschriften | 131 | **303** |
| registrierte Abschnitte | 122 | **296** |
| aufgelöste Querverweise | 314 | **766** (0 unaufgelöst) |
| aufgelöste Querverweise | 314 | **815** (0 unaufgelöst) |
| Indexmarken | 295 | **328** |
| Beispielprogramme | 41 | **76** (alle lauffähig) |
| PDF-Seiten | — | **749** |
| PDF-Seiten | — | **758** |
| Notebooks | — | **25** |
| Plotly-Figuren | — | **4** |
| Diagramme (SVG) | 26 | **33**, davon **19** mit Generatorskript (16 Skripte) |
@ -1724,6 +1724,52 @@ Mitgezogen: Lernziel, Zusammenfassung, Rückverweis aus Anhang B, Pfad E im Vorw
**Damit ist Phase 7 abgeschlossen.** 296 Abschnitte, 766 Querverweise, 141 Aufgaben mit
141 Lösungen, PDF **749** Seiten.
### ✅ 8.1 Synthese-Seiten je Teil — und ein Fund in der Lesekette
Setzt Paket 5 aus `Verbesserungen_02.md` um (den Teil, der nicht zurückgestellt wurde). Fünf
neue Dateien `19_/29_/39_/49_/52_Synthese_*.md`, je eine am Ende eines Teils, mit eigener
Website-Seite (`SONDERSEITEN`, weil sie bewusst **keine** `# Kapitel:`-Überschrift tragen —
sie sind keine Kapitel, sondern der Rückblick auf einen Teil).
**Der Entwurf musste sich abgrenzen:** Die Teil-**Einleitungen** haben bereits
Entscheidungsdiagramme („welches Werkzeug passt zu meinem Problem"). Eine zweite
Entscheidungsmatrix am Teil-Ende wäre eine Dopplung gewesen. Die Synthesen leisten deshalb
das, was eine Einleitung nicht kann: den **Vergleich über die Kapitel hinweg** (Verfahren
nebeneinander, mit der Spalte „wo es aufhört"), eine Tabelle **„was dieser Teil gemessen
hat"** — Behauptung gegen Messung gegen Fundstelle — und drei Fehler, die der Teil
verhindert. Zitiert wird ausschließlich, was im Buch tatsächlich gerechnet wird.
### Drei Funde beim Einbau
**Erstens: Teil III sagte „die drei Kapitel dieses Teils", hat aber fünf.** Phase 3 hatte
{ref:kap:mehrziel} und {ref:kap:prognose} hinzugefügt, die Einleitung blieb stehen. Sie
nennt die drei Abweichungen jetzt weiterhin, schließt die beiden späteren Kapitel aber
ausdrücklich an.
**Zweitens: `50_Praxis.md` verwies auf die Projektwerkstatt mit „acht eigene Anwendungen"** —
sie hat elf.
**Drittens, und das ist der eigentliche Fund: Die Lesekette der Quelldateien führte an acht
Kapiteln vorbei.** Nach Phase 3 zeigte `12_Python_Oekosystem.md` direkt auf
`20_Lineare_Programmierung.md`, `23_Graphen…` direkt auf `30_QP…`, `32_Dynamische…` direkt
auf `40_Finanzdaten.md`, `50_Praxis.md` direkt auf die Projektwerkstatt. Wer der Kette
folgte, übersprang **acht von 23 Kapiteln** — darunter Metaheuristiken, Spaltengenerierung,
Mehrziel, Predict-then-Optimize, Strukturbrücke, Supply-Chain und das ganze
Testing-Kapitel. Zehn weitere Dateien hatten gar keine Navigationszeile.
**Zur Reichweite, damit sie nicht überschätzt wird:** Diese Zeilen stehen **nur in den
Quelldateien**. `entferne_navigation()` streicht sie aus dem Gesamtdokument, und die Website
baut ihre Vor/Zurück-Knöpfe selbst aus `DATEIEN`. PDF und Website waren also nie betroffen —
wohl aber jeder, der die Markdown-Dateien im Repository liest, und das wird nach der
Veröffentlichung der Normalfall sein.
Die Kette ist jetzt über **alle 35 Übergänge** geschlossen, und `--check` bewacht sie: Fehlt
eine Zeile oder zeigt sie an der in `DATEIEN` folgenden Datei vorbei, ist der Lauf rot.
Gegengetestet mit beiden Bruchformen.
Stand danach: **36 Dateien** (31 + 5 Synthesen), 296 Abschnitte, **815** Querverweise,
303 Hauptüberschriften, PDF **758** Seiten.
---
## 8. Commit-Historie des V04-Strangs

View file

@ -14,10 +14,10 @@ daraus ab, und alle Befehle unten werden **hier** ausgeführt.
| Pfad | Rolle |
| --- | --- |
| `Operations_Research_mit_Python_Version_04/` | **Quelle**: 31 Kapiteldateien + Build-Skripte |
| `Operations_Research_mit_Python_Version_04/` | **Quelle**: 36 Kapiteldateien (inkl. 5 Teil-Synthesen) + Build-Skripte |
| `bilder_04/` | **Quelle**: Diagramme (SVG/PNG) + `erzeuge_*.py`-Generatoren |
| `Operations_Research_mit_Python_Version_04.md` | generiert: Gesamtdokument (Pandoc-Eingabe) |
| `Operations_Research_mit_Python_Version_04.pdf` | generiert: PDF, 749 Seiten |
| `Operations_Research_mit_Python_Version_04.pdf` | generiert: PDF, 758 Seiten |
| `OR_HTML_04/` | generiert: **Mehrseiten-Website** — dieser Ordner wird veröffentlicht |
| `Operations_Research_mit_Python_Version_04_Programme/` | generiert: 76 lauffähige Beispielprogramme |
| `Notebooks_04/` | generiert: ein Jupyter-Notebook je Kapitel |