Distributed Hydropower Models in StochasticPrograms.jl Martin Biel - - PowerPoint PPT Presentation

distributed hydropower models in stochasticprograms jl
SMART_READER_LITE
LIVE PREVIEW

Distributed Hydropower Models in StochasticPrograms.jl Martin Biel - - PowerPoint PPT Presentation

KTH ROYAL INSTITUTE OF TECHNOLOGY Distributed Hydropower Models in StochasticPrograms.jl Martin Biel KTH - Royal Institute of Technology July 30, 2019 Motivation Simulation of hydro power operations for decision-support Martin Biel (KTH)


slide-1
SLIDE 1

KTH ROYAL INSTITUTE OF TECHNOLOGY

Distributed Hydropower Models in StochasticPrograms.jl

Martin Biel

KTH - Royal Institute of Technology

July 30, 2019

slide-2
SLIDE 2

Motivation

  • Simulation of hydro power operations for decision-support

Martin Biel (KTH) July 30, 2019 2/31

slide-3
SLIDE 3

Motivation

  • Simulation of hydro power operations for decision-support

◮ Future electricity prices unknown ◮ Irregular power production: solar and wind ◮ Nuclear power phase-out

Martin Biel (KTH) July 30, 2019 2/31

slide-4
SLIDE 4

Motivation

  • Simulation of hydro power operations for decision-support

◮ Future electricity prices unknown ◮ Irregular power production: solar and wind ◮ Nuclear power phase-out

  • Common: trade-off between accuracy and computation time

Martin Biel (KTH) July 30, 2019 2/31

slide-5
SLIDE 5

Motivation

  • Simulation of hydro power operations for decision-support

◮ Future electricity prices unknown ◮ Irregular power production: solar and wind ◮ Nuclear power phase-out

  • Common: trade-off between accuracy and computation time
  • Aim: provide reliable decision-support in real time

Martin Biel (KTH) July 30, 2019 2/31

slide-6
SLIDE 6

Motivation

  • Simulation of hydro power operations for decision-support

◮ Future electricity prices unknown ◮ Irregular power production: solar and wind ◮ Nuclear power phase-out

  • Common: trade-off between accuracy and computation time
  • Aim: provide reliable decision-support in real time

◮ Accurate models: optimal model reductions ◮ Fast computations: scalable algorithms on commodity hardware Figure: Manageable models. Figure: Scalable algorithms.

Martin Biel (KTH) July 30, 2019 2/31

slide-7
SLIDE 7

Motivation

  • Simulation of hydro power operations for decision-support

◮ Future electricity prices unknown ◮ Irregular power production: solar and wind ◮ Nuclear power phase-out

  • Common: trade-off between accuracy and computation time
  • Aim: provide reliable decision-support in real time

◮ Accurate models: optimal model reductions ◮ Fast computations: scalable algorithms on commodity hardware Figure: Manageable models. Figure: Scalable algorithms.

Martin Biel (KTH) July 30, 2019 2/31

slide-8
SLIDE 8

Motivation

Stochastic programming for hydro power operations

  • Optimal orders on the day-ahead market
  • Maintenance scheduling
  • Long-term investments
  • Wind/solar uncertainties
  • . . .

Martin Biel (KTH) July 30, 2019 3/31

slide-9
SLIDE 9

Motivation

Stochastic programming for hydro power operations

  • Optimal orders on the day-ahead market
  • Maintenance scheduling
  • Long-term investments
  • Wind/solar uncertainties
  • . . .

In short

  • Accurate decision-support under uncertainty
  • Variety of parallel decomposition schemes

Martin Biel (KTH) July 30, 2019 3/31

slide-10
SLIDE 10

Contribution

  • StochasticPrograms.jl: framework for stochastic programming

Martin Biel (KTH) July 30, 2019 4/31

slide-11
SLIDE 11

Contribution

  • StochasticPrograms.jl: framework for stochastic programming
  • Formulate, solve and analyze stochastic models

Martin Biel (KTH) July 30, 2019 4/31

slide-12
SLIDE 12

Contribution

  • StochasticPrograms.jl: framework for stochastic programming
  • Formulate, solve and analyze stochastic models
  • A collection of structure-exploiting algorithms

Martin Biel (KTH) July 30, 2019 4/31

slide-13
SLIDE 13

Contribution

  • StochasticPrograms.jl: framework for stochastic programming
  • Formulate, solve and analyze stochastic models
  • A collection of structure-exploiting algorithms
  • Distributed-memory implementation for large-scale models

Martin Biel (KTH) July 30, 2019 4/31

slide-14
SLIDE 14

Contribution

  • StochasticPrograms.jl: framework for stochastic programming
  • Formulate, solve and analyze stochastic models
  • A collection of structure-exploiting algorithms
  • Distributed-memory implementation for large-scale models
  • Collection of (hydroelectric) energy planning models

Martin Biel (KTH) July 30, 2019 4/31

slide-15
SLIDE 15

Contribution

  • StochasticPrograms.jl: framework for stochastic programming
  • Formulate, solve and analyze stochastic models
  • A collection of structure-exploiting algorithms
  • Distributed-memory implementation for large-scale models
  • Collection of (hydroelectric) energy planning models

Efficiently model and solve stochastic problems using expressive syntax

Martin Biel (KTH) July 30, 2019 4/31

slide-16
SLIDE 16

Outline

  • StochasticPrograms.jl showcase
  • Real-world application: the day-ahead problem
  • Numerical experiments
  • Final remarks

Martin Biel (KTH) July 30, 2019 5/31

slide-17
SLIDE 17

StochasticPrograms.jl

Martin Biel (KTH) July 30, 2019 6/31

slide-18
SLIDE 18

StochasticPrograms.jl

  • Flexible and expressive problem definition

Martin Biel (KTH) July 30, 2019 6/31

slide-19
SLIDE 19

