Hi all,
Following up on my previous question about Conditioning stochastic inflows on lagged state variables in SDDP.jl (PAR(p) model), I now have a question about applying the discount factor in the cost-to-go function and the role of padding stages.
Context
The one-stage hydrothermal dispatch problem (NEWAVE/Eletrobrás formulation) has the objective:
where \beta is the monthly discount rate and \alpha_{t+1} is the future cost-to-go function.
In SDDP.jl, the factor \frac{1}{1+\beta} that multiplies \alpha_{t+1} maps naturally to the edge weight in the policy graph. I implement it as:
annual_rate = 0.12
β_monthly = 1 / (1 + annual_rate)^(1/12)
graph = SDDP.Graph(0)
for t in 1:steps
SDDP.add_node(graph, t)
end
T_real = 60 # real planning horizon (e.g., 5 years x 12 months)
SDDP.add_edge(graph, 0 => 1, 1.0)
for t in 1:(steps - 1)
if t < T_real
SDDP.add_edge(graph, t => t + 1, β_monthly)
else
SDDP.add_edge(graph, t => t + 1, 1.0) # padding stages
end
end
Why padding is needed
Without padding, the model knows the world ends at stage T_real and sets \alpha_{T_{real}+1} = 0. This causes the model to over-dispatch thermal generation in the final periods (the end-of-horizon effect). Padding stages extend the horizon so that the cuts at T_real are informed by non-trivial future costs, approximating a reasonable terminal value function.
My questions
-
Is placing \frac{1}{1+\beta} on the edges the correct way to implement discounting in SDDP.jl? Or should the discount factor appear explicitly inside the subproblem objective instead?
-
For the padding stages, should the edge weight be
1.0(no discounting) or continue usingβ_monthly? My intuition is that padding stages are artificial and exist only to provide a non-trivial boundary condition — applying further discounting would shrink the cost-to-go signal from the padding toward zero, defeating its purpose. But one could also argue the padding should keep discounting and simply be long enough that the discounted tail becomes negligible.
Thanks!