operations_research/Operations_Research_mit_Python_Version_04
Repository files (latest commit first)
Filename Latest commit message Latest commit date
dschlueter 5d5bdb6508 Folium-Karten: die Blockade war eine falsche Alternative
Der einzige Punkt, der in diesem Projekt je als "blockiert" gefuehrt wurde,
ist erledigt. Die Begruendung lautete: Die VRP-Instanz sei ein synthetisches
100 x 100-km-Raster ohne Geokoordinaten, eine echte Karte verlange also
ENTWEDER eine neue Instanz (und damit zwei Dutzend neue abgedruckte Zahlen)
ODER eine willkuerliche Verankerung.

Es gibt einen dritten Weg, und er ist exakt. Eine azimutal-aequidistante
Projektion um den Schwerpunkt des Rasters bildet die 17 Punkte so auf Laenge
und Breite ab, dass die Grosskreisdistanzen mit den Rasterdistanzen
uebereinstimmen:

  festes cos(Breite)        Median 0,360 %   Maximum 2,003 %
  cos der eigenen Breite    Median 0,351 %   Maximum 0,908 %
  azimutal-aequidistant     Median 0,000 %   Maximum 0,001 %

Ein Meter auf hundert Kilometer. Kein abgedruckter Wert aendert sich, die
Gesamtstrecke bleibt bei 619 km, das SVG ist byte-identisch geblieben.

Zwei Befunde stuetzten die Entscheidung: "100 x 100 km Raster" steht nur in
zwei Codekommentaren, nirgends im Fliesstext; und der didaktische Punkt der
Bildunterschrift - die sich kreuzenden Touren, die KEIN Fehler sind - wird auf
einer Karte deutlicher.

erzeuge_vrp_touren.py schreibt jetzt SVG UND Karte aus einem Lauf. Ein zweites
Skript haette erneut geloest, und die Routing-Bibliothek arbeitet heuristisch.
pruefe_projektion() bricht ab, wenn die Verzerrung 0,01 % ueberschreitet - die
Zahl im Buch wird bei jedem Lauf bewiesen.

Neu im Build: die Marke {karte:name}, aufgeloest zu einem <iframe> (Leaflets
Stylesheet soll nicht in die Buchseite greifen), im PDF zum Verweissatz - wie
bei {plotly:}. --check bewacht jetzt beide Markenarten auf Existenz der Datei;
gegengeprueft mit einer absichtlich falschen Marke.

Zwei Vorkehrungen, die ohne Messung nicht aufgefallen waeren:

* Folium vergibt jedem Element eine uuid4 - jeder Lauf erzeugte eine andere
  Datei. normalisiere() ersetzt sie durch fortlaufende Nummern; zwei Laeufe
  liefern jetzt dieselbe Pruefsumme.
* Folium bindet ZEHN CDN-Ressourcen ein (jQuery, Bootstrap, Glyphicons,
  FontAwesome, awesome-markers ...). Gebraucht werden ZWEI. leaflet.js und
  leaflet.css liegen jetzt in web_04/assets/, die uebrigen acht entfallen.
  Nachgeprueft: Die Karte benutzt ausschliesslich L.*-Aufrufe. Ohne Netz
  fehlen nur die Kacheln, Marker und Touren bleiben sichtbar.

Gegenrechnung an vier Strecken: Depot -> K1 misst auf der Karte 27,20 km, die
Distanzmatrix sagt 27 - die Differenz stammt aus deren int(), nicht aus der
Geographie.