StochasticPrograms.jl

  • Flexible and expressive problem definition
  • Deferred model instantiation
  • Scenario data injection

Martin Biel (KTH) July 30, 2019 6/31

slide-20
SLIDE 20

StochasticPrograms.jl

  • Flexible and expressive problem definition
  • Deferred model instantiation
  • Scenario data injection
  • Variety of tools for analyzing models

◮ VSS ◮ EVPI ◮ Confidence intervals ◮ . . .

Martin Biel (KTH) July 30, 2019 6/31

slide-21
SLIDE 21

StochasticPrograms.jl

  • Flexible and expressive problem definition
  • Deferred model instantiation
  • Scenario data injection
  • Variety of tools for analyzing models

◮ VSS ◮ EVPI ◮ Confidence intervals ◮ . . .

  • Memory-distributed

Martin Biel (KTH) July 30, 2019 6/31

slide-22
SLIDE 22

StochasticPrograms.jl

  • Flexible and expressive problem definition
  • Deferred model instantiation
  • Scenario data injection
  • Variety of tools for analyzing models

◮ VSS ◮ EVPI ◮ Confidence intervals ◮ . . .

  • Memory-distributed
  • Minimize data passing

◮ Lightweight sampler objects to generate scenario data ◮ Lightweight model recipes to generate second stage problems

Martin Biel (KTH) July 30, 2019 6/31

slide-23
SLIDE 23

StochasticPrograms.jl

  • Flexible and expressive problem definition
  • Deferred model instantiation
  • Scenario data injection
  • Variety of tools for analyzing models

◮ VSS ◮ EVPI ◮ Confidence intervals ◮ . . .

  • Memory-distributed
  • Minimize data passing

◮ Lightweight sampler objects to generate scenario data ◮ Lightweight model recipes to generate second stage problems

  • Interface to structure-exploiting (distributed) solver algorithms

◮ L-shaped variants (LShapedSolvers.jl) ◮ Progressive-hedging variants (ProgressiveHedgingSolvers.jl)

Martin Biel (KTH) July 30, 2019 6/31

slide-24
SLIDE 24

StochasticPrograms.jl - Simple model

minimize

x1,x2∈R

100x1 + 150x2 + Eω[Q(x1, x2, ξ)] s.t. x1 + x2 ≤ 120 x1 ≥ 40 x2 ≥ 20 where Q(x1, x2, ξ) = min

y1,y2∈R

q1(ξ)y1 + q2(ξ)y2 s.t. 6y1 + 10y2 ≤ 60x1 8y1 + 5y2 ≤ 80x2 0 ≤ y1 ≤ d1(ξ) 0 ≤ y2 ≤ d2(ξ)

Martin Biel (KTH) July 30, 2019 7/31

slide-25
SLIDE 25

StochasticPrograms.jl - Simple model

✞ ☎

simple_model = @stochastic_model begin @stage 1 begin @variable(model, x1 >= 40) @variable(model, x2 >= 20) @objective(model, Min, 100*x1 + 150*x2) @constraint(model, x1 + x2 <= 120) end @stage 2 begin @decision x1 x2 @uncertain q1 q2 d1 d2 @variable(model, 0 <= y1 <= d1) @variable(model, 0 <= y2 <= d2) @objective(model, Min, q1*y1 + q2*y2) @constraint(model, 6*y1 + 10*y2 <= 60*x1) @constraint(model, 8*y1 + 5*y2 <= 80*x2) end end

✝ ✆

Martin Biel (KTH) July 30, 2019 7/31

slide-26
SLIDE 26

StochasticPrograms.jl - Simple model

✞ ☎

simple_model = @stochastic_model begin @stage 1 begin @variable(model, x1 >= 40) @variable(model, x2 >= 20) @objective(model, Min, 100*x1 + 150*x2) @constraint(model, x1 + x2 <= 120) end @stage 2 begin @decision x1 x2 @uncertain q1 q2 d1 d2 @variable(model, 0 <= y1 <= d1) @variable(model, 0 <= y2 <= d2) @objective(model, Min, q1*y1 + q2*y2) @constraint(model, 6*y1 + 10*y2 <= 60*x1) @constraint(model, 8*y1 + 5*y2 <= 80*x2) end end

✝ ✆

JuMP syntax

Martin Biel (KTH) July 30, 2019 7/31

slide-27
SLIDE 27

StochasticPrograms.jl - Simple model

✞ ☎

simple_model = @stochastic_model begin @stage 1 begin @variable(model, x1 >= 40) @variable(model, x2 >= 20) @objective(model, Min, 100*x1 + 150*x2) @constraint(model, x1 + x2 <= 120) end @stage 2 begin @decision x1 x2 @uncertain q1 q2 d1 d2 @variable(model, 0 <= y1 <= d1) @variable(model, 0 <= y2 <= d2) @objective(model, Min, q1*y1 + q2*y2) @constraint(model, 6*y1 + 10*y2 <= 60*x1) @constraint(model, 8*y1 + 5*y2 <= 80*x2) end end

✝ ✆

minimize

x1,x2∈R

100x1 + 150x2 s.t. x1 + x2 ≤ 120 x1 ≥ 40 x2 ≥ 20

Martin Biel (KTH) July 30, 2019 7/31

slide-28
SLIDE 28

StochasticPrograms.jl - Simple model

✞ ☎

simple_model = @stochastic_model begin @stage 1 begin @variable(model, x1 >= 40) @variable(model, x2 >= 20) @objective(model, Min, 100*x1 + 150*x2) @constraint(model, x1 + x2 <= 120) end @stage 2 begin @decision x1 x2 @uncertain q1 q2 d1 d2 @variable(model, 0 <= y1 <= d1) @variable(model, 0 <= y2 <= d2) @objective(model, Min, q1*y1 + q2*y2) @constraint(model, 6*y1 + 10*y2 <= 60*x1) @constraint(model, 8*y1 + 5*y2 <= 80*x2) end end

✝ ✆

