Stichwortregister: automatische Markierung aller Glossarbegriffe (988 statt 456 Marker)

Neues Skript erzeuge_stichwortregister_04.py:
- Sucht alle Glossarbegriffe (Anzeigename) in den Kapiteldateien
  und markiert die erste Fundstelle je Datei mit {idx:Indexmarke}
- Termliste aus glossar_eintraege_04.py + vorhandenen {idx:...}-Markern
- Idempotent: erkennt vorhandene Marker und überspringt sie
- Überspringt Codeblöcke, Inline-Code und Math
- --check und --bericht Modi
- 605 Marker eingefügt (2 Durchläufe: 597 + 8)

Zusätzlich:
- titeltexte_04.py _saeubern(): entfernt {idx:...}-Marker vor
  Titeltext-Vergleich (pruefe_titeltexte schlug sonst fehl)
This commit is contained in:
dschlueter 2026-09-10 00:07:01 +02:00
commit 99cb85907c
107 changed files with 1529 additions and 1214 deletions

Binary file not shown.

View file

@ -4,7 +4,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"# Kapitel 7: Constraint Programming mit CP-SAT — Logik, Scheduling und Zuweisung\n",
"# Kapitel 7: Constraint Programming mit CP-SAT{idx:CP-SAT} — Logik, Scheduling und Zuweisung\n",
"\n",
"Begleitnotebook zu *Optimierte Entscheidungsfindung mit Python*. Die Codezellen sind identisch mit den im Buch abgedruckten Programmen.\n"
]

View file

@ -4,7 +4,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"# Kapitel 20: Tail-Risiko, CVaR und Transaktionskosten\n",
"# Kapitel 20: Tail-Risiko, CVaR und Transaktionskosten{idx:Transaktionskosten}\n",
"\n",
"Begleitnotebook zu *Optimierte Entscheidungsfindung mit Python*. Die Codezellen sind identisch mit den im Buch abgedruckten Programmen.\n"
]

View file

@ -4,7 +4,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"# Kapitel 13: Dynamische Programmierung — Die Bellman-Gleichung und Order-Execution\n",
"# Kapitel 13: Dynamische Programmierung — Die Bellman-Gleichung{idx:Bellman-Gleichung} und Order-Execution\n",
"\n",
"Begleitnotebook zu *Optimierte Entscheidungsfindung mit Python*. Die Codezellen sind identisch mit den im Buch abgedruckten Programmen.\n"
]

View file

@ -25,7 +25,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## Logarithmische Rendite\n",
"## Logarithmische Rendite{idx:Logarithmische Rendite}\n",
"\n",
"`Renditen_Vergleich.py`\n"
]
@ -110,7 +110,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## Das Schätzfehler-Problem\n",
"## Das Schätzfehler{idx:Schätzfehler}-Problem\n",
"\n",
"`Schaetzrauschen_Demo.py`\n"
]

View file

@ -4,7 +4,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"# Kapitel 2: Das mathematische Fundament — Vektoren, Matrizen, Konvexität\n",
"# Kapitel 2: Das mathematische Fundament — Vektoren, Matrizen, Konvexität{idx:Konvexität}\n",
"\n",
"Begleitnotebook zu *Optimierte Entscheidungsfindung mit Python*. Die Codezellen sind identisch mit den im Buch abgedruckten Programmen.\n"
]

View file

@ -139,7 +139,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## Der Satz von Birkhoff und von Neumann\n",
"## Der Satz von Birkhoff und von Neumann{idx:Satz von Birkhoff und von Neumann}\n",
"\n",
"`Zuordnung_Ungarisch.py`\n"
]

View file

@ -4,7 +4,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"# Kapitel 6: Gemischt-ganzzahlige Optimierung — Diskrete Entscheidungen und Branch-and-Bound\n",
"# Kapitel 6: Gemischt-ganzzahlige Optimierung — Diskrete Entscheidungen und Branch-and-Bound{idx:Branch-and-Bound}\n",
"\n",
"Begleitnotebook zu *Optimierte Entscheidungsfindung mit Python*. Die Codezellen sind identisch mit den im Buch abgedruckten Programmen.\n"
]
@ -133,7 +133,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## Beispiel: Das Rucksackproblem\n",
"## Beispiel: Das Rucksackproblem{idx:Rucksackproblem}\n",
"\n",
"`Rucksack.py`\n"
]