Veroeffentlicht: 8 Dateien uebertragen, alle dreizehn HTTP-Proben richtig, die
Karte auf dem Server unter 200 erreichbar.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-08 20:38:16 +02:00
..
00_Vorwort_und_Lesehilfe.md Titelblatt: Anwendungsliste beginnt ohne "Von" 2026-09-08 19:49:03 +02:00
01_Notation_und_Abkuerzungen.md Version 04 als eigenes Repository 2026-09-08 01:20:09 +02:00
10_Einfuehrung_OR.md Aufgeraeumt: 33 PNG-Zweitfassungen, Bau-Ueberbleibsel, Ausgabepfade 2026-09-08 14:22:26 +02:00
11_Mathematisches_Fundament.md Sechster und siebter Fund: die letzten handgeschriebenen Nummern 2026-09-08 09:52:41 +02:00
12_Python_Oekosystem.md Phase 8.2: Solver-Isolation ohne subprocess-Codestrings 2026-09-08 12:39:34 +02:00
13_Vom_Wunsch_zum_Modell.md Phase 8.1: Synthese-Seiten je Teil - und die gebrochene Lesekette 2026-09-08 12:10:02 +02:00
19_Synthese_Grundlagen.md Phase 8.1: Synthese-Seiten je Teil - und die gebrochene Lesekette 2026-09-08 12:10:02 +02:00
20_Lineare_Programmierung.md Achter Fund (Uebung-Verweise) und Phase 8.3: Dockerfile 2026-09-08 13:18:05 +02:00
21_MILP.md Phase 6.3: Parallelitaet und Determinismus - gemessen statt behauptet 2026-09-08 11:19:53 +02:00
22_CP_SAT.md Phase 8.1: Synthese-Seiten je Teil - und die gebrochene Lesekette 2026-09-08 12:10:02 +02:00
23_Graphen_Fluesse_Touren.md Folium-Karten: die Blockade war eine falsche Alternative 2026-09-08 20:38:16 +02:00
24_Metaheuristiken.md Phase 8.1: Synthese-Seiten je Teil - und die gebrochene Lesekette 2026-09-08 12:10:02 +02:00
25_Spaltengenerierung.md Phase 8.1: Synthese-Seiten je Teil - und die gebrochene Lesekette 2026-09-08 12:10:02 +02:00
29_Synthese_Kernverfahren.md Phase 8.1: Synthese-Seiten je Teil - und die gebrochene Lesekette 2026-09-08 12:10:02 +02:00
30_QP_und_NLP.md Achter Fund (Uebung-Verweise) und Phase 8.3: Dockerfile 2026-09-08 13:18:05 +02:00
31_Unsicherheit.md Achter Fund (Uebung-Verweise) und Phase 8.3: Dockerfile 2026-09-08 13:18:05 +02:00
32_Dynamische_Programmierung.md Phase 8.1: Synthese-Seiten je Teil - und die gebrochene Lesekette 2026-09-08 12:10:02 +02:00
33_Mehrziel_und_Pareto.md Phase 8.1: Synthese-Seiten je Teil - und die gebrochene Lesekette 2026-09-08 12:10:02 +02:00
34_Predict_then_Optimize.md Phase 8.1: Synthese-Seiten je Teil - und die gebrochene Lesekette 2026-09-08 12:10:02 +02:00
35_Strukturbruecke.md Phase 8.1: Synthese-Seiten je Teil - und die gebrochene Lesekette 2026-09-08 12:10:02 +02:00
36_Supply_Chain_Energie.md Phase 8.1: Synthese-Seiten je Teil - und die gebrochene Lesekette 2026-09-08 12:10:02 +02:00
39_Synthese_Nichtlinear.md Phase 8.1: Synthese-Seiten je Teil - und die gebrochene Lesekette 2026-09-08 12:10:02 +02:00
40_Finanzdaten.md Achter Fund (Uebung-Verweise) und Phase 8.3: Dockerfile 2026-09-08 13:18:05 +02:00
41_Markowitz.md Sechster und siebter Fund: die letzten handgeschriebenen Nummern 2026-09-08 09:52:41 +02:00
42_CVaR.md Phase 8.1: Synthese-Seiten je Teil - und die gebrochene Lesekette 2026-09-08 12:10:02 +02:00
43_Handelsmaschine.md Phase 8.1: Synthese-Seiten je Teil - und die gebrochene Lesekette 2026-09-08 12:10:02 +02:00
49_Synthese_Anwendungen.md Phase 8.1: Synthese-Seiten je Teil - und die gebrochene Lesekette 2026-09-08 12:10:02 +02:00
50_Praxis.md Achter Fund (Uebung-Verweise) und Phase 8.3: Dockerfile 2026-09-08 13:18:05 +02:00
51_Testing_und_Deployment.md Phase 8.2: Solver-Isolation ohne subprocess-Codestrings 2026-09-08 12:39:34 +02:00
52_Synthese_Praxis.md Phase 8.1: Synthese-Seiten je Teil - und die gebrochene Lesekette 2026-09-08 12:10:02 +02:00
59_Projektwerkstatt.md Phase 8.1: Synthese-Seiten je Teil - und die gebrochene Lesekette 2026-09-08 12:10:02 +02:00
90_Anhang_Loesungen.md Phase 8.1: Synthese-Seiten je Teil - und die gebrochene Lesekette 2026-09-08 12:10:02 +02:00
91_Anhang_Modellierungsmuster.md Phase 8.1: Synthese-Seiten je Teil - und die gebrochene Lesekette 2026-09-08 12:10:02 +02:00
92_Anhang_Fehlerdiagnose.md Phase 8.2: Solver-Isolation ohne subprocess-Codestrings 2026-09-08 12:39:34 +02:00
93_Anhang_Spickzettel.md Glossar und Literatur trennen, Menue um Glossar und ZIP-Download ergaenzen 2026-09-08 15:48:57 +02:00
94_Anhang_Glossar.md Glossar und Literatur trennen, Menue um Glossar und ZIP-Download ergaenzen 2026-09-08 15:48:57 +02:00
95_Anhang_Literatur.md Glossar und Literatur trennen, Menue um Glossar und ZIP-Download ergaenzen 2026-09-08 15:48:57 +02:00
build_version_04.py Folium-Karten: die Blockade war eine falsche Alternative 2026-09-08 20:38:16 +02:00
extract_programme_04.py Version 04 als eigenes Repository 2026-09-08 01:20:09 +02:00
README.md Dokumentation nachgezogen - und dabei den neunten Fund gemacht 2026-09-08 19:13:34 +02:00
README_Programme.md Version 04 als eigenes Repository 2026-09-08 01:20:09 +02:00
titeltexte_04.py Titeltext: eine Quelle fuer PDF-Titelseite und Startseite 2026-09-08 19:39:49 +02:00
veroeffentliche_04.py veroeffentliche_04.py: leserliche Ausgabe, 404-Probe entfernt 2026-09-08 20:04:53 +02:00