minimize

y1,y2∈R

q1(ξ) y1 + q2(ξ) y2 s.t. 6y1 + 10y2 ≤ 60 x1 8y1 + 5y2 ≤ 80 x2 0 ≤ y1 ≤ d1(ξ) 0 ≤ y2 ≤ d2(ξ)

Martin Biel (KTH) July 30, 2019 7/31

slide-29
SLIDE 29

StochasticPrograms.jl - Simple model

✞ ☎

simple_model = @stochastic_model begin @stage 1 begin @variable(model, x1 >= 40) @variable(model, x2 >= 20) @objective(model, Min, 100*x1 + 150*x2) @constraint(model, x1 + x2 <= 120) end @stage 2 begin @decision x1 x2 @uncertain q1 q2 d1 d2 @variable(model, 0 <= y1 <= d1) @variable(model, 0 <= y2 <= d2) @objective(model, Min, q1*y1 + q2*y2) @constraint(model, 6*y1 + 10*y2 <= 60*x1) @constraint(model, 8*y1 + 5*y2 <= 80*x2) end end

✝ ✆

minimize

y1,y2∈R

q1(ξ) y1 + q2(ξ) y2 s.t. 6y1 + 10y2 ≤ 60 x1 8y1 + 5y2 ≤ 80 x2 0 ≤ y1 ≤ d1(ξ) 0 ≤ y2 ≤ d2(ξ)

Martin Biel (KTH) July 30, 2019 7/31

slide-30
SLIDE 30

StochasticPrograms.jl - Simple model

✞ ☎

simple_model = @stochastic_model begin @stage 1 begin @variable(model, x1 >= 40) @variable(model, x2 >= 20) @objective(model, Min, 100*x1 + 150*x2) @constraint(model, x1 + x2 <= 120) end @stage 2 begin @decision x1 x2 @uncertain q1 q2 d1 d2 @variable(model, 0 <= y1 <= d1) @variable(model, 0 <= y2 <= d2) @objective(model, Min, q1*y1 + q2*y2) @constraint(model, 6*y1 + 10*y2 <= 60*x1) @constraint(model, 8*y1 + 5*y2 <= 80*x2) end end

✝ ✆

minimize

y1,y2∈R

q1(ξ) y1 + q2(ξ) y2 s.t. 6y1 + 10y2 ≤ 60 x1 8y1 + 5y2 ≤ 80 x2 0 ≤ y1 ≤ d1(ξ) 0 ≤ y2 ≤ d2(ξ)

Martin Biel (KTH) July 30, 2019 7/31

slide-31
SLIDE 31

StochasticPrograms.jl - Discrete distribution

✞ ☎

s1 = Scenario(q1 = -24.0, q2 = -28.0, d1 = 500.0, d2 = 100.0, probability = 0.4); s2 = Scenario(q1 = -28.0, q2 = -32.0, d1 = 300.0, d2 = 300.0, probability = 0.6); simple_discrete = instantiate(simple_model, [s1,s2]) Stochastic program with: * 2 decision variables * 2 recourse variables * 2 scenarios of type Scenario Solver is default solver

✝ ✆

Martin Biel (KTH) July 30, 2019 8/31

slide-32
SLIDE 32

StochasticPrograms.jl - Discrete distribution

✞ ☎

p r i n t ( s i m p l e _ d i s c r e t e ) F i r s t - s t a g e ============== Min 100 x 1 + 150 x 2 S u b j e c t t o x 1 + x 2

120 x 1

40 x 2

20 Second - s t a g e ============== Subproblem 1 ( p = 0 .4 0 ) : Min

  • 24

y 1

  • 28

y 2 S u b j e c t t o

  • 60

x 1 + 6 y 1 + 10 y 2

  • 80

x 2 + 8 y 1 + 5 y 2

≤ ≤

y 1

500

y 2

100 Subproblem 2 ( p = 0 .6 0 ) : Min

  • 28

y 1

  • 32

y 2 S u b j e c t t o 6 y 1 + 10 y 2

  • 60

x 1

8 y 1 + 5 y 2

  • 80

x 2

≤ ≤

y 1

300

y 2

300

✝ ✆

Martin Biel (KTH) July 30, 2019 8/31

slide-33
SLIDE 33

StochasticPrograms.jl - Discrete distribution

✞ ☎

dep = DEP(simple_discrete) print(dep) Min 100 x1 + 150 x2 - 9.6 y

11 - 11.2 y2 1 - 16.8 y 12 - 19.2 y2 2

Subject to x1 + x2

≤ 120

6 y

11 + 10 y2 1 - 60 x1

≤ 0

8 y

11 + 5 y2 1 - 80 x2

≤ 0

6 y

12 + 10 y2 2 - 60 x1

≤ 0

8 y

12 + 5 y2 2 - 80 x2

≤ 0

x1

≥ 40

x2

≥ 20

0 ≤ y

11 ≤ 500

0 ≤ y2 1

≤ 100

0 ≤ y

12 ≤ 300

0 ≤ y2 2

≤ 300

✝ ✆

Martin Biel (KTH) July 30, 2019 8/31

slide-34
SLIDE 34

StochasticPrograms.jl - Discrete distribution

✞ ☎

vrp = VRP(simple_discrete, solver = glpk)

  • 855.83

vss = VSS(simple_discrete, solver = glpk) 286.92 evpi = EVPI(simple, solver = glpk) 662.92

✝ ✆

Martin Biel (KTH) July 30, 2019 8/31

slide-35
SLIDE 35

StochasticPrograms.jl - Continuous distribution

✞ ☎

@sampler SimpleSampler = begin N::MvNormal SimpleSampler(µ, Σ) = new(MvNormal(µ, Σ)) @sample Scenario begin x = rand(sampler.N) return Scenario(q1 = x[1], q2 = x[2], d1 = x[3], d2 = x[4]) end end µ = [-28, -32, 300, 300] Σ = [2 0.5 0 0 0.5 1 0 0 0 0 50 20 0 0 20 30] sampler = SimpleSampler(µ, Σ)

