• Energy

Enel Quantum Optimization for Renewable Energy Grid Dispatch

Enel

Enel used quantum annealing and QAOA to optimize real-time dispatch of renewable energy sources across its European grid, tackling the unit commitment problem for 50 generation units over a 24-hour scheduling horizon on the Italian transmission network.

Key Outcome
D-Wave hybrid reduced renewable curtailment by 12% on Italian grid test case (50 generation units, 24 hours); CO2 savings equivalent to removing 8,000 cars annually.

The Problem

Enel operates approximately 90 GW of installed renewable capacity across wind, solar, and hydroelectric plants in Europe, Latin America, and North America. The daily scheduling challenge of deciding which generation units to commit (turn on) and at what output level for each hour of the next 24 hours is called the unit commitment problem and is one of the central NP-hard problems in power systems.

Classical mixed-integer programming (MIP) solvers such as Gurobi handle the unit commitment problem for moderate grid sizes in minutes. But as renewable penetration rises, the problem becomes harder in two ways. First, wind and solar output is intermittent and uncertain, requiring scenario-based stochastic formulations that multiply the problem size by the number of scenarios. Second, high renewable penetration creates curtailment: at peak solar noon or peak wind hours, the grid may produce more power than it can absorb, and plants must be throttled back at a cost. Minimizing curtailment requires finer dispatch granularity across more units, pushing the problem size beyond what classical MIP handles comfortably in real time.

Enel’s Italian grid test case involves 50 generation units (12 wind farms, 18 solar plants, 8 hydro units, 7 gas peakers, 5 pump-storage facilities) scheduled over 24 one-hour intervals. The binary on/off commitment decisions alone create a 50 x 24 = 1,200 variable binary program, plus continuous dispatch levels, ramp rate constraints, minimum up/down time requirements, and spinning reserve obligations.

QUBO Formulation for Unit Commitment

The unit commitment problem was reformulated as a QUBO (Quadratic Unconstrained Binary Optimization) suitable for D-Wave Advantage. Continuous dispatch variables were discretized into 4-level binary representations (2 bits per unit per hour for output level). The QUBO objective captures:

  • Fuel and startup costs (minimized)
  • Renewable curtailment (penalized; curtailed energy is wasted)
  • Spinning reserve shortfall (penalized)
  • Ramp rate violations (penalized)
import numpy as np
import dimod
from dimod import BinaryQuadraticModel

# Simplified 4-unit, 3-hour unit commitment for illustration
# Full Enel instance: 50 units, 24 hours (run on D-Wave hybrid solver)

n_units = 4
n_hours = 3
# Startup cost, no-load cost, marginal cost for each unit
startup_cost   = np.array([50.0, 30.0, 80.0, 20.0])
no_load_cost   = np.array([10.0, 8.0, 15.0, 5.0])
marginal_cost  = np.array([25.0, 20.0, 40.0, 15.0])
p_min          = np.array([20.0, 15.0, 30.0, 10.0])  # MW minimum output
p_max          = np.array([100.0, 80.0, 150.0, 60.0]) # MW maximum output

# Renewable forecast (MW available but curtailable)
wind_forecast  = np.array([40.0, 55.0, 30.0])  # per hour
solar_forecast = np.array([10.0, 60.0, 45.0])  # per hour
load_demand    = np.array([180.0, 220.0, 200.0]) # MW load per hour

# Binary variables: u[i, t] = 1 if unit i is on in hour t
# QUBO variable index: var_id(i, t) = i * n_hours + t
def var_id(i, t):
    return i * n_hours + t

bqm = BinaryQuadraticModel(vartype='BINARY')

# Objective: minimize commitment costs
for i in range(n_units):
    for t in range(n_hours):
        # No-load cost when committed
        bqm.add_variable(var_id(i, t), no_load_cost[i])

# Startup cost: penalize switching on (u[i,t]=1, u[i,t-1]=0)
for i in range(n_units):
    for t in range(1, n_hours):
        v0 = var_id(i, t - 1)
        v1 = var_id(i, t)
        # startup indicator = u[t] * (1 - u[t-1]) = u[t] - u[t]*u[t-1]
        bqm.add_variable(v1, startup_cost[i])
        bqm.add_interaction(v0, v1, -startup_cost[i])

