rezani poole i kdyz je zlenenobonusove pole na stejnmstridaci
This commit is contained in:
@@ -562,6 +562,18 @@ def solve_dispatch(
|
||||
# by to jinak vedlo k nežádoucímu exportu / infeasible řešení.
|
||||
GEN_CUTOFF_PENALTY_CZK_KWH = 5.0
|
||||
|
||||
# Heuristika: pokud existuje necurtailable PV B a v budoucnu v horizontu nastane buy < 0,
|
||||
# chceme mít motivaci držet baterii „prázdnější“ pro pozdější výhodný import / bonusové PV B okno.
|
||||
# V okně sell < 0 pak preferujeme curtail PV A (místo placeného exportu), a to tak,
|
||||
# že dočasně snížíme penalizaci ca[t] (curtailment) na 0.
|
||||
has_pv_b = any(float(s.pv_b_forecast_w) > 0.0 for s in slots)
|
||||
future_neg_buy_from: list[bool] = [False] * T
|
||||
seen_neg_buy = False
|
||||
for i in range(T - 1, -1, -1):
|
||||
if float(slots[i].buy_price) < 0.0:
|
||||
seen_neg_buy = True
|
||||
future_neg_buy_from[i] = seen_neg_buy
|
||||
|
||||
# EV proměnné per vozidlo
|
||||
ev_direct = [[pulp.LpVariable(f"evd_{e}_{t}", 0,
|
||||
min(vehicles[e].max_charge_power_w, grid.max_import_power_w))
|
||||
@@ -611,7 +623,16 @@ def solve_dispatch(
|
||||
+ ev_via_bat[e][t] * slots[t].buy_price * EV_ROUNDTRIP_FACTOR * INTERVAL_H / 1000
|
||||
for e in range(EV)
|
||||
)
|
||||
+ ca[t] * CURTAILMENT_PENALTY
|
||||
+ ca[t]
|
||||
* (
|
||||
0.0
|
||||
if (
|
||||
has_pv_b
|
||||
and future_neg_buy_from[t]
|
||||
and float(slots[t].sell_price) < 0.0
|
||||
)
|
||||
else CURTAILMENT_PENALTY
|
||||
)
|
||||
for t in range(T)
|
||||
)
|
||||
+ soc_deficit_24h * soc_deficit_penalty_czk_kwh / 1000
|
||||
|
||||
Reference in New Issue
Block a user