LEAG-COALLOG/notebooks/constraints_overview.md
2026-03-17 12:00:21 +01:00

63 lines
5.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 5760): Max je Schicht zu J/SP/V/B3; hart kodiert (`20k/25k/25k/32k`).
- **Welzow Einzelziele** (Zellen 6265): Max je Schicht; hart kodiert (`26k/24k/24k/20k`); plus `welzow_j_multiple_2kt` mit `2_000`er Schritt.
- **Kombinierte Summen** (Zellen 6669): RW+N → SP/V/J/B3 und W → SP/V/B3; hart kodiert (`25k, 55k, 24k, 25k`).
- **Gesamtkombis** (Zellen 7071): 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.