solve_network: enable rolling horizon

This commit is contained in:
Fabian 2023-07-11 17:48:35 +02:00
parent 4bb0716414
commit 723350c8ef
4 changed files with 42 additions and 39 deletions

View File

@ -630,15 +630,18 @@ solving:
#tmpdir: "path/to/tmp"
options:
clip_p_max_pu: 1.e-2
linearized_unit_commitment: true
load_shedding: false
transmission_losses: 0
noisy_costs: true
skip_iterations: true
rolling_horizon: false
seed: 123
# options that go into the optimize function
track_iterations: false
min_iterations: 4
max_iterations: 6
seed: 123
transmission_losses: 0
linearized_unit_commitment: true
horizon: 365
solver:
name: gurobi
@ -666,7 +669,6 @@ solving:
AggFill: 0
PreDual: 0
GURO_PAR_BARDENSETHRESH: 200
seed: 10 # Consistent seed for all plattforms
gurobi-numeric-focus:
name: gurobi
NumericFocus: 3 # Favour numeric stability over speed

View File

@ -70,7 +70,7 @@ renewable:
cutout: europe-2019-era5
conventional:
unit_commitment: true
unit_commitment: false
dynamic_fuel_price: true
nuclear:
p_max_pu: "data/nuclear_p_max_pu.csv" # float of file name
@ -88,3 +88,5 @@ solving:
#tmpdir: "path/to/tmp"
options:
load_shedding: true
rolling_horizon: true
horizon: 365

View File

@ -7,11 +7,14 @@ run:
scenario:
clusters: # number of nodes in Europe, any integer between 37 (1 node per country-zone) and several hundred
- 37
- 37c
opts: # only relevant for PyPSA-Eur
- 'Ept'
snapshots:
start: "2019-04-01"
end: "2019-04-10"
start: "2019-01-01"
end: "2019-02-01"
inclusive: 'left' # include start, not end
conventional:
unit_commitment: false

View File

@ -598,47 +598,43 @@ def extra_functionality(n, snapshots):
def solve_network(n, config, solving, opts="", **kwargs):
set_of_options = solving["solver"]["options"]
solver_options = solving["solver_options"][set_of_options] if set_of_options else {}
solver_name = solving["solver"]["name"]
cf_solving = solving["options"]
track_iterations = cf_solving.get("track_iterations", False)
min_iterations = cf_solving.get("min_iterations", 4)
max_iterations = cf_solving.get("max_iterations", 6)
transmission_losses = cf_solving.get("transmission_losses", 0)
linearized_unit_commitment = cf_solving.get("linearized_unit_commitment", False)
kwargs["solver_options"] = (
solving["solver_options"][set_of_options] if set_of_options else {}
)
kwargs["solver_name"] = solving["solver"]["name"]
kwargs["extra_functionality"] = extra_functionality
kwargs["transmission_losses"] = cf_solving.get("transmission_losses", False)
kwargs["linearized_unit_commitment"] = cf_solving.get(
"linearized_unit_commitment", False
)
rolling_horizon = cf_solving.pop("rolling_horizon", False)
skip_iterations = cf_solving.pop("skip_iterations", False)
if not n.lines.s_nom_extendable.any():
skip_iterations = True
logger.info("No expandable lines found. Skipping iterative solving.")
# add to network for extra_functionality
n.config = config
n.opts = opts
skip_iterations = cf_solving.get("skip_iterations", False)
if not n.lines.s_nom_extendable.any():
skip_iterations = True
logger.info("No expandable lines found. Skipping iterative solving.")
if skip_iterations:
status, condition = n.optimize(
solver_name=solver_name,
transmission_losses=transmission_losses,
extra_functionality=extra_functionality,
linearized_unit_commitment=linearized_unit_commitment,
**solver_options,
**kwargs,
)
if rolling_horizon:
kwargs["horizon"] = cf_solving.get("horizon", 365)
kwargs["overlap"] = cf_solving.get("overlap", 0)
n.optimize.optimize_with_rolling_horizon(**kwargs)
status, condition = "", ""
elif skip_iterations:
status, condition = n.optimize(**kwargs)
else:
kwargs["track_iterations"] = (cf_solving.get("track_iterations", False),)
kwargs["min_iterations"] = (cf_solving.get("min_iterations", 4),)
kwargs["max_iterations"] = (cf_solving.get("max_iterations", 6),)
status, condition = n.optimize.optimize_transmission_expansion_iteratively(
solver_name=solver_name,
track_iterations=track_iterations,
min_iterations=min_iterations,
max_iterations=max_iterations,
linearized_unit_commitment=linearized_unit_commitment,
transmission_losses=transmission_losses,
extra_functionality=extra_functionality,
**solver_options,
**kwargs,
**kwargs
)
if status != "ok":
if status != "ok" and not rolling_horizon:
logger.warning(
f"Solving status '{status}' with termination condition '{condition}'"
)