Optimierte Entscheidungsfindung mit Python

Wegweiser durch diese Ausgabe. Dieses Kompendium verfolgt einen klaren Anspruch: Kursteilnehmerinnen und Kursteilnehmer sollen den Text nicht nur lesen, sondern damit arbeiten, üben und eigene Anwendungen bauen können.


Was dieses Kompendium bietet

Merkmal Umfang Warum
Formel-Lesehilfen bei jeder nicht-trivialen Formel Nicht jede/r liest Formelsprache flüssig
Handrechnungen Simplex, Big-M, Dualität, Bellman, CVaR Verstehen kommt vor Programmieren
Zeile-für-Zeile-Code-Erklärungen alle Kernprogramme Code lesen lernen, nicht nur ausführen
Erwartete Programmausgaben alle Programme Selbstkontrolle: „Läuft es bei mir richtig?“
~130 Übungsaufgaben mit Lösungen jedes Kapitel Aktives Üben statt passives Lesen
Selbsttests jedes Kapitel Schnelle Wissenskontrolle
Codebeispiele durchgängig lauffähig u. a. Rucksack, Zuordnung, Job-Shop, Monte-Carlo, robuste Optimierung, Min-Cost-Flow Theorie und Code gehören zusammen
Notations- und Abkürzungsverzeichnis 01_Notation_und_Abkuerzungen.md Jede Abkürzung genau einmal sauber eingeführt
Projektwerkstatt 59_Projektwerkstatt.md 8 vollständige Projektaufträge für eigene Anwendungen
Modellierungsmuster-Katalog 91_Anhang_Modellierungsmuster.md Nachschlagewerk: „Wie modelliere ich X?“
Fehlerdiagnose-Handbuch 92_Anhang_Fehlerdiagnose.md Was tun, wenn der Solver INFEASIBLE meldet?

