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

5.2 KiB
Raw Blame History

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_000er 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.