StructDualDynProg: Problem 5.2, 2 stages

This tutorial was generated using Literate.jl. Download the source as a .jl file. Download the source as a .ipynb file.

This example comes from StochasticDualDynamicProgramming.jl

using SDDP, HiGHS, Testfunction test_prob52_2stages()    model = SDDP.LinearPolicyGraph(;        stages = 2,        lower_bound = 0.0,        optimizer = HiGHS.Optimizer,    ) do subproblem, stage        # ========== Problem data ==========        n = 4        m = 3        i_c = [16, 5, 32, 2]        C = [25, 80, 6.5, 160]        T = [8760, 7000, 1500] / 8760        D2 = [diff([0, 3919, 7329, 10315]) diff([0, 7086, 9004, 11169])]        p2 = [0.9, 0.1]        # ========== State Variables ==========        @variable(subproblem, x[i = 1:n] >= 0, SDDP.State, initial_value = 0.0)        # ========== Variables ==========        @variables(subproblem, begin            y[1:n, 1:m] >= 0            v[1:n] >= 0            penalty >= 0            rhs_noise[1:m]  # Dummy variable for RHS noise term.        end)        # ========== Constraints ==========        @constraints(            subproblem,            begin                [i = 1:n], x[i].out == x[i].in + v[i]                [i = 1:n], sum(y[i, :]) <= x[i].in                [j = 1:m], sum(y[:, j]) + penalty >= rhs_noise[j]            end        )        if stage == 2            # No investment in last stage.            @constraint(subproblem, sum(v) == 0)        end        # ========== Uncertainty ==========        if stage != 1 # no uncertainty in first stage            SDDP.parameterize(subproblem, 1:size(D2, 2), p2) do ω                for j in 1:m                    fix(rhs_noise[j], D2[j, ω])                end            end        end        # ========== Stage objective ==========        @stageobjective(subproblem, i_c' * v + C' * y * T + 1e6 * penalty)        return    end    SDDP.train(model; log_frequency = 10)    @test SDDP.calculate_bound(model)  340315.52 atol = 0.1    returnendtest_prob52_2stages()
-------------------------------------------------------------------
         SDDP.jl (c) Oscar Dowson and contributors, 2017-26
-------------------------------------------------------------------
problem
  nodes           : 2
  state variables : 4
  scenarios       : 2.00000e+00
  existing cuts   : false
options
  solver          : serial mode
  risk measure    : SDDP.Expectation()
  sampling scheme : SDDP.InSampleMonteCarlo
subproblem structure
  VariableRef                             : [29, 29]
  AffExpr in MOI.EqualTo{Float64}         : [4, 5]
  AffExpr in MOI.GreaterThan{Float64}     : [3, 3]
  AffExpr in MOI.LessThan{Float64}        : [4, 4]
  VariableRef in MOI.GreaterThan{Float64} : [22, 22]
  VariableRef in MOI.LessThan{Float64}    : [1, 1]
numerical stability report
  matrix range     [1e+00, 1e+00]
  objective range  [1e+00, 1e+06]
  bounds range     [0e+00, 0e+00]
  rhs range        [0e+00, 0e+00]
-------------------------------------------------------------------
 iteration    simulation      bound        time (s)     solves  pid
-------------------------------------------------------------------
        10   3.455904e+05  3.147347e+05  5.064011e-03        54   1
        20   3.336455e+05  3.402383e+05  7.926941e-03       104   1
        30   3.337559e+05  3.403155e+05  1.029110e-02       158   1
        40   3.337559e+05  3.403155e+05  1.251793e-02       208   1
        47   3.337559e+05  3.403155e+05  1.430297e-02       243   1
-------------------------------------------------------------------
status         : simulation_stopping
total time (s) : 1.430297e-02
total solves   : 243
best bound     :  3.403155e+05
numeric issues : 0
-------------------------------------------------------------------