✝ ✆

Martin Biel (KTH) July 30, 2019 9/31

slide-36
SLIDE 36

StochasticPrograms.jl - Continuous distribution

✞ ☎

saa = SAA(simple_model, sampler, 100) Stochastic program with: * 2 decision variables * 2 recourse variables * 100 scenarios of type Scenario Solver is default solver

✝ ✆

Martin Biel (KTH) July 30, 2019 9/31

slide-37
SLIDE 37

StochasticPrograms.jl - Continuous distribution

✞ ☎

saa = SAA(simple_model, sampler, 100) Stochastic program with: * 2 decision variables * 2 recourse variables * 100 scenarios of type Scenario Solver is default solver

✝ ✆ ✞ ☎

confidence_interval(simple_model, sampler; solver = glpk, confidence = 0.95, N = 100) Confidence interval (p = 95%): [-2630.44 -2389.31]

✝ ✆

Martin Biel (KTH) July 30, 2019 8/31

slide-38
SLIDE 38

StochasticPrograms.jl - Continuous distribution

✞ ☎

saa = SAA(simple_model, sampler, 100) Stochastic program with: * 2 decision variables * 2 recourse variables * 100 scenarios of type Scenario Solver is default solver

✝ ✆ ✞ ☎

confidence_interval(simple_model, sampler; solver = glpk, confidence = 0.95, N = 100) Confidence interval (p = 95%): [-2630.44 -2389.31]

✝ ✆ ✞ ☎

confidence_interval(simple_model, sampler; solver = glpk, confidence = 0.95, N = 1000) Confidence interval (p = 95%): [-2568.90 -2509.78]

✝ ✆

Martin Biel (KTH) July 30, 2019 7/31

slide-39
SLIDE 39

Day-ahead problem - Electricity market

Day- Ahead Actor 1 P1 E1 Actor 2 P2 E2

Martin Biel (KTH) July 30, 2019 8/31

slide-40
SLIDE 40

Day-ahead problem - Electricity market

Day- Ahead Actor 1 P1 E1 Actor 2 P2 E2 Market closes

Martin Biel (KTH) July 30, 2019 8/31

slide-41
SLIDE 41

Day-ahead problem - Electricity market

Day- Ahead Actor 1 P1 E1 Actor 2 P2 E2 Market closes Actor 1 Actor 2 Balance responsible PM,E1 Balance responsible PM,E2 Next day

Martin Biel (KTH) July 30, 2019 8/31

slide-42
SLIDE 42

Day-ahead problem - Electricity market

Day- Ahead Actor 1 P1 E1 Actor 2 P2 E2 Market closes Actor 1 Actor 2 Balance responsible PM,E1 Balance responsible PM,E2 Next day Intraday P E P E

Martin Biel (KTH) July 30, 2019 8/31

slide-43
SLIDE 43

Day-ahead problem - Electricity market

Order Types

  • Single Hourly Order

◮ Price independent ◮ Price Dependent

  • Block Order

◮ Regular ◮ Linked

  • Exclusive Group
  • Flexible Order

Martin Biel (KTH) July 30, 2019 9/31

slide-44
SLIDE 44

Day-ahead problem - Electricity market

Order Types

  • Single Hourly Order

◮ Price independent ◮ Price Dependent

  • Block Order

◮ Regular ◮ Linked

  • Exclusive Group
  • Flexible Order

Martin Biel (KTH) July 30, 2019 9/31

slide-45
SLIDE 45

Day-ahead problem - Single order

0.00 121.73 243.47 365.20 486.93 608.66 730.40

Order Volume [MWh/h]

0.00 11.85 23.70 35.55 47.40 59.25

Price [EUR/MWh]

Order Curve

Price Independent Order Price Dependent Order

Figure: Single hourly order.

Martin Biel (KTH) July 30, 2019 10/31

slide-46
SLIDE 46

Day-ahead problem - Single order

0.00 121.73 243.47 365.20 486.93 608.66 730.40

Order Volume [MWh/h]

0.00 11.85 23.70 35.55 47.40 59.25

Price [EUR/MWh]

Order Curve

Price Independent Order Price Dependent Order Trading Outcome

Figure: Interpolated energy volume for a given market price.

Martin Biel (KTH) July 30, 2019 10/31

slide-47
SLIDE 47

Day-ahead problem - Block order

15 20

Hour

Block Order

14.93 [EUR/MWh] 500.00 [MWh/h]

Figure: Block order between 15:00-20:00.

Martin Biel (KTH) July 30, 2019 11/31

slide-48
SLIDE 48

Day-ahead problem - Block order

15 20

Hour

6.71 9.58 12.46 15.33 18.21

Price [EUR/MWh]

Block Order

14.93 [EUR/MWh] 500.00 [MWh/h]

Rejected Order Market price

Figure: Rejected after market price settlement.

Martin Biel (KTH) July 30, 2019 11/31

slide-49
SLIDE 49

Day-ahead problem - Block order

15 20

Hour

33.53 37.13 40.72 44.31 47.91 51.50 55.10 58.69 62.28 65.88

Price [EUR/MWh]

Block Order

14.93 [EUR/MWh] 500.00 [MWh/h]

Accepted Order Market price

Figure: Accepted after market price settlement.

Martin Biel (KTH) July 30, 2019 11/31

slide-50
SLIDE 50

Day-ahead problem - Setting

  • Price taking hydropower producer trading in the NordPool market

Martin Biel (KTH) July 30, 2019 12/31

slide-51
SLIDE 51

Day-ahead problem - Setting

  • Price taking hydropower producer trading in the NordPool market
  • All power stations in the Swedish river Skellefteälven

Martin Biel (KTH) July 30, 2019 12/31

slide-52
SLIDE 52