Aufbau der Dateien

Der Text ist auf mehrere Dateien verteilt, damit er handhabbar bleibt. Die Nummern-Präfixe legen die Lesereihenfolge fest.

Vorspann

Datei Inhalt
00_Vorwort_und_Lesehilfe.md Vorwort & Lesehilfe
01_Notation_und_Abkuerzungen.md Notation & Abkürzungen

Teil I: Grundlagen des Operations Research

Datei Kapitel
10_Einfuehrung_OR.md Kapitel 1 — Einführung in Operations Research — Vom Ursprung zur mathematischen Entscheidungsfindung
11_Mathematisches_Fundament.md Kapitel 2 — Das mathematische Fundament — Vektoren, Matrizen, Konvexität
12_Python_Oekosystem.md Kapitel 3 — Das Python-Ökosystem für OR — Solver, Bindings und Modellierungsschichten
13_Vom_Wunsch_zum_Modell.md Kapitel 4 — Vom Management-Wunsch zum Modell
19_Synthese_Grundlagen.md Synthese Teil I

Teil II: Die Kernverfahren der deterministischen Optimierung

Datei Kapitel
20_Lineare_Programmierung.md Kapitel 5 — Lineare Programmierung — Simplex, Dualität und Schattenpreise
21_MILP.md Kapitel 6 — Gemischt-ganzzahlige Optimierung — Diskrete Entscheidungen und Branch-and-Bound
22_CP_SAT.md Kapitel 7 — Constraint Programming mit CP-SAT — Logik, Scheduling und Zuweisung
23_Graphen_Fluesse_Touren.md Kapitel 8 — Graphen, Flüsse und Touren — Min-Cost-Flow, Matching und VRP
24_Metaheuristiken.md Kapitel 9 — Metaheuristiken — wenn der exakte Solver aussteigt
25_Spaltengenerierung.md Kapitel 10 — Spaltengenerierung — das Modell umbauen statt die Lösung raten
29_Synthese_Kernverfahren.md Synthese Teil II

Teil III: Nichtlinearität, Unsicherheit und mehrperiodige Dynamik

Datei Kapitel
30_QP_und_NLP.md Kapitel 11 — Quadratische und nichtlineare Optimierung — KKT, Lagrange, Konvexität
31_Unsicherheit.md Kapitel 12 — Optimierung unter Unsicherheit — Monte-Carlo, Stochastik, Robustheit
32_Dynamische_Programmierung.md Kapitel 13 — Dynamische Programmierung — Die Bellman-Gleichung und Order-Execution
33_Mehrziel_und_Pareto.md Kapitel 14 — Mehrere Ziele — Pareto-Fronten statt Gewichte
34_Predict_then_Optimize.md Kapitel 15 — Predict-then-Optimize — die bessere Prognose, die schlechtere Entscheidung
39_Synthese_Nichtlinear.md Synthese Teil III

Teil IV: Anwendungen — Energiewirtschaft und Finanzmärkte

