Version 04 als eigenes Repository
Erster Commit des Strangs "Optimierte Entscheidungsfindung mit Python"
(Version 04). Die Historie der 71 Commits bis zur Trennung bleibt im
uebergeordneten Repository OR_mit_Python liegen, das ab jetzt nur noch
Version_03 (eingefroren) verwaltet und Version_04/ ignoriert.
Bewusst kein "git subtree split": Der Pfad Version_04/ existiert erst seit
der Verzeichnistrennung, ein Split braechte daher nur 7 der 41 einschlaegigen
Commits - eine Teilhistorie, die vollstaendig aussieht und es nicht ist.
Stand: 5 Teile, 23 Kapitel, 5 Anhaenge, 292 Abschnitte, 703 Querverweise,
325 Indexmarken, 73 Beispielprogramme, 32 SVGs, 4 Plotly-Figuren,
25 Notebooks, PDF mit 715 Seiten.
Zusaetzlich in diesem Commit:
* pyproject.toml mit Abhaengigkeitsgruppen finance, large-scale, api,
figures, dev, empfehlungen. Die abgedruckte requirements.txt bleibt
unveraendert daneben bestehen. ortools steht in der Grundausstattung,
highspy erst in [large-scale] - so kann der HiGHS-Symbolkonflikt bei der
schlanken Installation gar nicht erst auftreten.
* Dabei zwei Funde: graphviz wird von erzeuge_architektur_diagramme.py
importiert, fehlt aber in requirements.txt (jetzt in [figures]); pymoo
steht in requirements.txt, wird aber von keinem Programm importiert,
sondern nur im Kapitel Metaheuristiken empfohlen (jetzt in
[empfehlungen]).
* NEUER_TITEL.md nach Kritik_und_Verbesserungsvorschlaege/ verschoben - es
ist die Vorlage des Titelblatts, kein Bestandteil des Werks. Die beiden
Fundstellen in PROGRESS.md und erzeuge_titelseite.py nachgezogen.
* PROGRESS.md nannte noch den Untertitel der ersten Fassung; auf den
tatsaechlichen aus erzeuge_titelseite.py korrigiert.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-08 01:20:09 +02:00
|
|
|
# Paketbeschreibung fuer die Beispielprogramme des Buchs
|
|
|
|
|
# "Optimierte Entscheidungsfindung mit Python".
|
|
|
|
|
#
|
|
|
|
|
# Zweck: schlanke, gezielt zusammengestellte Umgebungen. Wer nur die ersten
|
|
|
|
|
# Kapitel durcharbeitet, braucht weder yfinance noch FastAPI.
|
|
|
|
|
#
|
|
|
|
|
# pip install -e . # Grundausstattung, traegt den Grossteil des Buchs
|
|
|
|
|
# pip install -e ".[finance]" # Teil "Anwendungen": Markowitz, CVaR, Handelsmaschine
|
|
|
|
|
# pip install -e ".[large-scale]" # HiGHS, Pyomo, linopy, polars
|
|
|
|
|
# pip install -e ".[api]" # Kapitel "Testen, Messen, Ausliefern"
|
|
|
|
|
# pip install -e ".[figures]" # nur zum Neuerzeugen der Diagramme
|
|
|
|
|
# pip install -e ".[dev]" # Tests
|
|
|
|
|
# pip install -e ".[alles]" # alles zusammen - siehe Warnung unten
|
|
|
|
|
#
|
|
|
|
|
# ACHTUNG, Solverkonflikt: ortools und highspy bringen jeweils eine eigene
|
|
|
|
|
# HiGHS-Kopie mit und lassen sich nicht im selben Prozess importieren. ortools
|
|
|
|
|
# steht deshalb in der Grundausstattung, highspy erst in [large-scale] - wer nur
|
|
|
|
|
# "pip install -e ." nutzt, kann in den Konflikt gar nicht geraten. cvxpy zieht
|
|
|
|
|
# ein installiertes highspy bei der Solver-Erkennung selbst mit hinein, [finance]
|
|
|
|
|
# loest ihn also indirekt ebenfalls aus. Die Programme des Buchs umgehen das
|
|
|
|
|
# durch getrennte Prozesse (Muster: Ein_System_Vier_Ansaetze.py); ausfuehrlich
|
|
|
|
|
# steht es im Kapitel "Das Python-Oekosystem fuer OR".
|
|
|
|
|
#
|
|
|
|
|
# Die Datei ergaenzt
|
|
|
|
|
# Operations_Research_mit_Python_Version_04_Programme/requirements.txt und
|
|
|
|
|
# ersetzt sie nicht: Jene ist im Buch abgedruckt und installiert bewusst alles
|
|
|
|
|
# auf einen Schlag.
|
|
|
|
|
|
|
|
|
|
[build-system]
|
|
|
|
|
requires = ["setuptools>=68"]
|
|
|
|
|
build-backend = "setuptools.build_meta"
|
|
|
|
|
|
|
|
|
|
[project]
|
|
|
|
|
name = "or-mit-python"
|
|
|
|
|
version = "4.0.0"
|
|
|
|
|
description = "Beispielprogramme zum Buch 'Optimierte Entscheidungsfindung mit Python'"
|
|
|
|
|
readme = "README.md"
|
|
|
|
|
requires-python = ">=3.10"
|
|
|
|
|
authors = [{ name = "Dieter Schlüter", email = "dieter.schlueter@linix.de" }]
|
|
|
|
|
keywords = ["operations-research", "optimierung", "linear-programming",
|
|
|
|
|
"constraint-programming", "milp", "lehrbuch"]
|
|
|
|
|
|
|
|
|
|
# Grundausstattung: traegt die Kapitel bis einschliesslich Graphen und Touren.
|
|
|
|
|
# scipy liefert linprog/milp, ortools den CP-SAT-Solver und pywraplp.
|
|
|
|
|
dependencies = [
|
|
|
|
|
"numpy>=2.5.2",
|
|
|
|
|
"scipy>=1.17.1",
|
|
|
|
|
"pandas>=3.0.1",
|
|
|
|
|
"matplotlib>=3.10.8",
|
|
|
|
|
"openpyxl>=3.1.5", # kein direkter Import: Excel-Motor hinter pandas
|
|
|
|
|
"pydantic>=2.12",
|
|
|
|
|
"ortools>=9.15.6755",
|
Phase 6.1: Chance Constraints - die Zusage "mit 95 % Sicherheit"
Neuer Abschnitt im Kapitel Unsicherheit plus Chance_Constraints.py (74.
Programm). Das Kapitel hatte Monte-Carlo, Zweistufigkeit und
Worst-Case-Robustheit; die Wahrscheinlichkeitszusage war die fehlende vierte
Antwort - und die, nach der das Management tatsaechlich fragt. Setzt Paket 4
aus Verbesserungen_02.md um.
Beide Wege an DERSELBEN Instanz (Kraftwerkspark, 500 MW gesicherte Zusage):
analytisch als Second-Order-Cone-Bedingung (CLARABEL) und szenariobasiert als
Big-M-MILP (SciPy/HiGHS) - beides in einem Prozess, ohne ortools- oder
highspy-Import.
Drei gemessene Befunde:
* Der Mittelwertplan haelt 50,08 %. Kein Fehler, sondern die Definition des
Erwartungswerts.
* Sicherheit ist konvex bepreist: 56.289 EUR je Prozentpunkt auf dem Weg zu
80 %, 253.848 EUR zwischen 95 und 99 % - das 4,5-fache. Das Programm
rechnet die Tabelle selbst aus, statt sie zu behaupten.
* Die Zusage gilt nur fuer die unterstellte Verteilung: Der 95-%-Plan haelt
gemessen 87,44 %, sobald die Testverteilung eine Kaeltewelle mit
Dunkelflaute enthaelt, in der alles zugleich einbricht - auch das
Gaskraftwerk. In einer reinen Normalwelt liefert derselbe Plan 94,97 %.
Zwei eigene Fehlgriffe, beide durch Messen aufgefallen und korrigiert: Die
erste Kostentarierung ergab eine entartete Loesung (alles ins Gaskraftwerk),
womit die Kovarianzmatrix wirkungslos war - und gerade sie begruendet die
Kegelform. Und der erste Kaelteeinbruch traf nur Wind und Sonne; der SOC-Plan
hatte die ohnehin herausgehalten und war zufaellig robust, das Argument trug
nicht.
Ehrlich berichtet statt geglaettet: Die Szenariomethode ueberanpasst. Ueber
zwoelf Laeufe (S = 200, 400, 800) lag die tatsaechliche Quote zwischen
93,14 % und 96,71 %, und die Spanne wurde von S = 400 auf 800 wieder
breiter. Beide Solver bestaetigen optimal bei identischen Kosten - echte
Ueberanpassung, kein Solverartefakt. Steht als Warnkasten im Abschnitt.
Die Laufzeitmessung ist aus der Ausgabe entfernt: Eine Wanduhrzeit ist nie
byteidentisch reproduzierbar (2,2 s / 2,3 s zwischen zwei Laeufen) und haette
Regel 4 dauerhaft gebrochen. Danach drei Laeufe zeichengleich, und die
abgedruckte Ausgabe stimmt mit dem Lauf des extrahierten Programms ueberein.
Mitgezogen: Kapitelkopf, Lernziele, Uebersichtstabelle (drei -> vier
Ansaetze), Selbsttest, Zusammenfassung, Vorwort-Programmverzeichnis, eine
neue Uebungsaufgabe und ihre Loesung in Anhang A.
pyproject.toml korrigiert: cvxpy lag in [finance], wird aber von 13
Programmen gebraucht, darunter dreien in diesem Kapitel - jetzt in der
Grundausstattung. Es zieht kein highspy nach, der Solverkonflikt bleibt auf
[large-scale] beschraenkt.
Stand: 293 Abschnitte, 712 Querverweise, 327 Indexmarken, 74 Programme (0
Fehler), 33 pytest-Tests, PDF 725 Seiten.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-08 01:57:19 +02:00
|
|
|
# cvxpy gehoert in die Grundausstattung, nicht in [finance]: Es wird von
|
|
|
|
|
# 13 Programmen gebraucht, darunter dreien im Kapitel Unsicherheit, lange
|
|
|
|
|
# vor dem Finanzteil. Es zieht KEIN highspy nach - der Solverkonflikt
|
|
|
|
|
# entsteht erst mit [large-scale].
|
|
|
|
|
"cvxpy>=1.9.2",
|
Version 04 als eigenes Repository
Erster Commit des Strangs "Optimierte Entscheidungsfindung mit Python"
(Version 04). Die Historie der 71 Commits bis zur Trennung bleibt im
uebergeordneten Repository OR_mit_Python liegen, das ab jetzt nur noch
Version_03 (eingefroren) verwaltet und Version_04/ ignoriert.
Bewusst kein "git subtree split": Der Pfad Version_04/ existiert erst seit
der Verzeichnistrennung, ein Split braechte daher nur 7 der 41 einschlaegigen
Commits - eine Teilhistorie, die vollstaendig aussieht und es nicht ist.
Stand: 5 Teile, 23 Kapitel, 5 Anhaenge, 292 Abschnitte, 703 Querverweise,
325 Indexmarken, 73 Beispielprogramme, 32 SVGs, 4 Plotly-Figuren,
25 Notebooks, PDF mit 715 Seiten.
Zusaetzlich in diesem Commit:
* pyproject.toml mit Abhaengigkeitsgruppen finance, large-scale, api,
figures, dev, empfehlungen. Die abgedruckte requirements.txt bleibt
unveraendert daneben bestehen. ortools steht in der Grundausstattung,
highspy erst in [large-scale] - so kann der HiGHS-Symbolkonflikt bei der
schlanken Installation gar nicht erst auftreten.
* Dabei zwei Funde: graphviz wird von erzeuge_architektur_diagramme.py
importiert, fehlt aber in requirements.txt (jetzt in [figures]); pymoo
steht in requirements.txt, wird aber von keinem Programm importiert,
sondern nur im Kapitel Metaheuristiken empfohlen (jetzt in
[empfehlungen]).
* NEUER_TITEL.md nach Kritik_und_Verbesserungsvorschlaege/ verschoben - es
ist die Vorlage des Titelblatts, kein Bestandteil des Werks. Die beiden
Fundstellen in PROGRESS.md und erzeuge_titelseite.py nachgezogen.
* PROGRESS.md nannte noch den Untertitel der ersten Fassung; auf den
tatsaechlichen aus erzeuge_titelseite.py korrigiert.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-08 01:20:09 +02:00
|
|
|
]
|
|
|
|
|
|
|
|
|
|
[project.optional-dependencies]
|
|
|
|
|
# Teil "Anwendungen - Energiewirtschaft und Finanzmaerkte"
|
|
|
|
|
finance = [
|
|
|
|
|
"scikit-learn>=1.8.0",
|
|
|
|
|
"yfinance>=1.2.0",
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
# Groessere Modelle, alternative Solver und Modellierungsschichten
|
|
|
|
|
large-scale = [
|
|
|
|
|
"highspy>=1.15.1",
|
|
|
|
|
"Pyomo>=6.7",
|
|
|
|
|
"linopy>=0.3",
|
|
|
|
|
"polars>=1.0",
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
# Kapitel "Testen, Messen, Ausliefern": der Optimierungsdienst
|
|
|
|
|
api = [
|
|
|
|
|
"fastapi>=0.115",
|
|
|
|
|
"uvicorn>=0.30",
|
|
|
|
|
"httpx>=0.27", # Selbsttest des Dienstes ueber den TestClient
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
# Nur zum Neuerzeugen der Diagramme in bilder_04/ - fuer das Lesen und
|
|
|
|
|
# Ausfuehren des Buchs nicht noetig. graphviz braucht zusaetzlich das
|
|
|
|
|
# Kommandozeilenwerkzeug 'dot' aus dem Betriebssystempaket.
|
|
|
|
|
figures = [
|
|
|
|
|
"plotly>=6.0",
|
|
|
|
|
"graphviz>=0.20",
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
dev = [
|
|
|
|
|
"pytest>=8.0",
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
# pymoo wird im Buch als Bibliothek fuer genetische Algorithmen empfohlen
|
|
|
|
|
# (Kapitel Metaheuristiken), aber von keinem Beispielprogramm importiert.
|
|
|
|
|
# Deshalb steht es hier eigenstaendig und nicht in der Grundausstattung.
|
|
|
|
|
empfehlungen = [
|
|
|
|
|
"pymoo>=0.6",
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
alles = [
|
|
|
|
|
"or-mit-python[finance,large-scale,api,figures,dev,empfehlungen]",
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
[tool.setuptools]
|
|
|
|
|
# Die Beispielprogramme sind ein erzeugtes Artefakt (extract_programme_04.py)
|
|
|
|
|
# und kein installierbares Paket - hier wird nur der Abhaengigkeitsbaum
|
|
|
|
|
# beschrieben.
|
|
|
|
|
packages = []
|