Day-ahead problem - Setting

  • Price taking hydropower producer trading in the NordPool market
  • All power stations in the Swedish river Skellefteälven
  • First stage: hourly electricity volume bids for the upcoming day

◮ Single hourly orders ◮ Block orders

Martin Biel (KTH) July 30, 2019 12/31

slide-53
SLIDE 53

Day-ahead problem - Setting

  • Price taking hydropower producer trading in the NordPool market
  • All power stations in the Swedish river Skellefteälven
  • First stage: hourly electricity volume bids for the upcoming day

◮ Single hourly orders ◮ Block orders

  • Second stage: optimize day-ahead production

◮ Bid dispatch after market price realization ◮ Imbalances penalized in intraday market ◮ Water flow conversation (including water travel time) ◮ Maximize profits in the market and the future value of water

Martin Biel (KTH) July 30, 2019 12/31

slide-54
SLIDE 54

Day-ahead problem - Setting

  • Price taking hydropower producer trading in the NordPool market
  • All power stations in the Swedish river Skellefteälven
  • First stage: hourly electricity volume bids for the upcoming day

◮ Single hourly orders ◮ Block orders

  • Second stage: optimize day-ahead production

◮ Bid dispatch after market price realization ◮ Imbalances penalized in intraday market ◮ Water flow conversation (including water travel time) ◮ Maximize profits in the market and the future value of water

  • Full model defined in HydroModels.jl

Martin Biel (KTH) July 30, 2019 12/31

slide-55
SLIDE 55

Day-ahead problem - Data

Deterministic

  • Physical parameters for power plants in Skellefteälven
  • Trade regulations from NordPool

Uncertain

  • Day-ahead prices from NordPool
  • Mean water flows in Skellefteälven from SMHI

Martin Biel (KTH) July 30, 2019 13/31

slide-56
SLIDE 56

Day-ahead problem - Data

Figure: Schematic of the power stations in Skellefteälven.

Martin Biel (KTH) July 30, 2019 13/31

slide-57
SLIDE 57

Day-ahead problem - Data

Figure: Historical day-ahead prices 2013-2018 from NordPool.

Martin Biel (KTH) July 30, 2019 13/31

slide-58
SLIDE 58

Day-ahead problem - Data

Figure: Mean water flow in Skellefteälven 1999-2018 from SMHI.

Martin Biel (KTH) July 30, 2019 13/31

slide-59
SLIDE 59

Day-ahead problem - Forecasts

  • Recurrent neural networks (GRU)

Martin Biel (KTH) July 30, 2019 14/31

slide-60
SLIDE 60

Day-ahead problem - Forecasts

  • Recurrent neural networks (GRU)
  • Trained on price data and mean flow data separately

Martin Biel (KTH) July 30, 2019 14/31

slide-61
SLIDE 61

Day-ahead problem - Forecasts

  • Recurrent neural networks (GRU)
  • Trained on price data and mean flow data separately
  • Early stopping to prevent overfitting

Martin Biel (KTH) July 30, 2019 14/31

slide-62
SLIDE 62

Day-ahead problem - Forecasts

  • Recurrent neural networks (GRU)
  • Trained on price data and mean flow data separately
  • Early stopping to prevent overfitting
  • Seasonality modeled through separate inputs to the network

Martin Biel (KTH) July 30, 2019 14/31

slide-63
SLIDE 63

Day-ahead problem - Forecasts

  • Recurrent neural networks (GRU)
  • Trained on price data and mean flow data separately
  • Early stopping to prevent overfitting
  • Seasonality modeled through separate inputs to the network
  • Driven by Gaussian noise

Martin Biel (KTH) July 30, 2019 14/31

slide-64
SLIDE 64

Day-ahead problem - Forecasts

5 10 15 20

2013

25 50 75 100 5 10 15 20

2014

20 40 60 80 5 10 15 20

2015

20 40 60 80 5 10 15 20

2016

50 100 150 200 5 10 15 20

2017

25 50 75 100 125 5 10 15 20

2018

50 100 150 200

Figure: Price forecasts (black) and raw data (colored).

Martin Biel (KTH) July 30, 2019 15/31

slide-65
SLIDE 65

Day-ahead problem - Forecasts

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 Hour 25 50 75 100 125 Price [Eur]

Figure: 1000 sampled price curves using RNN.

Martin Biel (KTH) July 30, 2019 16/31

slide-66
SLIDE 66

Day-ahead problem - Forecasts

Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec Month 25 50 75 100 125 Price [Eur]

Figure: Price forecasts throughout a year.

Martin Biel (KTH) July 30, 2019 17/31

slide-67
SLIDE 67

Day-ahead problem - Forecasts

1 31 61 91 121 151 181 211 241 271 301 331 361

2018

100 200 300 400 500 600 700 100 200 300 50 75 100 125 150

Figure: Mean flow forecasts (black) and raw data (colored).

Martin Biel (KTH) July 30, 2019 17/31

slide-68
SLIDE 68

Day-ahead problem - Sampler

✞ ☎

@scenario DayAheadScenario = begin ρ::PriceCurve{Float64} Q ˜ ::Vector{Float64} end @sampler RecurrentDayAheadSampler = begin date::Date price_forecaster::Forecaster{:price} flow_forecaster::Forecaster{:flow} @sample DayAheadScenario begin prices = forecast(sampler.price_forecaster, month(sampler.date)) flows = forecast(sampler.flow_forecaster, week(sampler.date)) return DayAheadScenario(PriceCurve(prices), flows[1]) end end

✝ ✆

Martin Biel (KTH) July 30, 2019 18/31

slide-69
SLIDE 69

Day-ahead problem - Bidlevels

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 Hour 10 20 30 40 50 60 Price [Eur] Expected price Bidlevels

Figure: Available price points for bidding.

Martin Biel (KTH) July 30, 2019 19/31

slide-70
SLIDE 70

Day-ahead problem - Value of water

  • Marginal value of water has large impact on optimal dispatch

