63 lines
5.2 KiB
Markdown
63 lines
5.2 KiB
Markdown
first_opt_model.ipynb – Nebenbedingungen & Datenquellen (geordnet)
|
||
=================================================================
|
||
|
||
## Setup
|
||
- **Imports** (Zelle 2): pandas, numpy, pyomo, matplotlib; Basis-Notebook-Kontext.
|
||
- **Tabellen laden** (Zelle 3): Alle Parquet-Files aus `../data/processed` → Dict `tables[<name>]`.
|
||
|
||
## Datenaufbereitung
|
||
- **bedarf** (Zelle 5): Aus `tables['rohkohlebedarf']`; Spalten JW, SP, BW3, BW4, Veredel_Nochtener, Veredel_Welzower; Datum → week/weekday/day.
|
||
- **bounds_power_plants** (Zelle 5): Toleranzen Kraftwerke pro Tag/Woche/Monat.
|
||
- **bounds_day** (Zelle 8): Filter `bounds_power_plants` auf Zeitraum „pro Tag“; `match_kraftwerk_row` findet Zeile pro j.
|
||
- **veredelung_bounds** (Zelle 14): `tables['veredelung_bounds']` in `v_day/v_week/v_month`; `match_ver_row` holt Zeile je Kohlesorte/Zeitraum.
|
||
- **weitere Tabellen** (später genutzt): `tables['kohle_mix']` (Mischungsanteile), `tables['foerderkapaz']` (Förderlimits, Monat), `tables['verladungskap']` (KLP, Schicht/Tag), `tables['Verfuegbarkeiten']` (Schichtgrenzen, NaN = kein Limit).
|
||
|
||
## Modellaufbau
|
||
- **Sets** (Zelle 10): `J={J, SP, B3, B4, V}`, `W` aus `bedarf.week`, `D={Sa..Fr}`, `S={F,S,N}`, `I={Reichwalde, Nochten, Welzow}`, Hilfssets `I_W/I_N`.
|
||
- **Parameter-Container** (Zelle 12): `d, dV_N, dV_W, a_min_day, a_max_day` (alle mutable).
|
||
- **Befüllung Bedarfe & Tages-Toleranzen** (Zelle 14): `d` und `a_min_day/a_max_day` aus `rohkohlebedarf` + `bounds_day` (Absolut/Pct kombiniert). `dV_N/dV_W` aus `rohkohlebedarf`.
|
||
|
||
## Parameterdefinition (weiterführend)
|
||
- **Wochen/Monats-Toleranzen** (Zelle 21): `d_week/d_month` und `a_min/a_max` aus `bounds_power_plants` (pro Woche/Monat, inkl. Gesamtzeilen).
|
||
- **Veredlung Toleranzen** (Zelle 22): `a_min/a_max` für Tag/Woche/Monat aus `veredelung_bounds` pro Kohlesorte.
|
||
- **Mischungsparameter** (Zelle 25): `alpha_min/alpha_max` aus `tables['kohle_mix']` (Mapping Namen→Model-Keys).
|
||
- **Förderkapazitäten** (Zelle 45): `F_max_month` aus `tables['foerderkapaz']` (Zeitraum pro Monat).
|
||
- **Verladungskapazitäten** (Zelle 48): Caps aus `tables['verladungskap']` für Boxberg (RW+NO) und Welzow-Süd (Schicht/Tag).
|
||
- **Verfügbarkeiten** (Zelle 52): `cap_Welzow / cap_RW_N` aus `tables['Verfuegbarkeiten']` (NaN ⇒ `Constraint.Skip`).
|
||
|
||
## Tageslieferung und Abweichungen
|
||
- **delivery_tolerance** (Zelle 19): `y[j,w,d]` in `[d + a_min_day, d + a_max_day]` für `j≠V`. Daten: `d` aus `rohkohlebedarf`; `a_min_day/a_max_day` aus `bounds_power_plants` (pro Tag).
|
||
- **demand/dev/dev_balance** (Zelle 33): Nachfrage für V = `dV_N + dV_W`, sonst `d`; `dev_pos/neg` balancieren. Daten: `rohkohlebedarf`.
|
||
- **max_reached / no_three_in_a_row** (Zelle 35): Binärflag für erreichte Max-Tagesabweichung, nicht drei Tage in Folge. Daten: `a_max_day` aus `bounds_power_plants`.
|
||
- **Veredlung devV_*** (Zelle 37): Abweichungen je Kohlesorte; Daten: `dV_N/dV_W` aus `rohkohlebedarf`.
|
||
- **Schichtglättung glatt_hi/lo** (Zelle 39): L1-Abweichung zu Schichtmittel; Parameter `lambda_glatt` intern gesetzt.
|
||
- **Verbot Reichwalde→V** (Zelle 43): Hart kodiert.
|
||
|
||
## Wochen-/Monatslieferungen und Abweichung
|
||
- **week_tolerance / month_tolerance** (Zelle 21): `y_week/y_month` je Kraftwerk in Wochen-/Monats-Bändern. Daten: `d_week/d_month` + Toleranzen aus `bounds_power_plants`.
|
||
- **week_total_tolerance / month_total_tolerance** (Zelle 21): Gesamt über Kraftwerke in Bändern; Daten: Gesamtzeilen `bounds_power_plants`.
|
||
- **Veredlung v_*_day/week/month_tol** (Zelle 22): Lieferungen nach V (Nochten/Welzow/Gesamt) in Toleranzbändern; Daten: `veredelung_bounds` + `rohkohlebedarf`.
|
||
|
||
## Kohlensortenmischverhältnis
|
||
- **mix_lower / mix_upper** (Zelle 25): Anteil Kohlesorte i an Tagesgesamt `y_day[j]` zwischen `alpha_min/alpha_max`. Daten: `tables['kohle_mix']`.
|
||
|
||
## Kapazitäten & kombinierte Flussgrenzen
|
||
- **cap_month / cap_month_RWNO** (Zelle 45): Monatsförderung je Tagebau aus `foerderkapaz`; RW+NO hart auf `3_000_000` t.
|
||
- **cap_boxberg_shift/day, cap_welzow_shift/day** (Zelle 48): KLP-Limits aus `verladungskap` (Schicht/Tag).
|
||
- **cap_welzow_con / cap_rw_n_con** (Zelle 52): Schichtlimits aus `Verfuegbarkeiten`, sonst Skip.
|
||
- **Paar-Grenzen RW+N** (Zellen 57–60): Max je Schicht zu J/SP/V/B3; hart kodiert (`20k/25k/25k/32k`).
|
||
- **Welzow Einzelziele** (Zellen 62–65): Max je Schicht; hart kodiert (`26k/24k/24k/20k`); plus `welzow_j_multiple_2kt` mit `2_000`er Schritt.
|
||
- **Kombinierte Summen** (Zellen 66–69): RW+N → SP/V/J/B3 und W → SP/V/B3; hart kodiert (`25k, 55k, 24k, 25k`).
|
||
- **Gesamtkombis** (Zellen 70–71): RW+N+W → J/B3; hart kodiert (`34k, 32k`).
|
||
- **Gekoppelte Kombinationen** (Zellen 72, 74): RW+N→{J/SP/V} mit W→B3; hart kodiert (`20k, 32k`).
|
||
|
||
## Schichtmuster / Balance
|
||
- **shift_dev_4k** (Zelle 79): `|x_s1 - x_s2| ≤ 10_000` (≈10 kt) je Arc/Tag; hart kodiert.
|
||
- **shift_pattern** (Zelle 80): Erzwingt Muster aufsteigend/absteigend/gleich; Parameter `MAX_FLOW=10_000_000`, `TOL=0`; hart kodiert.
|
||
|
||
## Ausgeschaltete Blöcke
|
||
- Zellen 61, 76, 78: Alternative Schichtlogiken (min je Schicht, Binärflags für Nutzung); aktuell auskommentiert.
|
||
|
||
## Offene TODOs
|
||
- (Zelle 107) Straf-/Bonusterme (Early/Late), Förderband Boxberg 4, Lager/Bunker-Logik, Nichtverfügbarkeiten Verbraucher/Tagebaue, weitere kapazitive Constraints aus PDF.
|