SLDP: example 2
This tutorial was generated using Literate.jl. Download the source as a .jl file. Download the source as a .ipynb file.
This example is derived from Section 4.3 of the paper: Ahmed, S., Cabral, F. G., & da Costa, B. F. P. (2019). Stochastic Lipschitz Dynamic Programming. Optimization Online. PDF
using SDDPimport HiGHSimport Testfunction sldp_example_two(; first_stage_integer::Bool = true, N = 2) model = SDDP.LinearPolicyGraph(; stages = 2, lower_bound = -100.0, optimizer = HiGHS.Optimizer, ) do sp, t @variable(sp, 0 <= x[1:2] <= 5, SDDP.State, initial_value = 0.0) if t == 1 if first_stage_integer @variable(sp, 0 <= u[1:2] <= 5, Int) @constraint(sp, [i = 1:2], u[i] == x[i].out) end @stageobjective(sp, -1.5 * x[1].out - 4 * x[2].out) else @variable(sp, 0 <= y[1:4] <= 1, Bin) @variable(sp, ω[1:2]) @stageobjective(sp, -16 * y[1] - 19 * y[2] - 23 * y[3] - 28 * y[4]) @constraint( sp, 2 * y[1] + 3 * y[2] + 4 * y[3] + 5 * y[4] <= ω[1] - x[1].in ) @constraint( sp, 6 * y[1] + 1 * y[2] + 3 * y[3] + 2 * y[4] <= ω[2] - x[2].in ) steps = range(5; stop = 15, length = N) SDDP.parameterize(sp, [[i, j] for i in steps for j in steps]) do φ fix.(ω, φ) return end end end if get(ARGS, 1, "") == "--write" # Run `$ julia sldp_example_two.jl --write` to update the benchmark # model directory model_dir = joinpath(@__DIR__, "..", "..", "..", "benchmarks", "models") SDDP.write_to_file( model, joinpath(model_dir, "sldp_example_two_$(N).sof.json.gz"); test_scenarios = 30, ) return end SDDP.train(model; log_frequency = 10) bound = SDDP.calculate_bound(model) if N == 2 Test.@test bound <= -57.0 elseif N == 3 Test.@test bound <= -59.33 elseif N == 6 Test.@test bound <= -61.22 end returnendsldp_example_two(; N = 2)sldp_example_two(; N = 3)sldp_example_two(; N = 6)-------------------------------------------------------------------
SDDP.jl (c) Oscar Dowson and contributors, 2017-26
-------------------------------------------------------------------
problem
nodes : 2
state variables : 2
scenarios : 4.00000e+00
existing cuts : false
options
solver : serial mode
risk measure : SDDP.Expectation()
sampling scheme : SDDP.InSampleMonteCarlo
subproblem structure
VariableRef : [7, 11]
AffExpr in MOI.EqualTo{Float64} : [2, 2]
AffExpr in MOI.LessThan{Float64} : [2, 2]
VariableRef in MOI.GreaterThan{Float64} : [5, 7]
VariableRef in MOI.Integer : [2, 2]
VariableRef in MOI.LessThan{Float64} : [4, 7]
VariableRef in MOI.ZeroOne : [4, 4]
numerical stability report
matrix range [1e+00, 6e+00]
objective range [1e+00, 3e+01]
bounds range [1e+00, 1e+02]
rhs range [0e+00, 0e+00]
-------------------------------------------------------------------
iteration simulation bound time (s) solves pid
-------------------------------------------------------------------
10 -4.700000e+01 -5.809615e+01 9.155083e-02 78 1
20 -4.700000e+01 -5.809615e+01 2.004170e-01 148 1
30 -4.000000e+01 -5.809615e+01 3.187928e-01 226 1
40 -4.000000e+01 -5.809615e+01 4.233260e-01 296 1
-------------------------------------------------------------------
status : simulation_stopping
total time (s) : 4.233260e-01
total solves : 296
best bound : -5.809615e+01
numeric issues : 0
-------------------------------------------------------------------
-------------------------------------------------------------------
SDDP.jl (c) Oscar Dowson and contributors, 2017-26
-------------------------------------------------------------------
problem
nodes : 2
state variables : 2
scenarios : 9.00000e+00
existing cuts : false
options
solver : serial mode
risk measure : SDDP.Expectation()
sampling scheme : SDDP.InSampleMonteCarlo
subproblem structure
VariableRef : [7, 11]
AffExpr in MOI.EqualTo{Float64} : [2, 2]
AffExpr in MOI.LessThan{Float64} : [2, 2]
VariableRef in MOI.GreaterThan{Float64} : [5, 7]
VariableRef in MOI.Integer : [2, 2]
VariableRef in MOI.LessThan{Float64} : [4, 7]
VariableRef in MOI.ZeroOne : [4, 4]
numerical stability report
matrix range [1e+00, 6e+00]
objective range [1e+00, 3e+01]
bounds range [1e+00, 1e+02]
rhs range [0e+00, 0e+00]
-------------------------------------------------------------------
iteration simulation bound time (s) solves pid
-------------------------------------------------------------------
10 -4.000000e+01 -6.196125e+01 1.144090e-01 138 1
20 -9.800000e+01 -6.196125e+01 2.262650e-01 258 1
30 -4.700000e+01 -6.196125e+01 3.890522e-01 396 1
40 -7.500000e+01 -6.196125e+01 4.931700e-01 516 1
-------------------------------------------------------------------
status : simulation_stopping
total time (s) : 4.931700e-01
total solves : 516
best bound : -6.196125e+01
numeric issues : 0
-------------------------------------------------------------------
-------------------------------------------------------------------
SDDP.jl (c) Oscar Dowson and contributors, 2017-26
-------------------------------------------------------------------
problem
nodes : 2
state variables : 2
scenarios : 3.60000e+01
existing cuts : false
options
solver : serial mode
risk measure : SDDP.Expectation()
sampling scheme : SDDP.InSampleMonteCarlo
subproblem structure
VariableRef : [7, 11]
AffExpr in MOI.EqualTo{Float64} : [2, 2]
AffExpr in MOI.LessThan{Float64} : [2, 2]
VariableRef in MOI.GreaterThan{Float64} : [5, 7]
VariableRef in MOI.Integer : [2, 2]
VariableRef in MOI.LessThan{Float64} : [4, 7]
VariableRef in MOI.ZeroOne : [4, 4]
numerical stability report
matrix range [1e+00, 6e+00]
objective range [1e+00, 3e+01]
bounds range [1e+00, 1e+02]
rhs range [0e+00, 0e+00]
-------------------------------------------------------------------
iteration simulation bound time (s) solves pid
-------------------------------------------------------------------
10 -8.200000e+01 -6.546793e+01 1.825562e-01 462 1
20 -4.000000e+01 -6.546793e+01 3.381350e-01 852 1
30 -6.300000e+01 -6.546793e+01 6.713390e-01 1314 1
40 -4.700000e+01 -6.546793e+01 7.942481e-01 1704 1
-------------------------------------------------------------------
status : simulation_stopping
total time (s) : 7.942481e-01
total solves : 1704
best bound : -6.546793e+01
numeric issues : 0
-------------------------------------------------------------------