Phase 6.3: Parallelitaet und Determinismus - gemessen statt behauptet
Neuer Abschnitt im CP-SAT-Kapitel plus Parallele_Suche.py (76. Programm). Setzt Paket 2 aus Verbesserungen_02.md um. Was fehlte, war nicht die Regel, sondern die Messung: Das Buch setzt an acht Stellen num_workers = 1 mit dem Kommentar "fuer eine reproduzierbare Ausgabe", nachgeprueft hatte es nie jemand. Gerechnet wird auf demselben Job-Shop wie das Intervallvariablen-Kapitel, nur gross genug, dass die Suche arbeitet: 12 Auftraege, 10 Maschinen, 120 Arbeitsgaenge. Zwei Befunde, beide staerker als die Behauptung: * Die Beschleunigung ist ueberlinear. Acht Arbeiter waren im abgedruckten Lauf nicht achtmal, sondern 12,3-mal schneller als einer. Kein Messfehler: CP-SAT vervielfacht nicht dieselbe Suche, sondern laesst verschiedene Strategien nebeneinander laufen, die einander ihre Schranken mitteilen. * Der Seed genuegt nicht - und zwar schon ab ZWEI Arbeitern. Ein Arbeiter: 1 Plan aus 4 Laeufen. Zwei Arbeiter: 3 verschiedene Plaene aus 4 Laeufen, bei identischem random_seed und identischem Zielwert 183. Die vollstaendige Antwort kam erst ueber die Uebungsaufgabe: Mit num_workers = 1, aber fuenf verschiedenen Seeds ergeben sich ebenfalls fuenf verschiedene Plaene. Keiner der beiden Parameter sichert die Reproduzierbarkeit allein - erst die Kombination traegt. Weiter fuer die Aufgabe gemessen: Der Gewinn kehrt sich um (auf 24 Kernen Faktor 10,2 bei 8 Arbeitern, 12,3 bei 16, 9,0 bei 24) - "so viele Arbeiter wie Kerne" ist damit widerlegt. Und bei 15 Auftraegen laeuft ein Arbeiter ins 60-s-Limit (FEASIBLE, Makespan 200), waehrend acht OPTIMAL mit demselben Makespan 200 nach 26,4 s melden: Der Unterschied liegt nicht in der Loesung, sondern im Beweis, dass es keine bessere gibt. Die abgedruckte Ausgabe traegt die Kennzeichnung "Laufzeiten und die Zahl der verschiedenen Plaene sind hardwareabhaengig" - nach dem Muster, das das Testing-Kapitel fuer Benchmark_Skalierung.py schon verwendet. Der Vergleich des extrahierten Programms mit dem Abdruck weicht denn auch in genau einer Zelle ab (4 statt 3 verschiedene Plaene bei 4 Arbeitern); Zielwert und Struktur sind identisch. Hier ist die Nichtreproduzierbarkeit der abgedruckten Zahl die Aussage selbst. Mitgezogen: Kapitelkopf, Lernziele, Selbsttest, Zusammenfassung, Vorwort-Programmverzeichnis, Uebungsaufgabe und Loesung in Anhang A, ein Verweis aus dem bestehenden Callout zu mehrdeutigen Optima und einer aus Warmstart_Effekt.py im MILP-Kapitel (dort nach Regel 12 der Kapitelname). Stand: 295 Abschnitte, 730 Querverweise, 328 Indexmarken, 76 Programme, 140 Aufgaben mit 140 Loesungen, 33 pytest-Tests, PDF 744 Seiten, 69 netzfreie Programme fehlerfrei. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
dd4acda129
commit
293370b7a1
30 changed files with 12643 additions and 10385 deletions
|
|
@ -519,241 +519,246 @@ Alles bereit — Sie können mit dem ersten Kapitel beginnen.</code></pre>
|
|||
<td><a href="cpsat.html#kap-cpsat">Kapitel 7</a></td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<td><code>Parallele_Suche.py</code></td>
|
||||
<td>num_workers: Tempo gegen Reproduzierbarkeit</td>
|
||||
<td><a href="cpsat.html#kap-cpsat">Kapitel 7</a></td>
|
||||
</tr>
|
||||
<tr class="odd">
|
||||
<td><code>CP_SAT_Statusfaelle.py</code></td>
|
||||
<td>Die fünf Solver-Antworten</td>
|
||||
<td><a href="cpsat.html#kap-cpsat">Kapitel 7</a></td>
|
||||
</tr>
|
||||
<tr class="odd">
|
||||
<tr class="even">
|
||||
<td><code>Strafgewichte.py</code></td>
|
||||
<td>Gewichte als Wechselkurse</td>
|
||||
<td><a href="cpsat.html#kap-cpsat">Kapitel 7</a></td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<tr class="odd">
|
||||
<td><code>Min_Cost_Flow.py</code></td>
|
||||
<td>Netzwerkfluss</td>
|
||||
<td><a href="graphen.html#kap-graphen">Kapitel 8</a></td>
|
||||
</tr>
|
||||
<tr class="odd">
|
||||
<tr class="even">
|
||||
<td><code>Zuordnung_Ungarisch.py</code></td>
|
||||
<td>Zuordnung, Unimodularität</td>
|
||||
<td><a href="graphen.html#kap-graphen">Kapitel 8</a></td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<tr class="odd">
|
||||
<td><code>VRP_Flotten_Routing.py</code></td>
|
||||
<td>CVRPTW</td>
|
||||
<td><a href="graphen.html#kap-graphen">Kapitel 8</a></td>
|
||||
</tr>
|
||||
<tr class="odd">
|
||||
<tr class="even">
|
||||
<td><code>VRP_Kapazitaetsfalle.py</code></td>
|
||||
<td>Vergessene Dimension im Routing</td>
|
||||
<td><a href="graphen.html#kap-graphen">Kapitel 8</a></td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<tr class="odd">
|
||||
<td><code>Simulated_Annealing.py</code></td>
|
||||
<td>Lokale Suche, Temperatur kalibrieren</td>
|
||||
<td><a href="metaheuristiken.html#kap-metaheuristiken">Kapitel 9</a></td>
|
||||
</tr>
|
||||
<tr class="odd">
|
||||
<tr class="even">
|
||||
<td><code>Metaheuristik_vs_Exakt.py</code></td>
|
||||
<td>Der Umschlagpunkt, und die Schranke</td>
|
||||
<td><a href="metaheuristiken.html#kap-metaheuristiken">Kapitel 9</a></td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<tr class="odd">
|
||||
<td><code>Large_Neighborhood_Search.py</code></td>
|
||||
<td>Zerstören und exakt reparieren</td>
|
||||
<td><a href="metaheuristiken.html#kap-metaheuristiken">Kapitel 9</a></td>
|
||||
</tr>
|
||||
<tr class="odd">
|
||||
<tr class="even">
|
||||
<td><code>Spaltengenerierung.py</code></td>
|
||||
<td>Muster statt Stücke, Master und Pricing</td>
|
||||
<td><a href="dekomposition.html#kap-dekomposition">Kapitel 10</a></td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<tr class="odd">
|
||||
<td><code>QP_Grundlagen.py</code></td>
|
||||
<td>Konvexität, DCP-Check</td>
|
||||
<td><a href="qp-nlp.html#kap-qp-nlp">Kapitel 11</a></td>
|
||||
</tr>
|
||||
<tr class="odd">
|
||||
<tr class="even">
|
||||
<td><code>KKT_Nachweis.py</code></td>
|
||||
<td>KKT numerisch prüfen</td>
|
||||
<td><a href="qp-nlp.html#kap-qp-nlp">Kapitel 11</a></td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<tr class="odd">
|
||||
<td><code>Entropie_Maximierte_Allokation.py</code></td>
|
||||
<td>NLP mit Entropie</td>
|
||||
<td><a href="qp-nlp.html#kap-qp-nlp">Kapitel 11</a></td>
|
||||
</tr>
|
||||
<tr class="odd">
|
||||
<tr class="even">
|
||||
<td><code>Lokale_Optima_Multistart.py</code></td>
|
||||
<td>Lokale Optima, Multistart</td>
|
||||
<td><a href="qp-nlp.html#kap-qp-nlp">Kapitel 11</a></td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<tr class="odd">
|
||||
<td><code>Fluch_des_Durchschnitts.py</code></td>
|
||||
<td>Optimum ≠ Mittelwert</td>
|
||||
<td><a href="unsicherheit.html#kap-unsicherheit">Kapitel 12</a></td>
|
||||
</tr>
|
||||
<tr class="odd">
|
||||
<tr class="even">
|
||||
<td><code>Monte_Carlo.py</code></td>
|
||||
<td>Monte-Carlo-Bewertung</td>
|
||||
<td><a href="unsicherheit.html#kap-unsicherheit">Kapitel 12</a></td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<tr class="odd">
|
||||
<td><code>Stochastische_Optimierung.py</code></td>
|
||||
<td>Two-Stage mit Recourse</td>
|
||||
<td><a href="unsicherheit.html#kap-unsicherheit">Kapitel 12</a></td>
|
||||
</tr>
|
||||
<tr class="odd">
|
||||
<tr class="even">
|
||||
<td><code>Robuste_Optimierung.py</code></td>
|
||||
<td>Worst-Case-Absicherung</td>
|
||||
<td><a href="unsicherheit.html#kap-unsicherheit">Kapitel 12</a></td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<tr class="odd">
|
||||
<td><code>Chance_Constraints.py</code></td>
|
||||
<td>Zusage „mit 95 % Sicherheit“, SOC und Big-M</td>
|
||||
<td><a href="unsicherheit.html#kap-unsicherheit">Kapitel 12</a></td>
|
||||
</tr>
|
||||
<tr class="odd">
|
||||
<tr class="even">
|
||||
<td><code>Bellman_Minimalbeispiel.py</code></td>
|
||||
<td>Rückwärtsinduktion</td>
|
||||
<td><a href="dynamische-programmierung.html#kap-dynamische-programmierung">Kapitel 13</a></td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<tr class="odd">
|
||||
<td><code>Mehrziel_Pareto.py</code></td>
|
||||
<td>Pareto-Front, ε-Constraint, Gewichtslücke</td>
|
||||
<td><a href="mehrziel.html#kap-mehrziel">Kapitel 14</a></td>
|
||||
</tr>
|
||||
<tr class="odd">
|
||||
<tr class="even">
|
||||
<td><code>Predict_then_Optimize.py</code></td>
|
||||
<td>MSE gegen Entscheidungskosten</td>
|
||||
<td><a href="prognose.html#kap-prognose">Kapitel 15</a></td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<tr class="odd">
|
||||
<td><code>Strukturbruecke.py</code></td>
|
||||
<td>Derselbe Code über Werkstatt und Depot</td>
|
||||
<td><a href="bruecke.html#kap-bruecke">Kapitel 16</a></td>
|
||||
</tr>
|
||||
<tr class="odd">
|
||||
<tr class="even">
|
||||
<td><code>Kraftwerkseinsatz.py</code></td>
|
||||
<td>Unit Commitment unter Windunsicherheit</td>
|
||||
<td><a href="supplychain.html#kap-supplychain">Kapitel 17</a></td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<tr class="odd">
|
||||
<td><code>Mehrperiodige_Order_Execution.py</code></td>
|
||||
<td>Almgren-Chriss</td>
|
||||
<td><a href="dynamische-programmierung.html#kap-dynamische-programmierung">Kapitel 13</a></td>
|
||||
</tr>
|
||||
<tr class="odd">
|
||||
<tr class="even">
|
||||
<td><code>Renditen_Vergleich.py</code></td>
|
||||
<td>Diskret vs. logarithmisch</td>
|
||||
<td><a href="finanzdaten.html#kap-finanzdaten">Kapitel 18</a></td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<tr class="odd">
|
||||
<td><code>Schaetzrauschen_Demo.py</code></td>
|
||||
<td>Error-Maximizer messen</td>
|
||||
<td><a href="finanzdaten.html#kap-finanzdaten">Kapitel 18</a></td>
|
||||
</tr>
|
||||
<tr class="odd">
|
||||
<tr class="even">
|
||||
<td><code>Finanzdaten_Ledoit_Wolf.py</code></td>
|
||||
<td>Datenpipeline, Shrinkage</td>
|
||||
<td><a href="finanzdaten.html#kap-finanzdaten">Kapitel 18</a></td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<tr class="odd">
|
||||
<td><code>Kovarianz_Falle.py</code></td>
|
||||
<td>Singuläre Kovarianz, Error-Maximizer</td>
|
||||
<td><a href="finanzdaten.html#kap-finanzdaten">Kapitel 18</a></td>
|
||||
</tr>
|
||||
<tr class="odd">
|
||||
<tr class="even">
|
||||
<td><code>Markowitz_CVXPY.py</code></td>
|
||||
<td>GMV, Max Sharpe, Frontier</td>
|
||||
<td><a href="markowitz.html#kap-markowitz">Kapitel 19</a></td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<tr class="odd">
|
||||
<td><code>Diversifikation_Demo.py</code></td>
|
||||
<td>Korrelation und Portfoliorisiko</td>
|
||||
<td><a href="markowitz.html#kap-markowitz">Kapitel 19</a></td>
|
||||
</tr>
|
||||
<tr class="odd">
|
||||
<tr class="even">
|
||||
<td><code>Renditeschaetzung_Falle.py</code></td>
|
||||
<td>Schätzfehler in erwarteten Renditen</td>
|
||||
<td><a href="markowitz.html#kap-markowitz">Kapitel 19</a></td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<tr class="odd">
|
||||
<td><code>VaR_CVaR_Demo.py</code></td>
|
||||
<td>Fat Tails, Subadditivität</td>
|
||||
<td><a href="cvar.html#kap-cvar">Kapitel 20</a></td>
|
||||
</tr>
|
||||
<tr class="odd">
|
||||
<tr class="even">
|
||||
<td><code>CVaR_Portfolio.py</code></td>
|
||||
<td>CVaR mit Reibung</td>
|
||||
<td><a href="cvar.html#kap-cvar">Kapitel 20</a></td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<tr class="odd">
|
||||
<td><code>QuantitativeTradingEngine.py</code></td>
|
||||
<td>Walk-Forward-Backtest</td>
|
||||
<td><a href="handelsmaschine.html#kap-handelsmaschine">Kapitel 21</a></td>
|
||||
</tr>
|
||||
<tr class="odd">
|
||||
<tr class="even">
|
||||
<td><code>Backtest_Fallen.py</code></td>
|
||||
<td>Fünf Selbsttäuschungen</td>
|
||||
<td><a href="handelsmaschine.html#kap-handelsmaschine">Kapitel 21</a></td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<tr class="odd">
|
||||
<td><code>Data_Snooping.py</code></td>
|
||||
<td>Bestes aus N Versuchen auf Rauschen</td>
|
||||
<td><a href="handelsmaschine.html#kap-handelsmaschine">Kapitel 21</a></td>
|
||||
</tr>
|
||||
<tr class="odd">
|
||||
<tr class="even">
|
||||
<td><code>Infeasibility_Diagnose.py</code></td>
|
||||
<td>Notfallplan statt Fehler</td>
|
||||
<td><a href="praxisfallen.html#kap-praxisfallen">Kapitel 22</a></td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<tr class="odd">
|
||||
<td><code>Erklaerbarkeit.py</code></td>
|
||||
<td>Constraint-Trace, Was-wäre-wenn</td>
|
||||
<td><a href="praxisfallen.html#kap-praxisfallen">Kapitel 22</a></td>
|
||||
</tr>
|
||||
<tr class="odd">
|
||||
<tr class="even">
|
||||
<td><code>Constraint_Attribution.py</code></td>
|
||||
<td>Was kostet welche Bedingung? Managementbericht</td>
|
||||
<td><a href="praxisfallen.html#kap-praxisfallen">Kapitel 22</a></td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<tr class="odd">
|
||||
<td><code>Betriebsueberwachung.py</code></td>
|
||||
<td>Status, Gap und Zeitausschöpfung</td>
|
||||
<td><a href="praxisfallen.html#kap-praxisfallen">Kapitel 22</a></td>
|
||||
</tr>
|
||||
<tr class="odd">
|
||||
<tr class="even">
|
||||
<td><code>or_kern.py</code></td>
|
||||
<td>Gemeinsamer Unterbau: Domäne, Status, Prüfung</td>
|
||||
<td><a href="praxisfallen.html#kap-praxisfallen">Kapitel 22</a></td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<tr class="odd">
|
||||
<td><code>Solverwechsel_CPSAT_HiGHS.py</code></td>
|
||||
<td>Derselbe Fall in zwei Solvern</td>
|
||||
<td><a href="praxisfallen.html#kap-praxisfallen">Kapitel 22</a></td>
|
||||
</tr>
|
||||
<tr class="odd">
|
||||
<tr class="even">
|
||||
<td><code>test_or_kern.py</code></td>
|
||||
<td>Testsuite für ein Optimierungsmodell</td>
|
||||
<td><a href="testing.html#kap-testing">Kapitel 23</a></td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<tr class="odd">
|
||||
<td><code>Mutationstest.py</code></td>
|
||||
<td>Findet die Lücken der eigenen Tests</td>
|
||||
<td><a href="testing.html#kap-testing">Kapitel 23</a></td>
|
||||
</tr>
|
||||
<tr class="odd">
|
||||
<tr class="even">
|
||||
<td><code>Benchmark_Skalierung.py</code></td>
|
||||
<td>Aufbau gegen Lösen, vier Bibliotheken</td>
|
||||
<td><a href="testing.html#kap-testing">Kapitel 23</a></td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<tr class="odd">
|
||||
<td><code>Optimierungsdienst.py</code></td>
|
||||
<td>Das Modell als HTTP-Dienst</td>
|
||||
<td><a href="testing.html#kap-testing">Kapitel 23</a></td>
|
||||
</tr>
|
||||
<tr class="odd">
|
||||
<tr class="even">
|
||||
<td><code>Konfliktsuche.py</code></td>
|
||||
<td>Deletion Filter: den Widerspruch einkreisen</td>
|
||||
<td><a href="anhang-fehlerdiagnose.html#anhang-fehlerdiagnose">Anhang C</a></td>
|
||||
|
|
|
|||
Loading…
Reference in a new issue