Martin Biel (KTH) July 30, 2019 20/31

slide-71
SLIDE 71

Day-ahead problem - Value of water

  • Marginal value of water has large impact on optimal dispatch
  • Sometimes optimal to accept imbalance penalty and save water

Martin Biel (KTH) July 30, 2019 20/31

slide-72
SLIDE 72

Day-ahead problem - Value of water

  • Marginal value of water has large impact on optimal dispatch
  • Sometimes optimal to accept imbalance penalty and save water
  • Naive approach: production from excess water solved at mean price

Martin Biel (KTH) July 30, 2019 20/31

slide-73
SLIDE 73

Day-ahead problem - Value of water

  • Marginal value of water has large impact on optimal dispatch
  • Sometimes optimal to accept imbalance penalty and save water
  • Naive approach: production from excess water solved at mean price
  • Leads to crude order strategies

Martin Biel (KTH) July 30, 2019 20/31

slide-74
SLIDE 74

Day-ahead problem - Value of water

  • Solve a dummy stochastic program:

◮ First stage: water content in reservoirs ◮ Second stage: optimize production over the coming week ◮ Future prices and water inflows are uncertain

Martin Biel (KTH) July 30, 2019 21/31

slide-75
SLIDE 75

Day-ahead problem - Value of water

  • Solve a dummy stochastic program:

◮ First stage: water content in reservoirs ◮ Second stage: optimize production over the coming week ◮ Future prices and water inflows are uncertain

  • L-shaped generates a polyhedral objective approximation

Martin Biel (KTH) July 30, 2019 21/31

slide-76
SLIDE 76

Day-ahead problem - Value of water

  • Solve a dummy stochastic program:

◮ First stage: water content in reservoirs ◮ Second stage: optimize production over the coming week ◮ Future prices and water inflows are uncertain

  • L-shaped generates a polyhedral objective approximation
  • Approximation used to model the expected future value of water

Figure: Polyhedral approximation.

Martin Biel (KTH) July 30, 2019 21/31

slide-77
SLIDE 77

Day-ahead problem - Model

✞ ☎

@stage 1 begin @parameters begin horizon = horizon indices = indices data = data end @unpack hours, plants, bids, blockbids, blocks = indices @unpack hydrodata, regulations = data # Variables # ======================================================== @variable(model, xt_i[t = hours] >= 0) @variable(model, xt_d[i = bids, t = hours] >= 0) @variable(model, xb[i = blockbids, b = blocks] >= 0) ... end

✝ ✆

Martin Biel (KTH) July 30, 2019 22/31

slide-78
SLIDE 78

Day-ahead problem - Model

✞ ☎

@stage 2 begin ... @uncertain ρ, V from ξ::DayAheadScenario @decision xt_i xt_d xb # ------------------------------------------------------- @variable(model, yt[t = hours] >= 0) # Hourly dispatch @variable(model, yb[b = blocks] >= 0) # Block dispatch @variable(model, z_up[t = hours] >= 0) # Power bought from intraday @variable(model, z_do[t = hours] >= 0) # Power sold to intraday @variable(model, 0 <= Q[p = plants, t = hours] <= Q ¯ ) # Water discharge @variable(model, S[p = plants, t = hours] >= 0) # Spillage @variable(model, Qf[p = plants, t = hours] >= 0) # Incoming discharge @variable(model, Sf[p = plants, t = hours] >= 0) # Incoming spillage @variable(model, 0 <= M[p = plants, t = hours] <= M ¯ # Reservoir content @variable(model, H[t = hours] >= 0) # Power production ... @objective(model, Max, net_profit + value_of_stored_water) ...

✝ ✆

Martin Biel (KTH) July 30, 2019 22/31

slide-79
SLIDE 79

Day-ahead problem - Model

✞ ☎

... # Bid-dispatch links @constraint(model, hourlybids[t = hours], yt[t] == interpolate(ρ[t], bidlevels, xt_d[t]) + xt_i[t] ) @constraint(model, bidblocks[b = blocks], yb[b] == sum(xb[j,b] for j = accepted_blocks(b)) ) # Hydrological balance @constraint(model, hydro_constraints[p = plants, t = hours], # Previous reservoir content M[p,t] == (t > 1 ? M[p,t-1] : M0[p]) # Inflow + sum(Qf[i,t]+Sf[i,t] for i = upstream_plants[p]) # Local inflow + V[p] # Outflow

  • (Q[p,t] + S[p,t])

) ...

✝ ✆

Martin Biel (KTH) July 30, 2019 22/31

slide-80
SLIDE 80

Day-ahead problem - Model

✞ ☎

... # Production @constraint(model, production[t = hours], H[t] == sum(hydrodata[p].µ[s]*Q[p,s,t] for p = plants, s = segments) ) # Load balance @constraint(model, loadbalance[t = hours], yt[t] + sum(yb[b] for b = blocks[t]) - H[t] == z_up[t] - z_do[t] ) ... # Water travel time ... # Water value @constraint(model, water_value_approximation[c = 1:ncuts(water_value)], sum(water_value[c][p]*M[p,nhours(horizon)] for p in plants) + sum(W[i] for i in cut_indices(water_value[c])) >= cut_lb(water_value[c])) end

✝ ✆

Martin Biel (KTH) July 30, 2019 22/31

slide-81
SLIDE 81

Day-ahead problem - Algorithm

  • VSS typically low in day-ahead problems

Martin Biel (KTH) July 30, 2019 23/31

slide-82
SLIDE 82

Day-ahead problem - Algorithm

  • VSS typically low in day-ahead problems
  • Generate tight confidence intervals trough sequential SAA algorithm

Martin Biel (KTH) July 30, 2019 23/31

slide-83
SLIDE 83

Day-ahead problem - Algorithm

  • VSS typically low in day-ahead problems
  • Generate tight confidence intervals trough sequential SAA algorithm
  • Ensure statistically significant VSS