# Demand constraint: sum of committed capacity >= load each hour (soft penalty)
penalty_demand = 500.0
for t in range(n_hours):
    renewable = wind_forecast[t] + solar_forecast[t]
    committed_max = sum(p_max[i] for i in range(n_units))
    deficit_penalty = max(0.0, load_demand[t] - renewable - committed_max)
    for i in range(n_units):
        # Penalty for under-supply: simplified linear term
        bqm.add_variable(var_id(i, t), -penalty_demand * p_min[i] / load_demand[t])

# Ramp rate constraint: limit consecutive-hour output change (simplified)
ramp_limit = 30.0  # MW per hour
for i in range(n_units):
    for t in range(1, n_hours):
        v0 = var_id(i, t - 1)
        v1 = var_id(i, t)
        # Penalize both units being off when load is high -- simplified proxy
        if load_demand[t] > 200:
            bqm.add_interaction(v0, v1, -5.0)  # encourage joint commitment

print(f"QUBO variables: {len(bqm.variables)}")
print(f"QUBO interactions: {len(bqm.quadratic)}")

# In the full Enel deployment, this BQM is submitted to D-Wave Advantage
# via the LeapHybridSampler for large instances:
#
# from dwave.system import LeapHybridSampler
# sampler = LeapHybridSampler()
# response = sampler.sample(bqm, time_limit=10)
# best = response.first.sample
# committed = {(i, t): best[var_id(i, t)] for i in range(n_units) for t in range(n_hours)}

# For demonstration, solve classically with exact solver
from dimod import ExactSolver
response = ExactSolver().sample(bqm)
best = response.first.sample
print("\nOptimal commitment schedule:")
for i in range(n_units):
    schedule = [best[var_id(i, t)] for t in range(n_hours)]
    print(f"  Unit {i}: {schedule} (on hours: {[t for t,s in enumerate(schedule) if s]})")
print(f"Total cost: {response.first.energy:.2f}")

D-Wave Hybrid vs. Gurobi MIP Benchmark

Enel ran the full 50-unit, 24-hour instance on three solvers and measured both solution quality (total operational cost + curtailment penalty) and renewable curtailment percentage:

SolverSolve timeCurtailment (%)Relative cost
Gurobi MIP (classical)4.2 min14.3%1.00x (reference)
D-Wave Hybrid Solver2.8 min12.6%0.99x
QAOA p=2 (IBM Eagle)18 min13.1%1.01x

D-Wave hybrid solved the instance 33% faster than Gurobi and achieved 12% less curtailment (14.3% curtailment rate reduced to 12.6%). On the Italian grid test case, this translates to approximately 4.7 GWh of additional renewable energy delivered per year, equivalent to avoiding roughly 2,300 tonnes of CO2 annually (estimated at 490 gCO2/kWh displaced gas generation), equivalent to removing approximately 8,000 passenger cars from European roads.

The QAOA approach on IBM Eagle was slower and less accurate at p=2. Deeper circuits (p=5 or more) would be needed to match D-Wave hybrid on this problem size, but current hardware noise limits practical depth. The hybrid quantum-classical D-Wave approach was the production-viable path for 2024.

Spinning Reserve and Renewable Intermittency Encoding

One of the critical constraints in renewable dispatch is spinning reserve: sufficient quickly-dispatchable capacity must be kept online (but not necessarily generating) to cover sudden drops in wind or solar output. Enel encoded spinning reserve requirements as quadratic penalty terms in the QUBO, ensuring that if renewable forecast uncertainty (quantified as a 10% standard deviation band around wind forecasts) materializes, committed thermal and hydro units can ramp up within 15 minutes.

Renewable intermittency was handled via scenario decomposition: the 24-hour scheduling problem was solved under 5 renewable forecast scenarios (high wind/low solar, average, low wind/high solar, etc.), with the QUBO objective averaging cost across scenarios weighted by forecast probabilities. D-Wave Advantage’s annealing hardware handled the 5-scenario decomposition by solving each scenario’s QUBO independently and combining results in a classical post-processing step, a workflow enabled by D-Wave Leap’s cloud infrastructure.

Enel plans to extend the quantum dispatch approach to its Spanish and Romanian grids in 2025, adding stochastic demand forecasting and cross-border interconnect constraints that will push the QUBO to approximately 5,000 variables, firmly in D-Wave hybrid territory.