View file

@ -25,7 +25,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## Falle 1 — Infeasibility\n",
"## Falle 1 — Infeasibility{idx:Infeasibility}\n",
"\n",
"`Infeasibility_Diagnose.py`\n"
]
@ -256,7 +256,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## Constraint Attribution: welche Bedingung kostet wie viel?\n",
"## Constraint Attribution{idx:Constraint Attribution}: welche Bedingung kostet wie viel?\n",
"\n",
"`Constraint_Attribution.py`\n"
]

View file

@ -4,7 +4,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"# Kapitel 15: Predict-then-Optimize — die bessere Prognose, die schlechtere Entscheidung\n",
"# Kapitel 15: Predict-then-Optimize{idx:Predict-then-Optimize} — die bessere Prognose, die schlechtere Entscheidung\n",
"\n",
"Begleitnotebook zu *Optimierte Entscheidungsfindung mit Python*. Die Codezellen sind identisch mit den im Buch abgedruckten Programmen.\n"
]

View file

@ -95,7 +95,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## Monte-Carlo-Simulation\n",
"## Monte-Carlo-Simulation{idx:Monte-Carlo-Simulation}\n",
"\n",
"`Monte_Carlo.py`\n"
]
@ -340,7 +340,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## Robuste Optimierung: gegen den Worst Case absichern\n",
"## Robuste Optimierung{idx:Robuste Optimierung}: gegen den Worst Case absichern\n",
"\n",
"`Robuste_Optimierung.py`\n"
]

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -2444,37 +2444,42 @@ z
</g>
</g>
<g id="text_14">
<!-- Stand: 9. September 2026 -->
<!-- Stand: 10. September 2026 -->
<g style="fill: #c7d2fe" transform="translate(71.4528 818.05749) scale(0.12 -0.12)">
<defs>
<path id="DejaVuSans-39" d="M 703 97
L 703 672
Q 941 559 1184 500
Q 1428 441 1663 441
Q 2288 441 2617 861
Q 2947 1281 2994 2138
Q 2813 1869 2534 1725
Q 2256 1581 1919 1581
Q 1219 1581 811 2004
Q 403 2428 403 3163
Q 403 3881 828 4315
Q 1253 4750 1959 4750
Q 2769 4750 3195 4129
Q 3622 3509 3622 2328
Q 3622 1225 3098 567
Q 2575 -91 1691 -91
Q 1453 -91 1209 -44
Q 966 3 703 97
<path id="DejaVuSans-31" d="M 794 531
L 1825 531
L 1825 4091
L 703 3866
L 703 4441
L 1819 4666
L 2450 4666
L 2450 531
L 3481 531
L 3481 0
L 794 0
L 794 531
z
M 1959 2075
Q 2384 2075 2632 2365
Q 2881 2656 2881 3163
Q 2881 3666 2632 3958
Q 2384 4250 1959 4250
Q 1534 4250 1286 3958
Q 1038 3666 1038 3163
Q 1038 2656 1286 2365
Q 1534 2075 1959 2075
" transform="scale(0.015625)"/>
<path id="DejaVuSans-30" d="M 2034 4250
Q 1547 4250 1301 3770
Q 1056 3291 1056 2328
Q 1056 1369 1301 889
Q 1547 409 2034 409
Q 2525 409 2770 889
Q 3016 1369 3016 2328
Q 3016 3291 2770 3770
Q 2525 4250 2034 4250
z
M 2034 4750
Q 2819 4750 3233 4129
Q 3647 3509 3647 2328
Q 3647 1150 3233 529
Q 2819 -91 2034 -91
Q 1250 -91 836 529
Q 422 1150 422 2328
Q 422 3509 836 4129
Q 1250 4750 2034 4750
z
" transform="scale(0.015625)"/>
<path id="DejaVuSans-32" d="M 1228 531
@ -2500,27 +2505,6 @@ Q 3191 2616 2906 2266
Q 2828 2175 2409 1742
Q 1991 1309 1228 531
z
" transform="scale(0.015625)"/>
<path id="DejaVuSans-30" d="M 2034 4250
Q 1547 4250 1301 3770
Q 1056 3291 1056 2328
Q 1056 1369 1301 889
Q 1547 409 2034 409
Q 2525 409 2770 889
Q 3016 1369 3016 2328
Q 3016 3291 2770 3770
Q 2525 4250 2034 4250
z
M 2034 4750
Q 2819 4750 3233 4129
Q 3647 3509 3647 2328
Q 3647 1150 3233 529
Q 2819 -91 2034 -91
Q 1250 -91 836 529
Q 422 1150 422 2328
Q 422 3509 836 4129
Q 1250 4750 2034 4750
z
" transform="scale(0.015625)"/>
<path id="DejaVuSans-36" d="M 2113 2584
Q 1688 2584 1439 2293
@ -2560,23 +2544,24 @@ z
<use xlink:href="#DejaVuSans-64" transform="translate(227.34375 0)"/>
<use xlink:href="#DejaVuSans-3a" transform="translate(290.820312 0)"/>
<use xlink:href="#DejaVuSans-20" transform="translate(324.511719 0)"/>
<use xlink:href="#DejaVuSans-39" transform="translate(356.298828 0)"/>
<use xlink:href="#DejaVuSans-2e" transform="translate(419.921875 0)"/>
<use xlink:href="#DejaVuSans-20" transform="translate(451.708984 0)"/>
<use xlink:href="#DejaVuSans-53" transform="translate(483.496094 0)"/>
<use xlink:href="#DejaVuSans-65" transform="translate(546.972656 0)"/>
<use xlink:href="#DejaVuSans-70" transform="translate(608.496094 0)"/>
<use xlink:href="#DejaVuSans-74" transform="translate(671.972656 0)"/>
<use xlink:href="#DejaVuSans-65" transform="translate(711.181641 0)"/>
<use xlink:href="#DejaVuSans-6d" transform="translate(772.705078 0)"/>
<use xlink:href="#DejaVuSans-62" transform="translate(870.117188 0)"/>
<use xlink:href="#DejaVuSans-65" transform="translate(933.59375 0)"/>
<use xlink:href="#DejaVuSans-72" transform="translate(995.117188 0)"/>
<use xlink:href="#DejaVuSans-20" transform="translate(1036.230469 0)"/>
<use xlink:href="#DejaVuSans-32" transform="translate(1068.017578 0)"/>
<use xlink:href="#DejaVuSans-30" transform="translate(1131.640625 0)"/>
<use xlink:href="#DejaVuSans-32" transform="translate(1195.263672 0)"/>
<use xlink:href="#DejaVuSans-36" transform="translate(1258.886719 0)"/>
<use xlink:href="#DejaVuSans-31" transform="translate(356.298828 0)"/>
<use xlink:href="#DejaVuSans-30" transform="translate(419.921875 0)"/>
<use xlink:href="#DejaVuSans-2e" transform="translate(483.544922 0)"/>
<use xlink:href="#DejaVuSans-20" transform="translate(515.332031 0)"/>
<use xlink:href="#DejaVuSans-53" transform="translate(547.119141 0)"/>
<use xlink:href="#DejaVuSans-65" transform="translate(610.595703 0)"/>
<use xlink:href="#DejaVuSans-70" transform="translate(672.119141 0)"/>
<use xlink:href="#DejaVuSans-74" transform="translate(735.595703 0)"/>
<use xlink:href="#DejaVuSans-65" transform="translate(774.804688 0)"/>
<use xlink:href="#DejaVuSans-6d" transform="translate(836.328125 0)"/>
<use xlink:href="#DejaVuSans-62" transform="translate(933.740234 0)"/>
<use xlink:href="#DejaVuSans-65" transform="translate(997.216797 0)"/>
<use xlink:href="#DejaVuSans-72" transform="translate(1058.740234 0)"/>
<use xlink:href="#DejaVuSans-20" transform="translate(1099.853516 0)"/>
<use xlink:href="#DejaVuSans-32" transform="translate(1131.640625 0)"/>
<use xlink:href="#DejaVuSans-30" transform="translate(1195.263672 0)"/>
<use xlink:href="#DejaVuSans-32" transform="translate(1258.886719 0)"/>
<use xlink:href="#DejaVuSans-36" transform="translate(1322.509766 0)"/>
</g>
</g>
<g id="text_15">

