Puzzle: Unit Commitment

Puzzle: Unit Commitment

Due to the advent of renewables, the math of power generation has shifted from predictable arithmetic to a volatile high-dimensional puzzle. As an asset manager at Spinners, the DS power utility, you are tasked with committing a fleet of generators a day in advance for a 30 hour planning horizon to meet a demand that is increasingly influenced by weather-driven uncertainty. Can you help?

Your objective is to find a good commitment of units that minimizes expected costs plus the CVaR-5% (the average costs over the 5% worst outcomes for your solution). You must decide which units to commit for each hour in the planning horizon, knowing that tomorrow’s actual demand could swing anywhere between a "Cool Breeze" and a "Heat Spike."

The Fleet

You manage four units with distinct physical and economic profiles:

Demand Uncertainty

The forecast for the 30 hours in the planning horizon is characterized by three potential foundation scenarios. You must commit your fleet before you know which scenario will occur.

The actual distribution of demands you have to prepare for is given as follows: First, we choose with equal probability X=Cool Breeze of X=Heat Spike. Then, we choose a value L in [0,1] uniformly at random and set the foundation demand in all periods p

F(p) = L * Expected(p) + (1-L) * X(p).

To obtain the final demand, we choose 30 noise factors N(p), each sampled from a Gaussian with mu=1 and sigma=0.01. The final demand in each scenario is then

D(p) = N(p) * F(p).

Like this, we obtain a wealth of scenarios, each of which is a combination of the Expected scenario and either the Cool Breeze or the Heat Spike scenario, whereby the factor L determines how far we deviate from the Expected scenario. Finally, we add uncorrelated noise with standard deviation 1% of demand to each period.

The Economic Model & Constraints

  • Must-Run Violation ($200/MWh): Triggered if your combined Lower Bound (the physical Min or the downward Ramp limit from the previous hour) exceeds demand. For each MWh you produce over demand, you have to pay $200.
  • Scarcity Violation ($2,000/MWh): Triggered if demand exceeds your Upper Bound (the physical Max or the upward Ramp limit from the previous hour). For each MWh you produce under demand, you pay $2,000.
  • Startup: Every time a unit switches from 0 to 1, the Start Cost is incurred. After a Startup, the unit must run anywhere between its min capacity and min capacity plus ramp up value.
  • Min Run Time: Once activated, a unit must remain online for the specified duration (e.g., 8h for CCGTs).
  • Operational Dispatch: Within your bounds, units are dispatched via Merit Order (lowest fuel cost first).

 

The Challenge

Define the three 30-hour binary commitment vectors for CCGT1, CCGT2, and the Peaker (Nuclear is fixed to ON). In the beginning, all units are running at their min cap and have been on for at least the respective min-duration.

The Goal

Minimize the Mean Costs + CVaR-5%.

As experienced OR expert, this should not take long to do. Especially, since the data is waiting for you in this Colab. Use the 'visualize_commitment'-function to turn your solution into an image.

How will you handle the uncertainty in the demand forecast? How many scenarios will you need to assess the CVaR-5% with reasonable accuracy? And how will you realize the merit-order commitment strategy?

The problem appears tailor-made for 2-stage stochastic programming: In the first phase, decide which unit will be committed at what times. Then, in the second phase, when demand is known, we ramp up and ramp down as needed, using the cheapest power producers first, which can be done with an LP. For the CVaR computation, we then need to add logic to compute the average over the most expensive 5% of the scenarios we built. If we use 100 scenarios, we would need to compute the average over the most expensive 5 scenarios.

As it is often the case, 100 scenarios would be very little in any real-world setting. For a legacy solver, it is a challenge to scale up. For a modern stochastic optimizer like Seeker, it is simple, both in terms of modeling (the model used below is 110 lines long) and in terms of runtime. Using 10,000 scenarios, we can create this plan within 210 seconds on a simple Macbook Air with 10 parallel processes.

Visualizing our committed capacity against the demand scenarios, we see how Seeker follows the general demand curve and aims to envelope it within the maximum and minimum run rates of the power units.

Here are the last lines of the Seeker output:

At time 99.565975: Objective = 5778708.438896; Status = Feasible; Evaluations = 14797
    mean = 2161030.317842; cvar = 3617678.121055; 

We expect costs of $2.16 million, but the average costs over the worst 500 of our 10,000 scenarios is $3.62 million.

Note the stark difference between stochastic programming (the traditional approach using MIP technology) and modern stochastic optimization that leverages AI-based search. With Seeker, we can utilize parallel compute, scale up the number of scenarios, and thereby provide risk-tailored solutions. At the same time, creating the model is absolutely straight forward, no deep research into sophisticated decomposition or column generation etc needed.

That is the Seeker difference. When will you start?