SLDP: example 1

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.2 of the paper: Ahmed, S., Cabral, F. G., & da Costa, B. F. P. (2019). Stochastic Lipschitz Dynamic Programming. Optimization Online. PDF

using SDDP, HiGHS, Testfunction sldp_example_one()    model = SDDP.LinearPolicyGraph(;        stages = 8,        lower_bound = 0.0,        optimizer = HiGHS.Optimizer,    ) do sp, t        @variable(sp, x, SDDP.State, initial_value = 2.0)        @variables(sp, begin            x⁺ >= 0            x⁻ >= 0            0 <= u <= 1, Bin            ω        end)        @stageobjective(sp, 0.9^(t - 1) * (x⁺ + x⁻))        @constraints(sp, begin            x.out == x.in + 2 * u - 1 + ω            x⁺ >= x.out            x⁻ >= -x.out        end)        points = [            -0.3089653673606697,            -0.2718277412744214,            -0.09611178608243474,            0.24645863921577763,            0.5204224537256875,        ]        SDDP.parameterize(φ -> fix(ω, φ), sp, [points; -points])        return    end    SDDP.train(model; log_frequency = 10)    @test SDDP.calculate_bound(model) <= 1.1675    returnendsldp_example_one()
-------------------------------------------------------------------
         SDDP.jl (c) Oscar Dowson and contributors, 2017-26
-------------------------------------------------------------------
problem
  nodes           : 8
  state variables : 1
  scenarios       : 1.00000e+08
  existing cuts   : false
options
  solver          : serial mode
  risk measure    : SDDP.Expectation()
  sampling scheme : SDDP.InSampleMonteCarlo
subproblem structure
  VariableRef                             : [7, 7]
  AffExpr in MOI.EqualTo{Float64}         : [1, 1]
  AffExpr in MOI.GreaterThan{Float64}     : [2, 2]
  VariableRef in MOI.GreaterThan{Float64} : [4, 4]
  VariableRef in MOI.LessThan{Float64}    : [1, 2]
  VariableRef in MOI.ZeroOne              : [1, 1]
numerical stability report
  matrix range     [1e+00, 2e+00]
  objective range  [5e-01, 1e+00]
  bounds range     [1e+00, 1e+00]
  rhs range        [1e+00, 1e+00]
-------------------------------------------------------------------
 iteration    simulation      bound        time (s)     solves  pid
-------------------------------------------------------------------
        10   3.272983e+00  1.166965e+00  5.366366e+00      1680   1
        20   4.412603e+00  1.166965e+00  5.890186e+00      2560   1
        30   3.086857e+00  1.167299e+00  1.076269e+01      4240   1
        40   3.816808e+00  1.167299e+00  1.125803e+01      5120   1
        50   3.793849e+00  1.167299e+00  1.616854e+01      6800   1
        60   3.172515e+00  1.167299e+00  1.671442e+01      7680   1
        70   2.935820e+00  1.167410e+00  2.158035e+01      9360   1
        80   3.287600e+00  1.167410e+00  2.211692e+01     10240   1
-------------------------------------------------------------------
status         : simulation_stopping
total time (s) : 2.211692e+01
total solves   : 10240
best bound     :  1.167410e+00
numeric issues : 0
-------------------------------------------------------------------