Before

Width:  |  Height:  |  Size: 87 KiB

After

Width:  |  Height:  |  Size: 86 KiB

Before After
Before After

File diff suppressed because one or more lines are too long

10
OR_HTML_04/cpsat.html generated

File diff suppressed because one or more lines are too long

6
OR_HTML_04/cvar.html generated

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -381,7 +381,7 @@
<p>Mit Python planen, optimieren und entscheiden: von <strong>Personal, Schichten und Logistik</strong> über <strong>Energie, Ressourcen und Netzwerke</strong> bis zur <strong>Portfoliooptimierung an den Finanzmärkten</strong>.</p>
<p>Autor / Herausgeber: Dieter Schlüter</p>
<p>&lt;dieter(dot)schlueter(atsign)linix(dot)de&gt;</p>
<p>Stand: 9. September 2026</p>
<p>Stand: 10. September 2026</p>
<hr />
<nav id="TOC" role="doc-toc">
<ul>
@ -16655,7 +16655,7 @@ DCP-konvex (CVXPY-Pruefung)? False
<p><span class="math display">
\min_{\mathbf{w}}\quad \underbrace{\tfrac12\mathbf{w}^\top\boldsymbol{\Sigma}\mathbf{w}}_{\text{Risiko}}
\;-\;\underbrace{\alpha\,\boldsymbol{\mu}^\top\mathbf{w}}_{\text{Ertrag}}
\;-\;\underbrace{\beta\Big(-\textstyle\sum_i w_i\ln w_i\Big)}_{\text{Diversifikation}}
\;-\;\underbrace{\beta\Big(-\textstyle\sum_i w_i\ln w_i\Big)}_{\text{Diversifikation`\index{Diversifikation}`{=latex}}}
</span></p>
<blockquote>
<p><strong>📐 Formel-Lesehilfe zur Entropie</strong> <span class="math inline">H(\mathbf{w}) = -\sum_i w_i \ln w_i</span> ist ein Streuungsmaß: * Alles in einem Titel (<span class="math inline">w = (1,0,0,0)</span>): <span class="math inline">H = 0</span> — minimale Streuung. * Gleichverteilt (<span class="math inline">w_i = 1/4</span>): <span class="math inline">H = \ln 4 \approx 1{,}386</span> — maximale Streuung.</p>
@ -19985,7 +19985,7 @@ e(x) \le \varepsilon
<h2 id="sec:mehrziel-vorlegen">14.8 Wie man die Front vorlegt</h2>
<p>Eine Front mit zehn Punkten ist kein Ergebnis, sondern eine Speisekarte. Damit sie entscheidbar wird, gehört eine Spalte dazu, die im Programm <code>EUR je kg</code> heißt:</p>
<p><span class="math display">
\text{Schattenpreis} = \frac{\text{Aufpreis gegenüber dem Kostenminimum}}
\text{Schattenpreis`\index{Schattenpreis}`{=latex}} = \frac{\text{Aufpreis gegenüber dem Kostenminimum}}
{\text{eingesparte Kilogramm}}
</span></p>
<p>Diese Zahl ist mit etwas vergleichbar, das das Unternehmen ohnehin kennt: dem internen CO₂-Preis oder dem Zertifikatspreis. Liegt der Schattenpreis darunter, ist die Entscheidung kaufmännisch schon getroffen.</p>
@ -26173,6 +26173,11 @@ von allen Fehlversuchen genau einen: den erfolgreichsten.
<h3 id="falle-5-laufzeitexplosion">Falle 5 — Laufzeitexplosion</h3>
<p>Exakte Optimalität kann bei MILP oder CP-SAT Minuten bis Stunden dauern — und die Laufzeit wächst nicht linear mit der Problemgröße.</p>
<table>
<colgroup>
<col style="width: 33%" />
<col style="width: 33%" />
<col style="width: 33%" />
</colgroup>
<thead>
<tr class="header">
<th>Einsatzszenario</th>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

6
OR_HTML_04/index.html generated

File diff suppressed because one or more lines are too long

6
OR_HTML_04/lp.html generated

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

10
OR_HTML_04/milp.html generated

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long