<aclass="brand"href="index.html"><svgclass="icon"aria-hidden="true"><usehref="#icon-book"></use></svg><span>Optimierte Entscheidungsfindung mit Python</span></a>
<navclass="sidebar"id="sidebar"aria-label="Kapitelnavigation"><divclass="sidebar-inhalt"><detailsclass="sidebar-gruppe"><summary>Einstieg</summary><ul><lidata-kapitel="vorwort.html"><ahref="vorwort.html"><spanclass="fortschritt-haken"><svgclass="icon"aria-hidden="true"><usehref="#icon-check"></use></svg></span><span>Vorwort & Lesehilfe</span></a></li><lidata-kapitel="notation.html"><ahref="notation.html"><spanclass="fortschritt-haken"><svgclass="icon"aria-hidden="true"><usehref="#icon-check"></use></svg></span><span>Notation & Abkürzungen</span></a></li></ul></details><detailsclass="sidebar-gruppe"><summary>Teil I: Grundlagen des Operations Research</summary><ul><lidata-kapitel="einfuehrung.html"><ahref="einfuehrung.html"><spanclass="fortschritt-haken"><svgclass="icon"aria-hidden="true"><usehref="#icon-check"></use></svg></span><span>Kapitel 1: Einführung in Operations Research — Vom Ursprung zur mathematischen Entscheidungsfindung</span></a></li><lidata-kapitel="fundament.html"><ahref="fundament.html"><spanclass="fortschritt-haken"><svgclass="icon"aria-hidden="true"><usehref="#icon-check"></use></svg></span><span>Kapitel 2: Das mathematische Fundament — Vektoren, Matrizen, Konvexität{idx:Konvexität}</span></a></li><lidata-kapitel="oekosystem.html"><ahref="oekosystem.html"><spanclass="fortschritt-haken"><svgclass="icon"aria-hidden="true"><usehref="#icon-check"></use></svg></span><span>Kapitel 3: Das Python-Ökosystem für OR — Solver, Bindings und Modellierungsschichten</span></a></li><lidata-kapitel="modellierung.html"><ahref="modellierung.html"><spanclass="fortschritt-haken"><svgclass="icon"aria-hidden="true"><usehref="#icon-check"></use></svg></span><span>Kapitel 4: Vom Management-Wunsch zum Modell</span></a></li><lidata-kapitel="synthese-grundlagen.html"><ahref="synthese-grundlagen.html"><spanclass="fortschritt-haken"><svgclass="icon"aria-hidden="true"><usehref="#icon-check"></use></svg></span><span>Synthese Teil I</span></a></li></ul></details><detailsclass="sidebar-gruppe"><summary>Teil II: Die Kernverfahren der deterministischen Optimierung</summary><ul><lidata-kapitel="lp.html"><ahref="lp.html"><spanclass="fortschritt-haken"><svgclass="icon"aria-hidden="true"><usehref="#icon-check"></use></svg></span><span>Kapitel 5: Lineare Programmierung — Simplex, Dualität und Schattenpreise</span></a></li><lidata-kapitel="milp.html"><ahref="milp.html"><spanclass="fortschritt-haken"><svgclass="icon"aria-hidden="true"><usehref="#icon-check"></use></svg></span><span>Kapitel 6: Gemischt-ganzzahlige Optimierung — Diskrete Entscheidungen und Branch-and-Bound{idx:Branch-and-Bound}</span></a></li><lidata-kapitel="cpsat.html"><ahref="cpsat.html"><spanclass="fortschritt-haken"><svgclass="icon"aria-hidden="true"><usehref="#icon-check"></use></svg></span><span>Kapitel 7: Constraint Programming mit CP-SAT{idx:CP-SAT} — Logik, Scheduling und Zuweisung</span></a></li><lidata-kapitel="graphen.html"><ahref="graphen.html"><spanclass="fortschritt-haken"><svgclass="icon"aria-hidden="true"><usehref="#icon-check"></use></svg></span><span>Kapitel 8: Graphen, Flüsse und Touren — Min-Cost-Flow, Matching und VRP</span></a></li><lidata-kapitel="metaheuristiken.html"><ahref="metaheuristiken.html"><spanclass="fortschritt-haken"><svgclass="icon"aria-hidden="true"><usehref="#icon-check"></use></svg></span><span>Kapitel 9: Metaheuristiken — wenn der exakte Solver aussteigt</span></a></li><lidata-kapitel="dekomposition.html"><ahref="dekomposition.html"><spanclass="fortschritt-haken"><svgclass="icon"aria-hidden="true"><usehref="#icon-check"></use></svg></span><span>Kapitel 10: Spaltengenerierung — das Modell umbauen statt die Lösung raten</span></a></li><lidata-kapitel="synthese-kernverfahren.html"><ahref="synthese-kernverfahren.html"><spanclass="fortschritt-haken"><svgclass="icon"aria-hidden="true"><usehref="#icon-check"></use></svg></span><span>Synthese Teil II</span></a></li></ul></details><detailsclass="sidebar-gruppe"><summary>Teil III:
<navclass="breadcrumb"aria-label="Breadcrumb"><ahref="index.html">Start</a>›<span>Teil IV</span>›<span>Kapitel 17: Supply-Chain und Energieeinsatz unter Unsicherheit</span></nav>
<navclass="prev-next"><aclass="prev-next-knopf prev-next-prev"href="bruecke.html"><svgclass="icon"aria-hidden="true"><usehref="#icon-chevron-left"></use></svg><span><small>Zurück</small>Kapitel 16: Die Strukturbrücke — dieselbe Mathematik, zwei Welten</span></a><aclass="prev-next-knopf prev-next-next"href="finanzdaten.html"><span><small>Weiter</small>Kapitel 18: Finanzdaten-Modellierung — Renditen, Kovarianz und Shrinkage</span><svgclass="icon"aria-hidden="true"><usehref="#icon-chevron-right"></use></svg></a></nav>
<article>
<h1id="kap-supplychain">Kapitel 17: Supply-Chain und Energieeinsatz unter Unsicherheit</h1>
<divclass="card card-blick">
<blockquote>
<p><strong>📌 Kapitel auf einen Blick</strong></p>
<p><strong>Worum geht es?</strong> Um einen zusammenhängenden Industriefall, der die Werkzeuge aus Teil II und III zusammenführt: gemischt-ganzzahlige Entscheidungen, Szenarien, Risikomaße — an der Kraftwerkseinsatzplanung, der klassischen Aufgabe der Energiewirtschaft.</p>
<p><strong>Voraussetzungen:</strong><ahref="milp.html#kap-milp">Kapitel 6</a>, <ahref="unsicherheit.html#kap-unsicherheit">Kapitel 12</a> (zweistufige stochastische Programmierung) und <ahref="cvar.html#kap-cvar">Kapitel 20</a>.</p>
<p><strong>Danach können Sie:</strong> ein Modell aufsetzen, in dem die <strong>erste Stufe ganzzahlig</strong> ist und vor dem Zufall feststeht; erklären, warum eine Planung auf den Erwartungswert systematisch zu knapp ausfällt; und den Preis einer Versorgungssicherheitsvorgabe in Euro je vermiedener Megawattstunde ausweisen.</p>
<p><strong>Zeitbedarf:</strong> ca. 4 Stunden.</p>
<p><strong>Notebook:</strong><ahref="Notebooks_04/supplychain.ipynb">supplychain.ipynb</a> — herunterladen und in Jupyter öffnen, in Colab hochladen oder mit dem Kurs-Image starten</p>
<p>Zwei Kraftwerke können 120 MW liefern. Der Kernblock produziert für 22 €/MWh, die Gasturbine für 105 € — fünfmal so teuer. Die Merit-Order-Regel sagt: Kernblock.</p>
<p>Sie übersieht die Anfahrkosten: 40 000 € gegen 1 500 €.</p>
<divclass="sourceCode"id="cb1"><preclass="sourceCode python"><codeclass="sourceCode python"><spanid="cb1-1"><ahref="#cb1-1"aria-hidden="true"tabindex="-1"></a><spanclass="co"># Zwei Kraftwerke, die 120 MW decken sollen - aber wie lange?</span></span>
<spanid="cb1-11"><ahref="#cb1-11"aria-hidden="true"tabindex="-1"></a> k, g <spanclass="op">=</span> kosten(kernblock, stunden), kosten(gasturbine, stunden)</span>
<spanid="cb1-12"><ahref="#cb1-12"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="ss">f"</span><spanclass="sc">{</span>stunden<spanclass="sc">:>5}</span><spanclass="ss"> h </span><spanclass="sc">{</span>k<spanclass="sc">:>12,.0f}</span><spanclass="ss"></span><spanclass="sc">{</span>g<spanclass="sc">:>12,.0f}</span><spanclass="ss">"</span></span>
<spanid="cb1-13"><ahref="#cb1-13"aria-hidden="true"tabindex="-1"></a><spanclass="ss">f"</span><spanclass="sc">{</span>kernblock[<spanclass="st">'name'</span>] <spanclass="cf">if</span> k <spanclass="op"><</span> g <spanclass="cf">else</span> gasturbine[<spanclass="st">'name'</span>]<spanclass="sc">}</span><spanclass="ss">"</span>)</span>
<p><strong>Und jetzt der Punkt.</strong> Bis knapp vier Stunden ist die <em>fünfmal teurere</em> Gasturbine die günstigere Wahl. Erst danach hat der Kernblock seine Anfahrkosten wieder eingespielt.</p>
<p>Die Merit-Order — Kraftwerke nach Grenzkosten sortieren und von unten auffüllen — ist damit nur für einen <strong>einzelnen</strong> Zeitpunkt richtig. Sobald ein Tag geplant wird, hängt jede Stunde an allen anderen: Ein Block, der um 8 Uhr angefahren wird, muss bis mindestens 16 Uhr laufen, und diese Entscheidung fällt am Vorabend.</p>
<blockquote>
<p><strong>🎯 Merksatz</strong> Anfahrkosten und Mindestlaufzeiten machen aus 24 unabhängigen Stundenentscheidungen <strong>ein</strong> Problem. Genau deshalb ist die Kraftwerkseinsatzplanung ein MILP und keine Sortierung.</p>
</blockquote>
<p><strong>Warum funktioniert das?</strong> Der Umschlagpunkt ist eine einfache Rechnung: Die Anfahrkostendifferenz (38 500 €) geteilt durch die Grenzkostendifferenz je Stunde (83 €/MWh × 120 MW = 9 960 €/h) ergibt 3,9 Stunden. Bei zwei Kraftwerken kann man das im Kopf ausrechnen — bei fünf Blöcken und 24 Stunden nicht mehr.</p>
<li>… ein Unit-Commitment-Modell mit Anfahrkosten und Mindestlaufzeiten aufstellen.</li>
<li>… erklären, warum eine <strong>binäre erste Stufe</strong> das zweistufige Modell aus <ahref="unsicherheit.html#kap-unsicherheit">Kapitel 12</a> verschärft.</li>
<li>… zeigen, dass eine Planung auf den Erwartungswert nicht nur ungenau, sondern <strong>systematisch zu knapp</strong> ist.</li>
<li>… eine CVaR-Schranke auf eine physikalische Größe (nicht gedeckte Energie) legen.</li>
<li>… begründen, wann eine Risikoschranke etwas ändert — und wann sie überflüssig ist.</li>
</ol>
<hr/>
<h2id="sec:supplychain-aufgabe">17.3 Die Aufgabe</h2>
<p>Fünf Blöcke, 24 Stunden, eine Last zwischen 270 und 804 MW. Dazu Windeinspeisung, die niemand am Vorabend kennt.</p>
<p>Die Reihenfolge ist typisch: <strong>je billiger im Betrieb, desto träger und teurer im Anfahren.</strong> Das ist keine Willkür, sondern Physik — ein großer Dampfprozess braucht Stunden, bis er auf Temperatur ist.</p>
<h3id="die-zeitstruktur-der-entscheidung">Die Zeitstruktur der Entscheidung</h3>
<p>Hier geht das Kapitel über <ahref="unsicherheit.html#sec:unsicherheit-zweistufige-stochastische-programmierung">Abschnitt 12.5</a> hinaus:</p>
<table>
<colgroup>
<colstyle="width: 25%"/>
<colstyle="width: 25%"/>
<colstyle="width: 25%"/>
<colstyle="width: 25%"/>
</colgroup>
<thead>
<trclass="header">
<th>Stufe</th>
<th>Entscheidung</th>
<th>Typ</th>
<th>wann</th>
</tr>
</thead>
<tbody>
<trclass="odd">
<td><strong>1</strong></td>
<td>Welcher Block läuft in welcher Stunde?</td>
<td><strong>binär</strong>, für alle Szenarien gleich</td>
<td>am Vorabend, bevor der Wind bekannt ist</td>
</tr>
<trclass="even">
<td><strong>2</strong></td>
<td>Wie viel liefert jeder laufende Block?</td>
<td>kontinuierlich, je Szenario verschieden</td>
<td>am Tag selbst, laufend anpassbar</td>
</tr>
</tbody>
</table>
<p>Im Kapitel Unsicherheit war die erste Stufe kontinuierlich (Kapazität kaufen, Menge festlegen). Hier ist sie <strong>ganzzahlig</strong> — und das ändert die Sache grundlegend: Eine Kapazität lässt sich anteilig erhöhen, ein Kraftwerk nicht zu 30 % anfahren.</p>
<divclass="card card-formel">
<blockquote>
<p><strong>🔤 Formel-Übersetzer: die Kopplung der beiden Stufen</strong></p>
<td>„Läuft Block <spanclass="math inline">k</span> in Stunde <spanclass="math inline">t</span>?” — <strong>eine</strong> Antwort für alle Szenarien</td>
<td>„Erzeugung plus Wind plus Nichtdeckung deckt die Last.”</td>
</tr>
</tbody>
</table>
<p>Die beiden mittleren Zeilen sind der ganze Trick: Sie verbinden eine <strong>binäre</strong> Größe (<spanclass="math inline">u</span>) mit einer <strong>kontinuierlichen</strong> (<spanclass="math inline">p</span>) — und weil <spanclass="math inline">u</span> szenarioübergreifend gleich ist, die Szenarien untereinander.</p>
</blockquote>
</div>
<hr/>
<h2id="sec:supplychain-programm">17.4 Das Programm</h2>
<spanid="cb3-5"><ahref="#cb3-5"aria-hidden="true"tabindex="-1"></a><spanclass="co">Kapitel Supply-Chain: Welche Bloecke laufen morgen? Und was, wenn kein Wind weht?</span></span>
<spanid="cb3-7"><ahref="#cb3-7"aria-hidden="true"tabindex="-1"></a><spanclass="co">Die Kraftwerkseinsatzplanung (englisch Unit Commitment) ist die Aufgabe, an der</span></span>
<spanid="cb3-8"><ahref="#cb3-8"aria-hidden="true"tabindex="-1"></a><spanclass="co">sich in der Energiewirtschaft alles entscheidet: Fuer jede Stunde des naechsten</span></span>
<spanid="cb3-9"><ahref="#cb3-9"aria-hidden="true"tabindex="-1"></a><spanclass="co">Tages muss feststehen, welche Bloecke am Netz sind. Ein Kernblock braucht acht</span></span>
<spanid="cb3-10"><ahref="#cb3-10"aria-hidden="true"tabindex="-1"></a><spanclass="co">Stunden Mindestlaufzeit und 40.000 Euro Anfahrkosten - wer ihn abschaltet, hat</span></span>
<spanid="cb3-11"><ahref="#cb3-11"aria-hidden="true"tabindex="-1"></a><spanclass="co">ihn fuer den Rest des Tages verloren.</span></span>
<spanid="cb3-13"><ahref="#cb3-13"aria-hidden="true"tabindex="-1"></a><spanclass="co">Das Besondere liegt in der Zeitstruktur, und es geht ueber das zweistufige</span></span>
<spanid="cb3-14"><ahref="#cb3-14"aria-hidden="true"tabindex="-1"></a><spanclass="co">Modell aus dem Kapitel Unsicherheit hinaus:</span></span>
<spanid="cb3-16"><ahref="#cb3-16"aria-hidden="true"tabindex="-1"></a><spanclass="co"> STUFE 1 Das AN/AUS je Block und Stunde. Binaer, und es steht am Vorabend</span></span>
<spanid="cb3-17"><ahref="#cb3-17"aria-hidden="true"tabindex="-1"></a><spanclass="co"> fest - bevor irgendjemand weiss, wie viel Wind morgen weht.</span></span>
<spanid="cb3-18"><ahref="#cb3-18"aria-hidden="true"tabindex="-1"></a><spanclass="co"> STUFE 2 Die Fahrweise: wie viel jeder laufende Block liefert. Das darf</span></span>
<spanid="cb3-19"><ahref="#cb3-19"aria-hidden="true"tabindex="-1"></a><spanclass="co"> sich stundenweise an die Wirklichkeit anpassen.</span></span>
<spanid="cb3-21"><ahref="#cb3-21"aria-hidden="true"tabindex="-1"></a><spanclass="co">Die erste Stufe ist also GANZZAHLIG und szenariouebergreifend gleich, die</span></span>
<spanid="cb3-22"><ahref="#cb3-22"aria-hidden="true"tabindex="-1"></a><spanclass="co">zweite kontinuierlich und je Szenario verschieden. Genau diese Kombination</span></span>
<spanid="cb3-23"><ahref="#cb3-23"aria-hidden="true"tabindex="-1"></a><spanclass="co">macht das Problem interessant - und sie ist der Grund, warum ein Plan, der auf</span></span>
<spanid="cb3-24"><ahref="#cb3-24"aria-hidden="true"tabindex="-1"></a><spanclass="co">den Wind-Erwartungswert gerechnet wurde, in der Wirklichkeit teuer wird.</span></span>
<spanid="cb3-28"><ahref="#cb3-28"aria-hidden="true"tabindex="-1"></a><spanclass="co"> 1. Deterministisch: gerechnet mit dem Wind-ERWARTUNGSWERT, danach gegen 40</span></span>
<spanid="cb3-30"><ahref="#cb3-30"aria-hidden="true"tabindex="-1"></a><spanclass="co"> 2. Zweistufig: der Commitment-Plan sieht alle 40 Szenarien.</span></span>
<spanid="cb3-31"><ahref="#cb3-31"aria-hidden="true"tabindex="-1"></a><spanclass="co"> 3. Mit Versorgungssicherheit: die Nichtdeckung in den schlechtesten Faellen</span></span>
<spanid="cb3-32"><ahref="#cb3-32"aria-hidden="true"tabindex="-1"></a><spanclass="co"> wird begrenzt - und der Preis dafuer in Euro je vermiedener MWh</span></span>
<spanid="cb3-56"><ahref="#cb3-56"aria-hidden="true"tabindex="-1"></a>ALPHA <spanclass="op">=</span><spanclass="fl">0.90</span><spanclass="co"># die schlechtesten 10 % der Szenarien</span></span>
<spanid="cb3-57"><ahref="#cb3-57"aria-hidden="true"tabindex="-1"></a>LASTABWURF <spanclass="op">=</span><spanclass="fl">3_000.0</span><spanclass="co"># EUR je nicht gedeckter MWh ("value of lost load")</span></span>
<spanid="cb3-58"><ahref="#cb3-58"aria-hidden="true"tabindex="-1"></a>NIEDRIGER_ABWURFPREIS <spanclass="op">=</span><spanclass="fl">300.0</span><spanclass="co"># zum Vergleich: ein Marktpreisdeckel</span></span>
<spanid="cb3-67"><ahref="#cb3-67"aria-hidden="true"tabindex="-1"></a><spanclass="co">"""Windeinspeisung je Szenario und Stunde.</span></span>
<spanid="cb3-69"><ahref="#cb3-69"aria-hidden="true"tabindex="-1"></a><spanclass="co"> Zwei Zutaten, die zusammen den Unterschied machen: eine breite</span></span>
<spanid="cb3-70"><ahref="#cb3-70"aria-hidden="true"tabindex="-1"></a><spanclass="co"> lognormale Streuung des Tagesniveaus - und in 15 % der Faelle eine</span></span>
<spanid="cb3-71"><ahref="#cb3-71"aria-hidden="true"tabindex="-1"></a><spanclass="co"> DUNKELFLAUTE, in der praktisch gar kein Wind weht. Solche seltenen,</span></span>
<spanid="cb3-72"><ahref="#cb3-72"aria-hidden="true"tabindex="-1"></a><spanclass="co"> extremen Faelle sind der Grund, warum der Erwartungswert als</span></span>
<spanid="cb3-73"><ahref="#cb3-73"aria-hidden="true"tabindex="-1"></a><spanclass="co"> Planungsgrundlage nicht genuegt.</span></span>
<spanid="cb3-86"><ahref="#cb3-86"aria-hidden="true"tabindex="-1"></a><spanclass="co">"""Commitment (Stufe 1) und Fahrweise je Szenario (Stufe 2) in einem Modell.</span></span>
<spanid="cb3-88"><ahref="#cb3-88"aria-hidden="true"tabindex="-1"></a><spanclass="co">'wind' hat die Form (Szenarien, Stunden). Mit einer einzigen Zeile</span></span>
<spanid="cb3-89"><ahref="#cb3-89"aria-hidden="true"tabindex="-1"></a><spanclass="co"> Windprognose wird daraus die deterministische Planung.</span></span>
<spanid="cb3-91"><ahref="#cb3-91"aria-hidden="true"tabindex="-1"></a><spanclass="co">'cvar_grenze' begrenzt den CVaR der Nichtdeckung ueber die Szenarien -</span></span>
<spanid="cb3-92"><ahref="#cb3-92"aria-hidden="true"tabindex="-1"></a><spanclass="co"> dieselbe Rockafellar-Uryasev-Konstruktion wie im Kapitel CVaR, nur dass</span></span>
<spanid="cb3-93"><ahref="#cb3-93"aria-hidden="true"tabindex="-1"></a><spanclass="co"> hier keine Verluste in Euro, sondern Megawattstunden begrenzt werden.</span></span>
<spanid="cb3-102"><ahref="#cb3-102"aria-hidden="true"tabindex="-1"></a> laeuft <spanclass="op">=</span> [[solver.BoolVar(<spanclass="ss">f"laeuft_</span><spanclass="sc">{</span>k<spanclass="sc">}</span><spanclass="ss">_</span><spanclass="sc">{</span>t<spanclass="sc">}</span><spanclass="ss">"</span>) <spanclass="cf">for</span> t <spanclass="kw">in</span><spanclass="bu">range</span>(STUNDEN)]</span>
<spanid="cb3-103"><ahref="#cb3-103"aria-hidden="true"tabindex="-1"></a><spanclass="cf">for</span> k <spanclass="kw">in</span><spanclass="bu">range</span>(anzahl_bloecke)]</span>
<spanid="cb3-104"><ahref="#cb3-104"aria-hidden="true"tabindex="-1"></a> faehrt_an <spanclass="op">=</span> [[solver.BoolVar(<spanclass="ss">f"start_</span><spanclass="sc">{</span>k<spanclass="sc">}</span><spanclass="ss">_</span><spanclass="sc">{</span>t<spanclass="sc">}</span><spanclass="ss">"</span>) <spanclass="cf">for</span> t <spanclass="kw">in</span><spanclass="bu">range</span>(STUNDEN)]</span>
<spanid="cb3-105"><ahref="#cb3-105"aria-hidden="true"tabindex="-1"></a><spanclass="cf">for</span> k <spanclass="kw">in</span><spanclass="bu">range</span>(anzahl_bloecke)]</span>
<spanid="cb3-109"><ahref="#cb3-109"aria-hidden="true"tabindex="-1"></a><spanclass="cf">for</span> t <spanclass="kw">in</span><spanclass="bu">range</span>(STUNDEN)] <spanclass="cf">for</span> k <spanclass="kw">in</span><spanclass="bu">range</span>(anzahl_bloecke)]</span>
<spanid="cb3-115"><ahref="#cb3-115"aria-hidden="true"tabindex="-1"></a><spanclass="cf">for</span> t <spanclass="kw">in</span><spanclass="bu">range</span>(STUNDEN):</span>
<spanid="cb3-116"><ahref="#cb3-116"aria-hidden="true"tabindex="-1"></a><spanclass="co"># Anfahren erkennen: aus im Vortakt, an im aktuellen</span></span>
<spanid="cb3-117"><ahref="#cb3-117"aria-hidden="true"tabindex="-1"></a> vorher <spanclass="op">=</span> laeuft[k][t <spanclass="op">-</span><spanclass="dv">1</span>] <spanclass="cf">if</span> t <spanclass="op">></span><spanclass="dv">0</span><spanclass="cf">else</span><spanclass="dv">0</span></span>
<spanid="cb3-119"><ahref="#cb3-119"aria-hidden="true"tabindex="-1"></a><spanclass="co"># Mindestlaufzeit: wer anfaehrt, laeuft die naechsten Stunden weiter</span></span>
<spanid="cb3-120"><ahref="#cb3-120"aria-hidden="true"tabindex="-1"></a><spanclass="cf">for</span> spaeter <spanclass="kw">in</span><spanclass="bu">range</span>(t, <spanclass="bu">min</span>(STUNDEN, t <spanclass="op">+</span> mindestlaufzeit)):</span>
<spanid="cb3-122"><ahref="#cb3-122"aria-hidden="true"tabindex="-1"></a><spanclass="co"># Ein laufender Block liefert zwischen Mindest- und Nennleistung,</span></span>
<spanid="cb3-123"><ahref="#cb3-123"aria-hidden="true"tabindex="-1"></a><spanclass="co"># ein stehender gar nichts. Das koppelt beide Stufen.</span></span>
<spanid="cb3-129"><ahref="#cb3-129"aria-hidden="true"tabindex="-1"></a><spanclass="cf">for</span> t <spanclass="kw">in</span><spanclass="bu">range</span>(STUNDEN):</span>
<spanid="cb3-130"><ahref="#cb3-130"aria-hidden="true"tabindex="-1"></a> solver.Add(<spanclass="bu">sum</span>(leistung[j][k][t] <spanclass="cf">for</span> k <spanclass="kw">in</span><spanclass="bu">range</span>(anzahl_bloecke))</span>
<spanid="cb3-140"><ahref="#cb3-140"aria-hidden="true"tabindex="-1"></a><spanclass="cf">for</span> t <spanclass="kw">in</span><spanclass="bu">range</span>(STUNDEN)) <spanclass="op">-</span> schwelle)</span>
<spanid="cb3-145"><ahref="#cb3-145"aria-hidden="true"tabindex="-1"></a><spanclass="cf">for</span> k <spanclass="kw">in</span><spanclass="bu">range</span>(anzahl_bloecke) <spanclass="cf">for</span> t <spanclass="kw">in</span><spanclass="bu">range</span>(STUNDEN))</span>
<spanid="cb3-148"><ahref="#cb3-148"aria-hidden="true"tabindex="-1"></a><spanclass="cf">for</span> k <spanclass="kw">in</span><spanclass="bu">range</span>(anzahl_bloecke) <spanclass="cf">for</span> t <spanclass="kw">in</span><spanclass="bu">range</span>(STUNDEN))</span>
<spanid="cb3-151"><ahref="#cb3-151"aria-hidden="true"tabindex="-1"></a><spanclass="op">*</span><spanclass="bu">sum</span>(nichtdeckung[j][t] <spanclass="cf">for</span> t <spanclass="kw">in</span><spanclass="bu">range</span>(STUNDEN))</span>
<spanid="cb3-158"><ahref="#cb3-158"aria-hidden="true"tabindex="-1"></a><spanclass="cf">if</span> status <spanclass="kw">not</span><spanclass="kw">in</span> (pywraplp.Solver.OPTIMAL, pywraplp.Solver.FEASIBLE):</span>
<spanid="cb3-160"><ahref="#cb3-160"aria-hidden="true"tabindex="-1"></a> plan <spanclass="op">=</span> np.array([[laeuft[k][t].solution_value() <spanclass="cf">for</span> t <spanclass="kw">in</span><spanclass="bu">range</span>(STUNDEN)]</span>
<spanid="cb3-161"><ahref="#cb3-161"aria-hidden="true"tabindex="-1"></a><spanclass="cf">for</span> k <spanclass="kw">in</span><spanclass="bu">range</span>(anzahl_bloecke)]).<spanclass="bu">round</span>()</span>
<spanid="cb3-162"><ahref="#cb3-162"aria-hidden="true"tabindex="-1"></a><spanclass="cf">return</span> plan, dauer, status <spanclass="op">==</span> pywraplp.Solver.OPTIMAL</span>
<spanid="cb3-166"><ahref="#cb3-166"aria-hidden="true"tabindex="-1"></a><spanclass="co">"""Commitment steht fest - nur noch die Fahrweise je Szenario optimieren.</span></span>
<spanid="cb3-168"><ahref="#cb3-168"aria-hidden="true"tabindex="-1"></a><spanclass="co"> Das ist die ehrliche Bewertung eines Plans: Er wird der Wirklichkeit</span></span>
<spanid="cb3-169"><ahref="#cb3-169"aria-hidden="true"tabindex="-1"></a><spanclass="co"> ausgesetzt und darf nur noch das anpassen, was sich am Tag selbst</span></span>
<spanid="cb3-178"><ahref="#cb3-178"aria-hidden="true"tabindex="-1"></a><spanclass="cf">for</span> t <spanclass="kw">in</span><spanclass="bu">range</span>(STUNDEN)] <spanclass="cf">for</span> k <spanclass="kw">in</span><spanclass="bu">range</span>(anzahl_bloecke)]</span>
<spanid="cb3-180"><ahref="#cb3-180"aria-hidden="true"tabindex="-1"></a><spanclass="cf">for</span> t <spanclass="kw">in</span><spanclass="bu">range</span>(STUNDEN)]</span>
<spanid="cb3-182"><ahref="#cb3-182"aria-hidden="true"tabindex="-1"></a><spanclass="cf">for</span> t <spanclass="kw">in</span><spanclass="bu">range</span>(STUNDEN):</span>
<spanid="cb3-185"><ahref="#cb3-185"aria-hidden="true"tabindex="-1"></a><spanclass="cf">for</span> t <spanclass="kw">in</span><spanclass="bu">range</span>(STUNDEN):</span>
<spanid="cb3-186"><ahref="#cb3-186"aria-hidden="true"tabindex="-1"></a> solver.Add(<spanclass="bu">sum</span>(leistung[k][t] <spanclass="cf">for</span> k <spanclass="kw">in</span><spanclass="bu">range</span>(anzahl_bloecke))</span>
<spanid="cb3-190"><ahref="#cb3-190"aria-hidden="true"tabindex="-1"></a><spanclass="cf">for</span> k <spanclass="kw">in</span><spanclass="bu">range</span>(anzahl_bloecke) <spanclass="cf">for</span> t <spanclass="kw">in</span><spanclass="bu">range</span>(STUNDEN))</span>
<spanid="cb3-191"><ahref="#cb3-191"aria-hidden="true"tabindex="-1"></a><spanclass="op">+</span><spanclass="bu">sum</span>(abwurfpreis <spanclass="op">*</span> fehlt[t] <spanclass="cf">for</span> t <spanclass="kw">in</span><spanclass="bu">range</span>(STUNDEN)))</span>
<spanid="cb3-197"><ahref="#cb3-197"aria-hidden="true"tabindex="-1"></a><spanclass="op">*</span><spanclass="bu">max</span>(<spanclass="fl">0.0</span>, plan[k, t] <spanclass="op">-</span> (plan[k, t <spanclass="op">-</span><spanclass="dv">1</span>] <spanclass="cf">if</span> t <spanclass="op">></span><spanclass="dv">0</span><spanclass="cf">else</span><spanclass="fl">0.0</span>))</span>
<spanid="cb3-198"><ahref="#cb3-198"aria-hidden="true"tabindex="-1"></a><spanclass="cf">for</span> k <spanclass="kw">in</span><spanclass="bu">range</span>(anzahl_bloecke) <spanclass="cf">for</span> t <spanclass="kw">in</span><spanclass="bu">range</span>(STUNDEN))</span>
<spanid="cb3-203"><ahref="#cb3-203"aria-hidden="true"tabindex="-1"></a><spanclass="co">"""Mittelwert der schlechtesten (1-alpha) Faelle."""</span></span>
<spanid="cb3-225"><ahref="#cb3-225"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="st">" KRAFTWERKSEINSATZ: DER PLAN STEHT, BEVOR DER WIND WEHT"</span>)</span>
<spanid="cb3-229"><ahref="#cb3-229"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="ss">f"Last </span><spanclass="sc">{</span>LAST<spanclass="sc">.</span><spanclass="bu">min</span>()<spanclass="sc">:.0f}</span><spanclass="ss"> bis </span><spanclass="sc">{</span>LAST<spanclass="sc">.</span><spanclass="bu">max</span>()<spanclass="sc">:.0f}</span><spanclass="ss"> MW, "</span></span>
<spanid="cb3-230"><ahref="#cb3-230"aria-hidden="true"tabindex="-1"></a><spanclass="ss">f"Wind im Erwartungswert </span><spanclass="sc">{</span>WIND_ERWARTUNG<spanclass="sc">.</span><spanclass="bu">min</span>()<spanclass="sc">:.0f}</span><spanclass="ss"> bis "</span></span>
<spanid="cb3-232"><ahref="#cb3-232"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="ss">f"Nicht gedeckte Last kostet </span><spanclass="sc">{</span>LASTABWURF<spanclass="sc">:,.0f}</span><spanclass="ss"> EUR je MWh.</span><spanclass="ch">\n</span><spanclass="ss">"</span>)</span>
<spanid="cb3-256"><ahref="#cb3-256"aria-hidden="true"tabindex="-1"></a><spanclass="co"># --- Was die Zeilen bedeuten -----------------------------------------</span></span>
<spanid="cb3-258"><ahref="#cb3-258"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="st">"Was der Erwartungswert-Plan anrichtet</span><spanclass="ch">\n</span><spanclass="st">"</span>)</span>
<spanid="cb3-259"><ahref="#cb3-259"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="ss">f" Er ist auf dem Papier der billigste - gerechnet auf den mittleren"</span>)</span>
<spanid="cb3-260"><ahref="#cb3-260"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="ss">f" Wind kostet er weniger als jeder andere. In der Wirklichkeit liegt"</span>)</span>
<spanid="cb3-261"><ahref="#cb3-261"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="ss">f" er </span><spanclass="sc">{</span>det[<spanclass="st">'mittel'</span>] <spanclass="op">/</span> sto[<spanclass="st">'mittel'</span>] <spanclass="op">-</span><spanclass="dv">1</span><spanclass="sc">:+.0%}</span><spanclass="ss"> ueber dem zweistufigen Plan, und sein "</span></span>
<spanid="cb3-263"><ahref="#cb3-263"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="ss">f" kostet </span><spanclass="sc">{</span>det[<spanclass="st">'max'</span>] <spanclass="op">/</span> sto[<spanclass="st">'max'</span>]<spanclass="sc">:.1f}</span><spanclass="ss">-mal so viel."</span>)</span>
<spanid="cb3-264"><ahref="#cb3-264"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="ss">f"</span><spanclass="ch">\n</span><spanclass="ss"> Der Grund steht in der letzten Spalte: In </span><spanclass="sc">{</span>det[<spanclass="st">'betroffen'</span>]<spanclass="sc">}</span><spanclass="ss"> von </span><spanclass="sc">{</span>SZENARIEN<spanclass="sc">}</span><spanclass="ss">"</span></span>
<spanid="cb3-266"><ahref="#cb3-266"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="ss">f" Last abgeworfen werden. Was fehlt, sind nicht Kraftwerke, sondern"</span>)</span>
<spanid="cb3-267"><ahref="#cb3-267"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="ss">f" ANGEFAHRENE Kraftwerke - und ein Block mit acht Stunden"</span>)</span>
<spanid="cb3-268"><ahref="#cb3-268"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="ss">f" Mindestlaufzeit laesst sich um 18 Uhr nicht mehr herbeirufen."</span>)</span>
<spanid="cb3-270"><ahref="#cb3-270"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="ss">f"</span><spanclass="ch">\n</span><spanclass="ss"> Der Unterschied im Plan ist klein:"</span>)</span>
<spanid="cb3-271"><ahref="#cb3-271"aria-hidden="true"tabindex="-1"></a><spanclass="cf">for</span> name, plan <spanclass="kw">in</span> [(<spanclass="st">"Erwartungswert"</span>, plan_det), (<spanclass="st">"zweistufig"</span>, plan_sto),</span>
<spanid="cb3-274"><ahref="#cb3-274"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="ss">f"</span><spanclass="sc">{</span>name<spanclass="sc">:<16}</span><spanclass="ss"></span><spanclass="sc">{</span><spanclass="st">''</span><spanclass="sc">.</span>join(<spanclass="bu">str</span>(x) <spanclass="cf">for</span> x <spanclass="kw">in</span> laufend)<spanclass="sc">}</span><spanclass="ss">"</span></span>
<spanid="cb3-276"><ahref="#cb3-276"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="ss">f"</span><spanclass="ch">\n</span><spanclass="ss"> Der zweistufige Plan haelt </span><spanclass="sc">{</span>sto[<spanclass="st">'blockstunden'</span>] <spanclass="op">-</span> det[<spanclass="st">'blockstunden'</span>]<spanclass="sc">}</span><spanclass="ss">"</span></span>
<spanid="cb3-277"><ahref="#cb3-277"aria-hidden="true"tabindex="-1"></a><spanclass="ss">f"Blockstunden mehr vor - das genuegt,"</span>)</span>
<spanid="cb3-278"><ahref="#cb3-278"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="ss">f" um alle </span><spanclass="sc">{</span>det[<spanclass="st">'betroffen'</span>]<spanclass="sc">}</span><spanclass="ss"> Lastabwuerfe zu vermeiden."</span>)</span>
<spanid="cb3-280"><ahref="#cb3-280"aria-hidden="true"tabindex="-1"></a><spanclass="co"># --- Der Preis der Sicherheit ----------------------------------------</span></span>
<spanid="cb3-283"><ahref="#cb3-283"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="ss">f" Bei </span><spanclass="sc">{</span>LASTABWURF<spanclass="sc">:,.0f}</span><spanclass="ss"> EUR/MWh kostet die CVaR-Schranke NICHTS: Der"</span>)</span>
<spanid="cb3-284"><ahref="#cb3-284"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="st">" risikoneutrale Plan haelt sie schon ein. Das ist kein Zufall - bei"</span>)</span>
<spanid="cb3-285"><ahref="#cb3-285"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="st">" diesem Preis lohnt sich Vorhaltung bereits im Erwartungswert."</span>)</span>
<spanid="cb3-286"><ahref="#cb3-286"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="st">"</span><spanclass="ch">\n</span><spanclass="st"> Interessant wird die Schranke dort, wo der Schaden ZU NIEDRIG"</span>)</span>
<spanid="cb3-287"><ahref="#cb3-287"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="st">" bepreist ist. Dieselbe Rechnung mit einem Marktpreisdeckel von"</span>)</span>
<spanid="cb3-305"><ahref="#cb3-305"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="ss">f"</span><spanclass="ch">\n</span><spanclass="ss"> Jetzt greift die Schranke: Der risikoneutrale Plan nimmt in"</span>)</span>
<spanid="cb3-306"><ahref="#cb3-306"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="ss">f"</span><spanclass="sc">{</span>billig[<spanclass="st">'betroffen'</span>]<spanclass="sc">}</span><spanclass="ss"> von </span><spanclass="sc">{</span>SZENARIEN<spanclass="sc">}</span><spanclass="ss"> Szenarien einen Lastabwurf in Kauf, weil er bei"</span>)</span>
<spanid="cb3-307"><ahref="#cb3-307"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="ss">f"</span><spanclass="sc">{</span>NIEDRIGER_ABWURFPREIS<spanclass="sc">:,.0f}</span><spanclass="ss"> EUR/MWh billiger ist als das Vorhalten eines Blocks."</span>)</span>
<spanid="cb3-308"><ahref="#cb3-308"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="ss">f"</span><spanclass="ch">\n</span><spanclass="ss"> Aufpreis fuer die Sicherheit: </span><spanclass="sc">{</span>aufpreis<spanclass="sc">:,.0f}</span><spanclass="ss"> EUR je Tag"</span>)</span>
<spanid="cb3-311"><ahref="#cb3-311"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="ss">f" -></span><spanclass="sc">{</span>aufpreis <spanclass="op">/</span> vermieden<spanclass="sc">:,.0f}</span><spanclass="ss"> EUR je vermiedener MWh"</span>)</span>
<spanid="cb3-312"><ahref="#cb3-312"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="ss">f"</span><spanclass="ch">\n</span><spanclass="ss"> Diese Zahl ist die Entscheidungsgrundlage - genau wie die Spalte"</span>)</span>
<spanid="cb3-313"><ahref="#cb3-313"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="ss">f"'EUR je kg' im Kapitel Mehrziel. Sie sagt der Aufsicht, was ihre"</span>)</span>
<spanid="cb3-315"><ahref="#cb3-315"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="ss">f" zu streiten, wie wichtig sie ist."</span>)</span>
<spanid="cb3-318"><ahref="#cb3-318"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="st">" WAS MAN DARAUS MITNIMMT"</span>)</span>
<spanid="cb3-320"><ahref="#cb3-320"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="st">"1. Die erste Stufe ist binaer und traege. Was am Vorabend nicht"</span>)</span>
<spanid="cb3-321"><ahref="#cb3-321"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="st">" angefahren wurde, steht am naechsten Tag nicht zur Verfuegung -"</span>)</span>
<spanid="cb3-322"><ahref="#cb3-322"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="st">" egal, wie hoch der Preis dann steigt."</span>)</span>
<spanid="cb3-323"><ahref="#cb3-323"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="st">"2. Deshalb ist der Erwartungswert als Planungsgrundlage nicht nur"</span>)</span>
<spanid="cb3-324"><ahref="#cb3-324"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="st">" ungenau, sondern SYSTEMATISCH zu knapp: Er plant fuer einen Tag,"</span>)</span>
<spanid="cb3-325"><ahref="#cb3-325"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="st">" der so nie eintritt, und laesst keine Reserve fuer die Haelfte"</span>)</span>
<spanid="cb3-326"><ahref="#cb3-326"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="st">" der Faelle, in denen es schlechter kommt."</span>)</span>
<spanid="cb3-327"><ahref="#cb3-327"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="st">"3. Der Ausweg ist keine bessere Windprognose, sondern ein Modell,"</span>)</span>
<spanid="cb3-328"><ahref="#cb3-328"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="st">" das die Szenarien SIEHT. Die Rechenzeit dafuer liegt hier im"</span>)</span>
<spanid="cb3-329"><ahref="#cb3-329"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="st">" Sekundenbereich - der Aufwand ist die Modellierung, nicht der"</span>)</span>
<spanid="cb3-331"><ahref="#cb3-331"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="st">"4. Wo der Lastabwurf teuer genug bepreist ist, deckt schon die"</span>)</span>
<spanid="cb3-332"><ahref="#cb3-332"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="st">" Minimierung der ERWARTETEN Kosten die Extremfaelle mit ab. Die"</span>)</span>
<spanid="cb3-333"><ahref="#cb3-333"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="st">" Risikoschranke wird genau dann gebraucht, wenn der Schaden ZU"</span>)</span>
<spanid="cb3-334"><ahref="#cb3-334"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="st">" NIEDRIG bepreist ist - was bei Versorgungssicherheit die Regel"</span>)</span>
<spanid="cb3-335"><ahref="#cb3-335"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="st">" ist, weil ein Marktpreisdeckel nicht den volkswirtschaftlichen"</span>)</span>
<spanid="cb3-336"><ahref="#cb3-336"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="st">" Schaden abbildet. Dann liefert sie den Preis der Vorgabe in Euro"</span>)</span>
<spanid="cb3-337"><ahref="#cb3-337"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="st">" je vermiedener MWh, und darueber laesst sich verhandeln."</span>)</span>
<imgsrc="bilder_04/kap_supplychain_lastabwurf.svg"alt="Abb. 17.1: Die 40 Szenarien einzeln, aufsteigend nach Kosten. Punkte markieren Szenarien mit Lastabwurf. Erzeugt von bilder_04/erzeuge_lastabwurf_verteilung.py."/>
<figcaptionaria-hidden="true">Abb. 17.1: Die 40 Szenarien einzeln, aufsteigend nach Kosten. Punkte markieren Szenarien mit Lastabwurf. Erzeugt von <code>bilder_04/erzeuge_lastabwurf_verteilung.py</code>.</figcaption>
</figure>
<p><strong>Was Sie in der Abbildung sehen.</strong> Der Erwartungswert-Plan ist in den ruhigen Szenarien tatsächlich der billigere — die rote Kurve verläuft links von der grünen. Er kippt erst rechts, und zwar so weit, dass der Mittelwert das Vorzeichen wechselt.</p>
<p><strong>Wofür genau?</strong> Die Summendifferenz von 523 514 € sagt noch nicht, wo sie entsteht. Zerlegt man sie nach Kostenarten, wird aus dem Befund eine Aussage, die man vorlegen kann:</p>
<p>Drei Dinge stehen darin, die die Tabelle nicht zeigt. Die <strong>Anfahrkosten sind in beiden Plänen gleich</strong> (58 000 €) — der Erwartungswert-Plan spart also nicht dort, wo man es vermuten würde. Er spart <strong>12 725 € Brennstoff</strong>, weil er weniger Blockstunden vorhält. Und er bezahlt dafür <strong>536 239 € Lastabwurf</strong>: das <strong>42-fache</strong> seiner Ersparnis.</p>
<p>Genau diese Gegenüberstellung ist es, die eine Investitionsentscheidung trägt. „149 % mehr” ist eine Zahl, über die man streiten kann; „wir sparen 12 725 € und riskieren dafür 536 239 €” ist eine, über die man entscheidet.</p>
<blockquote>
<p><strong>📌 Zum Diagramm</strong> Es wird von <code>bilder_04/erzeuge_wirkung.py</code> erzeugt, das die Instanz aus <code>Kraftwerkseinsatz.py</code><strong>erneut rechnet</strong> statt Zahlen zu übernehmen — und dabei die beiden abgedruckten Summen exakt reproduziert. Die Trennung von Brennstoff- und Abwurfkosten ist der einzige Zusatz; das Buchprogramm braucht sie nicht.</p>
<p><strong>Sechs zusätzliche Blockstunden verhindern 28 Lastabwürfe.</strong> Der zweistufige Plan fährt den zweiten Block eine Stunde früher an und lässt ihn bis 21 Uhr statt bis 16 Uhr laufen.</p>
<blockquote>
<p><strong>⚠️ Warum der Erwartungswert hier systematisch versagt</strong></p>
<p>Der Fehler ist nicht, dass die Windprognose ungenau wäre. Er liegt in der <strong>Trägheit der ersten Stufe</strong>: Was am Vorabend nicht angefahren wurde, steht am nächsten Tag nicht zur Verfügung — egal, wie hoch der Preis dann steigt.</p>
<p>Eine Planung auf den Mittelwert lässt in der Hälfte der Fälle zu wenig Reserve. Bei einer <em>anpassbaren</em> Größe wäre das halb so schlimm, weil man nachsteuern könnte. Bei einem Kernblock mit acht Stunden Mindestlaufzeit gibt es kein Nachsteuern.</p>
<p>Das ist eine Verschärfung des „Fluchs des Durchschnitts” aus <ahref="unsicherheit.html#sec:unsicherheit-der-fluch-des-durchschnitts">Abschnitt 12.3</a>: Dort war der Mittelwert eine schlechte Näherung, hier ist er eine <strong>nicht revidierbare</strong> schlechte Näherung.</p>
</blockquote>
<hr/>
<h2id="sec:supplychain-sicherheit">17.6 Was Versorgungssicherheit kostet</h2>
<p>Der dritte Plan legt eine CVaR-Schranke auf die nicht gedeckte Energie: Im Mittel der schlechtesten 10 % der Szenarien darf <strong>nichts</strong> fehlen. Dieselbe Rockafellar-Uryasev-Konstruktion wie in <ahref="cvar.html#kap-cvar">Kapitel 20</a>, nur dass hier Megawattstunden begrenzt werden statt Euro.</p>
<p>Das Ergebnis ist zunächst enttäuschend — und dann lehrreich:</p>
<p>Bei 3 000 €/MWh kostet die Schranke <strong>nichts</strong>: Der risikoneutrale Plan hält sie längst ein. Bei diesem Preis lohnt sich das Vorhalten eines Blocks schon im Erwartungswert, lange bevor jemand über Risiko spricht.</p>
<p>Erst bei einem Marktpreisdeckel von 300 €/MWh greift sie. Dann nimmt der risikoneutrale Plan in 8 von 40 Szenarien einen Lastabwurf in Kauf, weil er billiger ist als Vorhaltung — und die Schranke kostet 844 € je Tag für 18,4 vermiedene MWh im CVaR:</p>
<p><spanclass="math display">
\frac{844\ \text{€}}{18{,}4\ \text{MWh}} \approx 46\ \text{€ je vermiedener MWh}
</span></p>
<blockquote>
<p><strong>🎯 Merksatz</strong> Eine Risikoschranke ändert genau dann etwas, wenn der Schaden <strong>zu niedrig bepreist</strong> ist. Ist er realistisch bewertet, erledigt die Minimierung der erwarteten Kosten die Absicherung von selbst.</p>
</blockquote>
<p>Das ist keine akademische Feinheit, sondern die reale Lage der Energiewirtschaft: Ein Marktpreisdeckel bildet den volkswirtschaftlichen Schaden eines Stromausfalls nicht ab. Genau deshalb gibt es regulatorische Vorgaben zur Versorgungssicherheit — und diese Zahl, 46 € je vermiedener MWh, ist das, worüber sich verhandeln lässt. Sie ist dasselbe Instrument wie die Spalte „€ je kg” in <ahref="mehrziel.html#sec:mehrziel-vorlegen">Abschnitt 14.8</a>.</p>
<p><strong>Aufgabe 17.1 ⭐ — Der Umschlagpunkt.</strong> Rechnen Sie den Umschlagpunkt aus dem Schnellstart für eine Leistung von 60 MW statt 120 MW nach. In welche Richtung verschiebt er sich, und warum ist das plausibel?</p>
<p><strong>Aufgabe 17.2 ⭐ — Die fehlende Nebenbedingung.</strong> Das Modell kennt Mindestlaufzeiten, aber keine <strong>Mindeststillstandszeiten</strong>. Formulieren Sie die entsprechende Bedingung. Welchen realen Sachverhalt bildet sie ab?</p>
<p><strong>Aufgabe 17.3 ⭐⭐ — Wie viele Szenarien?</strong> Rechnen Sie mit 10, 20, 40 und 80 Szenarien. Ab wann ändert sich der Commitment-Plan nicht mehr? Was folgt daraus für die Praxis — und was hat das mit <ahref="prognose.html#sec:prognose-messfalle">Abschnitt 15.6</a> zu tun?</p>
<p><strong>Aufgabe 17.4 ⭐⭐ — Der Wert eines Speichers.</strong> Ergänzen Sie einen Batteriespeicher (100 MW, 400 MWh, Wirkungsgrad 90 %). Um wie viel sinken die erwarteten Kosten — und was ist der Speicher damit je MWh Kapazität wert?</p>
<p><strong>Aufgabe 17.5 ⭐⭐⭐ — Wenn es größer wird.</strong> Erhöhen Sie auf 20 Blöcke und 168 Stunden (eine Woche). Beobachten Sie MIP-Gap und Rechenzeit (<ahref="milp.html#sec:milp-gap">Abschnitt 6.8</a>). Ab wann wird das Problem für den exakten Solver zu groß — und welches Verfahren aus <ahref="metaheuristiken.html#kap-metaheuristiken">Kapitel 9</a> würden Sie einsetzen?</p>
<hr/>
<h2id="sec:supplychain-denkfehler">17.8 Finde den Denkfehler</h2>
<divclass="card card-denkfehler">
<blockquote>
<p><strong>🐛 „Wir rechnen mit dem P50-Szenario”</strong></p>
<p>Ein Netzbetreiber beschreibt sein Vorgehen:</p>
<blockquote>
<p><em>„Wir verwenden für die Tagesplanung das <strong>P50-Szenario</strong> der Windprognose — also den > Median. Die Hälfte der Tage fällt besser aus, die Hälfte schlechter, im Mittel gleicht > sich das aus. Für die Extremfälle haben wir zusätzlich eine Reserve von 5 % der Last > vorgehalten, das ist die branchenübliche Größenordnung.”</em></p>
</blockquote>
<p>Das klingt sorgfältig, und beides ist gängige Praxis.</p>
<p><strong>Beide Teile der Aussage enthalten einen Fehler. Welche?</strong></p>
<p>Ein Hinweis zum zweiten Teil: Sehen Sie sich in der Ausgabe des Programms an, <em>welche</em> Größe der Plan verändert hat, um die Lastabwürfe zu vermeiden — und vergleichen Sie das mit dem, was eine prozentuale Leistungsreserve leisten kann.</p>
</blockquote>
</div>
<hr/>
<h2id="sec:supplychain-quiz">17.9 Micro-Quiz</h2>
<divclass="card card-quiz">
<blockquote>
<p><strong>❓ Drei Fragen</strong></p>
<p><strong>1. Warum ist die Merit-Order-Regel („billigstes Kraftwerk zuerst”) für die Tagesplanung nicht ausreichend?</strong> a) Weil sie die Netzverluste ignoriert. b) Weil Anfahrkosten und Mindestlaufzeiten die Stunden miteinander koppeln — die Entscheidung einer Stunde bindet die folgenden. c) Weil Grenzkosten in der Praxis nicht bekannt sind.</p>
<p><strong>2. Was unterscheidet dieses zweistufige Modell von dem in <ahref="unsicherheit.html#kap-unsicherheit">Kapitel 12</a>?</strong> a) Es hat mehr Szenarien. b) Die erste Stufe ist <strong>binär</strong> und damit nicht anteilig anpassbar. c) Es minimiert den CVaR statt des Erwartungswerts.</p>
<p><strong>3. Bei 3 000 €/MWh kostet die CVaR-Schranke nichts, bei 300 €/MWh dagegen 844 €/Tag. Warum?</strong> a) Weil der Solver bei kleineren Zahlen ungenauer rechnet. b) Weil bei realistisch hohem Abwurfpreis schon die Minimierung der erwarteten Kosten Vorhaltung erzwingt; die Schranke greift nur, wenn der Schaden zu niedrig bepreist ist. c) Weil die CVaR-Schranke bei hohen Preisen numerisch unwirksam wird.</p>
<li>Erklären Sie in zwei Sätzen, warum ein Kraftwerkspark nicht wie ein Regal aufgefüllt werden kann.</li>
<li>Welche Größe ist in diesem Modell die „here and now”-Entscheidung, welche die „wait and see”-Entscheidung?</li>
<li>Warum ist eine Planung auf den Erwartungswert hier <em>systematisch</em> zu knapp und nicht nur ungenau?</li>
<li>Wann ändert eine Risikoschranke etwas an der Lösung — und wann nicht?</li>
<li>Sie sollen einer Regulierungsbehörde erklären, was ihre Versorgungssicherheitsvorgabe kostet. Welche Zahl nennen Sie, und wie ist sie entstanden?</li>
<li><strong>Anfahrkosten und Mindestlaufzeiten</strong> machen aus 24 Stundenentscheidungen ein einziges Problem. Die Merit-Order gilt nur für einen einzelnen Zeitpunkt; im Schnellstart schlägt die fünfmal teurere Gasturbine den Kernblock bis knapp vier Stunden.</li>
<li>Das Modell ist zweistufig mit <strong>binärer erster Stufe</strong>: Das An/Aus steht am Vorabend fest und gilt für alle Szenarien, die Fahrweise passt sich an. Das ist eine Verschärfung gegenüber <ahref="unsicherheit.html#kap-unsicherheit">Kapitel 12</a>, wo die erste Stufe kontinuierlich war.</li>
<li>Eine Planung auf den <strong>Wind-Erwartungswert</strong> kostet hier 149 % mehr und führt in 28 von 40 Szenarien zum Lastabwurf. Der Grund ist nicht die Prognosegüte, sondern die Trägheit: Was nicht angefahren wurde, ist nicht verfügbar.</li>
<li>Der zweistufige Plan braucht dafür nur <strong>sechs zusätzliche Blockstunden</strong>.</li>
<li>Eine <strong>CVaR-Schranke</strong> auf die nicht gedeckte Energie ändert nur dann etwas, wenn der Schaden zu niedrig bepreist ist. Bei realistischen 3 000 €/MWh erledigt die Minimierung der erwarteten Kosten die Absicherung von selbst.</li>
<li>Wo sie greift, liefert sie den <strong>Preis der Vorgabe</strong>: 46 € je vermiedener MWh — eine Zahl, über die man verhandeln kann.</li>