Datei Kapitel
35_Strukturbruecke.md Kapitel 16 — Die Strukturbrücke — dieselbe Mathematik, zwei Welten
36_Supply_Chain_Energie.md Kapitel 17 — Supply-Chain und Energieeinsatz unter Unsicherheit
40_Finanzdaten.md Kapitel 18 — Finanzdaten-Modellierung — Renditen, Kovarianz und Shrinkage
41_Markowitz.md Kapitel 19 — Die moderne Portfoliotheorie nach Markowitz
42_CVaR.md Kapitel 20 — Tail-Risiko, CVaR und Transaktionskosten
43_Handelsmaschine.md Kapitel 21 — Die vollständige quantitative Handelsmaschine
49_Synthese_Anwendungen.md Synthese Teil IV

Teil V: Praxis

Datei Kapitel
50_Praxis.md Kapitel 22 — Praxisfallen und der Weg zum produktiven Einsatz
51_Testing_und_Deployment.md Kapitel 23 — Testen, Messen, Ausliefern
52_Synthese_Praxis.md Synthese Teil V
59_Projektwerkstatt.md Projektwerkstatt

Anhang

Datei Inhalt
90_Anhang_Loesungen.md Anhang A — Lösungen zu allen Übungsaufgaben
91_Anhang_Modellierungsmuster.md Anhang B — Katalog der Modellierungsmuster
92_Anhang_Fehlerdiagnose.md Anhang C — Fehlerdiagnose-Handbuch
93_Anhang_Spickzettel.md Anhang D — Spickzettel der Solver
94_Anhang_Glossar.md Anhang E — Glossar
95_Anhang_Literatur.md Anhang F — Literaturverzeichnis

Eine Einzeldatei erzeugen

Wer lieber ein einziges Dokument möchte (z. B. zum Drucken oder für die PDF-Erzeugung), baut es aus den Einzeldateien:

cd Version_04   # das Wurzelverzeichnis des Repositorys
python3 Operations_Research_mit_Python_Version_04/build_version_04.py

Das Skript erzeugt Operations_Research_mit_Python_Version_04.md im übergeordneten Verzeichnis — in derselben Reihenfolge wie oben, mit Titelblock, automatisch gesetztem Inhaltsverzeichnis-Platzhalter und entfernten unnötigen Zeilenumbrüchen innerhalb von Absätzen. Optionen:

python3 .../build_version_04.py --pdf     # zusätzlich PDF über pandoc + xelatex
python3 .../build_version_04.py --html    # zusätzlich die Website OR_HTML_04/
python3 .../build_version_04.py --check   # nur Konsistenzprüfung, schreibt nichts

--html erzeugt die mehrseitige Website mit Suche, Stichwortverzeichnis und Notebook-Downloads; das Gesamtdokument auf einer Seite liegt darin als gesamtdokument.html.


Empfohlene Reihenfolge für Kursteilnehmer

Vollständiger Lehrgang (empfohlen, ca. 100140 Stunden): Vorwort → Notation → alle Kapitel der Reihe nach → Projektwerkstatt. Jedes Kapitel endet mit Übungsaufgaben — bearbeiten Sie diese, bevor Sie weiterlesen.

Schnellpfad Planung & Disposition (ca. 25 Stunden): Einführung, Fundament, Vom Wunsch zum Modell, LP, MILP, CP-SAT → Projekt P1 oder P2.

Schnellpfad Logistik (ca. 25 Stunden): Einführung, Fundament, LP, MILP, Graphen → Projekt P3.

Schnellpfad Quantitative Finance (ca. 30 Stunden): Einführung, Fundament, QP/NLP, Finanzdaten, Markowitz, CVaR, Handelsmaschine → Projekt P6 oder P7.

(Ohne Kapitelnummern — die verschieben sich beim Einfügen neuer Kapitel. Die maßgebliche, immer aktuelle Fassung der Lernpfade steht im Vorwort.)

Details zu den Lernpfaden stehen in 00_Vorwort_und_Lesehilfe.md.


Autor / Herausgeber: Dieter Schlüter · Stand: 8. September 2026