Martin Biel (KTH) July 30, 2019 23/31

slide-84
SLIDE 84

Day-ahead problem - Algorithm

  • VSS typically low in day-ahead problems
  • Generate tight confidence intervals trough sequential SAA algorithm
  • Ensure statistically significant VSS
  • SAA instances of ~2000 scenarios required to reach this bound

◮ ~5 million variables ◮ ~3.3 million constraints

Martin Biel (KTH) July 30, 2019 23/31

slide-85
SLIDE 85

Day-ahead problem - Algorithm

Sequential SAA

  • Lower bound: solve M SAA models of size N
  • Upper bound: decision evaluation on T SAA models of size ˜

N > N

  • Increase N iteratively until confidence interval is tight enough

Martin Biel (KTH) July 30, 2019 24/31

slide-86
SLIDE 86

Day-ahead problem - Algorithm

Sequential SAA

  • Lower bound: solve M SAA models of size N
  • Upper bound: decision evaluation on T SAA models of size ˜

N > N

  • Increase N iteratively until confidence interval is tight enough

Distributed L-shaped

  • Regularization

◮ Trust-regions ◮ Level-sets ◮ . . .

  • Aggregation

◮ Static ◮ Dynamic ◮ Clustering ◮ . . .

Martin Biel (KTH) July 30, 2019 24/31

slide-87
SLIDE 87

Results - Benchmarks

1 2 4 8 16 Number of Cores P 18.0 42.5 66.9 91.4 Computation Time T [s]

Distributed L-shaped with trust-region Distributed L-shaped

Figure: Distributed L-shaped performance.

Martin Biel (KTH) July 30, 2019 25/31

slide-88
SLIDE 88

Results - Benchmarks

1 10 50 100 125 # Cuts in Bundle B 12.1 16.1 20.1 24.1 Computation Time T [s]

Distributed bundled L-shaped with trust-region

Figure: Distributed L-shaped performance using aggregation.

Martin Biel (KTH) July 30, 2019 25/31

slide-89
SLIDE 89

Results - Day-ahead

Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec Month 5.1×10 5.2×10 5.3×10 5.4×10 5.5×10 5.6×10 5.7×10 Profit [Eur] Day-ahead Day-ahead VRP Day-ahead EEV

Figure: Day-ahead profits.

Martin Biel (KTH) July 30, 2019 26/31

slide-90
SLIDE 90

Results - Day-ahead

Apr May Jun Jul Aug Month 5.1×10 5.2×10 Profit [Eur] Day-ahead Day-ahead VRP Day-ahead EEV

Figure: Day-ahead profits.

Martin Biel (KTH) July 30, 2019 26/31

slide-91
SLIDE 91

Results - Day-ahead

Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec Month 0.1 % 0.2 % 0.3 % 0.4 % Profit [% of VRP] Day-ahead Day-ahead VSS

Figure: Day-ahead value of stochastic solution.

Martin Biel (KTH) July 30, 2019 27/31

slide-92
SLIDE 92

Results - Day-ahead

Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec Month 5.0×10³ 1.0×10 1.5×10 2.0×10 2.5×10 Profit [Eur] Day-ahead Day-ahead VSS

Figure: Day-ahead value of stochastic solution.

Martin Biel (KTH) July 30, 2019 27/31

slide-93
SLIDE 93

Results - Order strategies

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

Hour

0.00 13.22 26.44 39.66 52.88 66.10 79.32

Price [EUR/MWh]

Single Orders

671.1 642.3 622.2 675.6 692.9 696.6 1.1e+03 721.3 736.8 1.1e+03 742.8 1.1e+03 401.1 0.0 398.8 507.3 708.6 520.5 0.0 364.7 797.8 817.0 891.3 867.8 865.6 440.7 0.0 175.4 45.14 0.0 12.56 17.61 58.80 174.6 508.5 611.3 485.9 611.3 982.1 1.1e+03 1.0e+03 1.0e+03 1.0e+03 1.0e+03 1.0e+03 Independent Volume [MWh] Dependent Volumes [Mwh]

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

Hour

Block Orders

13.68 428.6 14.93 500.0 23.33 8.03 23.78 2.39 52.57 0.80 Price [EUR/MWh] Volume [MWh/h]

Figure: Day-ahead order strategy.

Martin Biel (KTH) July 30, 2019 28/31

slide-94
SLIDE 94

Results - Order strategies

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

Hour

0.00 13.22 26.44 39.66 52.88 66.10 79.32

Price [EUR/MWh]

Single Orders

671.1 642.3 622.2 675.6 692.9 696.6 1.1e+03 721.3 736.8 1.1e+03 742.8 1.1e+03 401.1 0.0 398.8 507.3 708.6 520.5 0.0 364.7 797.8 817.0 891.3 867.8 865.6 440.7 0.0 175.4 45.14 0.0 12.56 17.61 58.80 174.6 508.5 611.3 485.9 611.3 982.1 1.1e+03 1.0e+03 1.0e+03 1.0e+03 1.0e+03 1.0e+03 Independent Volume [MWh] Dependent Volumes [Mwh]

Figure: Day-ahead single hourly order strategy.

Martin Biel (KTH) July 30, 2019 28/31

slide-95
SLIDE 95

Results - Order strategies

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

Hour

0.00 12.38 24.76 37.13 49.51 61.89 74.27

Price [EUR/MWh]

Single Orders

671.1 642.3 622.2 675.6 692.9 699.1 739.7 802.3 401.1 509.3 520.5 364.7 817.0 891.3 867.8 865.6 440.7 27.77 45.14 16.15 60.89 509.8 505.4 1.0e+03 1.0e+03 1.0e+03 1.0e+03 Independent Volume [MWh] Dependent Volumes [Mwh]

Accepted Orders Rejected Orders Market price

Figure: Result of single order strategy after realized market price.

Martin Biel (KTH) July 30, 2019 29/31

