Glossar-Links: Fachbegriffe im Fließtext automatisch verlinken

Auto-Linking im Build: Glossar-Begriffe werden im Fließtext automatisch
erkannt und als Link auf den Glossar-Eintrag gesetzt — erste Nennung je
Begriff je Datei, dezent gestrichelte Unterstreichung im HTML, hyperref
im PDF. Kein manuelles Markieren bei Textänderungen nötig.

Neue Infrastruktur:
- glossar_eintraege_04.py: glossar_slug() + LINK_TEXTE-Map (automatisch
  generiert aus EINTRAEGEN + Abkürzungs-Extraktion)
- erzeuge_glossar_04.py: jeder Eintrag bekommt {#gloss:<slug>}-Anchor
- build_version_04.py: resolve_glossar() — Auto-Linking + {gl:}-Marke
- web_04/site.css: .glossar-link (dezent, nicht wie Navigationslink)

5 neue Glossar-Einträge (waren als Begriff im Text, aber nicht im Glossar):
Solver, Scheduling, Graphen, Backtest, DCP (Disciplined Convex Programming)

Schutzmechanismen:
- Code-Blöcke, Inline-Code, {idx:}/{ref:}-Marken, Markdown-Links und
  Überschriften werden nicht verlinkt
- Verschachtelung verhindert: 'CP-SAT-Solver' als Ganzes, nicht 'CP'+[
  -'SAT'+[-'Solver'
- 'OR' als 2-Zeichen-Abkürzung nicht auto-verlinkt (False Positive in
  'OR-Tools'); {gl:OR} als manuelle Marke
- Glossar selbst nicht auto-verlinkt (sonst Self-Links)
- reflow_markdown(): ::: als Block-Grenze (sonst kollabiert fenced div)

619 Glossar-Links im Gesamtdokument, 239 Anchor im Glossar, 34 im Vorwort.
This commit is contained in:
dschlueter 2026-09-10 17:40:29 +02:00
commit e8abb66d75
52 changed files with 4316 additions and 1921 deletions

View file

@ -106,11 +106,11 @@
<hr />
<h1 class="unlisted unnumbered" id="optimierte-entscheidungsfindung-mit-python">Optimierte Entscheidungsfindung mit Python</h1>
<h2 class="unlisted unnumbered" id="von-der-mathematischen-modellierung-zu-praktischen-intelligenten-lösungen-für-betrieb-technik-und-finanzmärkte">Von der mathematischen Modellierung zu praktischen intelligenten Lösungen für Betrieb, Technik und Finanzmärkte</h2>
<p><strong>Ein praxisorientiertes Kompendium für Entscheider</strong> mit Constraint Programming, Vektor- und Matrixmethoden sowie HiGHS, SciPy, Google OR-Tools und CVXPY.</p>
<p><strong>Ein praxisorientiertes Kompendium für Entscheider</strong> mit Constraint Programming, Vektor- und Matrixmethoden sowie <a href="anhang-glossar.md#gloss:highs" class="glossar-link">HiGHS</a>, <a href="anhang-glossar.md#gloss:scipy" class="glossar-link">SciPy</a>, Google <a href="anhang-glossar.md#gloss:or-tools" class="glossar-link">OR-Tools</a> und <a href="anhang-glossar.md#gloss:cvxpy" class="glossar-link">CVXPY</a>.</p>
<p>Mit Python planen, optimieren und entscheiden: von <strong>Personal, Schichten und Logistik</strong> über <strong>Energie, Ressourcen und Netzwerke</strong> bis zur <strong>Portfoliooptimierung an den Finanzmärkten</strong>.</p>
<p>Autor / Herausgeber: Dieter Schlüter</p>
<p>&lt;dieter(dot)schlueter(atsign)linix(dot)de&gt;</p>
<p>Stand: 10. September 2026 v16.11</p>
<p>Stand: 10. September 2026 v17.39</p>
<hr />
<h1 class="unnumbered" id="über-den-kurs">Über den Kurs</h1>
<h2 class="unnumbered" id="vorwort">Vorwort</h2>
@ -125,9 +125,9 @@
<p>Die Programme des Kurses laufen unter Linux, MacOS und Windows (WSL) gleichermaßen, entweder im Terminal, in Jupyter Notebook oder nach dem Hochladen in Google Colab. Entwickelt und ausgiebig getestet wurden sie in der Linux-Umgebung.</p>
<hr />
<h2 class="unnumbered" id="ziel-der-masterclass">Ziel der Masterclass</h2>
<p>Ein umfassendes, didaktisch von Grund auf aufgebautes Lehrbuch zur mathematischen Entscheidungsoptimierung (<strong>Operations Research, OR</strong>) mit praktischer Umsetzung in <strong>Python</strong>. Dieser Kurs der <strong>mathematischen Optimierung</strong> setzt kein Vorwissen in OR voraus und führt schrittweise von den algebraischen und kombinatorischen Grundlagen über Scheduling- und Constraint-Modelle bis hin zur professionellen Anwendung im quantitativen Aktienhandel, Portfoliomanagement und Risikocontrolling.</p>
<p>Ein umfassendes, didaktisch von Grund auf aufgebautes Lehrbuch zur mathematischen Entscheidungsoptimierung (<strong>Operations Research, OR</strong>) mit praktischer Umsetzung in <strong>Python</strong>. Dieser Kurs der <strong>mathematischen Optimierung</strong> setzt kein Vorwissen in OR voraus und führt schrittweise von den algebraischen und kombinatorischen Grundlagen über <a href="anhang-glossar.md#gloss:scheduling" class="glossar-link">Scheduling</a>- und Constraint-Modelle bis hin zur professionellen Anwendung im quantitativen Aktienhandel, Portfoliomanagement und Risikocontrolling.</p>
<h3 class="unnumbered" id="vorausgesetzte-kenntnisse">Vorausgesetzte Kenntnisse</h3>
<p>Vorausgesetzt werden <strong>sichere Python-Kenntnisse</strong> (Funktionen, Klassen, NumPy, pandas) sowie Mathematik auf Grundstudiumsniveau:</p>
<p>Vorausgesetzt werden <strong>sichere Python-Kenntnisse</strong> (Funktionen, Klassen, <a href="anhang-glossar.md#gloss:numpy" class="glossar-link">NumPy</a>, <a href="anhang-glossar.md#gloss:pandas" class="glossar-link">pandas</a>) sowie Mathematik auf Grundstudiumsniveau:</p>
<table>
<colgroup>
<col style="width: 33%" />
@ -149,7 +149,7 @@
</tr>
<tr class="even">
<td><strong>Analysis</strong></td>
<td>Ableitung, Gradient, notwendige Bedingung erster Ordnung</td>
<td>Ableitung, <a href="anhang-glossar.md#gloss:gradient" class="glossar-link">Gradient</a>, notwendige Bedingung erster Ordnung</td>
<td><a href="qp-nlp.html#kap-qp-nlp">Kapitel 11</a></td>
</tr>
<tr class="odd">
@ -181,7 +181,7 @@
<div class="sourceCode" id="cb2"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a><span class="ex">pip</span> install <span class="at">-r</span> Operations_Research_mit_Python_Version_04_Programme/requirements.txt</span></code></pre></div>
<h3 class="unnumbered" id="installationstest">Installationstest</h3>
<p>Prüfen Sie mit diesem Skript, ob alles bereitsteht, <strong>bevor</strong> Sie mit <a href="einfuehrung.html#kap-einfuehrung">Kapitel 1</a> beginnen. Es meldet für jedes Paket Version und Status und löst ein Mini-Optimierungsproblem.</p>
<p>Eine Besonderheit dabei — die Import-Reihenfolge ist bewusst gewählt: <code>highspy</code> und <code>cvxpy</code> werden in der Paketübersicht nur auf Anwesenheit geprüft, und <code>ortools</code> lädt seine native Bibliothek zuerst. Der Grund: <code>ortools</code> und <code>highspy</code> bringen jeweils eine eigene HiGHS-Kopie mit, die sich nicht im selben Python-Prozess verträgt — und <code>cvxpy</code> importiert ein installiertes <code>highspy</code> bei der Solver-Erkennung selbst mit. Lädt deren HiGHS-Kopie zuerst, bricht der Test beim CP-SAT-Funktionstest mit einem kryptischen <code>ImportError: undefined symbol</code> ab; so gewinnt die Kopie von <code>ortools</code>, und CVXPY verzichtet lediglich auf sein HIGHS-Interface (für alle Buchprogramme folgenlos). Details und Abhilfen: <a href="oekosystem.html#sec:oekosystem-ein-system-vier-programmieransaetze">Abschnitt 3.5</a> und <a href="anhang-fehlerdiagnose.html#anhang-fehlerdiagnose">Anhang C</a>.</p>
<p>Eine Besonderheit dabei — die Import-Reihenfolge ist bewusst gewählt: <code>highspy</code> und <code>cvxpy</code> werden in der Paketübersicht nur auf Anwesenheit geprüft, und <code>ortools</code> lädt seine native Bibliothek zuerst. Der Grund: <code>ortools</code> und <code>highspy</code> bringen jeweils eine eigene HiGHS-Kopie mit, die sich nicht im selben Python-Prozess verträgt — und <code>cvxpy</code> importiert ein installiertes <code>highspy</code> bei der <a href="anhang-glossar.md#gloss:solver" class="glossar-link">Solver</a>-Erkennung selbst mit. Lädt deren HiGHS-Kopie zuerst, bricht der Test beim <a href="anhang-glossar.md#gloss:cp-sat" class="glossar-link">CP-SAT</a>-Funktionstest mit einem kryptischen <code>ImportError: undefined symbol</code> ab; so gewinnt die Kopie von <code>ortools</code>, und CVXPY verzichtet lediglich auf sein HIGHS-Interface (für alle Buchprogramme folgenlos). Details und Abhilfen: <a href="oekosystem.html#sec:oekosystem-ein-system-vier-programmieransaetze">Abschnitt 3.5</a> und <a href="anhang-fehlerdiagnose.html#anhang-fehlerdiagnose">Anhang C</a>.</p>
<div class="sourceCode" id="cb3"><pre class="sourceCode python"><code class="sourceCode python"><span id="cb3-1"><a href="#cb3-1" aria-hidden="true" tabindex="-1"></a><span class="co">#!/usr/bin/env python3</span></span>
<span id="cb3-2"><a href="#cb3-2" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb3-3"><a href="#cb3-3" aria-hidden="true" tabindex="-1"></a><span class="co"># Installationstest.py</span></span>
@ -364,20 +364,20 @@ Alles bereit — Sie können mit dem ersten Kapitel beginnen.</code></pre>
<ul>
<li><strong>Was Planen mit Durchschnitten kostet, wird hier beziffert, nicht behauptet.</strong> Im Kraftwerkseinsatz aus <a href="supplychain.html#kap-supplychain">Kapitel 17</a> kostet ein Plan, der mit dem Wind-<strong>Erwartungswert</strong> rechnet, in der Wirklichkeit <strong>149 % mehr</strong> als einer, der 40 Szenarien berücksichtigt — 874 870 € statt 351 356 € — und führt in <strong>28 von 40 Szenarien</strong> zum Lastabwurf statt in keinem.</li>
<li><strong>„Wie sicher soll es sein?“ wird eine Preisfrage.</strong> <a href="unsicherheit.html#sec:unsicherheit-chance-constraints">Abschnitt 12.7</a> rechnet aus, was ein Prozentpunkt Versorgungssicherheit kostet: rund 56 000 € auf dem Weg zu 80 %, rund 254 000 € zwischen 95 und 99 %. Das <strong>4,5-fache</strong>. Wer 99,9 % fordert, ohne diese Kurve gesehen zu haben, fordert ins Blaue.</li>
<li><strong>Für die Sitzung gibt es einen Bericht, keine Tabelle.</strong> <a href="praxisfallen.html#sec:praxisfallen-attribution">Abschnitt 22.4</a> beziffert je Nebenbedingung, was sie den Plan kostet, und formuliert daraus Sätze in Alltagssprache. Für die Frage des Betriebsrats — <em>„warum ausgerechnet ich?“</em> — liefert <a href="praxisfallen.html#kap-praxisfallen">Kapitel 22</a> den Constraint-Trace, der die einzelne Zuweisung begründet.</li>
<li><strong>Für die Sitzung gibt es einen Bericht, keine Tabelle.</strong> <a href="praxisfallen.html#sec:praxisfallen-attribution">Abschnitt 22.4</a> beziffert je Nebenbedingung, was sie den Plan kostet, und formuliert daraus Sätze in Alltagssprache. Für die Frage des Betriebsrats — <em>„warum ausgerechnet ich?“</em> — liefert <a href="praxisfallen.html#kap-praxisfallen">Kapitel 22</a> den <a href="anhang-glossar.md#gloss:constraint-trace" class="glossar-link">Constraint-Trace</a>, der die einzelne Zuweisung begründet.</li>
</ul>
<p><strong>Ihr Weg.</strong> Zuerst Pfad E (24 Stunden): <a href="einfuehrung.html#sec:einfuehrung-historischer-kontext-und-evolution">Abschnitt 1.5</a> und <a href="anhang-modellierungsmuster.html#anhang-modellierungsmuster">Anhang B</a>. Wenn Sie danach wissen wollen, was in Ihrem Betrieb geht, Pfad B und Projekt <strong>P1</strong> oder <strong>P2</strong>.</p>
<p><strong>Woran es scheitert.</strong> Nicht am Modell, sondern an der Einführung — das ist der meistgenannte Befund in <a href="praxisfallen.html#kap-praxisfallen">Kapitel 22</a>. Und an einer Verwechslung, die dieses Buch Ihnen nicht abnehmen kann: Ein Bericht erklärt das <strong>Modell</strong>, nicht die <strong>Wirklichkeit</strong>. Ist ein Deckungsbeitrag falsch geschätzt, ist er überzeugend <strong>und</strong> falsch. Fragen Sie deshalb jedes Mal, worauf eine Zahl beruht.</p>
<blockquote>
<p><strong>Eine Erwartung, die dieses Buch enttäuscht:</strong> Es nennt keine ROI-Kennzahl und keine Amortisationsdauer. Beide hängen an Ihrem Betrieb, und jede Zahl hier wäre erfunden. Was es stattdessen liefert, ist das Werkzeug, Ihre eigene auszurechnen: den <strong>EVPI</strong> in <a href="unsicherheit.html#kap-unsicherheit">Kapitel 12</a> (was eine perfekte Prognose überhaupt wert wäre — eine Obergrenze für jedes Prognoseprojekt) und die Kostenzurechnung aus <a href="praxisfallen.html#sec:praxisfallen-attribution">Abschnitt 22.4</a>.</p>
<p><strong>Eine Erwartung, die dieses Buch enttäuscht:</strong> Es nennt keine ROI-Kennzahl und keine Amortisationsdauer. Beide hängen an Ihrem Betrieb, und jede Zahl hier wäre erfunden. Was es stattdessen liefert, ist das Werkzeug, Ihre eigene auszurechnen: den <strong><a href="anhang-glossar.md#gloss:evpi-expected-value-of-perfect-information" class="glossar-link">EVPI</a></strong> in <a href="unsicherheit.html#kap-unsicherheit">Kapitel 12</a> (was eine perfekte Prognose überhaupt wert wäre — eine Obergrenze für jedes Prognoseprojekt) und die Kostenzurechnung aus <a href="praxisfallen.html#sec:praxisfallen-attribution">Abschnitt 22.4</a>.</p>
</blockquote>
<h3 class="unnumbered" id="für-ingenieure-und-produktionsplaner-die-physik-des-systems">Für Ingenieure und Produktionsplaner — die Physik des Systems</h3>
<blockquote>
<p><em>„Der Engpass wandert. Kaum ist eine Maschine entlastet, steht die nächste — und niemand kann mir vorher sagen, welche.“</em></p>
</blockquote>
<ul>
<li><strong>Der Engpass lässt sich benennen und bepreisen.</strong> <a href="praxisfallen.html#sec:praxisfallen-attribution">Abschnitt 22.4</a> rechnet für jede Kapazität aus, was die nächste Stunde wert ist — und wie weit dieser Wert trägt. Im Beispiel gilt der Schattenpreis der Lackiererei exakt bis <strong>+15 Stunden</strong>; eine ganze Sonderschicht von 30 Stunden bringt deshalb 60 € statt der rechnerischen 120 €. <strong>Die zweite Hälfte wäre bezahlt und wirkungslos.</strong></li>
<li><strong>Rüstzeiten, Reihenfolgen, Taktzeiten sind der Kern, nicht die Ausnahme.</strong> <a href="cpsat.html#kap-cpsat">Kapitel 7</a> modelliert Maschinenbelegung mit Intervallvariablen, <a href="metaheuristiken.html#kap-metaheuristiken">Kapitel 9</a> zeigt am selben Fall das Gesamtbild: Faustregel 2 497 Minuten Rüstzeit, CP-SAT allein 2 628, Simulated Annealing 2 343, Annealing plus LNS <strong>2 289</strong> — und die untere Schranke bei 1 768, damit sichtbar bleibt, wie viel Luft noch da ist.</li>
<li><strong>Der Engpass lässt sich benennen und bepreisen.</strong> <a href="praxisfallen.html#sec:praxisfallen-attribution">Abschnitt 22.4</a> rechnet für jede Kapazität aus, was die nächste Stunde wert ist — und wie weit dieser Wert trägt. Im Beispiel gilt der <a href="anhang-glossar.md#gloss:schattenpreis" class="glossar-link">Schattenpreis</a> der Lackiererei exakt bis <strong>+15 Stunden</strong>; eine ganze Sonderschicht von 30 Stunden bringt deshalb 60 € statt der rechnerischen 120 €. <strong>Die zweite Hälfte wäre bezahlt und wirkungslos.</strong></li>
<li><strong>Rüstzeiten, Reihenfolgen, Taktzeiten sind der Kern, nicht die Ausnahme.</strong> <a href="cpsat.html#kap-cpsat">Kapitel 7</a> modelliert Maschinenbelegung mit Intervallvariablen, <a href="metaheuristiken.html#kap-metaheuristiken">Kapitel 9</a> zeigt am selben Fall das Gesamtbild: Faustregel 2 497 Minuten <a href="anhang-glossar.md#gloss:ruestzeit" class="glossar-link">Rüstzeit</a>, <a href="anhang-glossar.md#gloss:constraint-programming-cp" class="glossar-link">CP</a>-<a href="anhang-glossar.md#gloss:sat-boolean-satisfiability" class="glossar-link">SAT</a> allein 2 628, <a href="anhang-glossar.md#gloss:simulated-annealing" class="glossar-link">Simulated Annealing</a> 2 343, Annealing plus <a href="anhang-glossar.md#gloss:large-neighborhood-search-lns" class="glossar-link">LNS</a> <strong>2 289</strong> — und die untere Schranke bei 1 768, damit sichtbar bleibt, wie viel Luft noch da ist.</li>
<li><strong>Wenn der Solver zu lange braucht, gibt es Zahlen statt Ratschläge.</strong> <a href="cpsat.html#sec:cpsat-parallele-suche">Abschnitt 7.7</a> misst, was mehrere Suchstränge bringen (hier Faktor 12,3) — und ab wo mehr Arbeiter wieder schaden.</li>
</ul>
<p><strong>Ihr Weg.</strong> Pfad B bis <a href="cpsat.html#kap-cpsat">Kapitel 7</a>, dann Projekt <strong>P5</strong> (Produktionsplanung mit Rüstkosten). Wenn Ihre echten Instanzen den Solver stehen lassen: <a href="metaheuristiken.html#kap-metaheuristiken">Kapitel 9</a> und Projekt <strong>P9</strong>.</p>
@ -387,18 +387,18 @@ Alles bereit — Sie können mit dem ersten Kapitel beginnen.</code></pre>
<p><em>„Die Optimierung liefert mir Gewichte, die kein Mensch halten würde: 60 % in einem Titel, null in fünf anderen. Und im nächsten Quartal sieht sie völlig anders aus.“</em></p>
</blockquote>
<ul>
<li><strong>Der Grund dafür steht in <a href="finanzdaten.html#kap-finanzdaten">Kapitel 18</a>, nicht in <a href="markowitz.html#kap-markowitz">Kapitel 19</a>.</strong> Eine aus kurzen Zeitreihen geschätzte Kovarianzmatrix ist schlecht konditioniert; der Optimierer setzt dann auf Schätzrauschen. Shrinkage nach Ledoit-Wolf ist das Gegenmittel; ihre Wirkung wird an <strong>Eigenwertspektrum und Konditionszahl</strong> gemessen, nicht behauptet.</li>
<li><strong>Der VaR verschweigt genau das, worauf es ankommt.</strong> In der Stichprobe aus <a href="cvar.html#kap-cvar">Kapitel 20</a> sagt der VaR: „an 95 % der Tage höchstens <strong>1,86 %</strong> Verlust“. Der CVaR sagt: „und wenn doch, dann im Mittel <strong>2,99 %</strong>“. Der schlechteste Tag der Stichprobe liegt bei <strong>23,0 %</strong> — am VaR ändert dieser eine Tag <strong>nichts</strong>, am CVaR sehr wohl. Deshalb ist der CVaR die Größe, die man optimiert.</li>
<li><strong>Transaktionskosten und Rebalancing sind Teil des Modells, nicht ein Abzug danach.</strong> <a href="cvar.html#kap-cvar">Kapitel 20</a> nimmt sie in die Zielfunktion, <a href="handelsmaschine.html#kap-handelsmaschine">Kapitel 21</a> setzt den Backtest daneben — samt der Fallen, die einen guten Backtest wertlos machen.</li>
<li><strong>Der Grund dafür steht in <a href="finanzdaten.html#kap-finanzdaten">Kapitel 18</a>, nicht in <a href="markowitz.html#kap-markowitz">Kapitel 19</a>.</strong> Eine aus kurzen Zeitreihen geschätzte <a href="anhang-glossar.md#gloss:kovarianzmatrix" class="glossar-link">Kovarianzmatrix</a> ist schlecht konditioniert; der Optimierer setzt dann auf Schätzrauschen. Shrinkage nach Ledoit-Wolf ist das Gegenmittel; ihre Wirkung wird an <strong>Eigenwertspektrum und <a href="anhang-glossar.md#gloss:konditionszahl" class="glossar-link">Konditionszahl</a></strong> gemessen, nicht behauptet.</li>
<li><strong>Der <a href="anhang-glossar.md#gloss:value-at-risk-var" class="glossar-link">VaR</a> verschweigt genau das, worauf es ankommt.</strong> In der Stichprobe aus <a href="cvar.html#kap-cvar">Kapitel 20</a> sagt der VaR: „an 95 % der Tage höchstens <strong>1,86 %</strong> Verlust“. Der <a href="anhang-glossar.md#gloss:conditional-value-at-risk-cvar" class="glossar-link">CVaR</a> sagt: „und wenn doch, dann im Mittel <strong>2,99 %</strong>“. Der schlechteste Tag der Stichprobe liegt bei <strong>23,0 %</strong> — am VaR ändert dieser eine Tag <strong>nichts</strong>, am CVaR sehr wohl. Deshalb ist der CVaR die Größe, die man optimiert.</li>
<li><strong><a href="anhang-glossar.md#gloss:transaktionskosten" class="glossar-link">Transaktionskosten</a> und <a href="anhang-glossar.md#gloss:rebalancing" class="glossar-link">Rebalancing</a> sind Teil des Modells, nicht ein Abzug danach.</strong> <a href="cvar.html#kap-cvar">Kapitel 20</a> nimmt sie in die <a href="anhang-glossar.md#gloss:zielfunktion" class="glossar-link">Zielfunktion</a>, <a href="handelsmaschine.html#kap-handelsmaschine">Kapitel 21</a> setzt den <a href="anhang-glossar.md#gloss:backtest" class="glossar-link">Backtest</a> daneben — samt der Fallen, die einen guten Backtest wertlos machen.</li>
</ul>
<p><strong>Ihr Weg.</strong> Pfad D, und zwar <strong>mit</strong> <a href="finanzdaten.html#kap-finanzdaten">Kapitel 18</a>. Danach Projekt <strong>P6</strong> (Portfolio-Rebalancer) oder <strong>P7</strong> (Risikoreport mit CVaR und Stresstests).</p>
<p><strong>Woran es scheitert.</strong> An der Reihenfolge. Wer bei Markowitz einsteigt und die Datenkapitel überspringt, bekommt ein Modell, das seine eigenen Schätzfehler maximiert — und merkt es erst im Echtgeldbetrieb.</p>
<p><strong>Woran es scheitert.</strong> An der Reihenfolge. Wer bei Markowitz einsteigt und die Datenkapitel überspringt, bekommt ein Modell, das seine eigenen <a href="anhang-glossar.md#gloss:schaetzfehler" class="glossar-link">Schätzfehler</a> maximiert — und merkt es erst im Echtgeldbetrieb.</p>
<h3 class="unnumbered" id="für-studierende-und-data-scientists-die-methodik">Für Studierende und Data Scientists — die Methodik</h3>
<blockquote>
<p><em>„Ich kann ein Modell trainieren und den Fehler senken. Aber wie wird aus einer Prognose eine Entscheidung — und woher weiß ich, dass sie gut ist?“</em></p>
</blockquote>
<ul>
<li><strong>Die unbequemste Erkenntnis zuerst.</strong> <a href="prognose.html#kap-prognose">Kapitel 15</a> zeigt an einem gerechneten Fall, dass das Modell mit dem <strong>schlechteren</strong> MSE die <strong>günstigere</strong> Entscheidung trifft. Prognosegüte und Entscheidungsqualität sind zwei verschiedene Größen; wer die eine optimiert, bekommt die andere nicht geschenkt.</li>
<li><strong>Die unbequemste Erkenntnis zuerst.</strong> <a href="prognose.html#kap-prognose">Kapitel 15</a> zeigt an einem gerechneten Fall, dass das Modell mit dem <strong>schlechteren</strong> <a href="anhang-glossar.md#gloss:mse" class="glossar-link">MSE</a> die <strong>günstigere</strong> Entscheidung trifft. Prognosegüte und Entscheidungsqualität sind zwei verschiedene Größen; wer die eine optimiert, bekommt die andere nicht geschenkt.</li>
<li><strong>Dieselbe Mathematik, zwei Welten.</strong> <a href="bruecke.html#kap-bruecke">Kapitel 16</a> lässt <strong>denselben Code</strong> einmal über eine Werkstatt und einmal über ein Depot laufen — und benennt die drei Stellen, an denen die Analogie endet. Struktur zu erkennen ist die eigentliche Fähigkeit, nicht Bibliothekskenntnis; zu wissen, wo eine Analogie aufhört, gehört dazu.</li>
<li><strong>Es wird gerechnet, nicht nacherzählt.</strong> Zu jedem Kapitel gehören Aufgaben mit vollständigen Lösungen, Handrechnungen und ein „Finde den Denkfehler“ — und jedes abgedruckte Ergebnis stammt aus einem echten Lauf des danebenstehenden Programms.</li>
</ul>
@ -410,13 +410,13 @@ Alles bereit — Sie können mit dem ersten Kapitel beginnen.</code></pre>
<h3 class="unnumbered" id="pfad-a-vollständiger-lehrgang-100140-stunden">Pfad A — Vollständiger Lehrgang (100140 Stunden)</h3>
<p><a href="einfuehrung.html#kap-einfuehrung">Kapitel 1</a> bis <a href="testing.html#kap-testing">Kapitel 23</a> in Reihenfolge, danach ein Projekt aus der Projektwerkstatt. Empfohlen, wenn Sie OR systematisch lernen wollen. Rechnen Sie mit 46 Stunden je Kapitel inklusive Übungen.</p>
<h3 class="unnumbered" id="pfad-b-planung-disposition-personaleinsatz-ca.-25-stunden">Pfad B — Planung, Disposition, Personaleinsatz (ca. 25 Stunden)</h3>
<p><a href="einfuehrung.html#kap-einfuehrung">Kapitel 1</a> (Bausteine) → <a href="fundament.html#kap-fundament">Kapitel 2</a> (bis <a href="fundament.html#sec:fundament-konvexitaet-die-grenze-zwischen-leicht-und">Abschnitt 2.5</a>) → <a href="modellierung.html#kap-modellierung">Kapitel 4</a> (vom Wunsch zum Modell) → <a href="lp.html#kap-lp">Kapitel 5</a> (LP, Schattenpreise) → <a href="milp.html#kap-milp">Kapitel 6</a> (Ja/Nein-Entscheidungen) → <a href="cpsat.html#kap-cpsat">Kapitel 7</a> (CP-SAT, Scheduling) → Projekt <strong>P1</strong> (Vertretungsplaner) oder <strong>P2</strong> (Schichtplanung). Das ist der kürzeste Weg zu einem einsetzbaren Dienstplan-Optimierer.</p>
<p><a href="einfuehrung.html#kap-einfuehrung">Kapitel 1</a> (Bausteine) → <a href="fundament.html#kap-fundament">Kapitel 2</a> (bis <a href="fundament.html#sec:fundament-konvexitaet-die-grenze-zwischen-leicht-und">Abschnitt 2.5</a>) → <a href="modellierung.html#kap-modellierung">Kapitel 4</a> (vom Wunsch zum Modell) → <a href="lp.html#kap-lp">Kapitel 5</a> (<a href="anhang-glossar.md#gloss:lineare-programmierung-lp" class="glossar-link">LP</a>, Schattenpreise) → <a href="milp.html#kap-milp">Kapitel 6</a> (Ja/Nein-Entscheidungen) → <a href="cpsat.html#kap-cpsat">Kapitel 7</a> (CP-SAT, Scheduling) → Projekt <strong>P1</strong> (Vertretungsplaner) oder <strong>P2</strong> (Schichtplanung). Das ist der kürzeste Weg zu einem einsetzbaren Dienstplan-Optimierer.</p>
<p><em>Wenn der Solver bei Ihrer echten Instanz stehen bleibt:</em> <a href="metaheuristiken.html#kap-metaheuristiken">Kapitel 9</a> und Projekt <strong>P9</strong>.</p>
<h3 class="unnumbered" id="pfad-c-logistik-und-tourenplanung-ca.-25-stunden">Pfad C — Logistik und Tourenplanung (ca. 25 Stunden)</h3>
<p><a href="einfuehrung.html#kap-einfuehrung">Kapitel 1</a><a href="fundament.html#kap-fundament">Kapitel 2</a> (bis <a href="fundament.html#sec:fundament-der-zulaessige-loesungsraum-und-das-polyeder">Abschnitt 2.4</a>) → <a href="lp.html#kap-lp">Kapitel 5</a><a href="milp.html#kap-milp">Kapitel 6</a><a href="graphen.html#kap-graphen">Kapitel 8</a> (Graphen, VRP) → Projekt <strong>P3</strong> (Liefertouren) oder <strong>P4</strong> (Lagernetzwerk).</p>
<p><a href="einfuehrung.html#kap-einfuehrung">Kapitel 1</a><a href="fundament.html#kap-fundament">Kapitel 2</a> (bis <a href="fundament.html#sec:fundament-der-zulaessige-loesungsraum-und-das-polyeder">Abschnitt 2.4</a>) → <a href="lp.html#kap-lp">Kapitel 5</a><a href="milp.html#kap-milp">Kapitel 6</a><a href="graphen.html#kap-graphen">Kapitel 8</a> (<a href="anhang-glossar.md#gloss:graphen" class="glossar-link">Graphen</a>, <a href="anhang-glossar.md#gloss:vehicle-routing-problem-vrp" class="glossar-link">VRP</a>) → Projekt <strong>P3</strong> (Liefertouren) oder <strong>P4</strong> (Lagernetzwerk).</p>
<p><em>Wenn die Instanzen zu groß werden:</em> <a href="metaheuristiken.html#kap-metaheuristiken">Kapitel 9</a> (gute Lösung in fester Zeit) und <a href="dekomposition.html#kap-dekomposition">Kapitel 10</a> (das Modell umbauen statt die Lösung raten) — dazu Projekt <strong>P9</strong>, das beide Wege am selben Problem vergleicht.</p>
<h3 class="unnumbered" id="pfad-d-quantitative-finance-ca.-30-stunden">Pfad D — Quantitative Finance (ca. 30 Stunden)</h3>
<p><a href="einfuehrung.html#kap-einfuehrung">Kapitel 1</a><a href="fundament.html#kap-fundament">Kapitel 2</a><a href="qp-nlp.html#kap-qp-nlp">Kapitel 11</a> (QP, KKT) → <a href="finanzdaten.html#kap-finanzdaten">Kapitel 18</a> (Daten, Shrinkage) → <a href="markowitz.html#kap-markowitz">Kapitel 19</a> (Markowitz) → <a href="cvar.html#kap-cvar">Kapitel 20</a> (CVaR) → <a href="handelsmaschine.html#kap-handelsmaschine">Kapitel 21</a> (Backtest) → Projekt <strong>P6</strong> (Portfolio-Rebalancer) oder <strong>P7</strong> (Risikoreport). <strong>Wichtig:</strong> Überspringen Sie <a href="finanzdaten.html#kap-finanzdaten">Kapitel 18</a> nicht. Wer direkt bei Markowitz einsteigt, optimiert Schätzrauschen und wundert sich über absurde Gewichte.</p>
<p><a href="einfuehrung.html#kap-einfuehrung">Kapitel 1</a><a href="fundament.html#kap-fundament">Kapitel 2</a><a href="qp-nlp.html#kap-qp-nlp">Kapitel 11</a> (<a href="anhang-glossar.md#gloss:quadratische-programmierung-qp" class="glossar-link">QP</a>, <a href="anhang-glossar.md#gloss:karush-kuhn-tucker-bedingungen-kkt" class="glossar-link">KKT</a>) → <a href="finanzdaten.html#kap-finanzdaten">Kapitel 18</a> (Daten, Shrinkage) → <a href="markowitz.html#kap-markowitz">Kapitel 19</a> (Markowitz) → <a href="cvar.html#kap-cvar">Kapitel 20</a> (CVaR) → <a href="handelsmaschine.html#kap-handelsmaschine">Kapitel 21</a> (Backtest) → Projekt <strong>P6</strong> (Portfolio-Rebalancer) oder <strong>P7</strong> (Risikoreport). <strong>Wichtig:</strong> Überspringen Sie <a href="finanzdaten.html#kap-finanzdaten">Kapitel 18</a> nicht. Wer direkt bei Markowitz einsteigt, optimiert Schätzrauschen und wundert sich über absurde Gewichte.</p>
<h3 class="unnumbered" id="pfad-e-ich-habe-morgen-ein-konkretes-problem-24-stunden">Pfad E — Ich habe morgen ein konkretes Problem (24 Stunden)</h3>
<p>Lesen Sie <a href="einfuehrung.html#sec:einfuehrung-historischer-kontext-und-evolution">Abschnitt 1.5</a> (die vier Bausteine) und <a href="modellierung.html#sec:modellierung-glossar">Abschnitt 4.6</a> (welcher Satz welcher Baustein ist), dann <a href="anhang-modellierungsmuster.html#anhang-modellierungsmuster">Anhang B</a> (<a href="anhang-modellierungsmuster.html">Modellierungsmuster</a>) und suchen Sie dort das Muster, das zu Ihrem Problem passt. Von jedem Muster führt ein Verweis in das zuständige Kapitel. Wie die gewählte Bibliothek es schreibt, steht in <a href="anhang-spickzettel.html#anhang-spickzettel">Anhang D</a> (<a href="anhang-spickzettel.html">Spickzettel</a>); wenn etwas nicht läuft, in <a href="anhang-fehlerdiagnose.html#anhang-fehlerdiagnose">Anhang C</a> (<a href="anhang-fehlerdiagnose.html">Fehlerdiagnose</a>).</p>
<h3 class="unnumbered" id="pfad-f-vom-prototyp-in-den-betrieb-ca.-15-stunden">Pfad F — Vom Prototyp in den Betrieb (ca. 15 Stunden)</h3>
@ -451,7 +451,7 @@ Alles bereit — Sie können mit dem ersten Kapitel beginnen.</code></pre>
</tr>
<tr class="odd">
<td><code>Brute_Force_Vergleich.py</code></td>
<td>Kombinatorische Explosion</td>
<td><a href="anhang-glossar.md#gloss:kombinatorische-explosion" class="glossar-link">Kombinatorische Explosion</a></td>
<td><a href="einfuehrung.html#kap-einfuehrung">Kapitel 1</a></td>
</tr>
<tr class="even">
@ -476,7 +476,7 @@ Alles bereit — Sie können mit dem ersten Kapitel beginnen.</code></pre>
</tr>
<tr class="even">
<td><code>Visualisierung_Loesungsraum.py</code></td>
<td>Polyeder mit Ecken</td>
<td><a href="anhang-glossar.md#gloss:polyeder" class="glossar-link">Polyeder</a> mit Ecken</td>
<td><a href="fundament.html#kap-fundament">Kapitel 2</a></td>
</tr>
<tr class="odd">
@ -496,7 +496,7 @@ Alles bereit — Sie können mit dem ersten Kapitel beginnen.</code></pre>
</tr>
<tr class="even">
<td><code>Modellierungsschichten.py</code></td>
<td>Pyomo und Linopy</td>
<td><a href="anhang-glossar.md#gloss:pyomo" class="glossar-link">Pyomo</a> und <a href="anhang-glossar.md#gloss:linopy" class="glossar-link">Linopy</a></td>
<td><a href="oekosystem.html#kap-oekosystem">Kapitel 3</a></td>
</tr>
<tr class="odd">
@ -526,7 +526,7 @@ Alles bereit — Sie können mit dem ersten Kapitel beginnen.</code></pre>
</tr>
<tr class="even">
<td><code>Toleranzen_und_Entartung.py</code></td>
<td>Entartung, Toleranzen, Dualspannen</td>
<td><a href="anhang-glossar.md#gloss:entartung" class="glossar-link">Entartung</a>, Toleranzen, Dualspannen</td>
<td><a href="lp.html#kap-lp">Kapitel 5</a></td>
</tr>
<tr class="odd">
@ -546,7 +546,7 @@ Alles bereit — Sie können mit dem ersten Kapitel beginnen.</code></pre>
</tr>
<tr class="even">
<td><code>Solverstatus_und_Gap.py</code></td>
<td>MIP-Gap, Zeitlimit, Statusfälle</td>
<td><a href="anhang-glossar.md#gloss:mip-gap" class="glossar-link">MIP-Gap</a>, Zeitlimit, Statusfälle</td>
<td><a href="milp.html#kap-milp">Kapitel 6</a></td>
</tr>
<tr class="odd">
@ -556,7 +556,7 @@ Alles bereit — Sie können mit dem ersten Kapitel beginnen.</code></pre>
</tr>
<tr class="even">
<td><code>Big_M_Falle.py</code></td>
<td>Trickle Flow bei zu großem M</td>
<td><a href="anhang-glossar.md#gloss:trickle-flow" class="glossar-link">Trickle Flow</a> bei zu großem M</td>
<td><a href="milp.html#kap-milp">Kapitel 6</a></td>
</tr>
<tr class="odd">
@ -571,7 +571,7 @@ Alles bereit — Sie können mit dem ersten Kapitel beginnen.</code></pre>
</tr>
<tr class="odd">
<td><code>JobShop_Intervalle.py</code></td>
<td>Job-Shop-Scheduling</td>
<td><a href="anhang-glossar.md#gloss:job-shop-scheduling" class="glossar-link">Job-Shop-Scheduling</a></td>
<td><a href="cpsat.html#kap-cpsat">Kapitel 7</a></td>
</tr>
<tr class="even">
@ -601,7 +601,7 @@ Alles bereit — Sie können mit dem ersten Kapitel beginnen.</code></pre>
</tr>
<tr class="odd">
<td><code>VRP_Flotten_Routing.py</code></td>
<td>CVRPTW</td>
<td><a href="anhang-glossar.md#gloss:cvrptw" class="glossar-link">CVRPTW</a></td>
<td><a href="graphen.html#kap-graphen">Kapitel 8</a></td>
</tr>
<tr class="even">
@ -631,7 +631,7 @@ Alles bereit — Sie können mit dem ersten Kapitel beginnen.</code></pre>
</tr>
<tr class="odd">
<td><code>QP_Grundlagen.py</code></td>
<td>Konvexität, DCP-Check</td>
<td><a href="anhang-glossar.md#gloss:konvexitaet" class="glossar-link">Konvexität</a>, <a href="anhang-glossar.md#gloss:dcp-disciplined-convex-programming" class="glossar-link">DCP</a>-Check</td>
<td><a href="qp-nlp.html#kap-qp-nlp">Kapitel 11</a></td>
</tr>
<tr class="even">
@ -641,7 +641,7 @@ Alles bereit — Sie können mit dem ersten Kapitel beginnen.</code></pre>
</tr>
<tr class="odd">
<td><code>Entropie_Maximierte_Allokation.py</code></td>
<td>NLP mit Entropie</td>
<td><a href="anhang-glossar.md#gloss:nichtlineare-programmierung-nlp" class="glossar-link">NLP</a> mit Entropie</td>
<td><a href="qp-nlp.html#kap-qp-nlp">Kapitel 11</a></td>
</tr>
<tr class="even">
@ -676,12 +676,12 @@ Alles bereit — Sie können mit dem ersten Kapitel beginnen.</code></pre>
</tr>
<tr class="even">
<td><code>Bellman_Minimalbeispiel.py</code></td>
<td>Rückwärtsinduktion</td>
<td><a href="anhang-glossar.md#gloss:rueckwaertsinduktion" class="glossar-link">Rückwärtsinduktion</a></td>
<td><a href="dynamische-programmierung.html#kap-dynamische-programmierung">Kapitel 13</a></td>
</tr>
<tr class="odd">
<td><code>Mehrziel_Pareto.py</code></td>
<td>Pareto-Front, ε-Constraint, Gewichtslücke</td>
<td><a href="anhang-glossar.md#gloss:pareto-front" class="glossar-link">Pareto-Front</a>, ε-Constraint, Gewichtslücke</td>
<td><a href="mehrziel.html#kap-mehrziel">Kapitel 14</a></td>
</tr>
<tr class="even">
@ -726,7 +726,7 @@ Alles bereit — Sie können mit dem ersten Kapitel beginnen.</code></pre>
</tr>
<tr class="even">
<td><code>Markowitz_CVXPY.py</code></td>
<td>GMV, Max Sharpe, Frontier</td>
<td><a href="anhang-glossar.md#gloss:global-minimum-variance-portfolio-gmv" class="glossar-link">GMV</a>, Max Sharpe, Frontier</td>
<td><a href="markowitz.html#kap-markowitz">Kapitel 19</a></td>
</tr>
<tr class="odd">
@ -741,7 +741,7 @@ Alles bereit — Sie können mit dem ersten Kapitel beginnen.</code></pre>
</tr>
<tr class="odd">
<td><code>VaR_CVaR_Demo.py</code></td>
<td>Fat Tails, Subadditivität</td>
<td><a href="anhang-glossar.md#gloss:fat-tails" class="glossar-link">Fat Tails</a>, <a href="anhang-glossar.md#gloss:subadditivitaet" class="glossar-link">Subadditivität</a></td>
<td><a href="cvar.html#kap-cvar">Kapitel 20</a></td>
</tr>
<tr class="even">
@ -751,7 +751,7 @@ Alles bereit — Sie können mit dem ersten Kapitel beginnen.</code></pre>
</tr>
<tr class="odd">
<td><code>QuantitativeTradingEngine.py</code></td>
<td>Walk-Forward-Backtest</td>
<td><a href="anhang-glossar.md#gloss:walk-forward-backtest" class="glossar-link">Walk-Forward-Backtest</a></td>
<td><a href="handelsmaschine.html#kap-handelsmaschine">Kapitel 21</a></td>
</tr>
<tr class="even">
@ -816,14 +816,14 @@ Alles bereit — Sie können mit dem ersten Kapitel beginnen.</code></pre>
</tr>
<tr class="even">
<td><code>Konfliktsuche.py</code></td>
<td>Deletion Filter: den Widerspruch einkreisen</td>
<td><a href="anhang-glossar.md#gloss:deletion-filter" class="glossar-link">Deletion Filter</a>: den Widerspruch einkreisen</td>
<td><a href="anhang-fehlerdiagnose.html#anhang-fehlerdiagnose">Anhang C</a></td>
</tr>
</tbody>
</table>
<hr />
<h2 class="unnumbered" id="was-dieses-buch-nicht-ist">Was dieses Buch nicht ist</h2>
<p>Es ist <strong>keine Anleitung zum Bau eigener Solver</strong> — wir nutzen ausgereifte Implementierungen und investieren die Zeit stattdessen in die Modellierung. Die einzige Ausnahme ist der Simplex-Algorithmus in <a href="lp.html#kap-lp">Kapitel 5</a>, den wir von Grund auf programmieren, weil man ihn verstanden haben muss, um Dualität und Schattenpreise zu begreifen.</p>
<p>Es ist <strong>keine Anleitung zum Bau eigener Solver</strong> — wir nutzen ausgereifte Implementierungen und investieren die Zeit stattdessen in die Modellierung. Die einzige Ausnahme ist der <a href="anhang-glossar.md#gloss:simplex-algorithmus" class="glossar-link">Simplex-Algorithmus</a> in <a href="lp.html#kap-lp">Kapitel 5</a>, den wir von Grund auf programmieren, weil man ihn verstanden haben muss, um Dualität und Schattenpreise zu begreifen.</p>
<p>Es ist <strong>kein Buch über maschinelles Lernen</strong>. Prognosen kommen nur so weit vor, wie sie als Eingangsdaten einer Optimierung nötig sind.</p>
<p>Und der vierte Teil ist <strong>ausdrücklich keine Anlageberatung</strong>. Die Finanzbeispiele demonstrieren Methodik an realen Daten, nicht handelbare Strategien. <a href="praxisfallen.html#kap-praxisfallen">Kapitel 22</a> erklärt ausführlich, warum ein gut aussehender Backtest noch keine funktionierende Strategie ist.</p>
<hr />