Glossar: Sprungleiste, Abkürzungen ausschreiben, CLAUDE.md-Regel
Sprungleiste (A B C ... Z) im Glossar — wie im Stichwortverzeichnis:
ein Klick je Buchstabe springt zur '## <Buchstabe>'-Überschrift.
Eingebaut in erzeuge_glossar_04.py als {=html}-Rohblock (nur HTML,
im PDF bedeutungslos).
Abkürzungen beim ersten Mal ausschreiben: 'VaR' → 'VaR (Value at Risk)',
'EVPI' → 'EVPI (Expected Value of Perfect Information)' als Link-Text
bei der ersten Nennung je Datei; danach nur die Abkürzung. 19 Abkürzungen
erfasst (VaR, CVaR, KKT, NLP, MILP, EVPI, LP, QP, ...).
CLAUDE.md: Regel 'Glossar-Links: Fachbegriffe im Fließtext automatisch
verlinkt' dokumentiert — resolve_glossar(), LINK_TEXTE,
ABBREV_ERSTE_NENNUNG, _NICHT_AUTO_LINKEN, _ZU_KURZ_ABK, .glossar-link,
{gl:}-Marke, Sprungleiste, {#gloss:<slug>}-Anchor.
This commit is contained in:
parent
e8abb66d75
commit
0e2c011732
38 changed files with 545 additions and 561 deletions
BIN
OR_HTML_04/Operations_Research_mit_Python_Version_04.pdf
generated
BIN
OR_HTML_04/Operations_Research_mit_Python_Version_04.pdf
generated
Binary file not shown.
10
OR_HTML_04/anhang-fehlerdiagnose.html
generated
10
OR_HTML_04/anhang-fehlerdiagnose.html
generated
|
|
@ -197,7 +197,7 @@
|
|||
<blockquote>
|
||||
<p>Nimm eine Bedingung versuchsweise heraus. Bleibt der Rest unlösbar, wurde sie nicht gebraucht: weg damit, endgültig. Wird der Rest lösbar, war sie beteiligt: sie bleibt.</p>
|
||||
</blockquote>
|
||||
<p>Nach genau einem Durchlauf über alle <span class="math inline">n</span> Bedingungen ist die übrig gebliebene Menge <strong>unreduzierbar</strong> — entfernt man aus ihr irgendeine Bedingung, ist der Rest lösbar. Das ist ein <em>Irreducible Infeasible Subset</em>, kurz <a href="anhang-glossar.md#gloss:iis-irreducible-infeasible-subset" class="glossar-link">IIS</a>. Kommerzielle Solver bieten das als fertige Funktion an (<code>computeIIS</code> bei <a href="anhang-glossar.md#gloss:gurobi" class="glossar-link">Gurobi</a>, der Conflict Refiner bei CPLEX); im Open-Source-Werkzeugkasten dieses Buchs gibt es sie nicht — sie ist aber in zwanzig Zeilen selbst geschrieben, und sie kostet <span class="math inline">n</span> Aufrufe des Solvers statt <span class="math inline">2^n</span> durchprobierter Teilmengen.</p>
|
||||
<p>Nach genau einem Durchlauf über alle <span class="math inline">n</span> Bedingungen ist die übrig gebliebene Menge <strong>unreduzierbar</strong> — entfernt man aus ihr irgendeine Bedingung, ist der Rest lösbar. Das ist ein <em>Irreducible Infeasible Subset</em>, kurz <a href="anhang-glossar.md#gloss:iis-irreducible-infeasible-subset" class="glossar-link">IIS (Irreducible Infeasible Subset)</a>. Kommerzielle Solver bieten das als fertige Funktion an (<code>computeIIS</code> bei <a href="anhang-glossar.md#gloss:gurobi" class="glossar-link">Gurobi</a>, der Conflict Refiner bei CPLEX); im Open-Source-Werkzeugkasten dieses Buchs gibt es sie nicht — sie ist aber in zwanzig Zeilen selbst geschrieben, und sie kostet <span class="math inline">n</span> Aufrufe des Solvers statt <span class="math inline">2^n</span> durchprobierter Teilmengen.</p>
|
||||
<div class="sourceCode" id="cb4"><pre class="sourceCode python"><code class="sourceCode python"><span id="cb4-1"><a href="#cb4-1" aria-hidden="true" tabindex="-1"></a><span class="co">#!/usr/bin/env python3</span></span>
|
||||
<span id="cb4-2"><a href="#cb4-2" aria-hidden="true" tabindex="-1"></a></span>
|
||||
<span id="cb4-3"><a href="#cb4-3" aria-hidden="true" tabindex="-1"></a><span class="co"># Konfliktsuche.py</span></span>
|
||||
|
|
@ -567,9 +567,9 @@ Insgesamt 2874 Solveraufrufe fuer die gesamte Diagnose.
|
|||
<span id="cb7-3"><a href="#cb7-3" aria-hidden="true" tabindex="-1"></a>loesen()<span class="op">;</span> t2 <span class="op">=</span> time.perf_counter()</span>
|
||||
<span id="cb7-4"><a href="#cb7-4" aria-hidden="true" tabindex="-1"></a><span class="bu">print</span>(<span class="ss">f"Aufbau </span><span class="sc">{</span>t1<span class="op">-</span>t0<span class="sc">:.2f}</span><span class="ss">s | Loesen </span><span class="sc">{</span>t2<span class="op">-</span>t1<span class="sc">:.2f}</span><span class="ss">s"</span>)</span></code></pre></div>
|
||||
<p>Bei CVXPY und bei Schleifen über Szenarien ist oft der <strong>Aufbau</strong> der Engpass, nicht der Solver (siehe <a href="cvar.html#sec:cvar-implementierung-cvar-portfolio-mit-reibung">Abschnitt 20.6</a>).</p>
|
||||
<p><strong>2. Big-M zu groß?</strong> Der häufigste Grund für explodierende <a href="anhang-glossar.md#gloss:gemischt-ganzzahlige-optimierung-milp" class="glossar-link">MILP</a>-Laufzeiten. Setzen Sie <span class="math inline">M</span> auf die kleinste gültige Schranke (<a href="milp.html#sec:milp-modellierungstricks-big-m-und-logische-bedingungen">Abschnitt 6.5</a>).</p>
|
||||
<p><strong>2. Big-M zu groß?</strong> Der häufigste Grund für explodierende <a href="anhang-glossar.md#gloss:gemischt-ganzzahlige-optimierung-milp" class="glossar-link">MILP (Gemischt-ganzzahlige Optimierung)</a>-Laufzeiten. Setzen Sie <span class="math inline">M</span> auf die kleinste gültige Schranke (<a href="milp.html#sec:milp-modellierungstricks-big-m-und-logische-bedingungen">Abschnitt 6.5</a>).</p>
|
||||
<p><strong>3. Symmetrie im Modell?</strong> Identische Maschinen, austauschbare Mitarbeitende, gleichwertige Fahrzeuge — der Solver durchsucht alle Vertauschungen. Abhilfe: Ordnungsbedingungen (Muster B20).</p>
|
||||
<p><strong>4. Falsche Solverfamilie?</strong> Zuordnungsprobleme mit MILP, Routing mit <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> von Hand nachgebaut, konvexe Probleme mit <code>scipy.optimize.minimize</code> — jeweils Größenordnungen langsamer als das passende Werkzeug (<a href="oekosystem.html#sec:oekosystem-wann-lohnt-sich-welche-ebene">Abschnitt 3.6</a>).</p>
|
||||
<p><strong>4. Falsche Solverfamilie?</strong> Zuordnungsprobleme mit MILP, Routing mit <a href="anhang-glossar.md#gloss:constraint-programming-cp" class="glossar-link">CP (Constraint Programming)</a>-<a href="anhang-glossar.md#gloss:sat-boolean-satisfiability" class="glossar-link">SAT (Boolean Satisfiability)</a> von Hand nachgebaut, konvexe Probleme mit <code>scipy.optimize.minimize</code> — jeweils Größenordnungen langsamer als das passende Werkzeug (<a href="oekosystem.html#sec:oekosystem-wann-lohnt-sich-welche-ebene">Abschnitt 3.6</a>).</p>
|
||||
<p><strong>5. Wird vektorisiert?</strong></p>
|
||||
<div class="sourceCode" id="cb8"><pre class="sourceCode python"><code class="sourceCode python"><span id="cb8-1"><a href="#cb8-1" aria-hidden="true" tabindex="-1"></a><span class="co"># langsam: # schnell:</span></span>
|
||||
<span id="cb8-2"><a href="#cb8-2" aria-hidden="true" tabindex="-1"></a><span class="cf">for</span> s <span class="kw">in</span> <span class="bu">range</span>(S): constraints.append(u <span class="op">>=</span> <span class="op">-</span>(R <span class="op">@</span> w) <span class="op">-</span> gamma)</span>
|
||||
|
|
@ -694,7 +694,7 @@ Insgesamt 2874 Solveraufrufe fuer die gesamte Diagnose.
|
|||
<tr class="odd">
|
||||
<td><code>x * y</code> (beide Variablen)</td>
|
||||
<td>bilinear</td>
|
||||
<td>umformulieren oder MILP/<a href="anhang-glossar.md#gloss:nichtlineare-programmierung-nlp" class="glossar-link">NLP</a></td>
|
||||
<td>umformulieren oder MILP/<a href="anhang-glossar.md#gloss:nichtlineare-programmierung-nlp" class="glossar-link">NLP (Nichtlineare Programmierung)</a></td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<td><code>a / x</code></td>
|
||||
|
|
@ -703,7 +703,7 @@ Insgesamt 2874 Solveraufrufe fuer die gesamte Diagnose.
|
|||
</tr>
|
||||
<tr class="odd">
|
||||
<td><code>cp.sqrt(cp.quad_form(w, S))</code></td>
|
||||
<td><code>cp.sqrt</code> ist <strong>konkav</strong> und verlangt ein konkaves Argument — <code>quad_form</code> ist konvex. Der Ausdruck ist nie <a href="anhang-glossar.md#gloss:dcp-disciplined-convex-programming" class="glossar-link">DCP</a>, egal wie sauber <span class="math inline">S</span> ist</td>
|
||||
<td><code>cp.sqrt</code> ist <strong>konkav</strong> und verlangt ein konkaves Argument — <code>quad_form</code> ist konvex. Der Ausdruck ist nie <a href="anhang-glossar.md#gloss:dcp-disciplined-convex-programming" class="glossar-link">DCP (Disciplined Convex Programming)</a>, egal wie sauber <span class="math inline">S</span> ist</td>
|
||||
<td>Cholesky <span class="math inline">S = LL^\top</span>, dann <code>cp.norm2(L.T @ w)</code>: die 2-Norm eines <strong>affinen</strong> Ausdrucks (siehe <code>CVaR_Portfolio.py</code>)</td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
|
|
|
|||
1
OR_HTML_04/anhang-glossar.html
generated
1
OR_HTML_04/anhang-glossar.html
generated
|
|
@ -101,6 +101,7 @@
|
|||
<article>
|
||||
<h1 id="anhang-glossar">Anhang E: Glossar</h1>
|
||||
<p>Nachschlagewerk zu allen Fachbegriffen, Abkürzungen, Algorithmen und Bibliotheken dieses Buchs. Jeder Eintrag nennt am Ende den Abschnitt, in dem der Begriff eingeführt wird — ein Klick dorthin führt in der Online-Fassung direkt zur Erklärung im Zusammenhang. Wer einen Begriff an <em>allen</em> Fundstellen sucht, benutzt das Stichwortverzeichnis.</p>
|
||||
<nav class="register-sprungleiste"><a href="#a">A</a> <a href="#b">B</a> <a href="#c">C</a> <a href="#d">D</a> <a href="#e">E</a> <a href="#f">F</a> <a href="#g">G</a> <a href="#h">H</a> <a href="#i">I</a> <a href="#j">J</a> <a href="#k">K</a> <a href="#l">L</a> <a href="#m">M</a> <a href="#n">N</a> <a href="#o">O</a> <a href="#p">P</a> <a href="#q">Q</a> <a href="#r">R</a> <a href="#s">S</a> <a href="#t">T</a> <a href="#u">U</a> <a href="#v">V</a> <a href="#w">W</a> <a href="#y">Y</a> <a href="#z">Z</a></nav>
|
||||
<h2 id="a">A</h2>
|
||||
<div id="gloss:absolutbetrag">
|
||||
<p><strong>Absolutbetrag</strong> — Modellierungsmuster für <span class="math inline">|x-z|</span>: Der Betrag selbst ist nicht linear, lässt sich aber durch eine Hilfsvariable <span class="math inline">d</span> mit den beiden Bedingungen <span class="math inline">x-z \le d</span> und <span class="math inline">z-x \le d</span> ersetzen. Das funktioniert nur, wenn <span class="math inline">d</span> minimiert wird — sonst bleibt die Schranke unausgeschöpft. → <a href="anhang-modellierungsmuster.html#anhang-modellierungsmuster">Anhang B</a></p>
|
||||
|
|
|
|||
18
OR_HTML_04/anhang-literatur.html
generated
18
OR_HTML_04/anhang-literatur.html
generated
|
|
@ -132,14 +132,14 @@
|
|||
<li>★★★ <strong>Wolsey, L. A. (2020):</strong> <em>Integer Programming</em> (2. Aufl.). Wiley, Hoboken. DOI: 10.1002/9781119606475 [Ganzzahlige Optimierung] <em><a href="anhang-glossar.md#gloss:branch-and-bound" class="glossar-link">Branch-and-Bound</a>, <a href="anhang-glossar.md#gloss:branch-and-cut" class="glossar-link">Branch-and-Cut</a>, Polyedertheorie, Formulierungsstärke. Die Begründung dafür, warum ein kleines <span class="math inline">M</span> besser ist als ein großes.</em></li>
|
||||
<li>★★★ <strong>Conforti, M., Cornuéjols, G. & Zambelli, G. (2014):</strong> <em>Integer Programming.</em> Springer, Cham. DOI: 10.1007/978-3-319-11008-0 [Ganzzahlige Optimierung] <em>Modernere Darstellung als Wolsey, mit ausführlicher Behandlung von Schnittebenen und totaler Unimodularität.</em></li>
|
||||
<li>★★ <strong>Klotz, E. & Newman, A. M. (2013):</strong> <em>Practical guidelines for solving difficult mixed integer linear programs.</em> In: <em>Surveys in Operations Research and Management Science</em> 18(1–2), S. 18–32. DOI: 10.1016/j.sorms.2012.12.001 [Ganzzahlige Optimierung] <em>Was zu tun ist, wenn ein Modell nicht fertig rechnet — Skalierung, Formulierung, Symmetrie. Die Literaturgrundlage von <a href="anhang-fehlerdiagnose.html#anhang-fehlerdiagnose">Anhang C</a>.</em></li>
|
||||
<li>★★ <strong>Achterberg, T. (2009):</strong> <em><a href="anhang-glossar.md#gloss:scip" class="glossar-link">SCIP</a>: solving constraint integer programs.</em> In: <em>Mathematical Programming Computation</em> 1(1), S. 1–41. DOI: 10.1007/s12532-008-0001-1 [<a href="anhang-glossar.md#gloss:solver" class="glossar-link">Solver</a>: SCIP] <em>Beschreibt die Verbindung von <a href="anhang-glossar.md#gloss:gemischt-ganzzahlige-optimierung-milp" class="glossar-link">MILP</a> und Constraint Programming in einem Solver.</em></li>
|
||||
<li>★★ <strong>Achterberg, T. (2009):</strong> <em><a href="anhang-glossar.md#gloss:scip" class="glossar-link">SCIP</a>: solving constraint integer programs.</em> In: <em>Mathematical Programming Computation</em> 1(1), S. 1–41. DOI: 10.1007/s12532-008-0001-1 [<a href="anhang-glossar.md#gloss:solver" class="glossar-link">Solver</a>: SCIP] <em>Beschreibt die Verbindung von <a href="anhang-glossar.md#gloss:gemischt-ganzzahlige-optimierung-milp" class="glossar-link">MILP (Gemischt-ganzzahlige Optimierung)</a> und Constraint Programming in einem Solver.</em></li>
|
||||
</ul>
|
||||
<h2 id="moderne-solver-implementierung-vergleich-und-benchmarks">Moderne Solver: Implementierung, Vergleich und Benchmarks</h2>
|
||||
<p><em>Zu <a href="oekosystem.html#kap-oekosystem">Kapitel 3</a> und <a href="anhang-spickzettel.html#anhang-spickzettel">Anhang D</a>. Neuer Abschnitt: Das Buch vergleicht durchgehend Solver, die Literatur dazu stand bisher verstreut.</em></p>
|
||||
<ul>
|
||||
<li>★★★ <strong>Huangfu, Q. & Hall, J. A. J. (2018):</strong> <em>Parallelizing the dual revised simplex method.</em> In: <em>Mathematical Programming Computation</em> 10(1), S. 119–142. DOI: 10.1007/s12532-017-0130-5 [Solver: <a href="anhang-glossar.md#gloss:highs" class="glossar-link">HiGHS</a>] <em>Die vom HiGHS-Projekt selbst benannte Zitierquelle. HiGHS ist das Backend von <code>scipy.optimize.linprog</code> und CVXPY. <a href="https://highs.dev">highs.dev</a></em></li>
|
||||
<li>★★★ <strong>Gleixner, A., Hendel, G., Gamrath, G. et al. (2021):</strong> <em>MIPLIB 2017: data-driven compilation of the 6th mixed-integer programming library.</em> In: <em>Mathematical Programming Computation</em> 13(3), S. 443–490. DOI: 10.1007/s12532-020-00194-3 [Benchmarks] <em>Die Testmenge, auf der praktisch jeder Solververgleich beruht: 1065 Instanzen, davon 240 als Benchmark-Teilmenge. Frei zugänglich; Daten unter <a href="https://miplib.zib.de">miplib.zib.de</a>.</em></li>
|
||||
<li>★★★ <strong>Mittelmann, H. D.:</strong> <em>Benchmarks for Optimization Software.</em> Arizona State University. <a href="https://plato.asu.edu/bench.html">plato.asu.edu/bench.html</a> [Benchmarks] <em>Die laufend aktualisierte Referenzmessung für <a href="anhang-glossar.md#gloss:lineare-programmierung-lp" class="glossar-link">LP</a>-, MILP- und <a href="anhang-glossar.md#gloss:quadratische-programmierung-qp" class="glossar-link">QP</a>-Solver. <strong>Wichtige Einschränkung:</strong> Seit 2024 sind die kommerziellen Solver auf eigenen Wunsch nicht mehr enthalten; ein direkter Vergleich <a href="anhang-glossar.md#gloss:gurobi" class="glossar-link">Gurobi</a> gegen HiGHS ist dort nicht mehr möglich.</em></li>
|
||||
<li>★★★ <strong>Mittelmann, H. D.:</strong> <em>Benchmarks for Optimization Software.</em> Arizona State University. <a href="https://plato.asu.edu/bench.html">plato.asu.edu/bench.html</a> [Benchmarks] <em>Die laufend aktualisierte Referenzmessung für <a href="anhang-glossar.md#gloss:lineare-programmierung-lp" class="glossar-link">LP (Lineare Programmierung)</a>-, MILP- und <a href="anhang-glossar.md#gloss:quadratische-programmierung-qp" class="glossar-link">QP (Quadratische Programmierung)</a>-Solver. <strong>Wichtige Einschränkung:</strong> Seit 2024 sind die kommerziellen Solver auf eigenen Wunsch nicht mehr enthalten; ein direkter Vergleich <a href="anhang-glossar.md#gloss:gurobi" class="glossar-link">Gurobi</a> gegen HiGHS ist dort nicht mehr möglich.</em></li>
|
||||
<li>★★ <strong>Bolusani, S., Besançon, M., Bestuzheva, K. et al. (2024):</strong> <em>The SCIP Optimization Suite 9.0.</em> Technischer Bericht, Zuse-Institut Berlin. arXiv:2402.17702 [Solver: SCIP] <em>Beschreibt Aufbau und Komponenten der Suite. Die Reihe wird fortgeschrieben — die jeweils aktuelle Fassung steht unter <a href="https://www.scipopt.org">scipopt.org</a>; beim Zitieren die tatsächlich benutzte Version angeben.</em></li>
|
||||
<li>★★ <strong>Perron, L. & Furnon, V.:</strong> <em><a href="anhang-glossar.md#gloss:or-tools" class="glossar-link">OR-Tools</a>.</em> Google. <a href="https://developers.google.com/optimization">developers.google.com/optimization</a> · Quellcode: <a href="https://github.com/google/or-tools">github.com/google/or-tools</a> [Solver: OR-Tools] <em>Die Sammlung, aus der das Buch <a href="anhang-glossar.md#gloss:cp-sat" class="glossar-link">CP-SAT</a> und die <a href="anhang-glossar.md#gloss:routing-bibliothek" class="glossar-link">Routing-Bibliothek</a> benutzt.</em></li>
|
||||
</ul>
|
||||
|
|
@ -147,7 +147,7 @@
|
|||
<p><em>Zu <a href="cpsat.html#kap-cpsat">Kapitel 7</a>.</em></p>
|
||||
<ul>
|
||||
<li>★★★ <strong>Rossi, F., van Beek, P. & Walsh, T. (Hrsg., 2006):</strong> <em>Handbook of Constraint Programming.</em> Foundations of Artificial Intelligence, Bd. 2. Elsevier, Amsterdam. [Constraint Programming] <em>Nach wie vor das Referenzwerk zu Propagation, globalen Constraints und Suchstrategien.</em></li>
|
||||
<li>★★★ <strong>Perron, L. & Furnon, V.:</strong> <em>OR-Tools <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> Solver Documentation.</em> Google. <a href="https://developers.google.com/optimization/cp">developers.google.com/optimization/cp</a> [Solver: CP-SAT] <em>Die einzige vollständige Beschreibung des im Buch benutzten Solvers. Der Abschnitt zu <code>AddNoOverlap</code> und <code>AddCumulative</code> deckt sich mit <a href="cpsat.html#kap-cpsat">Kapitel 7</a>.</em></li>
|
||||
<li>★★★ <strong>Perron, L. & Furnon, V.:</strong> <em>OR-Tools <a href="anhang-glossar.md#gloss:constraint-programming-cp" class="glossar-link">CP (Constraint Programming)</a>-<a href="anhang-glossar.md#gloss:sat-boolean-satisfiability" class="glossar-link">SAT (Boolean Satisfiability)</a> Solver Documentation.</em> Google. <a href="https://developers.google.com/optimization/cp">developers.google.com/optimization/cp</a> [Solver: CP-SAT] <em>Die einzige vollständige Beschreibung des im Buch benutzten Solvers. Der Abschnitt zu <code>AddNoOverlap</code> und <code>AddCumulative</code> deckt sich mit <a href="cpsat.html#kap-cpsat">Kapitel 7</a>.</em></li>
|
||||
<li>★★ <strong>Laborie, P., Rogerie, J., Shaw, P. & Vilím, P. (2018):</strong> <em>IBM ILOG CP Optimizer for scheduling.</em> In: <em>Constraints</em> 23(2), S. 210–250. DOI: 10.1007/s10601-018-9281-x [<a href="anhang-glossar.md#gloss:scheduling" class="glossar-link">Scheduling</a>] <em>Intervallvariablen und Ressourcenprofile aus Sicht des konkurrierenden Solvers — lehrreich für das Verständnis der Modellierungsprimitive.</em></li>
|
||||
<li>★★ <strong>Biere, A., Heule, M., van Maaren, H. & Walsh, T. (Hrsg., 2021):</strong> <em>Handbook of Satisfiability</em> (2. Aufl.). Frontiers in Artificial Intelligence and Applications, Bd. 336. IOS Press, Amsterdam. DOI: 10.3233/FAIA336 [SAT] <em>Die Grundlage dessen, was CP-SAT unter der Haube tut: Conflict-Driven Clause Learning, Klausellernen, Neustarts.</em></li>
|
||||
</ul>
|
||||
|
|
@ -155,14 +155,14 @@
|
|||
<p><em>Zu <a href="graphen.html#kap-graphen">Kapitel 8</a>. Neuer Abschnitt.</em></p>
|
||||
<ul>
|
||||
<li>★★★ <strong>Ahuja, R. K., Magnanti, T. L. & Orlin, J. B. (1993):</strong> <em>Network Flows: Theory, Algorithms, and Applications.</em> Prentice Hall, Englewood Cliffs. [Netzwerkflüsse] <em>Das Standardwerk zu Min-Cost-Flow, Matching und totaler Unimodularität — der Grund, warum diese Modelle schon als LP ganzzahlig lösen.</em></li>
|
||||
<li>★★★ <strong>Toth, P. & Vigo, D. (Hrsg., 2014):</strong> <em>Vehicle Routing: Problems, Methods, and Applications</em> (2. Aufl.). SIAM, Philadelphia. DOI: 10.1137/1.9781611973594 [<a href="anhang-glossar.md#gloss:vehicle-routing-problem-vrp" class="glossar-link">VRP</a>] <em>Das Referenzwerk zur Tourenplanung, einschließlich Kapazitäten, Zeitfenstern und <a href="anhang-glossar.md#gloss:subtour" class="glossar-link">Subtour</a>-Eliminierung.</em></li>
|
||||
<li>★★★ <strong>Toth, P. & Vigo, D. (Hrsg., 2014):</strong> <em>Vehicle Routing: Problems, Methods, and Applications</em> (2. Aufl.). SIAM, Philadelphia. DOI: 10.1137/1.9781611973594 [<a href="anhang-glossar.md#gloss:vehicle-routing-problem-vrp" class="glossar-link">VRP (Vehicle Routing Problem)</a>] <em>Das Referenzwerk zur Tourenplanung, einschließlich Kapazitäten, Zeitfenstern und <a href="anhang-glossar.md#gloss:subtour" class="glossar-link">Subtour</a>-Eliminierung.</em></li>
|
||||
<li>★★ <strong>Vidal, T., Laporte, G. & Matl, P. (2020):</strong> <em>A concise guide to existing and emerging vehicle routing problem variants.</em> In: <em>European Journal of Operational Research</em> 286(2), S. 401–416. DOI: 10.1016/j.ejor.2019.10.010 [VRP] <em>Übersicht über die Variantenvielfalt — hilfreich, um die eigene Aufgabe einzuordnen, bevor man modelliert. Frei zugänglich als arXiv:1906.06750.</em></li>
|
||||
<li>★ <strong>Kuhn, H. W. (1955):</strong> <em>The Hungarian method for the assignment problem.</em> In: <em>Naval Research Logistics Quarterly</em> 2(1–2), S. 83–97. DOI: 10.1002/nav.3800020109 [<a href="anhang-glossar.md#gloss:zuordnungsproblem" class="glossar-link">Zuordnungsproblem</a>] <em>Das Originalverfahren hinter <code>scipy.optimize.linear_sum_assignment</code>.</em></li>
|
||||
</ul>
|
||||
<h2 id="metaheuristiken">Metaheuristiken</h2>
|
||||
<p><em>Zu <a href="metaheuristiken.html#kap-metaheuristiken">Kapitel 9</a>. Neuer Abschnitt.</em></p>
|
||||
<ul>
|
||||
<li>★★★ <strong>Gendreau, M. & Potvin, J.-Y. (Hrsg., 2019):</strong> <em>Handbook of Metaheuristics</em> (3. Aufl.). Springer, Cham. DOI: 10.1007/978-3-319-91086-4 <a href="#metaheuristiken">Metaheuristiken</a> <em>Sammelband zu <a href="anhang-glossar.md#gloss:tabu-suche" class="glossar-link">Tabu-Suche</a>, <a href="anhang-glossar.md#gloss:simulated-annealing" class="glossar-link">Simulated Annealing</a>, <a href="anhang-glossar.md#gloss:large-neighborhood-search-lns" class="glossar-link">LNS</a>, genetischen Verfahren — jeweils von den Urhebern geschrieben.</em></li>
|
||||
<li>★★★ <strong>Gendreau, M. & Potvin, J.-Y. (Hrsg., 2019):</strong> <em>Handbook of Metaheuristics</em> (3. Aufl.). Springer, Cham. DOI: 10.1007/978-3-319-91086-4 <a href="#metaheuristiken">Metaheuristiken</a> <em>Sammelband zu <a href="anhang-glossar.md#gloss:tabu-suche" class="glossar-link">Tabu-Suche</a>, <a href="anhang-glossar.md#gloss:simulated-annealing" class="glossar-link">Simulated Annealing</a>, <a href="anhang-glossar.md#gloss:large-neighborhood-search-lns" class="glossar-link">LNS (Large Neighborhood Search)</a>, genetischen Verfahren — jeweils von den Urhebern geschrieben.</em></li>
|
||||
<li>★★★ <strong>Pisinger, D. & Ropke, S. (2010):</strong> <em>Large Neighborhood Search.</em> In: Gendreau, M. & Potvin, J.-Y. (Hrsg.): <em>Handbook of Metaheuristics</em>, S. 399–419. Springer. DOI: 10.1007/978-1-4419-1665-5_13 <a href="#metaheuristiken">Metaheuristiken</a> <em>Die Darstellung des Verfahrens, das im Buch die exakte Suche auf Teilproblemen mit heuristischem Zerstören verbindet.</em></li>
|
||||
<li>★★ <strong>Kirkpatrick, S., Gelatt, C. D. & Vecchi, M. P. (1983):</strong> <em>Optimization by Simulated Annealing.</em> In: <em>Science</em> 220(4598), S. 671–680. DOI: 10.1126/science.220.4598.671 <a href="#metaheuristiken">Metaheuristiken</a> <em>Die Originalarbeit; die Abkühlungsanalogie stammt von hier.</em></li>
|
||||
<li>★★ <strong>Sörensen, K. (2015):</strong> <em>Metaheuristics — the metaphor exposed.</em> In: <em>International Transactions in Operational Research</em> 22(1), S. 3–18. DOI: 10.1111/itor.12001 <a href="#metaheuristiken">Metaheuristiken</a> <em>Kritik an der Flut naturanaloger „neuer” Verfahren. Vor der Auswahl einer <a href="anhang-glossar.md#gloss:metaheuristik" class="glossar-link">Metaheuristik</a> zu lesen — sie erspart viel Zeit.</em></li>
|
||||
|
|
@ -177,14 +177,14 @@
|
|||
<h2 id="konvexe-und-nichtlineare-optimierung">Konvexe und nichtlineare Optimierung</h2>
|
||||
<p><em>Zu <a href="qp-nlp.html#kap-qp-nlp">Kapitel 11</a>.</em></p>
|
||||
<ul>
|
||||
<li>★★★ <strong>Boyd, S. & Vandenberghe, L. (2004):</strong> <em>Convex Optimization.</em> Cambridge University Press. DOI: 10.1017/CBO9780511804441 [Konvexe Optimierung] <em>Referenzwerk für konvexe Mengen, <a href="anhang-glossar.md#gloss:karush-kuhn-tucker-bedingungen-kkt" class="glossar-link">KKT</a>-Bedingungen, QP und SDP; die theoretische Basis von CVXPY. Frei verfügbar unter <a href="https://web.stanford.edu/~boyd/cvxbook/">stanford.edu/~boyd/cvxbook</a>.</em></li>
|
||||
<li>★★★ <strong>Boyd, S. & Vandenberghe, L. (2004):</strong> <em>Convex Optimization.</em> Cambridge University Press. DOI: 10.1017/CBO9780511804441 [Konvexe Optimierung] <em>Referenzwerk für konvexe Mengen, <a href="anhang-glossar.md#gloss:karush-kuhn-tucker-bedingungen-kkt" class="glossar-link">KKT (Karush-Kuhn-Tucker-Bedingungen)</a>-Bedingungen, QP und SDP; die theoretische Basis von CVXPY. Frei verfügbar unter <a href="https://web.stanford.edu/~boyd/cvxbook/">stanford.edu/~boyd/cvxbook</a>.</em></li>
|
||||
<li>★★ <strong>Kraft, D. (1988):</strong> <em>A Software Package for Sequential Quadratic Programming.</em> DFVLR-FB 88-28, Deutsche Forschungs- und Versuchsanstalt für Luft- und Raumfahrt, Köln. [Nichtlineare Optimierung] <em>Die Originalarbeit zu <a href="anhang-glossar.md#gloss:slsqp" class="glossar-link">SLSQP</a> — dem Verfahren hinter <code>scipy.optimize.minimize</code>.</em></li>
|
||||
<li>★★ <strong>Lobo, M. S., Vandenberghe, L., Boyd, S. & Lebret, H. (1998):</strong> <em>Applications of second-order cone programming.</em> In: <em>Linear Algebra and its Applications</em> 284(1–3), S. 193–228. DOI: 10.1016/S0024-3795(98)10032-0 [<a href="anhang-glossar.md#gloss:konische-optimierung" class="glossar-link">Konische Optimierung</a>] <em>Warum sich Risikoschranken und Normbedingungen als SOCP schreiben lassen — die Grundlage der Chance-Constraints-Formulierung in <a href="unsicherheit.html#kap-unsicherheit">Kapitel 12</a>.</em></li>
|
||||
</ul>
|
||||
<h2 id="optimierung-unter-unsicherheit-stochastisch-robust-chance-constraints">Optimierung unter Unsicherheit: stochastisch, robust, Chance Constraints</h2>
|
||||
<p><em>Zu <a href="unsicherheit.html#kap-unsicherheit">Kapitel 12</a> und <a href="supplychain.html#kap-supplychain">Kapitel 17</a>. Aus dem früheren Block „Konvexe, nichtlineare und robuste Optimierung” herausgelöst und erweitert.</em></p>
|
||||
<ul>
|
||||
<li>★★★ <strong>Birge, J. R. & Louveaux, F. (2011):</strong> <em>Introduction to Stochastic Programming</em> (2. Aufl.). Springer, New York. DOI: 10.1007/978-1-4614-0237-4 [Stochastische Optimierung] <em>Das Standardwerk zur zweistufigen Optimierung, Szenariobäumen und dem Wert perfekter Information (<a href="anhang-glossar.md#gloss:evpi-expected-value-of-perfect-information" class="glossar-link">EVPI</a>).</em></li>
|
||||
<li>★★★ <strong>Birge, J. R. & Louveaux, F. (2011):</strong> <em>Introduction to Stochastic Programming</em> (2. Aufl.). Springer, New York. DOI: 10.1007/978-1-4614-0237-4 [Stochastische Optimierung] <em>Das Standardwerk zur zweistufigen Optimierung, Szenariobäumen und dem Wert perfekter Information (<a href="anhang-glossar.md#gloss:evpi-expected-value-of-perfect-information" class="glossar-link">EVPI (Expected Value of Perfect Information)</a>).</em></li>
|
||||
<li>★★★ <strong>Ben-Tal, A., El Ghaoui, L. & Nemirovski, A. (2009):</strong> <em>Robust Optimization.</em> Princeton University Press. DOI: 10.1515/9781400831050 [<a href="anhang-glossar.md#gloss:robuste-optimierung" class="glossar-link">Robuste Optimierung</a>] <em>Die geschlossene Darstellung der robusten Gegenstücke und ihrer konischen Umformung.</em></li>
|
||||
<li>★★★ <strong>Bertsimas, D. & Sim, M. (2004):</strong> <em>The Price of Robustness.</em> In: <em>Operations Research</em> 52(1), S. 35–53. DOI: 10.1287/opre.1030.0065 [Robuste Optimierung] <em>Quelle des Budgeted-Uncertainty-Ansatzes: Der <a href="anhang-glossar.md#gloss:parameter" class="glossar-link">Parameter</a> <span class="math inline">\Gamma</span> regelt stufenlos, wie vorsichtig die Lösung wird.</em></li>
|
||||
<li>★★ <strong>Nemirovski, A. & Shapiro, A. (2007):</strong> <em>Convex Approximations of Chance Constrained Programs.</em> In: <em>SIAM Journal on Optimization</em> 17(4), S. 969–996. DOI: 10.1137/050622328 [Chance Constraints] <em>Zeigt, wann sich eine Wahrscheinlichkeitsbedingung konvex annähern lässt — und wann nicht.</em></li>
|
||||
|
|
@ -226,7 +226,7 @@
|
|||
<p><em>Zu <a href="finanzdaten.html#kap-finanzdaten">Kapitel 18</a>, <a href="markowitz.html#kap-markowitz">Kapitel 19</a>, <a href="cvar.html#kap-cvar">Kapitel 20</a> und <a href="handelsmaschine.html#kap-handelsmaschine">Kapitel 21</a>.</em></p>
|
||||
<ul>
|
||||
<li>★★★ <strong>Markowitz, H. (1952):</strong> <em>Portfolio Selection.</em> In: <em>The Journal of Finance</em> 7(1), S. 77–91. DOI: 10.2307/2975974 [Portfoliotheorie] <em>Die Arbeit, die das Zusammenspiel von Rendite und Kovarianz zum Optimierungsproblem gemacht hat.</em></li>
|
||||
<li>★★★ <strong>Rockafellar, R. T. & Uryasev, S. (2000):</strong> <em>Optimization of Conditional Value-at-Risk.</em> In: <em>Journal of Risk</em> 2(3), S. 21–41. DOI: 10.21314/JOR.2000.038 [Risikomaße] <em>Der Satz, der die <a href="anhang-glossar.md#gloss:conditional-value-at-risk-cvar" class="glossar-link">CVaR</a>-Minimierung in ein lineares Programm überführt.</em></li>
|
||||
<li>★★★ <strong>Rockafellar, R. T. & Uryasev, S. (2000):</strong> <em>Optimization of Conditional Value-at-Risk.</em> In: <em>Journal of Risk</em> 2(3), S. 21–41. DOI: 10.21314/JOR.2000.038 [Risikomaße] <em>Der Satz, der die <a href="anhang-glossar.md#gloss:conditional-value-at-risk-cvar" class="glossar-link">CVaR (Conditional Value at Risk)</a>-Minimierung in ein lineares Programm überführt.</em></li>
|
||||
<li>★★★ <strong>Ledoit, O. & Wolf, M. (2004):</strong> <em>A well-conditioned estimator for large-dimensional covariance matrices.</em> In: <em>Journal of Multivariate Analysis</em> 88(2), S. 365–411. DOI: 10.1016/S0047-259X(03)00096-4 [Kovarianzschätzung] <em>Quelle des von <code>scikit-learn</code> verwendeten Shrinkage-Ziels (skalierte Einheitsmatrix).</em></li>
|
||||
<li>★★★ <strong>Cornuéjols, G., Peña, J. & Tütüncü, R. (2018):</strong> <em>Optimization Methods in Finance</em> (2. Aufl.). Cambridge University Press. DOI: 10.1017/9781107297340 [Finanzoptimierung] <em>Die Brücke zwischen Optimierungstheorie und Finanzanwendung; deckt QP, SOCP und robuste Portfolios ab.</em></li>
|
||||
<li>★★★ <strong>Almgren, R. & Chriss, N. (2001):</strong> <em>Optimal Execution of Portfolio Transactions.</em> In: <em>Journal of Risk</em> 3(2), S. 5–39. DOI: 10.21314/jor.2001.041 [Orderausführung] <em>Das Modell hinter dem Beispiel zur optimalen Orderausführung in <a href="dynamische-programmierung.html#kap-dynamische-programmierung">Kapitel 13</a>.</em></li>
|
||||
|
|
@ -238,7 +238,7 @@
|
|||
<h2 id="praxis-betrieb-test-und-auslieferung-von-optimierungsmodellen">Praxis: Betrieb, Test und Auslieferung von Optimierungsmodellen</h2>
|
||||
<p><em>Zu <a href="praxisfallen.html#kap-praxisfallen">Kapitel 22</a> und <a href="testing.html#kap-testing">Kapitel 23</a>. Neuer Abschnitt.</em></p>
|
||||
<ul>
|
||||
<li>★★★ <strong>Chinneck, J. W. (2008):</strong> <em>Feasibility and <a href="anhang-glossar.md#gloss:infeasibility" class="glossar-link">Infeasibility</a> in Optimization: Algorithms and Computational Methods.</em> Springer, New York. DOI: 10.1007/978-0-387-74932-7 [Fehlerdiagnose] <em>Das Standardwerk zur Unlösbarkeitsdiagnose, einschließlich des Deletion Filters und der irreduziblen unlösbaren Teilmengen (<a href="anhang-glossar.md#gloss:iis-irreducible-infeasible-subset" class="glossar-link">IIS</a>). Direkte Grundlage von <a href="anhang-fehlerdiagnose.html#anhang-fehlerdiagnose">Anhang C</a>.</em></li>
|
||||
<li>★★★ <strong>Chinneck, J. W. (2008):</strong> <em>Feasibility and <a href="anhang-glossar.md#gloss:infeasibility" class="glossar-link">Infeasibility</a> in Optimization: Algorithms and Computational Methods.</em> Springer, New York. DOI: 10.1007/978-0-387-74932-7 [Fehlerdiagnose] <em>Das Standardwerk zur Unlösbarkeitsdiagnose, einschließlich des Deletion Filters und der irreduziblen unlösbaren Teilmengen (<a href="anhang-glossar.md#gloss:iis-irreducible-infeasible-subset" class="glossar-link">IIS (Irreducible Infeasible Subset)</a>). Direkte Grundlage von <a href="anhang-fehlerdiagnose.html#anhang-fehlerdiagnose">Anhang C</a>.</em></li>
|
||||
<li>★★ <strong>Sculley, D., Holt, G., Golovin, D. et al. (2015):</strong> <em>Hidden Technical Debt in Machine Learning Systems.</em> In: <em>Advances in Neural Information Processing Systems</em> 28, S. 2503–2511. [Betrieb] <em>Über Systeme, deren Modell nur ein kleiner Teil ist — überträgt sich unmittelbar auf den Betrieb von Optimierungsdiensten. Frei zugänglich.</em></li>
|
||||
<li>★★ <strong>Kleppmann, M. (2017):</strong> <em>Designing Data-Intensive Applications.</em> O’Reilly, Sebastopol. [Betrieb] <em><a href="anhang-glossar.md#gloss:snapshot-prinzip" class="glossar-link">Snapshot-Prinzip</a>, <a href="anhang-glossar.md#gloss:zustandslosigkeit" class="glossar-link">Zustandslosigkeit</a>, Versionierung und Reproduzierbarkeit — die Architekturfragen hinter der OR-Plattform in <a href="praxisfallen.html#kap-praxisfallen">Kapitel 22</a>.</em></li>
|
||||
<li>★★ <strong>Ramírez, S.:</strong> <em>FastAPI Documentation.</em> <a href="https://fastapi.tiangolo.com">fastapi.tiangolo.com</a> [Betrieb] <em>Die Grundlage des Optimierungsdienstes in <a href="testing.html#kap-testing">Kapitel 23</a>, einschließlich der Eingabevalidierung über <code>pydantic</code>.</em></li>
|
||||
|
|
|
|||
24
OR_HTML_04/anhang-loesungen.html
generated
24
OR_HTML_04/anhang-loesungen.html
generated
|
|
@ -169,7 +169,7 @@
|
|||
<p>Für <span class="math inline">\mathbf{P}_2</span> ergibt sich eine PSD-Matrix mit Korrelation exakt <span class="math inline">1{,}0</span> — das Verfahren zieht die unmögliche Korrelation auf den nächstgelegenen zulässigen Wert. Für Kovarianzmatrizen setzt man in der Praxis auf einen kleinen positiven Wert statt auf 0 (<code>np.maximum(lam, 1e-10)</code>), damit die Matrix invertierbar bleibt.</p>
|
||||
<h3 id="finde-den-denkfehler-die-unauffällige-transposition">Finde den Denkfehler — Die unauffällige Transposition</h3>
|
||||
<ol type="a">
|
||||
<li><p><strong>Warum nichts auffällt.</strong> <span class="math inline">\mathbf{A}</span> ist quadratisch, also passen die Dimensionen auch transponiert. <a href="anhang-glossar.md#gloss:numpy" class="glossar-link">NumPy</a> prüft Formen, nicht Bedeutungen; der Solver bekommt ein vollkommen zulässiges <a href="anhang-glossar.md#gloss:lineare-programmierung-lp" class="glossar-link">LP</a> vorgelegt und löst es korrekt — nur eben ein <strong>anderes</strong>. Eine Transposition ist genau dann gefährlich, wenn sie folgenlos <em>aussieht</em>: Wäre die Matrix <span class="math inline">2 \times 3</span> gewesen, hätte NumPy sofort einen Dimensionsfehler geworfen.</p></li>
|
||||
<li><p><strong>Warum nichts auffällt.</strong> <span class="math inline">\mathbf{A}</span> ist quadratisch, also passen die Dimensionen auch transponiert. <a href="anhang-glossar.md#gloss:numpy" class="glossar-link">NumPy</a> prüft Formen, nicht Bedeutungen; der Solver bekommt ein vollkommen zulässiges <a href="anhang-glossar.md#gloss:lineare-programmierung-lp" class="glossar-link">LP (Lineare Programmierung)</a> vorgelegt und löst es korrekt — nur eben ein <strong>anderes</strong>. Eine Transposition ist genau dann gefährlich, wenn sie folgenlos <em>aussieht</em>: Wäre die Matrix <span class="math inline">2 \times 3</span> gewesen, hätte NumPy sofort einen Dimensionsfehler geworfen.</p></li>
|
||||
<li><p><strong>Der Plan an den echten Restriktionen.</strong> Mit <span class="math inline">\mathbf{A} = \begin{pmatrix} 1 & 2 \\ 3 & 1\end{pmatrix}</span> und <span class="math inline">\mathbf{x} = (5{,}6;\ 0{,}8)</span>:</p></li>
|
||||
</ol>
|
||||
<p><span class="math display">\mathbf{A}\mathbf{x} = \begin{pmatrix} 1\cdot5{,}6 + 2\cdot0{,}8 \\ 3\cdot5{,}6 + 1\cdot0{,}8\end{pmatrix} = \begin{pmatrix} 7{,}2 \\ 17{,}6 \end{pmatrix} \quad\text{gegen}\quad \mathbf{b} = \begin{pmatrix} 8 \\ 12\end{pmatrix}</span></p>
|
||||
|
|
@ -196,7 +196,7 @@
|
|||
</ol>
|
||||
<hr />
|
||||
<h2 id="sec:loesungen-oekosystem">A.3 Lösungen zu Kapitel „Das Python-Ökosystem für OR — Solver, Bindings und Modellierungsschichten“</h2>
|
||||
<p><strong>3.1 — Solverwahl.</strong> (a) <a href="anhang-glossar.md#gloss:cp-sat" class="glossar-link">CP-SAT</a> (diskrete Zuordnung mit Zeitfenstern). (b) <code>scipy.optimize.linprog</code> (klassisches Mischungs-LP, klein). (c) <a href="anhang-glossar.md#gloss:cvxpy" class="glossar-link">CVXPY</a> (konvexes <a href="anhang-glossar.md#gloss:quadratische-programmierung-qp" class="glossar-link">QP</a>). (d) <a href="anhang-glossar.md#gloss:miqp" class="glossar-link">MIQP</a> — CVXPY mit Binärvariablen und MIQP-fähigem Solver, oder Heuristik. (e) <a href="anhang-glossar.md#gloss:gemischt-ganzzahlige-optimierung-milp" class="glossar-link">MILP</a> über <code>highspy</code> oder <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> (Standortproblem mit Fixkosten). (f) <code>scipy.optimize.minimize</code> mit Multistart (nicht konvex).</p>
|
||||
<p><strong>3.1 — Solverwahl.</strong> (a) <a href="anhang-glossar.md#gloss:cp-sat" class="glossar-link">CP-SAT</a> (diskrete Zuordnung mit Zeitfenstern). (b) <code>scipy.optimize.linprog</code> (klassisches Mischungs-LP, klein). (c) <a href="anhang-glossar.md#gloss:cvxpy" class="glossar-link">CVXPY</a> (konvexes <a href="anhang-glossar.md#gloss:quadratische-programmierung-qp" class="glossar-link">QP (Quadratische Programmierung)</a>). (d) <a href="anhang-glossar.md#gloss:miqp" class="glossar-link">MIQP</a> — CVXPY mit Binärvariablen und MIQP-fähigem Solver, oder Heuristik. (e) <a href="anhang-glossar.md#gloss:gemischt-ganzzahlige-optimierung-milp" class="glossar-link">MILP (Gemischt-ganzzahlige Optimierung)</a> über <code>highspy</code> oder <a href="anhang-glossar.md#gloss:constraint-programming-cp" class="glossar-link">CP (Constraint Programming)</a>-<a href="anhang-glossar.md#gloss:sat-boolean-satisfiability" class="glossar-link">SAT (Boolean Satisfiability)</a> (Standortproblem mit Fixkosten). (f) <code>scipy.optimize.minimize</code> mit Multistart (nicht konvex).</p>
|
||||
<p><strong>3.2 — Bäckerei viermal.</strong> Alle vier müssen <span class="math inline">Z = 448</span> (ganzzahlig) bzw. <span class="math inline">450</span> (kontinuierlich) liefern. Denken Sie an die Prozesstrennung, falls <code>ortools</code> und <code>highspy</code> kollidieren.</p>
|
||||
<p><strong>3.3 — <a href="anhang-glossar.md#gloss:csr-format" class="glossar-link">CSR-Format</a>.</strong> <code>values = [3, 1, 2, 5, 4, 6]</code>, <code>indices = [0, 3, 2, 0, 1, 3]</code>, <code>starts = [0, 2, 3]</code>. CSR speichert 6 Werte + 6 Indizes + 3 Startpositionen = 15 Zahlen; die volle Matrix hätte <span class="math inline">3\times4 = 12</span>. <strong>Bei dieser winzigen, dicht besetzten Matrix lohnt CSR nicht</strong> — der Vorteil entsteht erst bei großer, dünn besetzter Struktur (z. B. 1000×1000 mit 0,5 % Besetzung: 15 000 statt 1 000 000 Zahlen).</p>
|
||||
<p><strong>3.4 — Konvexitätsprüfung.</strong> <span class="math inline">\min x^3</span> wirft <code>DCPError: Problem does not follow DCP rules</code>, weil <span class="math inline">x^3</span> auf <span class="math inline">[-2,2]</span> weder konvex noch konkav ist. <span class="math inline">\min x^2</span> läuft und liefert <span class="math inline">x=0</span>. Der Unterschied: CVXPY akzeptiert nur Ausdrücke, deren Konvexität es <strong>beweisen</strong> kann — dafür garantiert es das globale Optimum.</p>
|
||||
|
|
@ -644,8 +644,8 @@
|
|||
<p>Beachten Sie, dass Werk 3 seine günstigste Verbindung (L4 zu 5) voll ausschöpft und W2 ausschließlich L1 beliefert (9), obwohl L4 mit 7 billiger wäre — dort ist der Bedarf bereits von W3 gedeckt. (c) Die Lösung ist ganzzahlig, obwohl nicht gefordert — die Transportmatrix ist <strong>total unimodular</strong>, alle Ecken sind ganzzahlig.</p>
|
||||
<p><strong>8.4 — Zuordnung mit Verboten.</strong> Kosten auf einen sehr hohen Wert setzen (<code>kosten[2][2] = 1e6</code>) oder mit <code>np.inf</code> arbeiten (bei <code>linear_sum_assignment</code> erlaubt). Die Lösung weicht auf die zweitbeste Zuordnung für Carla aus; die Gesamtkosten steigen um die Differenz.</p>
|
||||
<p><strong>8.5 — Engpass finden.</strong> Die Dualwerte der Kapazitätsschranken (<code>res.upper.marginals</code> bei <code>linprog</code>) zeigen es direkt; alternativ jede Kapazität einzeln um 1 erhöhen und neu rechnen. Im Beispiel ist die Kante <code>Werk_A → Umschlag</code> der Engpass (voll ausgelastet, günstigster Weg).</p>
|
||||
<p><strong>8.6 — <a href="anhang-glossar.md#gloss:vehicle-routing-problem-vrp" class="glossar-link">VRP</a> variieren.</strong> (a) Mit 3 Fahrzeugen werden die Touren länger, die Gesamtfahrzeit steigt leicht, die Auslastung deutlich. (b) Unlösbar, sobald <span class="math inline">\text{Kapazität} \times \text{Fahrzeuge} < \text{Gesamtbedarf}</span> (hier: bei 3 Fahrzeugen à 10 sind 30 < 37 → unlösbar) <strong>oder</strong> wenn Zeitfenster nicht mehr eingehalten werden können. (c) 1 s liefert meist eine brauchbare, 30 s eine spürbar bessere Lösung — die <a href="anhang-glossar.md#gloss:metaheuristik" class="glossar-link">Metaheuristik</a> verbessert kontinuierlich. (d) Doppelte Servicezeit kann Zeitfenster verletzen → möglicherweise unlösbar.</p>
|
||||
<p><strong>8.7 — <a href="anhang-glossar.md#gloss:tsp-traveling-salesperson-problem" class="glossar-link">TSP</a> mit MTZ.</strong> Erwartetes Ergebnis: Bei 8 Städten löst das MILP in Sekunden. Ab etwa 12–15 Städten wird die schwache MTZ-Relaxation zum Problem, und die Laufzeit steigt stark — während <a href="anhang-glossar.md#gloss:or-tools" class="glossar-link">OR-Tools</a> weiterhin in Sekundenbruchteilen sehr gute Touren liefert.</p>
|
||||
<p><strong>8.6 — <a href="anhang-glossar.md#gloss:vehicle-routing-problem-vrp" class="glossar-link">VRP (Vehicle Routing Problem)</a> variieren.</strong> (a) Mit 3 Fahrzeugen werden die Touren länger, die Gesamtfahrzeit steigt leicht, die Auslastung deutlich. (b) Unlösbar, sobald <span class="math inline">\text{Kapazität} \times \text{Fahrzeuge} < \text{Gesamtbedarf}</span> (hier: bei 3 Fahrzeugen à 10 sind 30 < 37 → unlösbar) <strong>oder</strong> wenn Zeitfenster nicht mehr eingehalten werden können. (c) 1 s liefert meist eine brauchbare, 30 s eine spürbar bessere Lösung — die <a href="anhang-glossar.md#gloss:metaheuristik" class="glossar-link">Metaheuristik</a> verbessert kontinuierlich. (d) Doppelte Servicezeit kann Zeitfenster verletzen → möglicherweise unlösbar.</p>
|
||||
<p><strong>8.7 — <a href="anhang-glossar.md#gloss:tsp-traveling-salesperson-problem" class="glossar-link">TSP (Traveling Salesperson Problem)</a> mit MTZ.</strong> Erwartetes Ergebnis: Bei 8 Städten löst das MILP in Sekunden. Ab etwa 12–15 Städten wird die schwache MTZ-Relaxation zum Problem, und die Laufzeit steigt stark — während <a href="anhang-glossar.md#gloss:or-tools" class="glossar-link">OR-Tools</a> weiterhin in Sekundenbruchteilen sehr gute Touren liefert.</p>
|
||||
<h3 id="finde-den-denkfehler-die-vergessene-dimension">Finde den Denkfehler — Die vergessene Dimension</h3>
|
||||
<ol type="a">
|
||||
<li><strong>Was die Fahrzeuge tun.</strong> Fahrzeuge 1, 2 und 3 fahren <strong>gar nicht</strong> — sie stehen mit null Stopps im Depot. Fahrzeug 4 bedient alle 16 Kunden und lädt dabei <strong>37 Paletten</strong> bei einer Kapazität von 10. Es ist um 270 % überladen. Physikalisch ist dieser Plan nicht ausführbar; im Modell ist er die beste Lösung.</li>
|
||||
|
|
@ -694,7 +694,7 @@
|
|||
<p><strong>Es fehlt die Schranke.</strong></p>
|
||||
<p>Alles, was der Kollege sagt, stimmt. Der Fehler liegt darin, was er <em>nicht</em> sagt: Die Ersparnis wird gegen die <strong>bisherige Praxis</strong> gemessen, nicht gegen das <strong>Mögliche</strong>. Damit beantwortet die Zahl eine andere Frage als die, die das Management stellt.</p>
|
||||
<p><code>Metaheuristik_vs_Exakt.py</code> liefert die fehlende Zahl in der Spalte <em>Schranke</em>: <strong>1 768 Minuten</strong>. Der Abstand der vorgestellten Lösung zum Bestmöglichen beträgt also bis zu 25 %, nicht 0 %. In derselben Nacht, in der 640 Stunden gefeiert werden, liegen möglicherweise weitere 2 000 Stunden ungenutzt herum.</p>
|
||||
<p>Die Konsequenz ist keine Absage an das Projekt — 6,2 % sind echt und werden verdient. Die Konsequenz ist eine ehrliche Fortschreibung: „Wir heben 6,2 % und wissen, dass bis zu einem Viertel noch offen ist. Der nächste Schritt ist <a href="anhang-glossar.md#gloss:large-neighborhood-search-lns" class="glossar-link">LNS</a>.“ Wer die Schranke verschweigt, erklärt das Projekt für abgeschlossen und lässt den größeren Teil liegen.</p>
|
||||
<p>Die Konsequenz ist keine Absage an das Projekt — 6,2 % sind echt und werden verdient. Die Konsequenz ist eine ehrliche Fortschreibung: „Wir heben 6,2 % und wissen, dass bis zu einem Viertel noch offen ist. Der nächste Schritt ist <a href="anhang-glossar.md#gloss:large-neighborhood-search-lns" class="glossar-link">LNS (Large Neighborhood Search)</a>.“ Wer die Schranke verschweigt, erklärt das Projekt für abgeschlossen und lässt den größeren Teil liegen.</p>
|
||||
<blockquote>
|
||||
<p>Dasselbe Muster in anderer Verkleidung: Kapitel Handelsmaschine, <code>Data_Snooping.py</code> — dort fehlt nicht die Schranke, sondern die Zahl der Versuche. Beide Male macht eine weggelassene Kennzahl aus einem korrekten Ergebnis eine irreführende Aussage.</p>
|
||||
</blockquote>
|
||||
|
|
@ -775,7 +775,7 @@
|
|||
<h2 id="sec:loesungen-qp-nlp">A.11 Lösungen zu Kapitel „Quadratische und nichtlineare Optimierung — KKT, Lagrange, Konvexität“</h2>
|
||||
<p><strong>11.1 — Konvexität einordnen.</strong> PSD (alle <span class="math inline">\ge 0</span>) → <strong>konvex</strong>, aber <strong>nicht streng</strong> konvex; die Lösung ist <strong>nicht notwendig eindeutig</strong>. Der Eigenwert 0 bedeutet eine <strong>flache Richtung</strong>: Entlang des zugehörigen Eigenvektors ändert sich der quadratische Term nicht — es gibt eine Rinne statt eines Punktes.</p>
|
||||
<p><strong>11.2 — <a href="anhang-glossar.md#gloss:komplementaerer-schlupf" class="glossar-link">Komplementärer Schlupf</a>.</strong> Ja, verträglich: <span class="math inline">\lambda_i w_i = 0</span> gilt für alle <span class="math inline">i</span> (<span class="math inline">w_2 = 0</span> mit <span class="math inline">\lambda_2 > 0</span>; die anderen mit <span class="math inline">\lambda = 0</span>). <span class="math inline">\lambda_2 = 0{,}03</span> bedeutet: Würde man Titel 2 zwingen, ein kleines positives Gewicht zu tragen, verschlechterte sich der Zielwert um 0,03 je Einheit — die Nichtnegativitätsschranke ist dort <strong>bindend</strong>.</p>
|
||||
<p><strong>11.3 — <a href="anhang-glossar.md#gloss:karush-kuhn-tucker-bedingungen-kkt" class="glossar-link">KKT</a> von Hand.</strong> <span class="math inline">\mathcal{L} = x_1^2 + x_2^2 + \lambda(4 - x_1 - x_2)</span>. Stationarität: <span class="math inline">2x_1 = \lambda</span>, <span class="math inline">2x_2 = \lambda</span> → <span class="math inline">x_1 = x_2</span>. Bindend (<span class="math inline">\lambda > 0</span>): <span class="math inline">x_1 + x_2 = 4</span> → <span class="math inline">x_1 = x_2 = 2</span>, <span class="math inline">\lambda = 4</span>. Prüfung: <span class="math inline">\lambda = 4 > 0</span> ✓, <span class="math inline">f = 8</span>. <strong>Interpretation:</strong> Würde die Forderung auf <span class="math inline">\ge 4{,}1</span> steigen, stiege <span class="math inline">f</span> um etwa <span class="math inline">4 \cdot 0{,}1 = 0{,}4</span>. Probe: <span class="math inline">2\cdot(2{,}05)^2 = 8{,}405</span> ✓.</p>
|
||||
<p><strong>11.3 — <a href="anhang-glossar.md#gloss:karush-kuhn-tucker-bedingungen-kkt" class="glossar-link">KKT (Karush-Kuhn-Tucker-Bedingungen)</a> von Hand.</strong> <span class="math inline">\mathcal{L} = x_1^2 + x_2^2 + \lambda(4 - x_1 - x_2)</span>. Stationarität: <span class="math inline">2x_1 = \lambda</span>, <span class="math inline">2x_2 = \lambda</span> → <span class="math inline">x_1 = x_2</span>. Bindend (<span class="math inline">\lambda > 0</span>): <span class="math inline">x_1 + x_2 = 4</span> → <span class="math inline">x_1 = x_2 = 2</span>, <span class="math inline">\lambda = 4</span>. Prüfung: <span class="math inline">\lambda = 4 > 0</span> ✓, <span class="math inline">f = 8</span>. <strong>Interpretation:</strong> Würde die Forderung auf <span class="math inline">\ge 4{,}1</span> steigen, stiege <span class="math inline">f</span> um etwa <span class="math inline">4 \cdot 0{,}1 = 0{,}4</span>. Probe: <span class="math inline">2\cdot(2{,}05)^2 = 8{,}405</span> ✓.</p>
|
||||
<p><strong>11.4 — Unmögliche Korrelationsmatrix.</strong> Eigenwerte <span class="math inline">\approx (-0{,}62;\ 1{,}0;\ 2{,}62)</span> → <strong>nicht PSD</strong>, also unmöglich. Anschaulich: Wenn A stark <strong>positiv</strong> mit B korreliert und B stark positiv mit C, kann A nicht gleichzeitig stark <strong>negativ</strong> mit C korrelieren — Korrelation ist eingeschränkt transitiv. Formal: <span class="math inline">\rho_{AC} \ge \rho_{AB}\rho_{BC} - \sqrt{(1-\rho_{AB}^2)(1-\rho_{BC}^2)} = 0{,}81 - 0{,}19 = 0{,}62</span>; verlangt waren <span class="math inline">-0{,}9</span>.</p>
|
||||
<p><strong>11.5 — Gewichtung untersuchen.</strong> Erwartetes Muster: Größeres <span class="math inline">\alpha</span> → mehr Rendite, mehr Konzentration im Titel mit höchstem <span class="math inline">\mu</span>. Größeres <span class="math inline">\beta</span> → gleichmäßigere Gewichte, Entropie steigt Richtung <span class="math inline">\ln 4 = 1{,}386</span>. Ab etwa <span class="math inline">\beta \approx 0{,}1</span> dominiert die Entropie und man nähert sich der Gleichgewichtung. <strong>Empfehlung an einen Ausschuss:</strong> Nicht mit <span class="math inline">\beta</span> argumentieren, sondern mit der resultierenden <strong>Maximalposition</strong> — „mit dieser Einstellung liegt keine Position über 40 %“ ist verständlich, „<span class="math inline">\beta = 0{,}015</span>“ nicht.</p>
|
||||
<p><strong>11.6 — Nicht-Konvexität demonstrieren.</strong> Mit der bewusst fehlerhaft konstruierten Matrix finden 20 Startpunkte typischerweise mehrere verschiedene Optima; die „Portfoliovarianz“ <span class="math inline">w^\top\Sigma w</span> kann bei geeigneten Gewichten negativ werden (der zugehörige Eigenvektor liegt allerdings teilweise außerhalb des zulässigen Bereichs <span class="math inline">w \ge 0{,}001</span>, <span class="math inline">\sum w = 1</span> — deshalb fällt der Fehler bei naiver Prüfung nicht auf).</p>
|
||||
|
|
@ -829,7 +829,7 @@
|
|||
<p><strong>12.1 — Fluch des Durchschnitts.</strong> Weil sich Verzögerungen <strong>fortpflanzen</strong> und die Verteilung rechtsschief ist: Ein Gewerk, das früher fertig wird, beschleunigt selten den Gesamtablauf (der nächste Schritt ist noch nicht bereit), ein verspätetes verzögert alles. Weitere Beispiele: Wartezeiten in Warteschlangen (nichtlinear in der Auslastung), Projektkosten mit Nachträgen.</p>
|
||||
<p><strong>12.2 — Ansatz wählen.</strong> (a) robust (Ausfall ist existenziell, Wahrscheinlichkeiten unzuverlässig). (b) stochastisch (Verteilung bekannt). (c) robust bzw. Extremwertstatistik (seltene Ereignisse, katastrophale Folgen). (d) stochastisch (Szenarien mit Wahrscheinlichkeiten liegen vor). (e) <a href="anhang-glossar.md#gloss:chance-constraint" class="glossar-link">Chance Constraint</a> — die Zusage ist bereits als Quote formuliert („an 99 % aller Wintertage“). Robust wäre hier zu teuer (es gibt immer einen kälteren Tag), der Erwartungswert zu schwach (er sagt nichts über die Zusage).</p>
|
||||
<p><strong>12.3 — Zweistufig rechnen.</strong> (a) Mit Spot = 60: Ableitung bei <span class="math inline">x \in (100,250)</span>: <span class="math inline">40 - 60\cdot0{,}5 + 5\cdot0{,}5 = 40-30+2{,}5 = +12{,}5 > 0</span> → Kapazität <strong>senken</strong>. Bei <span class="math inline">x < 100</span>: <span class="math inline">40 - 60 = -20 < 0</span> → erhöhen. Optimum daher <span class="math inline">x^* = 100</span>. (b) Billige Nachbesserung macht Vorhalten unattraktiv. (c) Bei <span class="math inline">x = 225</span> optimal müsste die Ableitung dort das Vorzeichen wechseln — das ist bei diskreten Szenarien nur zufällig der Fall; der Mittelwert ist nur bei symmetrischen Kosten und stetiger Verteilung optimal.</p>
|
||||
<p><strong>12.4 — <a href="anhang-glossar.md#gloss:evpi-expected-value-of-perfect-information" class="glossar-link">EVPI</a> interpretieren.</strong> Selbst eine <strong>perfekte</strong> Prognose wäre nur 8 400 € pro Jahr wert. Eine Lösung für 15 000 € kann sich also <strong>niemals</strong> rechnen — unabhängig von ihrer Güte. Argument: „Der theoretische Maximalnutzen liegt unter dem Preis.“</p>
|
||||
<p><strong>12.4 — <a href="anhang-glossar.md#gloss:evpi-expected-value-of-perfect-information" class="glossar-link">EVPI (Expected Value of Perfect Information)</a> interpretieren.</strong> Selbst eine <strong>perfekte</strong> Prognose wäre nur 8 400 € pro Jahr wert. Eine Lösung für 15 000 € kann sich also <strong>niemals</strong> rechnen — unabhängig von ihrer Güte. Argument: „Der theoretische Maximalnutzen liegt unter dem Preis.“</p>
|
||||
<p><strong>12.5 — Monte-Carlo erweitern.</strong> (a) Servicelevel 95 %: Kapazität = 95 %-Quantil des Bedarfs (ca. 485). Die Zusatzkosten gegenüber dem Kostenoptimum (180) betragen ein Vielfaches — Servicelevel ist teuer, und genau diese Zahl braucht die Geschäftsleitung für die Entscheidung. (b) <code>cvar = kosten[kosten >= np.quantile(kosten, 0.95)].mean()</code>. (c) Erwartetes Bild: Bei kleiner Kapazität ist die Kostenverteilung stark rechtsschief (seltene, teure Notzukäufe); bei großer Kapazität schmal und nach rechts verschoben.</p>
|
||||
<p><strong>12.6 — Den Preis der Zusage selbst bestimmen.</strong> (a) Die Kosten je Prozentpunkt steigen weiter steil an; der Mix verschiebt sich dabei fast nur noch zugunsten des Gaskraftwerks, weil Biomasse längst an ihrer Ausbaugrenze liegt. Wind und Sonne bleiben bei einem kleinen Rest — sie senken über ihre Gegenläufigkeit die Norm, tragen zur gesicherten Leistung aber kaum bei. (b) Der Unterschied ist <strong>nicht</strong> numerisch, sondern inhaltlich. Bei 200 MW Biomasse liefert selbst der <strong>Vollausbau</strong> in der Kältewelle nur rund 440 MW — 7,5 % der Szenarien sind schlicht nicht bedienbar, egal wie viel Geld man ausgibt. Das Szenariomodell sieht diese Fälle in den Daten und meldet korrekt <code>infeasible</code>, sobald die Zusage über 92 % steigt. Das analytische Modell kennt sie nicht: Für eine Normalverteilung ist jede Zusage unter 100 % erfüllbar, wenn man nur genug Streuung wegkauft. Es meldet <code>optimal</code> — und der Plan hält gemessen 87,4 %. Glauben sollte man dem Szenariomodell: Ein <code>infeasible</code> ist hier die <strong>richtige</strong> Antwort. Es sagt, dass die Zusage nicht am Budget scheitert, sondern am Kraftwerkspark, und dass nicht mehr Geld hilft, sondern nur eine andere Anlage oder eine kleinere Zusage. (c) Sinngemäß: „99,99 % kosten nicht 5 % mehr als 99 %, sondern ein Vielfaches — der letzte Prozentpunkt ist bereits 4,5-mal so teuer wie der erste. Sagen Sie mir, was ein Ausfalltag das Unternehmen kostet, dann rechne ich aus, welche Quote sich lohnt. Und die Zusage gilt nur für die Wetterlagen, die wir modelliert haben — die Kältewelle gehört hinein.“</p>
|
||||
<p><strong>12.7 — <a href="anhang-glossar.md#gloss:budgeted-uncertainty" class="glossar-link">Budgeted Uncertainty</a>.</strong></p>
|
||||
|
|
@ -887,7 +887,7 @@ F(11{,}33) = 1 - \frac{(18-11{,}33)^2}{(18-6)(18-10)} = 1 - \frac{44{,}4}{96} =
|
|||
<p><strong>13.1 — Bausteine.</strong> Stufe = Tag 1–5; Zustand = verbleibende Distanz (ggf. plus Erschöpfungsgrad); Aktion = heutige Tagesetappe; Wertfunktion = minimale Restanstrengung. <strong>Nicht</strong> in den Zustand gehören: bereits gelaufene Kilometer (redundant, wenn die Restdistanz bekannt ist) und das Wetter von gestern (ohne Einfluss auf die Zukunft).</p>
|
||||
<p><strong>13.2 — <a href="anhang-glossar.md#gloss:optimalitaetsprinzip" class="glossar-link">Optimalitätsprinzip</a>.</strong> Weil der Wert eines Zustands nur von den <em>künftigen</em> Entscheidungen abhängt, kann man ihn ab dem Ende rekursiv berechnen. Hängen die Kosten zusätzlich von <strong>früheren</strong> Aktionen ab, ist die Markov-Eigenschaft verletzt — die Lösung: die relevante Vergangenheit <strong>in den Zustand aufnehmen</strong> (dann wächst allerdings der <a href="anhang-glossar.md#gloss:zustandsraum" class="glossar-link">Zustandsraum</a>).</p>
|
||||
<p><strong>13.3 — <a href="anhang-glossar.md#gloss:rueckwaertsinduktion" class="glossar-link">Rückwärtsinduktion</a>.</strong> Mit <span class="math inline">C(n) = n^2 + 2n</span> und 5 Einheiten in 3 Perioden ergibt sich als optimaler Pfad <span class="math inline">2 \to 2 \to 1</span> (oder eine Permutation davon) mit Gesamtkosten <span class="math inline">8 + 8 + 3 = 19</span>. Alles auf einmal kostet <span class="math inline">25 + 10 = 35</span>.</p>
|
||||
<p><strong>13.4 — Rucksack als <a href="anhang-glossar.md#gloss:dynamische-programmierung-dp" class="glossar-link">DP</a>.</strong></p>
|
||||
<p><strong>13.4 — Rucksack als <a href="anhang-glossar.md#gloss:dynamische-programmierung-dp" class="glossar-link">DP (Dynamische Programmierung)</a>.</strong></p>
|
||||
<div class="sourceCode" id="cb16"><pre class="sourceCode python"><code class="sourceCode python"><span id="cb16-1"><a href="#cb16-1" aria-hidden="true" tabindex="-1"></a>V <span class="op">=</span> np.zeros((n <span class="op">+</span> <span class="dv">1</span>, kapazitaet <span class="op">+</span> <span class="dv">1</span>))</span>
|
||||
<span id="cb16-2"><a href="#cb16-2" aria-hidden="true" tabindex="-1"></a><span class="cf">for</span> i <span class="kw">in</span> <span class="bu">range</span>(<span class="dv">1</span>, n <span class="op">+</span> <span class="dv">1</span>):</span>
|
||||
<span id="cb16-3"><a href="#cb16-3" aria-hidden="true" tabindex="-1"></a> <span class="cf">for</span> c <span class="kw">in</span> <span class="bu">range</span>(kapazitaet <span class="op">+</span> <span class="dv">1</span>):</span>
|
||||
|
|
@ -1044,7 +1044,7 @@ F(11{,}33) = 1 - \frac{(18-11{,}33)^2}{(18-6)(18-10)} = 1 - \frac{44{,}4}{96} =
|
|||
<p><strong>16.3 — Die Brücke rückwärts.</strong> Shrinkage hilft, wenn man eine <strong>Kovarianzmatrix</strong> aus wenigen Beobachtungen schätzt. Bei Lieferzeiten tritt genau dasselbe Problem auf, sobald man die <em>Korrelationen zwischen</em> Lieferanten braucht — und die braucht man, sobald Lieferanten gemeinsame Ursachen haben: derselbe Hafen, dasselbe Vorprodukt, dieselbe Region.</p>
|
||||
<p>Bei 40 Lieferanten hat die Kovarianzmatrix 820 zu schätzende Einträge. Wer dafür 36 Monatswerte hat, schätzt 820 Zahlen aus 36 Beobachtungen — dasselbe Missverhältnis wie bei Aktienrenditen, mit denselben Folgen (<code>Kovarianz_Falle.py</code>).</p>
|
||||
<p>Benötigt würden: Lieferzeit-Zeitreihen je Lieferant über denselben Zeitraum, gleich getaktet. Genau daran scheitert es in der Praxis meist — die Daten liegen in Bestellvorgängen, nicht in einer Matrix.</p>
|
||||
<p><strong>16.4 — <a href="anhang-glossar.md#gloss:conditional-value-at-risk-cvar" class="glossar-link">CVaR</a> mit Ganzzahligkeit.</strong> Man ergänzt Binärvariablen <span class="math inline">y_j</span> je Lieferant und die Kopplung <span class="math inline">w_j \le y_j</span> sowie <span class="math inline">\sum_j y_j \le 3</span>. Da CVXPY gemischt-ganzzahlige Probleme unterstützt, genügt <code>cp.Variable(n, boolean=True)</code>.</p>
|
||||
<p><strong>16.4 — <a href="anhang-glossar.md#gloss:conditional-value-at-risk-cvar" class="glossar-link">CVaR (Conditional Value at Risk)</a> mit Ganzzahligkeit.</strong> Man ergänzt Binärvariablen <span class="math inline">y_j</span> je Lieferant und die Kopplung <span class="math inline">w_j \le y_j</span> sowie <span class="math inline">\sum_j y_j \le 3</span>. Da CVXPY gemischt-ganzzahlige Probleme unterstützt, genügt <code>cp.Variable(n, boolean=True)</code>.</p>
|
||||
<p>Zu erwarten ist ein <strong>höherer</strong> CVaR: Der zulässige Bereich wird kleiner, und die Feinabstimmung über sechs Lieferanten fällt weg. Der Aufschlag ist der Preis der Vertragswirklichkeit — und genau die Zahl, die man dem Einkauf vorlegt, wenn dort jemand sagt, drei Lieferanten seien genug.</p>
|
||||
<p><strong>16.5 — Die eigene Brücke.</strong> Freie Antwort. Eine gute Bearbeitung nennt das Modell, die Entsprechung und <strong>die Zeile der Grenztabelle, die im Weg steht</strong> — meist ist es die dritte (Teilbarkeit) oder die erste (gemessen gegen geschätzt). Wenn keine im Weg steht, ist die Übertragung wahrscheinlich zu oberflächlich geprüft.</p>
|
||||
<h3 id="denkfehler-loesung-bruecke">Finde den Denkfehler — „Das ist doch dasselbe Problem“</h3>
|
||||
|
|
@ -1151,7 +1151,7 @@ u_{k,\tau} \le 1 - b_{k,t} \qquad \text{für } \tau = t, \dots, t + M_k - 1
|
|||
<ol type="1">
|
||||
<li>Log-Renditen sind Differenzen von Logarithmen — die addieren sich über die Zeit. Diskrete Renditen sind lineare Anteile am Kapital — die addieren sich über gewichtete Positionen.</li>
|
||||
<li>Die Optimierung sucht die Richtungen kleinster geschätzter Varianz — genau jene, deren Eigenwerte am stärksten nach unten verzerrt sind. Sie optimiert dadurch in das Schätzrauschen hinein.</li>
|
||||
<li>Der Rang von <span class="math inline">\mathbf{X}^\top\mathbf{X}</span> ist höchstens <span class="math inline">T < N</span> — die Matrix ist nicht invertierbar, das <a href="anhang-glossar.md#gloss:global-minimum-variance-portfolio-gmv" class="glossar-link">GMV</a>-Problem hat unendlich viele Lösungen.</li>
|
||||
<li>Der Rang von <span class="math inline">\mathbf{X}^\top\mathbf{X}</span> ist höchstens <span class="math inline">T < N</span> — die Matrix ist nicht invertierbar, das <a href="anhang-glossar.md#gloss:global-minimum-variance-portfolio-gmv" class="glossar-link">GMV (Global Minimum Variance Portfolio)</a>-Problem hat unendlich viele Lösungen.</li>
|
||||
<li>Stichprobenmatrix (unverzerrt, verrauscht) mit strukturiertem Ziel (verzerrt, stabil). <span class="math inline">\delta</span> wird analytisch so bestimmt, dass der erwartete quadratische Fehler minimal wird.</li>
|
||||
<li>Skalierte Einheitsmatrix (sklearn) und Konstant-Korrelations-Ziel (LW 2003).</li>
|
||||
</ol>
|
||||
|
|
@ -1250,7 +1250,7 @@ T \ge \left(\frac{2\sigma}{\mu}\right)^2 = \left(\frac{2 \cdot 0{,}012}{0{,}0004
|
|||
</ol>
|
||||
<hr />
|
||||
<h2 id="sec:loesungen-cvar">A.20 Lösungen zu Kapitel „Tail-Risiko, CVaR und Transaktionskosten“</h2>
|
||||
<p><strong>20.1 — <a href="anhang-glossar.md#gloss:value-at-risk-var" class="glossar-link">VaR</a> und CVaR von Hand.</strong> Sortierte Verluste: <span class="math inline">-2{,}0; -1{,}2; -0{,}8; -0{,}4; 0{,}3; 0{,}6; 1{,}1; 2{,}1; 5{,}4; 8{,}9</span>. Das 80 %-Quantil ist der 8. Wert: <span class="math inline">\text{VaR}_{80\%} = 2{,}1</span>. $_{80%} = $ Mittel der schlechtesten 20 % <span class="math inline">= (5{,}4+8{,}9)/2 = \mathbf{7{,}15}</span>.</p>
|
||||
<p><strong>20.1 — <a href="anhang-glossar.md#gloss:value-at-risk-var" class="glossar-link">VaR (Value at Risk)</a> und CVaR von Hand.</strong> Sortierte Verluste: <span class="math inline">-2{,}0; -1{,}2; -0{,}8; -0{,}4; 0{,}3; 0{,}6; 1{,}1; 2{,}1; 5{,}4; 8{,}9</span>. Das 80 %-Quantil ist der 8. Wert: <span class="math inline">\text{VaR}_{80\%} = 2{,}1</span>. $_{80%} = $ Mittel der schlechtesten 20 % <span class="math inline">= (5{,}4+8{,}9)/2 = \mathbf{7{,}15}</span>.</p>
|
||||
<p><strong>20.2 — <a href="anhang-glossar.md#gloss:subadditivitaet" class="glossar-link">Subadditivität</a>.</strong> Ein Risikomaß sollte Diversifikation nie bestrafen: Das Risiko eines zusammengelegten Portfolios darf nicht größer sein als die Summe der Einzelrisiken. Wird das verletzt, hätte eine Bank einen Anreiz, Portfolios künstlich aufzuspalten, um Eigenkapitalanforderungen zu senken — ökonomisch unsinnig.</p>
|
||||
<p><strong>20.3 — Rockafellar-Uryasev nachvollziehen.</strong> (a) Schlechtestes Drittel von <span class="math inline">(1,4,9)</span> ist <span class="math inline">\{9\}</span> → CVaR <span class="math inline">= 9</span>. (b) Mit <span class="math inline">\frac{1}{S(1-\alpha)} = \frac{1}{3\cdot(1/3)} = 1</span>: <span class="math inline">\gamma=0</span>: <span class="math inline">0 + (1+4+9) = 14</span>. <span class="math inline">\gamma=1</span>: <span class="math inline">1 + (0+3+8) = 12</span>. <span class="math inline">\gamma=4</span>: <span class="math inline">4 + (0+0+5) = \mathbf{9}</span>. <span class="math inline">\gamma=5</span>: <span class="math inline">5+4 = 9</span>. <span class="math inline">\gamma=9</span>: <span class="math inline">9+0 = 9</span>. (c) Minimum ab <span class="math inline">\gamma = 4</span> bei <strong>9</strong> — identisch mit (a) ✓. (Das Minimum wird auf einem ganzen Intervall angenommen, weil die Funktion stückweise linear ist — genau der Grund, warum der CVaR nicht <em>streng</em> konvex ist.)</p>
|
||||
<p><strong>20.4 — Einheiten prüfen.</strong> In einem Modell, das annualisierte Rendite gegen täglichen CVaR verrechnet, wirkt <span class="math inline">1{,}5</span> effektiv als <span class="math inline">1{,}5/252 \approx 0{,}006</span> auf Tagesbasis — der Risikoterm ist also um Faktor 252 zu leicht gewichtet. Um dieselbe Wirkung wie <code>RISIKOAVERSION = 1.5</code> im konsistenten Tagesmodell zu erzielen, hätte man dort <code>lambda_risk = 1.5 * 252 = 378</code> setzen müssen.</p>
|
||||
|
|
@ -1486,7 +1486,7 @@ T \ge \left(\frac{2\sigma}{\mu}\right)^2 = \left(\frac{2 \cdot 0{,}012}{0{,}0004
|
|||
<li>„Grün” heißt nur, dass kein Test fehlgeschlagen ist — das gilt auch für eine Suite aus lauter <code>assert True</code>. „Prüft etwas” heißt, dass die Tests bei einem eingebauten Fehler rot würden; genau das misst der Mutationstest.</li>
|
||||
<li>Weil sonst nicht erkennbar ist, welche Hälfte die Zeit kostet. Im Kapitel gehen bei OR-Tools 78 % in den Aufbau — wer nur die Gesamtzeit sieht, wechselt den Solver und ändert damit fast nichts.</li>
|
||||
<li>Weil die Rechnung Sekunden bis Minuten dauert. Eine synchrone Antwort läuft in den Timeout des Reverse Proxy und blockiert währenddessen einen Arbeiter. <code>202</code> heißt „angenommen, noch nicht fertig” — genau die richtige Aussage.</li>
|
||||
<li>Ein Threadpool genügt, wenn der Solver den <a href="anhang-glossar.md#gloss:gil-global-interpreter-lock" class="glossar-link">GIL</a> freigibt — das tun die C++-Bibliotheken (OR-Tools, HiGHS) während <code>Solve()</code>, im Kapitel mit Faktor 3,5 bei vier Threads gemessen. Eine in reinem Python geschriebene Heuristik hält den GIL; für sie braucht es Prozesse.</li>
|
||||
<li>Ein Threadpool genügt, wenn der Solver den <a href="anhang-glossar.md#gloss:gil-global-interpreter-lock" class="glossar-link">GIL (Global Interpreter Lock)</a> freigibt — das tun die C++-Bibliotheken (OR-Tools, HiGHS) während <code>Solve()</code>, im Kapitel mit Faktor 3,5 bei vier Threads gemessen. Eine in reinem Python geschriebene Heuristik hält den GIL; für sie braucht es Prozesse.</li>
|
||||
</ol>
|
||||
<hr />
|
||||
|
||||
|
|
|
|||
6
OR_HTML_04/anhang-modellierungsmuster.html
generated
6
OR_HTML_04/anhang-modellierungsmuster.html
generated
|
|
@ -412,7 +412,7 @@
|
|||
<span id="cb8-4"><a href="#cb8-4" aria-hidden="true" tabindex="-1"></a> modell.Add(<span class="bu">sum</span>(KOSTEN[i] <span class="op">*</span> x[i] <span class="cf">for</span> i <span class="kw">in</span> massnahmen</span>
|
||||
<span id="cb8-5"><a href="#cb8-5" aria-hidden="true" tabindex="-1"></a> <span class="cf">if</span> TOPF[i] <span class="op">==</span> topf) <span class="op"><=</span> grenze)</span></code></pre></div>
|
||||
<blockquote>
|
||||
<p>💡 <strong>Der <a href="anhang-glossar.md#gloss:schattenpreis" class="glossar-link">Schattenpreis</a> des Budgets ist die Zahl, nach der die Geschäftsführung fragt:</strong> „Was bringt der nächste Euro?“ Bei einem <strong><a href="anhang-glossar.md#gloss:lineare-programmierung-lp" class="glossar-link">LP</a></strong> ist er direkt ablesbar. Bei <strong>Ganzzahligkeit gibt es ihn nicht</strong> — die Dualwerte der <a href="anhang-glossar.md#gloss:relaxation" class="glossar-link">Relaxation</a> sind keine gültige Antwort. Rechnen Sie stattdessen mit erhöhtem Budget neu und vergleichen Sie die Zielwerte (<a href="lp.html#sec:lp-entartung">Abschnitt 5.9</a>).</p>
|
||||
<p>💡 <strong>Der <a href="anhang-glossar.md#gloss:schattenpreis" class="glossar-link">Schattenpreis</a> des Budgets ist die Zahl, nach der die Geschäftsführung fragt:</strong> „Was bringt der nächste Euro?“ Bei einem <strong><a href="anhang-glossar.md#gloss:lineare-programmierung-lp" class="glossar-link">LP (Lineare Programmierung)</a></strong> ist er direkt ablesbar. Bei <strong>Ganzzahligkeit gibt es ihn nicht</strong> — die Dualwerte der <a href="anhang-glossar.md#gloss:relaxation" class="glossar-link">Relaxation</a> sind keine gültige Antwort. Rechnen Sie stattdessen mit erhöhtem Budget neu und vergleichen Sie die Zielwerte (<a href="lp.html#sec:lp-entartung">Abschnitt 5.9</a>).</p>
|
||||
</blockquote>
|
||||
<blockquote>
|
||||
<p>⚠️ <strong>Die LP-Relaxation verspricht zu viel.</strong> Sie darf die letzte Maßnahme anteilig kaufen und liefert deshalb eine Schranke, die spürbar über dem tatsächlich Erreichbaren liegen kann. Wer sie als Prognose berichtet, verspricht Geld, das nicht kommt.</p>
|
||||
|
|
@ -426,7 +426,7 @@
|
|||
<h3 id="b14-nichtüberlappung">B14 — Nichtüberlappung</h3>
|
||||
<p><strong>Regel.</strong> „Eine Maschine bearbeitet nur einen Job gleichzeitig.“</p>
|
||||
<div class="sourceCode" id="cb9"><pre class="sourceCode python"><code class="sourceCode python"><span id="cb9-1"><a href="#cb9-1" aria-hidden="true" tabindex="-1"></a>modell.AddNoOverlap([intervall_1, intervall_2, ...])</span></code></pre></div>
|
||||
<p>In <a href="anhang-glossar.md#gloss:gemischt-ganzzahlige-optimierung-milp" class="glossar-link">MILP</a> bräuchte man je Paar eine Disjunktion (B4) — bei <span class="math inline">k</span> Jobs sind das <span class="math inline">\binom{k}{2}</span> Konstruktionen. <strong>Nehmen Sie hier <a href="anhang-glossar.md#gloss:cp-sat" class="glossar-link">CP-SAT</a>.</strong></p>
|
||||
<p>In <a href="anhang-glossar.md#gloss:gemischt-ganzzahlige-optimierung-milp" class="glossar-link">MILP (Gemischt-ganzzahlige Optimierung)</a> bräuchte man je Paar eine Disjunktion (B4) — bei <span class="math inline">k</span> Jobs sind das <span class="math inline">\binom{k}{2}</span> Konstruktionen. <strong>Nehmen Sie hier <a href="anhang-glossar.md#gloss:cp-sat" class="glossar-link">CP-SAT</a>.</strong></p>
|
||||
<h3 id="b15-kumulative-ressource">B15 — Kumulative Ressource</h3>
|
||||
<p><strong>Regel.</strong> „Zu keinem Zeitpunkt dürfen mehr als 3 Arbeiten gleichzeitig laufen“ bzw. „die Stromlast darf 500 kW nie übersteigen“.</p>
|
||||
<div class="sourceCode" id="cb10"><pre class="sourceCode python"><code class="sourceCode python"><span id="cb10-1"><a href="#cb10-1" aria-hidden="true" tabindex="-1"></a>modell.AddCumulative(intervalle, bedarfe, kapazitaet)</span></code></pre></div>
|
||||
|
|
@ -494,7 +494,7 @@
|
|||
</blockquote>
|
||||
<h3 id="b24-subtour-eliminierung">B24 — Subtour-Eliminierung</h3>
|
||||
<p><strong>MTZ (einfach, aber schwach):</strong> <span class="math display">u_i - u_j + C x_{ij} \le C - d_j \qquad \forall i\ne j</span></p>
|
||||
<p><strong>Besser in der Praxis:</strong> <code>AddCircuit</code> in <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> oder die <a href="anhang-glossar.md#gloss:routing-bibliothek" class="glossar-link">Routing-Bibliothek</a> von <a href="anhang-glossar.md#gloss:or-tools" class="glossar-link">OR-Tools</a>.</p>
|
||||
<p><strong>Besser in der Praxis:</strong> <code>AddCircuit</code> in <a href="anhang-glossar.md#gloss:constraint-programming-cp" class="glossar-link">CP (Constraint Programming)</a>-<a href="anhang-glossar.md#gloss:sat-boolean-satisfiability" class="glossar-link">SAT (Boolean Satisfiability)</a> oder die <a href="anhang-glossar.md#gloss:routing-bibliothek" class="glossar-link">Routing-Bibliothek</a> von <a href="anhang-glossar.md#gloss:or-tools" class="glossar-link">OR-Tools</a>.</p>
|
||||
<hr />
|
||||
<h2 id="ein-wort-zur-auswahl">Ein Wort zur Auswahl</h2>
|
||||
<p>Wenn mehrere Muster passen, entscheiden Sie nach dieser Reihenfolge:</p>
|
||||
|
|
|
|||
8
OR_HTML_04/anhang-spickzettel.html
generated
8
OR_HTML_04/anhang-spickzettel.html
generated
|
|
@ -105,7 +105,7 @@
|
|||
</blockquote>
|
||||
<p><strong>Alle Schnipsel lösen dasselbe Problem</strong> — das Produktionsprogramm aus <a href="oekosystem.html#sec:oekosystem-schnellstart">Abschnitt 3.1</a> mit dem bekannten Optimum <strong>530</strong> und den Schattenpreisen <strong>12</strong> und <strong>1</strong>:</p>
|
||||
<p><span class="math display">\max\; 10x_1 + 15x_2 + 25x_3 \quad\text{u.d.N.}\quad x_1 + x_2 + 2x_3 \le 40,\;\; 2x_1 + 3x_2 + x_3 \le 50,\;\; x \ge 0</span></p>
|
||||
<p>Damit ist jeder Schnipsel selbstprüfend: Kommt bei Ihnen etwas anderes als 530 heraus, liegt es an der Übertragung, nicht am Modell. (Die Ausnahme ist <a href="anhang-glossar.md#gloss:cp-sat" class="glossar-link">CP-SAT</a> — ein rein stetiges <a href="anhang-glossar.md#gloss:lineare-programmierung-lp" class="glossar-link">LP</a> ist dort das falsche Werkzeug; die Seite zeigt stattdessen die <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>-eigenen Bausteine.)</p>
|
||||
<p>Damit ist jeder Schnipsel selbstprüfend: Kommt bei Ihnen etwas anderes als 530 heraus, liegt es an der Übertragung, nicht am Modell. (Die Ausnahme ist <a href="anhang-glossar.md#gloss:cp-sat" class="glossar-link">CP-SAT</a> — ein rein stetiges <a href="anhang-glossar.md#gloss:lineare-programmierung-lp" class="glossar-link">LP (Lineare Programmierung)</a> ist dort das falsche Werkzeug; die Seite zeigt stattdessen die <a href="anhang-glossar.md#gloss:constraint-programming-cp" class="glossar-link">CP (Constraint Programming)</a>-<a href="anhang-glossar.md#gloss:sat-boolean-satisfiability" class="glossar-link">SAT (Boolean Satisfiability)</a>-eigenen Bausteine.)</p>
|
||||
<blockquote>
|
||||
<p><strong>Was dieser Anhang <em>nicht</em> ist.</strong> Kein Vergleich und keine Empfehlung. Welche Bibliothek für welche Aufgabe taugt, steht in <a href="oekosystem.html#sec:oekosystem-wann-lohnt-sich-welche-ebene">Abschnitt 3.6</a>; denselben Fall in vier Bibliotheken <em>nebeneinander</em> zeigt <code>Ein_System_Vier_Ansaetze.py</code>, die beiden Modellierungssprachen <code>Modellierungsschichten.py</code>. Hier geht es allein ums Nachschlagen.</p>
|
||||
</blockquote>
|
||||
|
|
@ -210,7 +210,7 @@
|
|||
</ol>
|
||||
<hr />
|
||||
<h2 id="d3-or-tools-pywraplp">D3 — OR-Tools: <code>pywraplp</code></h2>
|
||||
<p><strong>Wofür.</strong> Bequeme algebraische Schreibweise für LP und <a href="anhang-glossar.md#gloss:gemischt-ganzzahlige-optimierung-milp" class="glossar-link">MILP</a> mit umschaltbarem Backend (<code>GLOP</code>, <code>SCIP</code>, <code>CBC</code>, <code>SAT</code>). <strong>Wofür nicht:</strong> <a href="anhang-glossar.md#gloss:scheduling" class="glossar-link">Scheduling</a> und kombinatorische Bedingungen — dafür ist CP-SAT (D4) da.</p>
|
||||
<p><strong>Wofür.</strong> Bequeme algebraische Schreibweise für LP und <a href="anhang-glossar.md#gloss:gemischt-ganzzahlige-optimierung-milp" class="glossar-link">MILP (Gemischt-ganzzahlige Optimierung)</a> mit umschaltbarem Backend (<code>GLOP</code>, <code>SCIP</code>, <code>CBC</code>, <code>SAT</code>). <strong>Wofür nicht:</strong> <a href="anhang-glossar.md#gloss:scheduling" class="glossar-link">Scheduling</a> und kombinatorische Bedingungen — dafür ist CP-SAT (D4) da.</p>
|
||||
<div class="sourceCode" id="cb4"><pre class="sourceCode python"><code class="sourceCode python"><span id="cb4-1"><a href="#cb4-1" aria-hidden="true" tabindex="-1"></a><span class="im">from</span> ortools.linear_solver <span class="im">import</span> pywraplp</span>
|
||||
<span id="cb4-2"><a href="#cb4-2" aria-hidden="true" tabindex="-1"></a></span>
|
||||
<span id="cb4-3"><a href="#cb4-3" aria-hidden="true" tabindex="-1"></a><span class="co"># "GLOP" = LP, "SCIP" oder "CBC" = MILP, "SAT" = CP-SAT als MILP-Backend</span></span>
|
||||
|
|
@ -290,7 +290,7 @@
|
|||
</ol>
|
||||
<hr />
|
||||
<h2 id="d5-cvxpy">D5 — CVXPY</h2>
|
||||
<p><strong>Wofür.</strong> Konvexe Probleme: quadratische Ziele, Normen, <a href="anhang-glossar.md#gloss:conditional-value-at-risk-cvar" class="glossar-link">CVaR</a>, alles mit Regularisierungstermen. <strong>Wofür nicht:</strong> große kombinatorische Modelle — der Aufbau der Ausdrücke wird dann selbst zum Engpass.</p>
|
||||
<p><strong>Wofür.</strong> Konvexe Probleme: quadratische Ziele, Normen, <a href="anhang-glossar.md#gloss:conditional-value-at-risk-cvar" class="glossar-link">CVaR (Conditional Value at Risk)</a>, alles mit Regularisierungstermen. <strong>Wofür nicht:</strong> große kombinatorische Modelle — der Aufbau der Ausdrücke wird dann selbst zum Engpass.</p>
|
||||
<div class="sourceCode" id="cb6"><pre class="sourceCode python"><code class="sourceCode python"><span id="cb6-1"><a href="#cb6-1" aria-hidden="true" tabindex="-1"></a><span class="im">import</span> numpy <span class="im">as</span> np</span>
|
||||
<span id="cb6-2"><a href="#cb6-2" aria-hidden="true" tabindex="-1"></a><span class="im">import</span> cvxpy <span class="im">as</span> cp</span>
|
||||
<span id="cb6-3"><a href="#cb6-3" aria-hidden="true" tabindex="-1"></a></span>
|
||||
|
|
@ -319,7 +319,7 @@
|
|||
<span id="cb6-26"><a href="#cb6-26" aria-hidden="true" tabindex="-1"></a> <span class="bu">print</span>(<span class="st">"Solverfehler:"</span>, problem.status)</span></code></pre></div>
|
||||
<h3 id="die-drei-häufigsten-stolpersteine-4">Die drei häufigsten Stolpersteine</h3>
|
||||
<ol type="1">
|
||||
<li><strong><a href="anhang-glossar.md#gloss:dcp-disciplined-convex-programming" class="glossar-link">DCP</a>-Regeln vor dem Lösen prüfen.</strong> <code>problem.is_dcp()</code> und dann die einzelnen Bedingungen — das nennt die Schuldige, statt einen <code>DCPError</code> ohne Ort zu werfen (<a href="anhang-fehlerdiagnose.html#anhang-fehlerdiagnose">Anhang C</a>, C8).</li>
|
||||
<li><strong><a href="anhang-glossar.md#gloss:dcp-disciplined-convex-programming" class="glossar-link">DCP (Disciplined Convex Programming)</a>-Regeln vor dem Lösen prüfen.</strong> <code>problem.is_dcp()</code> und dann die einzelnen Bedingungen — das nennt die Schuldige, statt einen <code>DCPError</code> ohne Ort zu werfen (<a href="anhang-fehlerdiagnose.html#anhang-fehlerdiagnose">Anhang C</a>, C8).</li>
|
||||
<li><strong><code>OPTIMAL_INACCURATE</code> ist kein Erfolg.</strong> Der Solver hat aufgegeben und meldet das leise. Diesen Fall immer eigens behandeln.</li>
|
||||
<li><strong>Der Aufbau kann teurer sein als das Lösen.</strong> Schleifen über Szenarien durch Vektorausdrücke ersetzen; <code>Parameter</code> statt Neuaufbau, wenn sich nur Zahlen ändern.</li>
|
||||
</ol>
|
||||
|
|
|
|||
2
OR_HTML_04/assets/search-index.js
generated
2
OR_HTML_04/assets/search-index.js
generated
File diff suppressed because one or more lines are too long
98
OR_HTML_04/bilder_04/titelseite.svg
generated
98
OR_HTML_04/bilder_04/titelseite.svg
generated
|
|
@ -2444,7 +2444,7 @@ z
|
|||
</g>
|
||||
</g>
|
||||
<g id="text_14">
|
||||
<!-- Stand: 10. September 2026 v17.38 -->
|
||||
<!-- Stand: 10. September 2026 v17.51 -->
|
||||
<g style="fill: #c7d2fe" transform="translate(71.4528 818.05749) scale(0.12 -0.12)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-31" d="M 794 531
|
||||
|
|
@ -2546,75 +2546,29 @@ L 525 4134
|
|||
L 525 4666
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
<path id="DejaVuSans-33" d="M 2597 2516
|
||||
Q 3050 2419 3304 2112
|
||||
Q 3559 1806 3559 1356
|
||||
Q 3559 666 3084 287
|
||||
Q 2609 -91 1734 -91
|
||||
Q 1441 -91 1130 -33
|
||||
Q 819 25 488 141
|
||||
L 488 750
|
||||
Q 750 597 1062 519
|
||||
Q 1375 441 1716 441
|
||||
Q 2309 441 2620 675
|
||||
Q 2931 909 2931 1356
|
||||
Q 2931 1769 2642 2001
|
||||
Q 2353 2234 1838 2234
|
||||
L 1294 2234
|
||||
L 1294 2753
|
||||
L 1863 2753
|
||||
Q 2328 2753 2575 2939
|
||||
Q 2822 3125 2822 3475
|
||||
Q 2822 3834 2567 4026
|
||||
Q 2313 4219 1838 4219
|
||||
Q 1578 4219 1281 4162
|
||||
Q 984 4106 628 3988
|
||||
L 628 4550
|
||||
Q 988 4650 1302 4700
|
||||
Q 1616 4750 1894 4750
|
||||
Q 2613 4750 3031 4423
|
||||
Q 3450 4097 3450 3541
|
||||
Q 3450 3153 3228 2886
|
||||
Q 3006 2619 2597 2516
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
<path id="DejaVuSans-38" d="M 2034 2216
|
||||
Q 1584 2216 1326 1975
|
||||
Q 1069 1734 1069 1313
|
||||
Q 1069 891 1326 650
|
||||
Q 1584 409 2034 409
|
||||
Q 2484 409 2743 651
|
||||
Q 3003 894 3003 1313
|
||||
Q 3003 1734 2745 1975
|
||||
Q 2488 2216 2034 2216
|
||||
z
|
||||
M 1403 2484
|
||||
Q 997 2584 770 2862
|
||||
Q 544 3141 544 3541
|
||||
Q 544 4100 942 4425
|
||||
Q 1341 4750 2034 4750
|
||||
Q 2731 4750 3128 4425
|
||||
Q 3525 4100 3525 3541
|
||||
Q 3525 3141 3298 2862
|
||||
Q 3072 2584 2669 2484
|
||||
Q 3125 2378 3379 2068
|
||||
Q 3634 1759 3634 1313
|
||||
Q 3634 634 3220 271
|
||||
Q 2806 -91 2034 -91
|
||||
Q 1263 -91 848 271
|
||||
Q 434 634 434 1313
|
||||
Q 434 1759 690 2068
|
||||
Q 947 2378 1403 2484
|
||||
z
|
||||
M 1172 3481
|
||||
Q 1172 3119 1398 2916
|
||||
Q 1625 2713 2034 2713
|
||||
Q 2441 2713 2670 2916
|
||||
Q 2900 3119 2900 3481
|
||||
Q 2900 3844 2670 4047
|
||||
Q 2441 4250 2034 4250
|
||||
Q 1625 4250 1398 4047
|
||||
Q 1172 3844 1172 3481
|
||||
<path id="DejaVuSans-35" d="M 691 4666
|
||||
L 3169 4666
|
||||
L 3169 4134
|
||||
L 1269 4134
|
||||
L 1269 2991
|
||||
Q 1406 3038 1543 3061
|
||||
Q 1681 3084 1819 3084
|
||||
Q 2600 3084 3056 2656
|
||||
Q 3513 2228 3513 1497
|
||||
Q 3513 744 3044 326
|
||||
Q 2575 -91 1722 -91
|
||||
Q 1428 -91 1123 -41
|
||||
Q 819 9 494 109
|
||||
L 494 744
|
||||
Q 775 591 1075 516
|
||||
Q 1375 441 1709 441
|
||||
Q 2250 441 2565 725
|
||||
Q 2881 1009 2881 1497
|
||||
Q 2881 1984 2565 2268
|
||||
Q 2250 2553 1709 2553
|
||||
Q 1456 2553 1204 2497
|
||||
Q 953 2441 691 2322
|
||||
L 691 4666
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
|
|
@ -2649,8 +2603,8 @@ z
|
|||
<use xlink:href="#DejaVuSans-31" transform="translate(1508.886719 0)"/>
|
||||
<use xlink:href="#DejaVuSans-37" transform="translate(1572.509766 0)"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(1636.132812 0)"/>
|
||||
<use xlink:href="#DejaVuSans-33" transform="translate(1667.919922 0)"/>
|
||||
<use xlink:href="#DejaVuSans-38" transform="translate(1731.542969 0)"/>
|
||||
<use xlink:href="#DejaVuSans-35" transform="translate(1667.919922 0)"/>
|
||||
<use xlink:href="#DejaVuSans-31" transform="translate(1731.542969 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_15">
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 89 KiB After Width: | Height: | Size: 88 KiB |
10
OR_HTML_04/bruecke.html
generated
10
OR_HTML_04/bruecke.html
generated
|
|
@ -121,7 +121,7 @@
|
|||
<blockquote>
|
||||
<p><strong>📌 Kapitel auf einen Blick</strong></p>
|
||||
<p><strong>Worum geht es?</strong> Um den Nachweis, dass die Verfahren aus Teil II und III unverändert in der Finanzwelt funktionieren — und um die drei Stellen, an denen die Analogie endet.</p>
|
||||
<p><strong>Voraussetzungen:</strong> <a href="einfuehrung.html#kap-einfuehrung">Kapitel 1</a> (Allokation als <a href="anhang-glossar.md#gloss:lineare-programmierung-lp" class="glossar-link">LP</a>), <a href="unsicherheit.html#kap-unsicherheit">Kapitel 12</a> (Szenarien) und <a href="praxisfallen.html#sec:praxisfallen-or-kern">Abschnitt 22.6</a> (<code>or_kern.py</code>).</p>
|
||||
<p><strong>Voraussetzungen:</strong> <a href="einfuehrung.html#kap-einfuehrung">Kapitel 1</a> (Allokation als <a href="anhang-glossar.md#gloss:lineare-programmierung-lp" class="glossar-link">LP (Lineare Programmierung)</a>), <a href="unsicherheit.html#kap-unsicherheit">Kapitel 12</a> (Szenarien) und <a href="praxisfallen.html#sec:praxisfallen-or-kern">Abschnitt 22.6</a> (<code>or_kern.py</code>).</p>
|
||||
<p><strong>Danach können Sie:</strong> ein betriebswirtschaftliches Modell in die andere Domäne übersetzen, ohne den Modellcode anzufassen; Schattenpreise in beiden Welten lesen; und benennen, welche Annahmen dabei <strong>nicht</strong> mitwandern.</p>
|
||||
<p><strong>Zeitbedarf:</strong> ca. 2,5 Stunden.</p>
|
||||
<p><strong>Programme:</strong><br />
|
||||
|
|
@ -206,7 +206,7 @@
|
|||
<ol type="1">
|
||||
<li>… ein Allokationsproblem aus der einen Domäne in die andere übersetzen, indem Sie die Daten austauschen statt des Codes.</li>
|
||||
<li>… den Schattenpreis in beiden Welten deuten — als Wert einer Ressource und als Preis des Risikos.</li>
|
||||
<li>… erklären, warum die <a href="anhang-glossar.md#gloss:conditional-value-at-risk-cvar" class="glossar-link">CVaR</a>-Formulierung aus <a href="cvar.html#kap-cvar">Kapitel 20</a> auf Lieferverzüge genauso passt wie auf Kursverluste.</li>
|
||||
<li>… erklären, warum die <a href="anhang-glossar.md#gloss:conditional-value-at-risk-cvar" class="glossar-link">CVaR (Conditional Value at Risk)</a>-Formulierung aus <a href="cvar.html#kap-cvar">Kapitel 20</a> auf Lieferverzüge genauso passt wie auf Kursverluste.</li>
|
||||
<li>… die drei Stellen benennen, an denen die Analogie <strong>nicht</strong> trägt — und begründen, warum das Übertragen von Methoden dort gefährlich wird.</li>
|
||||
</ol>
|
||||
<hr />
|
||||
|
|
@ -681,7 +681,7 @@ u_s \ge \ell_s^\top w - \gamma, \quad u_s \ge 0
|
|||
</tr>
|
||||
<tr class="odd">
|
||||
<td><span class="math inline">\gamma</span></td>
|
||||
<td>der <a href="anhang-glossar.md#gloss:value-at-risk-var" class="glossar-link">VaR</a>: „so schlimm wird es an 95 % der Tage höchstens”</td>
|
||||
<td>der <a href="anhang-glossar.md#gloss:value-at-risk-var" class="glossar-link">VaR (Value at Risk)</a>: „so schlimm wird es an 95 % der Tage höchstens”</td>
|
||||
<td>„so viele Tage Verzug höchstens bei 95 % der Bestellungen”</td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
|
|
@ -733,8 +733,8 @@ u_s \ge \ell_s^\top w - \gamma, \quad u_s \ge 0
|
|||
</tr>
|
||||
<tr class="odd">
|
||||
<td><strong>Ob Teilbarkeit erlaubt ist</strong></td>
|
||||
<td>37,4 % eines Lieferanten gibt es nicht: Verträge, Mindestabnahmen, Rüstzeiten → <a href="anhang-glossar.md#gloss:gemischt-ganzzahlige-optimierung-milp" class="glossar-link">MILP</a></td>
|
||||
<td>37,4 % eines Fonds sind ein normaler Auftrag → LP/<a href="anhang-glossar.md#gloss:quadratische-programmierung-qp" class="glossar-link">QP</a> genügt</td>
|
||||
<td>37,4 % eines Lieferanten gibt es nicht: Verträge, Mindestabnahmen, Rüstzeiten → <a href="anhang-glossar.md#gloss:gemischt-ganzzahlige-optimierung-milp" class="glossar-link">MILP (Gemischt-ganzzahlige Optimierung)</a></td>
|
||||
<td>37,4 % eines Fonds sind ein normaler Auftrag → LP/<a href="anhang-glossar.md#gloss:quadratische-programmierung-qp" class="glossar-link">QP (Quadratische Programmierung)</a> genügt</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
|
|
|||
6
OR_HTML_04/cpsat.html
generated
6
OR_HTML_04/cpsat.html
generated
|
|
@ -151,7 +151,7 @@ Do -> Bux
|
|||
Fr -> Abel</code></pre>
|
||||
</blockquote>
|
||||
</div>
|
||||
<p><strong>Elf Zeilen Modell, und der Plan steht.</strong> Beachten Sie besonders die Zeile <code>m.AddExactlyOne(...)</code>. Sie sagt wörtlich, was gemeint ist: <em>genau eine</em> Person je Tag. In <a href="anhang-glossar.md#gloss:gemischt-ganzzahlige-optimierung-milp" class="glossar-link">MILP</a> hätte man dafür eine Gleichung <span class="math inline">\sum_p x_{p,d} = 1</span> aufgestellt — machbar, aber schon eine Übersetzungsleistung. Bei Regeln wie „diese beiden Dienste nicht direkt hintereinander“ oder „höchstens eine Nachtschicht pro Woche“ wächst dieser Übersetzungsaufwand rasch; in <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> bleibt er eine Zeile.</p>
|
||||
<p><strong>Elf Zeilen Modell, und der Plan steht.</strong> Beachten Sie besonders die Zeile <code>m.AddExactlyOne(...)</code>. Sie sagt wörtlich, was gemeint ist: <em>genau eine</em> Person je Tag. In <a href="anhang-glossar.md#gloss:gemischt-ganzzahlige-optimierung-milp" class="glossar-link">MILP (Gemischt-ganzzahlige Optimierung)</a> hätte man dafür eine Gleichung <span class="math inline">\sum_p x_{p,d} = 1</span> aufgestellt — machbar, aber schon eine Übersetzungsleistung. Bei Regeln wie „diese beiden Dienste nicht direkt hintereinander“ oder „höchstens eine Nachtschicht pro Woche“ wächst dieser Übersetzungsaufwand rasch; in <a href="anhang-glossar.md#gloss:constraint-programming-cp" class="glossar-link">CP (Constraint Programming)</a>-<a href="anhang-glossar.md#gloss:sat-boolean-satisfiability" class="glossar-link">SAT (Boolean Satisfiability)</a> bleibt er eine Zeile.</p>
|
||||
<p><strong>Und jetzt sehen Sie sich das Ergebnis genau an.</strong> <em>Cor bekommt keinen einzigen Dienst.</em> Dane arbeitet Montag <strong>und</strong> Dienstag hintereinander. Ist das ein Fehler?</p>
|
||||
<p>Nein — und das ist die wichtigste Lektion dieses Kapitels. Der Plan erfüllt <strong>jede</strong> Regel, die wir aufgeschrieben haben. Wir haben nur nie nach Fairness gefragt, und wir haben nie gesagt, dass Dienste nicht aufeinanderfolgen sollen. Ein Solver liefert exakt das Bestellte — nicht das Gemeinte.</p>
|
||||
<blockquote>
|
||||
|
|
@ -172,7 +172,7 @@ Fr -> Abel</code></pre>
|
|||
</ol>
|
||||
<hr />
|
||||
<h2 id="sec:cpsat-ein-anderes-denkmodell">7.3 Ein anderes Denkmodell</h2>
|
||||
<p>Während <a href="anhang-glossar.md#gloss:lineare-programmierung-lp" class="glossar-link">LP</a> und MILP auf algebraischen Gleichungen und Simplex-Matrizen beruhen, kommt <strong>Constraint Programming (CP)</strong> aus der künstlichen Intelligenz:</p>
|
||||
<p>Während <a href="anhang-glossar.md#gloss:lineare-programmierung-lp" class="glossar-link">LP (Lineare Programmierung)</a> und MILP auf algebraischen Gleichungen und Simplex-Matrizen beruhen, kommt <strong>Constraint Programming (CP)</strong> aus der künstlichen Intelligenz:</p>
|
||||
<table>
|
||||
<colgroup>
|
||||
<col style="width: 33%" />
|
||||
|
|
@ -365,7 +365,7 @@ Fr -> Abel</code></pre>
|
|||
<tr class="odd">
|
||||
<td><code>AddCircuit(arcs)</code></td>
|
||||
<td>Die gewählten Kanten bilden <strong>einen</strong> Rundweg</td>
|
||||
<td><a href="anhang-glossar.md#gloss:tsp-traveling-salesperson-problem" class="glossar-link">TSP</a>-artige Reihenfolgeprobleme</td>
|
||||
<td><a href="anhang-glossar.md#gloss:tsp-traveling-salesperson-problem" class="glossar-link">TSP (Traveling Salesperson Problem)</a>-artige Reihenfolgeprobleme</td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<td><code>.OnlyEnforceIf(bool)</code></td>
|
||||
|
|
|
|||
6
OR_HTML_04/cvar.html
generated
6
OR_HTML_04/cvar.html
generated
|
|
@ -104,8 +104,8 @@
|
|||
<blockquote>
|
||||
<p><strong>📌 Kapitel auf einen Blick</strong></p>
|
||||
<p><strong>Worum geht es?</strong> Um zwei Schwächen des Markowitz-Modells: Es unterschätzt Extremverluste und ignoriert die Kosten des Umschichtens. Beide lassen sich mit konvexen Mitteln beheben.</p>
|
||||
<p><strong>Voraussetzungen:</strong> <a href="markowitz.html#kap-markowitz">Kapitel 19</a>, <a href="lp.html#kap-lp">Kapitel 5</a> (<a href="anhang-glossar.md#gloss:lineare-programmierung-lp" class="glossar-link">LP</a>-Formulierungen).</p>
|
||||
<p><strong>Danach können Sie:</strong> <a href="anhang-glossar.md#gloss:value-at-risk-var" class="glossar-link">VaR</a> und <a href="anhang-glossar.md#gloss:conditional-value-at-risk-cvar" class="glossar-link">CVaR</a> unterscheiden, den CVaR nach Rockafellar/Uryasev als lineares Programm formulieren, Turnover über die <span class="math inline">L_1</span>-Norm bestrafen — und begründen, warum VaR-Kennzahlen nicht über Einheiten addiert werden dürfen.</p>
|
||||
<p><strong>Voraussetzungen:</strong> <a href="markowitz.html#kap-markowitz">Kapitel 19</a>, <a href="lp.html#kap-lp">Kapitel 5</a> (<a href="anhang-glossar.md#gloss:lineare-programmierung-lp" class="glossar-link">LP (Lineare Programmierung)</a>-Formulierungen).</p>
|
||||
<p><strong>Danach können Sie:</strong> <a href="anhang-glossar.md#gloss:value-at-risk-var" class="glossar-link">VaR (Value at Risk)</a> und <a href="anhang-glossar.md#gloss:conditional-value-at-risk-cvar" class="glossar-link">CVaR (Conditional Value at Risk)</a> unterscheiden, den CVaR nach Rockafellar/Uryasev als lineares Programm formulieren, Turnover über die <span class="math inline">L_1</span>-Norm bestrafen — und begründen, warum VaR-Kennzahlen nicht über Einheiten addiert werden dürfen.</p>
|
||||
<p><strong>Zeitbedarf:</strong> ca. 5 Stunden.</p>
|
||||
<p><strong>Programme:</strong><br />
|
||||
<code>VaR_CVaR_Demo.py</code><br />
|
||||
|
|
@ -684,7 +684,7 @@ CVaR: Portfolio 101.33 vs. Summe 159.24 -> subadditiv (kohaerent)
|
|||
<p>Im Vergleichsmodell <code>optimiere_varianz()</code> steht die Standardabweichung als</p>
|
||||
<div class="sourceCode" id="cb9"><pre class="sourceCode python"><code class="sourceCode python"><span id="cb9-1"><a href="#cb9-1" aria-hidden="true" tabindex="-1"></a>L <span class="op">=</span> np.linalg.cholesky(sigma <span class="op">+</span> <span class="fl">1e-12</span> <span class="op">*</span> np.eye(N))</span>
|
||||
<span id="cb9-2"><a href="#cb9-2" aria-hidden="true" tabindex="-1"></a>risiko <span class="op">=</span> cp.norm2(L.T <span class="op">@</span> w) <span class="co"># = sqrt(w' sigma w)</span></span></code></pre></div>
|
||||
<p>und <strong>nicht</strong> als das Naheliegende, <code>cp.sqrt(cp.quad_form(w, sigma))</code>. Der naheliegende Ausdruck ist nicht <a href="anhang-glossar.md#gloss:dcp-disciplined-convex-programming" class="glossar-link">DCP</a> und wird von CVXPY mit einem <code>DCPError</code> abgelehnt: <code>cp.sqrt</code> ist konkav und verlangt deshalb ein <strong>konkaves</strong> Argument, <code>quad_form</code> ist aber konvex. Die Regel wird verletzt, obwohl die Funktion als ganze mathematisch völlig harmlos ist — <span class="math inline">\sqrt{w^\top \Sigma w}</span> ist konvex, DCP kann es nur nicht <em>sehen</em>.</p>
|
||||
<p>und <strong>nicht</strong> als das Naheliegende, <code>cp.sqrt(cp.quad_form(w, sigma))</code>. Der naheliegende Ausdruck ist nicht <a href="anhang-glossar.md#gloss:dcp-disciplined-convex-programming" class="glossar-link">DCP (Disciplined Convex Programming)</a> und wird von CVXPY mit einem <code>DCPError</code> abgelehnt: <code>cp.sqrt</code> ist konkav und verlangt deshalb ein <strong>konkaves</strong> Argument, <code>quad_form</code> ist aber konvex. Die Regel wird verletzt, obwohl die Funktion als ganze mathematisch völlig harmlos ist — <span class="math inline">\sqrt{w^\top \Sigma w}</span> ist konvex, DCP kann es nur nicht <em>sehen</em>.</p>
|
||||
<p>Wichtig ist die Fehlerdiagnose dahinter, weil sie leicht in die Irre geht: <code>cp.psd_wrap(sigma)</code> sieht nach der Lösung aus und ist keine. Es unterdrückt die <strong>numerische</strong> Beanstandung, dass <span class="math inline">\Sigma</span> nicht als positiv semidefinit erkannt wird — gegen die <strong>strukturelle</strong> Regelverletzung im Aufbau hilft es nicht.</p>
|
||||
<p>Der Ausweg ist immer derselbe: Zerlegen Sie <span class="math inline">\Sigma = LL^\top</span> (Cholesky). Dann ist <span class="math inline">w^\top \Sigma w = \lVert L^\top w\rVert_2^2</span>, und die Standardabweichung wird zur 2-Norm eines <strong>affinen</strong> Ausdrucks — konvex, regelkonform und für den Solver sogar die bessere Formulierung, weil sie direkt ein Kegelproblem ist. Der winzige Diagonalzuschlag <span class="math inline">10^{-12}</span> fängt den Fall ab, dass <span class="math inline">\Sigma</span> numerisch nur halbdefinit ist (mehr Titel als Handelstage, duplizierte Spalten). Die vollständige Fehlertabelle steht in <a href="anhang-fehlerdiagnose.html#anhang-fehlerdiagnose">Anhang C</a>.</p>
|
||||
</blockquote>
|
||||
|
|
|
|||
4
OR_HTML_04/dekomposition.html
generated
4
OR_HTML_04/dekomposition.html
generated
|
|
@ -160,7 +160,7 @@
|
|||
<ol type="1">
|
||||
<li>… erklären, warum das naheliegende Zuordnungsmodell an <strong>Symmetrie</strong> scheitert.</li>
|
||||
<li>… ein Problem in <strong>Master</strong> und <strong>Pricing-Teilproblem</strong> zerlegen.</li>
|
||||
<li>… die Schleife schreiben: Master-<a href="anhang-glossar.md#gloss:lineare-programmierung-lp" class="glossar-link">LP</a> lösen, Dualwerte auslesen, Teilproblem lösen, Spalte hinzufügen.</li>
|
||||
<li>… die Schleife schreiben: Master-<a href="anhang-glossar.md#gloss:lineare-programmierung-lp" class="glossar-link">LP (Lineare Programmierung)</a> lösen, Dualwerte auslesen, Teilproblem lösen, Spalte hinzufügen.</li>
|
||||
<li>… das Abbruchkriterium über die <strong>reduzierten Kosten</strong> begründen.</li>
|
||||
<li>… an einer Kennzahl der Instanz abschätzen, ob sich das Verfahren lohnt.</li>
|
||||
</ol>
|
||||
|
|
@ -811,7 +811,7 @@ Mutterrolle 5,600 mm, 13 bestellte Breiten, 219 Zuschnitte.
|
|||
<hr />
|
||||
<h2 id="sec:dekomposition-selbsttest">10.10 Selbsttest</h2>
|
||||
<ol type="1">
|
||||
<li>Erklären Sie Symmetrie in einem <a href="anhang-glossar.md#gloss:gemischt-ganzzahlige-optimierung-milp" class="glossar-link">MILP</a> an einem Beispiel aus Ihrem Arbeitsumfeld.</li>
|
||||
<li>Erklären Sie Symmetrie in einem <a href="anhang-glossar.md#gloss:gemischt-ganzzahlige-optimierung-milp" class="glossar-link">MILP (Gemischt-ganzzahlige Optimierung)</a> an einem Beispiel aus Ihrem Arbeitsumfeld.</li>
|
||||
<li>Was ist beim Zuschnitt eine „Spalte”, und was steht darin?</li>
|
||||
<li>Woher kommen die Preise, mit denen das Teilproblem rechnet?</li>
|
||||
<li>Warum ist das Verfahren exakt, obwohl es fast alle Muster nie ansieht?</li>
|
||||
|
|
|
|||
4
OR_HTML_04/dynamische-programmierung.html
generated
4
OR_HTML_04/dynamische-programmierung.html
generated
|
|
@ -234,7 +234,7 @@ Restkosten je Ort: {'Ziel': 0, 'Ost': 5, 'West': 8, '
|
|||
<li>… Zustand, Stufe, Aktion und Wertfunktion für ein gegebenes Problem benennen.</li>
|
||||
<li>… eine Rückwärtsinduktion von Hand für ein kleines Problem durchführen.</li>
|
||||
<li>… das Almgren-Chriss-Ausführungsproblem lösen und die Lösung interpretieren.</li>
|
||||
<li>… einschätzen, wann <a href="anhang-glossar.md#gloss:dynamische-programmierung-dp" class="glossar-link">DP</a> funktioniert und wann der „<a href="anhang-glossar.md#gloss:fluch-der-dimensionalitaet" class="glossar-link">Fluch der Dimensionalität</a>“ zuschlägt.</li>
|
||||
<li>… einschätzen, wann <a href="anhang-glossar.md#gloss:dynamische-programmierung-dp" class="glossar-link">DP (Dynamische Programmierung)</a> funktioniert und wann der „<a href="anhang-glossar.md#gloss:fluch-der-dimensionalitaet" class="glossar-link">Fluch der Dimensionalität</a>“ zuschlägt.</li>
|
||||
<li>… die Wertfunktion als <strong>Nachschlagetabelle</strong> lesen: Sie liefert keine Planfolge, sondern eine Regel, die auch bei Abweichungen gilt.</li>
|
||||
<li>… einen <a href="anhang-glossar.md#gloss:zustandsraum" class="glossar-link">Zustandsraum</a> auf Vollständigkeit prüfen und erkennen, wann eine Kostenart Vorgeschichte erfordert.</li>
|
||||
</ol>
|
||||
|
|
@ -885,7 +885,7 @@ Abweichung DP zur analytischen Loesung: 5.788 % (Diskretisierung: 1000 Stueck)
|
|||
<p><strong>Aufgabe 13.1 ⭐ — Bausteine benennen.</strong> Ein Wanderer plant eine 5-Tages-Tour und muss täglich entscheiden, wie weit er läuft. Bestimmen Sie Stufe, Zustand, Aktion und Wertfunktion. Was gehört <strong>nicht</strong> in den Zustand?</p>
|
||||
<p><strong>Aufgabe 13.2 ⭐ — Optimalitätsprinzip anwenden.</strong> Warum folgt aus dem Optimalitätsprinzip, dass man rückwärts rechnen darf? Was würde schiefgehen, wenn die Kosten einer Periode auch von <strong>früheren</strong> Aktionen abhängen (und nicht nur vom aktuellen Zustand)?</p>
|
||||
<p><strong>Aufgabe 13.3 ⭐⭐ — Rückwärtsinduktion von Hand.</strong> 5 Einheiten in 3 Perioden, Kosten <span class="math inline">C(n) = n^2 + 2n</span>. Erstellen Sie die vollständige Wertfunktionstabelle und bestimmen Sie den optimalen Pfad. Prüfen Sie mit <code>Bellman_Minimalbeispiel.py</code> (angepasst).</p>
|
||||
<p><strong>Aufgabe 13.4 ⭐⭐ — <a href="anhang-glossar.md#gloss:rucksackproblem" class="glossar-link">Rucksackproblem</a> als DP.</strong> Lösen Sie das Rucksackproblem aus <a href="milp.html#kap-milp">Kapitel 6</a> mit dynamischer Programmierung statt <a href="anhang-glossar.md#gloss:gemischt-ganzzahlige-optimierung-milp" class="glossar-link">MILP</a>. (Zustand: verbleibende Kapazität; Stufe: betrachteter Gegenstand.) Vergleichen Sie Laufzeit und Ergebnis mit dem MILP-<a href="anhang-glossar.md#gloss:solver" class="glossar-link">Solver</a>.</p>
|
||||
<p><strong>Aufgabe 13.4 ⭐⭐ — <a href="anhang-glossar.md#gloss:rucksackproblem" class="glossar-link">Rucksackproblem</a> als DP.</strong> Lösen Sie das Rucksackproblem aus <a href="milp.html#kap-milp">Kapitel 6</a> mit dynamischer Programmierung statt <a href="anhang-glossar.md#gloss:gemischt-ganzzahlige-optimierung-milp" class="glossar-link">MILP (Gemischt-ganzzahlige Optimierung)</a>. (Zustand: verbleibende Kapazität; Stufe: betrachteter Gegenstand.) Vergleichen Sie Laufzeit und Ergebnis mit dem MILP-<a href="anhang-glossar.md#gloss:solver" class="glossar-link">Solver</a>.</p>
|
||||
<p><strong>Aufgabe 13.5 ⭐⭐⭐ — Risikoaversion kalibrieren.</strong> Untersuchen Sie mit <code>Mehrperiodige_Order_Execution.py</code>: (a) Bei welchem <span class="math inline">\lambda</span> verkauft das Modell in der ersten Periode mehr als 50 %? (b) Stellen Sie den Zusammenhang zwischen <span class="math inline">\lambda</span> und den erwarteten Gesamtkosten dar. (c) Ein Händler sagt: „Ich will höchstens 20 % Marktauswirkungskosten und den Rest an Risiko.“ Welches <span class="math inline">\lambda</span> setzen Sie?</p>
|
||||
<p><strong>Aufgabe 13.6 ⭐⭐⭐ — Zustandsraum erweitern.</strong> Erweitern Sie das Ausführungsmodell um einen zweiten Zustand: die aktuelle <strong>Orderbuchtiefe</strong> (3 Stufen: dünn/normal/tief), die mit gegebenen Übergangswahrscheinlichkeiten wechselt und <span class="math inline">\eta</span> um Faktor 2 / 1 / 0,5 skaliert. Wie ändert sich die Strategie? Wie stark wächst die Rechenzeit?</p>
|
||||
<hr />
|
||||
|
|
|
|||
6
OR_HTML_04/einfuehrung.html
generated
6
OR_HTML_04/einfuehrung.html
generated
|
|
@ -552,13 +552,13 @@ Der Solver löst dieselbe Instanz in Sekundenbruchteilen.
|
|||
<td>Kontinuierlich</td>
|
||||
<td><span class="math inline">x \in \mathbb{R}</span></td>
|
||||
<td>Investitionsbetrag in Euro, Fördermenge in Litern</td>
|
||||
<td><a href="anhang-glossar.md#gloss:lineare-programmierung-lp" class="glossar-link">LP</a> — leicht</td>
|
||||
<td><a href="anhang-glossar.md#gloss:lineare-programmierung-lp" class="glossar-link">LP (Lineare Programmierung)</a> — leicht</td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<td>Ganzzahlig</td>
|
||||
<td><span class="math inline">x \in \mathbb{Z}</span></td>
|
||||
<td>Anzahl produzierter Maschinen, Anzahl Mitarbeiter</td>
|
||||
<td><a href="anhang-glossar.md#gloss:gemischt-ganzzahlige-optimierung-milp" class="glossar-link">MILP</a> — schwer</td>
|
||||
<td><a href="anhang-glossar.md#gloss:gemischt-ganzzahlige-optimierung-milp" class="glossar-link">MILP (Gemischt-ganzzahlige Optimierung)</a> — schwer</td>
|
||||
</tr>
|
||||
<tr class="odd">
|
||||
<td>Binär</td>
|
||||
|
|
@ -1352,7 +1352,7 @@ Ergebnis geschrieben nach: produktionsmix_ergebnis.xlsx</code></pre>
|
|||
<p><strong>Aufgabe 1.2 ⭐ — Hart oder weich?</strong> Entscheiden Sie für jede Bedingung eines Klinik-Dienstplans, ob sie hart oder weich modelliert werden sollte, und begründen Sie: (a) Gesetzliche Ruhezeit von 11 Stunden zwischen zwei Diensten. (b) Frau Meier möchte freitags nicht arbeiten. (c) In jeder Nachtschicht muss mindestens eine examinierte Fachkraft anwesend sein. (d) Die Dienste sollen gleichmäßig über das Team verteilt sein. (e) Niemand arbeitet mehr als 10 Tage am Stück.</p>
|
||||
<p><strong>Aufgabe 1.3 ⭐⭐ — Kombinatorik selbst rechnen.</strong> Ein Speditionsdisponent muss 12 Aufträge auf einen einzigen Lkw in eine Reihenfolge bringen. (a) Wie viele Reihenfolgen gibt es? (b) Der Rechner prüft 5 Millionen Reihenfolgen pro Sekunde. Wie lange dauert das vollständige Durchprobieren? (c) Wie lange dauert es bei 13 Aufträgen? Um welchen Faktor ist das mehr? (d) Wie viele Aufträge könnte man in einer Stunde noch vollständig durchprobieren?</p>
|
||||
<p><strong>Aufgabe 1.4 ⭐⭐ — Modell lesen.</strong> Gegeben sei das Modell <span class="math display">\max\ 3x_1 + 5x_2 \quad \text{u. d. N.} \quad x_1 \le 4,\ \ 2x_2 \le 12,\ \ 3x_1 + 2x_2 \le 18,\ \ x_1, x_2 \ge 0.</span> (a) Benennen Sie die vier Bausteine. (b) Ist <span class="math inline">(2, 6)</span> zulässig? Ist <span class="math inline">(4, 3)</span> zulässig? Berechnen Sie jeweils <span class="math inline">Z</span>. (c) Finden Sie durch Probieren die beste ganzzahlige Lösung.</p>
|
||||
<p><strong>Aufgabe 1.5 ⭐⭐⭐ — Die Bäckerei programmieren.</strong> Setzen Sie das Bäckerei-Problem der Handrechnung <em>Zerlegen Sie dieses Problem</em> mit <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> um. Geben Sie die optimale Produktionsmenge, den Deckungsbeitrag und die Auslastung von Mehl und Ofen aus. Prüfen Sie Ihr Ergebnis mit <code>assert</code>-Anweisungen.</p>
|
||||
<p><strong>Aufgabe 1.5 ⭐⭐⭐ — Die Bäckerei programmieren.</strong> Setzen Sie das Bäckerei-Problem der Handrechnung <em>Zerlegen Sie dieses Problem</em> mit <a href="anhang-glossar.md#gloss:constraint-programming-cp" class="glossar-link">CP (Constraint Programming)</a>-<a href="anhang-glossar.md#gloss:sat-boolean-satisfiability" class="glossar-link">SAT (Boolean Satisfiability)</a> um. Geben Sie die optimale Produktionsmenge, den Deckungsbeitrag und die Auslastung von Mehl und Ofen aus. Prüfen Sie Ihr Ergebnis mit <code>assert</code>-Anweisungen.</p>
|
||||
<p><strong>Aufgabe 1.6 ⭐⭐⭐ — Sensitivität durch Ausprobieren.</strong> Erweitern Sie <code>Bot_Allokation.py</code> so, dass es das Modell in einer Schleife für RAM-Kapazitäten von 54 bis 72 GB (in Schritten von 2) löst und eine Tabelle <code>RAM | x_A | x_B | Gewinn | Gewinnzuwachs pro zusätzlichem GB</code> ausgibt. (a) Ab welcher RAM-Menge steigt der Gewinn nicht mehr? Warum? (b) Was sagt Ihnen der „Gewinnzuwachs pro GB“ intuitiv? (Der Begriff dafür — <em>Schattenpreis</em> — folgt in <a href="lp.html#kap-lp">Kapitel 5</a>.)</p>
|
||||
<p><strong>Aufgabe 1.7 ⭐⭐⭐ — Eigenes Problem zerlegen.</strong> Wählen Sie ein Entscheidungsproblem aus Ihrem eigenen Alltag oder Beruf (Beispiele: Wochenplan für Sportkurse, Sitzordnung bei einer Feier, Aufteilung eines Budgets auf Projekte, Reihenfolge von Hausarbeiten). Füllen Sie die Vorlage aus <a href="#sec:einfuehrung-die-vier-universellen-bausteine-jedes-or">Abschnitt 1.6</a> vollständig aus. Notieren Sie außerdem: Woher kämen die Daten? Wer müsste das Ergebnis akzeptieren? — Heben Sie diese Notiz auf; sie ist der Ausgangspunkt für Ihr eigenes Projekt in der <a href="projektwerkstatt.html">Projektwerkstatt</a>.</p>
|
||||
<hr />
|
||||
|
|
|
|||
2
OR_HTML_04/finanzdaten.html
generated
2
OR_HTML_04/finanzdaten.html
generated
|
|
@ -713,7 +713,7 @@ prices.columns: ['AAPL', 'AMZN', 'CVX', 'GS', &
|
|||
<p><strong>Aufgabe 18.2 ⭐ — Mittelwertfalle.</strong> Ein Fonds meldet Jahresrenditen von <span class="math inline">+60\,\%</span>, <span class="math inline">-40\,\%</span>, <span class="math inline">+60\,\%</span>, <span class="math inline">-40\,\%</span>. (a) Wie hoch ist das arithmetische Mittel? (b) Wie viel Kapital hat ein Anleger nach 4 Jahren aus 10 000 €? (c) Welche jährliche Rendite entspricht dem tatsächlich?</p>
|
||||
<p><strong>Aufgabe 18.3 ⭐⭐ — Konditionszahl verstehen.</strong> Erzeugen Sie eine Kovarianzmatrix für <span class="math inline">N = 30</span> Titel aus <span class="math inline">T = 40</span>, <span class="math inline">T = 100</span> und <span class="math inline">T = 1000</span> simulierten Beobachtungen. Berechnen Sie jeweils kleinsten Eigenwert und Konditionszahl. Ab welchem <span class="math inline">T</span> wird die Matrix brauchbar?</p>
|
||||
<p><strong>Aufgabe 18.4 ⭐⭐ — Spaltenreihenfolge prüfen.</strong> Laden Sie fünf Ticker in einer bewusst unsortierten Reihenfolge. Zeigen Sie, dass <code>raw["Close"].columns</code> abweicht, und dass <code>raw["Close"][tickers]</code> das behebt. Was passiert, wenn ein Ticker nicht existiert?</p>
|
||||
<p><strong>Aufgabe 18.5 ⭐⭐⭐ — Beide Shrinkage-Ziele vergleichen.</strong> Implementieren Sie das Konstant-Korrelations-Ziel vollständig (inklusive eigener Berechnung von <span class="math inline">\delta</span> nach Ledoit/Wolf 2003 oder per Kreuzvalidierung). Vergleichen Sie mit <code>sklearn</code> anhand: (a) der Konditionszahl, (b) der Out-of-Sample-Volatilität eines <a href="anhang-glossar.md#gloss:global-minimum-variance-portfolio-gmv" class="glossar-link">GMV</a>-Portfolios (nach dem Muster von <code>Schaetzrauschen_Demo.py</code>), (c) der Stabilität der Gewichte über rollierende Fenster.</p>
|
||||
<p><strong>Aufgabe 18.5 ⭐⭐⭐ — Beide Shrinkage-Ziele vergleichen.</strong> Implementieren Sie das Konstant-Korrelations-Ziel vollständig (inklusive eigener Berechnung von <span class="math inline">\delta</span> nach Ledoit/Wolf 2003 oder per Kreuzvalidierung). Vergleichen Sie mit <code>sklearn</code> anhand: (a) der Konditionszahl, (b) der Out-of-Sample-Volatilität eines <a href="anhang-glossar.md#gloss:global-minimum-variance-portfolio-gmv" class="glossar-link">GMV (Global Minimum Variance Portfolio)</a>-Portfolios (nach dem Muster von <code>Schaetzrauschen_Demo.py</code>), (c) der Stabilität der Gewichte über rollierende Fenster.</p>
|
||||
<p><strong>Aufgabe 18.6 ⭐⭐⭐ — Error-Maximizer selbst messen.</strong> Erweitern Sie <code>Schaetzrauschen_Demo.py</code> um eine dritte Variante: die <strong>Gleichgewichtung</strong> (<span class="math inline">w_i = 1/N</span>), die überhaupt keine Schätzung benötigt. (a) Ab welchem <span class="math inline">T/N</span> schlägt die Stichproben-Optimierung die Gleichgewichtung? (b) Ab welchem <span class="math inline">T/N</span> schlägt Ledoit-Wolf sie? (c) Was folgt daraus für die Praxis?</p>
|
||||
<hr />
|
||||
<h2 id="sec:finanzdaten-denkfehler">18.8 Finde den Denkfehler</h2>
|
||||
|
|
|
|||
6
OR_HTML_04/fundament.html
generated
6
OR_HTML_04/fundament.html
generated
|
|
@ -436,7 +436,7 @@ f(\theta\mathbf{x} + (1-\theta)\mathbf{y}) \le \theta f(\mathbf{x}) + (1-\theta)
|
|||
</thead>
|
||||
<tbody>
|
||||
<tr class="odd">
|
||||
<td>Lineares Programm (<a href="anhang-glossar.md#gloss:lineare-programmierung-lp" class="glossar-link">LP</a>)</td>
|
||||
<td>Lineares Programm (<a href="anhang-glossar.md#gloss:lineare-programmierung-lp" class="glossar-link">LP (Lineare Programmierung)</a>)</td>
|
||||
<td><strong>ja</strong></td>
|
||||
<td>Globales Optimum, Sekunden bis Minuten selbst bei <span class="math inline">10^6</span> Variablen</td>
|
||||
</tr>
|
||||
|
|
@ -446,7 +446,7 @@ f(\theta\mathbf{x} + (1-\theta)\mathbf{y}) \le \theta f(\mathbf{x}) + (1-\theta)
|
|||
<td>Globales Optimum, effizient (<a href="qp-nlp.html#kap-qp-nlp">Kapitel 11</a>, <a href="markowitz.html#kap-markowitz">Kapitel 19</a>)</td>
|
||||
</tr>
|
||||
<tr class="odd">
|
||||
<td>Ganzzahlige Variablen (<a href="anhang-glossar.md#gloss:gemischt-ganzzahlige-optimierung-milp" class="glossar-link">MILP</a>)</td>
|
||||
<td>Ganzzahlige Variablen (<a href="anhang-glossar.md#gloss:gemischt-ganzzahlige-optimierung-milp" class="glossar-link">MILP (Gemischt-ganzzahlige Optimierung)</a>)</td>
|
||||
<td><strong>nein</strong></td>
|
||||
<td>Der zulässige Bereich ist ein Punktgitter, keine zusammenhängende Menge — <a href="anhang-glossar.md#gloss:np-schwer" class="glossar-link">NP-schwer</a> (<a href="milp.html#kap-milp">Kapitel 6</a>)</td>
|
||||
</tr>
|
||||
|
|
@ -456,7 +456,7 @@ f(\theta\mathbf{x} + (1-\theta)\mathbf{y}) \le \theta f(\mathbf{x}) + (1-\theta)
|
|||
<td>Nur lokale Optima; eine ungültige <a href="anhang-glossar.md#gloss:kovarianzmatrix" class="glossar-link">Kovarianzmatrix</a> ist ein typischer Auslöser (siehe <a href="qp-nlp.html#sec:qp-nlp-nichtlineare-optimierung-mit-scipy-optimize-minimize">Abschnitt 11.5</a>)</td>
|
||||
</tr>
|
||||
<tr class="odd">
|
||||
<td>Allgemeines <a href="anhang-glossar.md#gloss:nichtlineare-programmierung-nlp" class="glossar-link">NLP</a> mit beliebigen Funktionen</td>
|
||||
<td>Allgemeines <a href="anhang-glossar.md#gloss:nichtlineare-programmierung-nlp" class="glossar-link">NLP (Nichtlineare Programmierung)</a> mit beliebigen Funktionen</td>
|
||||
<td>meist <strong>nein</strong></td>
|
||||
<td><code>scipy.optimize</code> liefert nur ein lokales Optimum, abhängig vom Startpunkt</td>
|
||||
</tr>
|
||||
|
|
|
|||
273
OR_HTML_04/gesamtdokument.html
generated
273
OR_HTML_04/gesamtdokument.html
generated
File diff suppressed because it is too large
Load diff
10
OR_HTML_04/graphen.html
generated
10
OR_HTML_04/graphen.html
generated
|
|
@ -225,7 +225,7 @@ Gesamtfahrzeit: 118 min</code></pre>
|
|||
<li>… den <strong>Flusserhaltungssatz</strong> aufstellen und seine Bedeutung erklären.</li>
|
||||
<li>… begründen, warum Zuordnungsprobleme <strong>ohne</strong> Ganzzahligkeitsbedingung ganzzahlig lösbar sind (totale Unimodularität).</li>
|
||||
<li>… ein Vehicle Routing Problem mit Kapazitäten und Zeitfenstern mit <a href="anhang-glossar.md#gloss:or-tools" class="glossar-link">OR-Tools</a> lösen.</li>
|
||||
<li>… einschätzen, wann ein spezialisierter Algorithmus einem allgemeinen <a href="anhang-glossar.md#gloss:gemischt-ganzzahlige-optimierung-milp" class="glossar-link">MILP</a> überlegen ist.</li>
|
||||
<li>… einschätzen, wann ein spezialisierter Algorithmus einem allgemeinen <a href="anhang-glossar.md#gloss:gemischt-ganzzahlige-optimierung-milp" class="glossar-link">MILP (Gemischt-ganzzahlige Optimierung)</a> überlegen ist.</li>
|
||||
<li>… begründen, warum eine gierige Zuordnung systematisch schlechter ist als eine gemeinsame Optimierung.</li>
|
||||
<li>… einen Tourenplan gegen die Wirklichkeit prüfen — unabhängig von den Bausteinen, aus denen das Modell gebaut wurde.</li>
|
||||
</ol>
|
||||
|
|
@ -424,7 +424,7 @@ Umschlag -> Kunde_2 5.0 10 3.00 15.00
|
|||
<blockquote>
|
||||
<p><strong>Satz.</strong> Die Extrempunkte der Menge aller doppelt-stochastischen Matrizen (alle Zeilensummen <span class="math inline">= 1</span>, alle Spaltensummen <span class="math inline">= 1</span>, <span class="math inline">x_{ij} \ge 0</span>) sind <strong>genau</strong> die Permutationsmatrizen (alle <span class="math inline">x_{ij} \in \{0,1\}</span>).</p>
|
||||
</blockquote>
|
||||
<p><strong>Warum das praktisch enorm wichtig ist:</strong> Nach dem Fundamentalsatz aus <a href="fundament.html#kap-fundament">Kapitel 2</a> liegt das <a href="anhang-glossar.md#gloss:lineare-programmierung-lp" class="glossar-link">LP</a>-Optimum in einer Ecke. Die Ecken sind hier laut Satz automatisch 0/1-wertig. Also gilt:</p>
|
||||
<p><strong>Warum das praktisch enorm wichtig ist:</strong> Nach dem Fundamentalsatz aus <a href="fundament.html#kap-fundament">Kapitel 2</a> liegt das <a href="anhang-glossar.md#gloss:lineare-programmierung-lp" class="glossar-link">LP (Lineare Programmierung)</a>-Optimum in einer Ecke. Die Ecken sind hier laut Satz automatisch 0/1-wertig. Also gilt:</p>
|
||||
<blockquote>
|
||||
<p><strong>🎯 Merksatz</strong> Beim Zuordnungsproblem müssen Sie die Ganzzahligkeit <strong>nicht</strong> fordern — ein gewöhnlicher LP-Solver liefert von selbst eine 0/1-Lösung. Sie sparen sich damit die NP-Schwere von Branch-and-Bound vollständig.</p>
|
||||
</blockquote>
|
||||
|
|
@ -574,7 +574,7 @@ Umschlag -> Kunde_2 5.0 10 3.00 15.00
|
|||
</blockquote>
|
||||
<hr />
|
||||
<h2 id="sec:graphen-das-vehicle-routing-problem-mit-zeitfenstern">8.5 Das Vehicle Routing Problem mit Zeitfenstern</h2>
|
||||
<p>Das <strong>Traveling Salesperson Problem (<a href="anhang-glossar.md#gloss:tsp-traveling-salesperson-problem" class="glossar-link">TSP</a>)</strong>, deutsch <em>Problem des Handlungsreisenden</em>, fragt nach der kürzesten Rundreise durch <span class="math inline">N</span> Städte. Das <strong>Capacitated Vehicle Routing Problem with Time Windows (<a href="anhang-glossar.md#gloss:cvrptw" class="glossar-link">CVRPTW</a>)</strong> erweitert es auf eine <strong>Flotte</strong> mit Kapazitätsgrenzen und Kundenzeitfenstern <span class="math inline">[e_i, l_i]</span>.</p>
|
||||
<p>Das <strong>Traveling Salesperson Problem (<a href="anhang-glossar.md#gloss:tsp-traveling-salesperson-problem" class="glossar-link">TSP (Traveling Salesperson Problem)</a>)</strong>, deutsch <em>Problem des Handlungsreisenden</em>, fragt nach der kürzesten Rundreise durch <span class="math inline">N</span> Städte. Das <strong>Capacitated Vehicle Routing Problem with Time Windows (<a href="anhang-glossar.md#gloss:cvrptw" class="glossar-link">CVRPTW</a>)</strong> erweitert es auf eine <strong>Flotte</strong> mit Kapazitätsgrenzen und Kundenzeitfenstern <span class="math inline">[e_i, l_i]</span>.</p>
|
||||
<figure>
|
||||
<img src="bilder_04/kap_graphen_vrp_touren.svg" alt="Abb. 8.2: Die Lösung der Instanz aus VRP_Flotten_Routing.py: 16 Kunden, vier Fahrzeuge, 619 km. Beachten Sie, dass sich die Touren kreuzen. Bei einem reinen Tourenproblem wäre das ein sicheres Zeichen für eine verbesserbare Lösung — hier ist es keines: Die Zeitfenster erzwingen die Reihenfolge, und wer die Kreuzungen auflöst, kommt zu spät. Erzeugt von bilder_04/erzeuge_vrp_touren.py." />
|
||||
<figcaption aria-hidden="true">Abb. 8.2: Die Lösung der Instanz aus <code>VRP_Flotten_Routing.py</code>: 16 Kunden, vier Fahrzeuge, 619 km. <strong>Beachten Sie, dass sich die Touren kreuzen.</strong> Bei einem reinen Tourenproblem wäre das ein sicheres Zeichen für eine verbesserbare Lösung — hier ist es keines: Die Zeitfenster erzwingen die Reihenfolge, und wer die Kreuzungen auflöst, kommt zu spät. Erzeugt von <code>bilder_04/erzeuge_vrp_touren.py</code>.</figcaption>
|
||||
|
|
@ -766,7 +766,7 @@ u_i - u_j + C \cdot x_{ij} \le C - d_j \qquad \forall i \ne j
|
|||
<span id="cb6-164"><a href="#cb6-164" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="va">__name__</span> <span class="op">==</span> <span class="st">"__main__"</span>:</span>
|
||||
<span id="cb6-165"><a href="#cb6-165" aria-hidden="true" tabindex="-1"></a> loese_cvrptw()</span></code></pre></div>
|
||||
<blockquote>
|
||||
<p><strong>⚠️ Typische Fehler beim <a href="anhang-glossar.md#gloss:vehicle-routing-problem-vrp" class="glossar-link">VRP</a></strong></p>
|
||||
<p><strong>⚠️ Typische Fehler beim <a href="anhang-glossar.md#gloss:vehicle-routing-problem-vrp" class="glossar-link">VRP (Vehicle Routing Problem)</a></strong></p>
|
||||
<ul>
|
||||
<li><strong><code>Min(CumulVar)</code> mit „Ankunftszeit“ verwechseln.</strong> Der Solver liefert ein <em>Intervall</em> möglicher Zeiten. <code>Min()</code> ist die früheste, <code>Max()</code> die späteste zulässige Zeit — die tatsächliche Fahrt kann irgendwo dazwischen starten.</li>
|
||||
<li><strong>Servicezeit im Depot mitzählen.</strong> Beim Start am Depot fällt keine Servicezeit an, sonst verschiebt sich der ganze Plan.</li>
|
||||
|
|
@ -1059,7 +1059,7 @@ plausibel aussieht.
|
|||
<li><strong>Totale Unimodularität ist zerbrechlich.</strong> Eine einzige zusätzliche Bedingung, die nicht ins Schema passt — Kardinalität, Fixkosten, Mindestmenge —, zerstört sie. Prüfen Sie das, bevor Sie sich auf die Struktur verlassen.</li>
|
||||
<li><strong>Der beste erste Zug ist selten Teil der besten Gesamtlösung.</strong> Gierige Regeln kosten schon bei vier Zuordnungen 8 %.</li>
|
||||
</ul>
|
||||
<p><strong>Ausblick.</strong> <a href="qp-nlp.html#teil-nichtlinear">Teil III</a> verlässt die lineare Welt. <a href="qp-nlp.html#kap-qp-nlp">Kapitel 11</a> führt quadratische Zielfunktionen und die <a href="anhang-glossar.md#gloss:karush-kuhn-tucker-bedingungen-kkt" class="glossar-link">KKT</a>-Bedingungen ein — das mathematische Fundament der Portfoliooptimierung.</p>
|
||||
<p><strong>Ausblick.</strong> <a href="qp-nlp.html#teil-nichtlinear">Teil III</a> verlässt die lineare Welt. <a href="qp-nlp.html#kap-qp-nlp">Kapitel 11</a> führt quadratische Zielfunktionen und die <a href="anhang-glossar.md#gloss:karush-kuhn-tucker-bedingungen-kkt" class="glossar-link">KKT (Karush-Kuhn-Tucker-Bedingungen)</a>-Bedingungen ein — das mathematische Fundament der Portfoliooptimierung.</p>
|
||||
|
||||
</article>
|
||||
<button type="button" class="fortschritt-knopf" data-kapitel="graphen.html"><svg class="icon" aria-hidden="true"><use href="#icon-check"></use></svg> <span>Als gelesen markieren</span></button>
|
||||
|
|
|
|||
2
OR_HTML_04/index.html
generated
2
OR_HTML_04/index.html
generated
|
|
@ -115,7 +115,7 @@
|
|||
<p class="hero-anwendungen">Mit Python planen, optimieren und entscheiden: von Personal, Schichten und Logistik über Energie, Ressourcen und Netzwerke bis zur Portfoliooptimierung an den Finanzmärkten.</p>
|
||||
<p class="hero-autor">Autor / Herausgeber: Dieter Schlüter<br>
|
||||
<dieter(dot)schlueter(atsign)linix(dot)de><br>
|
||||
Stand: 10. September 2026 v17.39</p>
|
||||
Stand: 10. September 2026 v17.52</p>
|
||||
</div>
|
||||
</section>
|
||||
<section class="einstieg">
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue