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>
5.9 KiB
Optimierte Entscheidungsfindung mit Python — Version 04
Quellen, Build-Werkzeuge und Ausgaben des Lehrbuchs Optimierte Entscheidungsfindung mit Python (Autor: Dieter Schlüter). Dieses Verzeichnis ist die Wurzel: Alle Skripte leiten ihre Pfade daraus ab, und alle Befehle unten werden hier ausgeführt.
Dies ist die Bau-Anleitung für das Repository. Der Wegweiser für Leserinnen und Leser des Buchs — Aufbau, Lernpfade, Voraussetzungen — steht in
Operations_Research_mit_Python_Version_04/README.md.
Was hier liegt
| Pfad | Rolle |
|---|---|
Operations_Research_mit_Python_Version_04/ |
Quelle: 31 Kapiteldateien + Build-Skripte |
bilder_04/ |
Quelle: Diagramme (SVG/PNG) + erzeuge_*.py-Generatoren |
Operations_Research_mit_Python_Version_04.md |
generiert: Gesamtdokument (Pandoc-Eingabe) |
Operations_Research_mit_Python_Version_04.pdf |
generiert: PDF, 744 Seiten |
OR_HTML_04/ |
generiert: Mehrseiten-Website — dieser Ordner wird veröffentlicht |
Operations_Research_mit_Python_Version_04_Programme/ |
generiert: 76 lauffähige Beispielprogramme |
Notebooks_04/ |
generiert: ein Jupyter-Notebook je Kapitel |
PLAN.md / PROGRESS.md |
das Ziel des Umbaus und der erreichte Stand |
pyproject.toml |
Abhängigkeiten in Gruppen (finance, large-scale, api, …) |
pandoc-defaults-*.yaml, pandoc/ |
Konfiguration des PDF-Baus |
Nur die als Quelle markierten Verzeichnisse werden von Hand bearbeitet. Alles andere wird erzeugt und bei jeder inhaltlichen Änderung neu gebaut — insbesondere gehören Programmänderungen in den Kapitel-Codeblock, nicht in das Programme-Verzeichnis.
Bauen
cd Version_04
# nur prüfen: Struktur, Querverweise, Codezäune, harte Nummern
python3 Operations_Research_mit_Python_Version_04/build_version_04.py --check
# Gesamtdokument, PDF und Website
python3 Operations_Research_mit_Python_Version_04/build_version_04.py --pdf --html
# Beispielprogramme aus den Kapiteln extrahieren
python3 Operations_Research_mit_Python_Version_04/extract_programme_04.py
Die Website ist danach in OR_HTML_04/ vollständig und selbstgenügsam — alle Verweise
zeigen auf Unterverzeichnisse (assets/, bilder_04/, katex/, Notebooks_04/). Der Ordner
lässt sich unverändert auf einen Webserver kopieren.
Voraussetzungen
Python-Pakete — alles auf einen Schlag, wie im Buch abgedruckt
(requirements.txt):
python3 -m venv .venv && source .venv/bin/activate
pip install -r Operations_Research_mit_Python_Version_04_Programme/requirements.txt
Wer eine schlanke Umgebung möchte, nimmt stattdessen pyproject.toml mit
seinen Gruppen — die Grundausstattung trägt den Großteil des Buchs:
pip install -e . # numpy, scipy, pandas, matplotlib, openpyxl, pydantic, ortools, cvxpy
pip install -e ".[finance]" # scikit-learn, yfinance
pip install -e ".[large-scale]" # highspy, Pyomo, linopy, polars
pip install -e ".[api]" # fastapi, uvicorn, httpx
pip install -e ".[figures]" # plotly, graphviz — nur zum Neuerzeugen der Diagramme
pip install -e ".[dev]" # pytest
ortools steht in der Grundausstattung, highspy erst in [large-scale]. Das ist
Absicht: Beide bringen eine eigene HiGHS-Kopie mit und vertragen sich nicht im selben
Prozess. Wer die Grundausstattung installiert, kann in den Konflikt gar nicht geraten —
cvxpy zieht highspy nicht nach, erkennt es aber, sobald [large-scale] es
mitgebracht hat.
graphviz fehlt in der requirements.txt — es wird allein von
bilder_04/erzeuge_architektur_diagramme.py gebraucht, nicht von den Beispielprogrammen,
und steht darum nur in [figures].
Externe Werkzeuge, je nachdem, was gebaut werden soll:
| Werkzeug | wofür | ohne es |
|---|---|---|
pandoc (≥ 3.0) |
PDF und Website | --pdf/--html scheitern; --check läuft |
xelatex + texindy |
kein PDF; Website unberührt | |
inkscape |
SVG-Grafiken im PDF | LaTeX bricht bei \includesvg ab |
dot (Graphviz) |
5 der 15 Bildgeneratoren | nur beim Neuerzeugen dieser Diagramme nötig |
OR_HTML_04/katex/ ist externes Material und wird von keinem Skript erzeugt. Fehlt es,
bleiben die Formeln auf der Website ungesetzt.
Zwei Werte, die beim Veröffentlichen zu setzen sind
COLAB_BASIS_URLinOperations_Research_mit_Python_Version_04/build_version_04.py. Sie trägt Kontoname und Repository-Name; die 25 Colab-Badges auf den Kapitelseiten hängen daran. Der PfadteilNotebooks_04/…wird relativ zur Repository-Wurzel aufgelöst und stimmt bereits. Ein Leerstring schaltet die Badges ab.- Nichts weiter. Alle übrigen Pfade sind relativ.
Warum die PDF-Konfiguration doppelt vorliegt
pandoc-defaults-basis.yaml ist eine Kopie der Benutzerdatei
~/.config/pandoc/defaults.yaml (Schriften, Geometrie, Seitenlayout) — mit relativem
Pfad auf pandoc/header-includes.tex statt des absoluten, der dort steht. Ohne diese Kopie
könnte ein frischer Klon kein PDF bauen. build_version_04.py bevorzugt sie und fällt auf
die Benutzerdatei zurück, falls sie fehlt.
pandoc-defaults-buch.yaml enthält die projektspezifischen Überschreibungen
(Inhaltsverzeichnis und Nummerierung werden im Markdown selbst erzeugt, -shell-escape für
\includesvg). Die eigentliche Buchtypografie steht in bilder_04/or_pdf_header.tex.
Verlauf
Version 04 baut das Werk vom Nachschlagewerk zum Kursbegleiter um; alle sechs Phasen sind
abgeschlossen. Was geplant war, steht in PLAN.md; was erreicht ist und woran
man das nachprüft, in PROGRESS.md — einschließlich der Funde unterwegs und
der Regeln, die sich daraus ergeben haben. Wer hier weiterarbeitet, liest beide zuerst.