slide-96
SLIDE 96

Results - Order strategies

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

Hour

0.00 12.38 24.76 37.13 49.51 61.89 74.27

Price [EUR/MWh]

Single Orders

671.1 642.3 622.2 675.6 692.9 699.1 739.7 802.3 401.1 509.3 520.5 364.7 817.0 891.3 867.8 865.6 440.7 27.77 45.14 16.15 60.89 509.8 505.4 1.0e+03 1.0e+03 1.0e+03 1.0e+03 Independent Volume [MWh] Dependent Volumes [Mwh]

Accepted Orders Rejected Orders Market price

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

Hour

33.53 44.43 55.33 66.23

Price [EUR/MWh]

Block Orders

54.97 500.0 56.92 428.6 62.59 2.39 58.08 8.03 54.93 0.80 Price [EUR/MWh] Volume [MWh/h]

Accepted Orders Market price

Figure: Result of complete order strategy after realized market price.

Martin Biel (KTH) July 30, 2019 29/31

slide-97
SLIDE 97

Results - Order strategies

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

Hour

0.00 13.22 26.44 39.66 52.88 66.10 79.32

Price [EUR/MWh]

Single Orders

674.2 0.0 437.9 0.0 663.0 1.1e+03 0.0 649.8 1.1e+03 0.0 664.2 1.1e+03 0.0 698.0 1.1e+03 706.6 0.0 405.5 734.1 0.0 378.0 0.0 713.5 1.1e+03 926.0 887.5 803.5 932.0 0.0 180.1 852.0 0.0 260.1 853.5 0.0 258.6 862.6 85.37 0.0 118.6 88.17 1.0e+03 980.7 980.4 0.0 131.7 0.0 1.0e+03 1.1e+03 1.0e+03 0.0 101.1 0.0 1.0e+03 1.1e+03 Independent Volume [MWh] Dependent Volumes [Mwh]

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

Hour

Block Orders

12.18 408.2 23.33 500.0 Price [EUR/MWh] Volume [MWh/h]

Figure: Deterministic order strategy.

Martin Biel (KTH) July 30, 2019 29/31

slide-98
SLIDE 98

Final Remarks

Discussion

  • VSS linked to imbalance penalties in the intraday market

Martin Biel (KTH) July 30, 2019 30/31

slide-99
SLIDE 99

Final Remarks

Discussion

  • VSS linked to imbalance penalties in the intraday market
  • Results are only as accurate/useful as the water valuation

Martin Biel (KTH) July 30, 2019 30/31

slide-100
SLIDE 100

Final Remarks

Discussion

  • VSS linked to imbalance penalties in the intraday market
  • Results are only as accurate/useful as the water valuation
  • Model improvements required.

Martin Biel (KTH) July 30, 2019 30/31

slide-101
SLIDE 101

Final Remarks

Discussion

  • VSS linked to imbalance penalties in the intraday market
  • Results are only as accurate/useful as the water valuation
  • Model improvements required.
  • Proof of concept for large-scale models in StochasticPrograms.jl

Martin Biel (KTH) July 30, 2019 30/31

slide-102
SLIDE 102

Final Remarks

Discussion

  • VSS linked to imbalance penalties in the intraday market
  • Results are only as accurate/useful as the water valuation
  • Model improvements required.
  • Proof of concept for large-scale models in StochasticPrograms.jl

Outlook on future/ongoing work

  • Formulate new energy planning models in StochasticPrograms.jl

Martin Biel (KTH) July 30, 2019 30/31

slide-103
SLIDE 103

Final Remarks

Discussion

  • VSS linked to imbalance penalties in the intraday market
  • Results are only as accurate/useful as the water valuation
  • Model improvements required.
  • Proof of concept for large-scale models in StochasticPrograms.jl

Outlook on future/ongoing work

  • Formulate new energy planning models in StochasticPrograms.jl
  • Evaluate different aggregation schemes

Martin Biel (KTH) July 30, 2019 30/31

slide-104
SLIDE 104

Final Remarks

Discussion

  • VSS linked to imbalance penalties in the intraday market
  • Results are only as accurate/useful as the water valuation
  • Model improvements required.
  • Proof of concept for large-scale models in StochasticPrograms.jl

Outlook on future/ongoing work

  • Formulate new energy planning models in StochasticPrograms.jl
  • Evaluate different aggregation schemes
  • Sample-based algorithms as an alternative to sequential SAA

Martin Biel (KTH) July 30, 2019 30/31

slide-105
SLIDE 105

Final Remarks

Summary

  • StochasticPrograms.jl: framework for stochastic programming

Martin Biel (KTH) July 30, 2019 31/31

slide-106
SLIDE 106

Final Remarks

Summary

  • StochasticPrograms.jl: framework for stochastic programming
  • Large-scale day-ahead problem solved on compute cluster

Martin Biel (KTH) July 30, 2019 31/31

slide-107
SLIDE 107

Final Remarks

Summary

  • StochasticPrograms.jl: framework for stochastic programming
  • Large-scale day-ahead problem solved on compute cluster
  • Tight confidence intervals through sequential SAA

Martin Biel (KTH) July 30, 2019 31/31

slide-108
SLIDE 108

Final Remarks

Summary

  • StochasticPrograms.jl: framework for stochastic programming
  • Large-scale day-ahead problem solved on compute cluster
  • Tight confidence intervals through sequential SAA
  • StochasticPrograms.jl is a registered Julia package

Martin Biel (KTH) July 30, 2019 31/31

slide-109
SLIDE 109

Final Remarks

Summary

  • StochasticPrograms.jl: framework for stochastic programming
  • Large-scale day-ahead problem solved on compute cluster
  • Tight confidence intervals through sequential SAA
  • StochasticPrograms.jl is a registered Julia package
  • The full framework is open-source and freely available on Github

https://github.com/martinbiel

Martin Biel (KTH) July 30, 2019 31/31