I’d like to share a small open model and get this community’s critique.
Premise. The German “renewables vs. nuclear” debate compresses the
decision onto one axis. enesys treats it as two independent axes —
base-load source × backup vector — yielding six pathways over 2026–2055: EE-GAS and
EE-H2 (renewables, German: “Erneuerbare Energien”), KKW-GAS and KKW-H2 (nuclear), plus WEITER-SO (status-quo) and BESTAND (existing-fleet) as reference paths.
Scope. Not a dispatch model (PyPSA-Eur / oemof / calliope cover
that ground far better), not an integrated assessment model, not a forecast. It answers one
question: which pathway is robustly cheapest as a forward decision —
sunk costs excluded by construction — across the assumption
substrates the opposing camps would actually defend?
Method hook — camp symmetry. Every contested parameter (nuclear
CAPEX, electrolysis cost, gas price, WACC, …) carries an EE-optimistic
and a nuclear-optimistic variant alongside the neutral default. In
the point estimate each camp gets its preferred path; the recommendation
comes from min-max-regret across camps, not from “EE wins
everywhere”. I’d genuinely like this attacked.
Substrate cross-check. A consistency test swaps in the PyPSA-
Technology-Data defaults (the input substrate of PyPSA-DE / Ariadne)
and asserts the structural ranking survives.
Reproducibility. Primary-source tag on every default, formulas
with worked examples, pinned dependencies, continuous integration on every commit, MIT license.
Five-minute Colab quickstart.
What I’d most value: where camp ranges are mis-calibrated, where the
forward-cost framing breaks, whether the regret logic holds up.
Critical methodology issues explicitly welcome.
Hello,
Thanks for sharing. One technical question about this specific sentence “not a dispatch model”: how is the dispatch problem actually solved? Because in the README I see a similar “negative statement”
Not a high-resolution dispatch model. No hourly grid simulation, no unit-commitment, no network flows. For that: PyPSA-Eur, oemof, calliope.
but in the end I didn’t find their “positive counterparts”:
no network flows: I imagine it’s a single node/copper plate, correct?
no unit-commitment: just no ON/OFF (→ MILP) cost or no convex flow optimization as well (sometimes called Energy Dispatch)? And if no optimum, then what: rule-based dispatch?
No hourly grid simulation: so is it daily, weekly?
Pierre, fair point — here are the positive counterparts:
No network flows → single node / copper plate. Correct.
No unit-commitment → rule-based merit-order, no optimization. Not MILP, not an LP economic-dispatch — a deterministic merit-order loop over a fixed priority per path, with endogenous fuel-cap expansion when the stack can’t cover demand.
No hourly simulation → annual aggregate. One representative year, no intra-year resolution. Full-load hours (vlh_normal) cap each tech; merit-order allocates within those caps.
No hard feasibility check: uncovered annual demand is priced as unserved energy (value of lost load), not flagged infeasible. Curtailment and seasonal storage are absorbed into the parameterized full load hours. So enesys can’t tell you whether a mix survives intra-year variability — only what it costs forward if dispatched merit-order on an annual aggregate. That’s where PyPSA-Eur / oemof belong, by design.
To point out that adaptive rule‑based dispatch can be shoehorned into minimum‑cost flow problems (which are normally used to provide for economic dispatch when the incoming bids are used to create the system costs). But only under so‑called recursive dynamic optimization (aka stepping through the time horizon) and not under an intertemporal formulation (like PyPSA).
The defunct xeona framework supported both adaptive rule‑based dispatch contained within actors (and also the much blunter exongenously prescribed dispatch) and recursive dynamic optimization with high temporal (hourly) and topological (key nodes) resolution. See the PhD report on GitHub for details. It is quite possible that other hybrid agent‑based/minimum‑cost flow frameworks offer similar functionality, but I’m not going to speculate on which. Best R.
You’re right: calling it “merit-order, no optimization” wasn’t quite accurate, since running the cheapest plants first is itself the answer to a small cost-minimisation problem. The distinction that actually matters is whether you step through time one period at a time (no foresight) or optimise the whole horizon at once with foresight, like PyPSA. enesys has neither — it just has no foresight built in.
And it’s simpler than even the step-by-step kind: there are no time steps inside the year at all. Each path has a fixed order in which plants are used, the model works with yearly totals, and if that stack can’t cover demand it lets the backup fuel stretch to fill the gap. So it’s closest to your “exogenously prescribed dispatch,” only at a yearly level instead of hour-by-hour. That’s on purpose — the things this distinction really matters for, like shifting stored energy across the seasons, are exactly what I leave to PyPSA-Eur / oemof.
I didn’t know xeona. Putting the dispatch logic inside the actors instead of one big optimisation is the opposite of how enesys works — I’ll read the PhD report. Thanks for the pointer.
This design brief is certainly more approachable, but predates the implementation:
Morrison, Robbie (20 October 2004). xeona: a generalized policy-oriented energy modeling environment — Issue A — Presentation. Berlin, Germany: Technical University of Berlin. doi:10.5281/zenodo.16635883. Presented to the New Zealand Energy Modelling Workshop #1, Victoria University of Wellington, Wellington, New Zealand.
I’d also look at AMIRIS (and also ignore the spurious AI slop banner at the start of that Wikipedia article).
Thanks! AMIRIS is the useful one for me — I hadn’t really placed it before. I had mentally grouped the explorative, non-optimising approaches together with the optimisation models, so that’s a helpful correction: simulating what actors actually do is a third paradigm, distinct from both PyPSA-style optimisation and my prescribed annual mix. The cold-Dunkelflaute work in VERMEER sits right next to my winter-stress block, so I’ll definitely have a look at that. And I’ll read the 2004 design brief for the background. Appreciated.
Do you think deliberately non-intertemporal annualised models form a distinct modelling class with clear validity conditions, alongside optimisation and agent-based simulation approaches? If so, where would you see their main strengths and limitations? In particular, what do you see as the main trade-off compared to intertemporal optimisation in terms of information loss versus interpretability?
Model typology is always somewhat inspired. I usually add the qualifier “hybrid” to agent‑based models that include least‑cost functionality (often to capture market clearing).
I’m comfortable with the idea that rules‑based models (or frameworks if you prefer) constitute a distinct category. The question of their temporal or topological resolution (annual, copper plate) is somewhat secondary.
Simplified, rapidly solvable formulations have a place. Here is an example from Poland where PyPSA‑PL‑mini is used to explore some defined but large solution space using multiple runs (requiring just a few minutes each to solve):
The preferred solutions can then be “confirmed” using a few fuller model runs, perhaps using the same codebase and inputs if you’re lucky.
Determining how actors in agent‑based models make decisions and then characterizing that behavior is a research question. I guess AI agents are going to be used in this simulated context (and some researchers now want to experiment on power system operations in real life) as large language models become more advanced. Another class of model, surely?
Here is an example using rule‑based bounded rationality in an agent‑based context (there is probably newer work too):
Wittmann, Tobias, Robbie Morrison, Julius Richter, and Thomas Bruckner (2006). A bounded rationality model of private energy investment decisions. Mt Royal, New Jersey, United States: International Association for Energy Economics (IEAA). doi:10.2139/ssrn.922020. Presented at the 29th IAEE International Conference: Securing energy in insecure times, Potsdam, Germany, 7–10 June 2006.
So agent‑based models now form a number of distinct sub‑typologies too, as indicated.
Finally, to note recent efforts to create agreed sets of scenarios and apply them to different frameworks to better understand validities and shortcomings. And further, other efforts to harmonize input datasets. Both require a certain conformity and even convergence for the projects involved.
Thanks, that helps. “Resolution is secondary to the category” is exactly the bet enesys makes: keep it coarse so every assumption stays out in the open and arguable, at the price of saying nothing about feasibility.
Explore-then-confirm is how I’d hope it gets used, with one caveat: enesys doesn’t sweep a solution space like PyPSA-PL-mini, it just ranks the six prescribed pathways under the camp-symmetric ranges. The regret-preferred one is then the candidate you’d hand to a fuller model.
On harmonisation: the cross-check currently substitutes the PyPSA Technology-Data defaults and checks the ranking still holds. If I add a second substrate, Fraunhofer ISE is the obvious one for the German context. But is there a cost database the intercomparison work already treats as canonical? I’d rather use that than choose my own.
Thanks also for the references; the hybrid/bounded-rationality sub-types are new to me, I’ll read the Wittmann paper.
What I’d still most like attacked is the decision logic, less the resolution: whether the camp ranges are mis-calibrated, and whether min-max-regret holds up when each camp gets the inputs it would defend. If anyone has tried it against deliberately partisan parameter sets, I’d like to know where it fell over.