odow / SDDP.jl

A JuMP extension for Stochastic Dual Dynamic Programming
https://sddp.dev
Other
293 stars 62 forks source link

New cut_type: Stochastic cutting plane #275

Closed roporte closed 3 years ago

roporte commented 4 years ago

Hi, I am trying to develop a third option in the SDDP package in addition to SINGLE_CUT and MULTI_CUT (STOCH_CUT_PLANE). This new option consists in sampling only one noise on each node in the backward pass and then solving the problem for that noises and for all old noises sampled in previous iterations at that node. With those solved problems a new cut is added averaging. Then old cuts at that node are smoothed by a factor (k-1)/k where k is the iteration number.

To do this i generate in refine_bellman_function the new case, but when I have to add the new cut (_add_stoch_cut function) i need to have the parameters with the solutions for old noises. I tried to store old noises inside the node so when solve_all_children is called, if cut_type==STOCH_CUT_PLANE then a MonteCarloSampler(1) is used to sample only a single noise. Then the noise terms collection is created with this new noise and the old noises (stored in the node). By doing things in this way i have the problem that i cannot fill old_noises collection in the node. Could you suggest some way to do it, or eventually another way to design the solution? I would prefer to clarify the design before forking and iterating.

Thank you

odow commented 4 years ago

Are you trying to do something like this paper: http://www.optimization-online.org/DB_FILE/2019/09/7395.pdf?

The current implementation uses a novel formulation that isn't well (if at all) documented in the literature. Essentially, we have:

V(x_{t-1}, w) = min c' x_t + theta_global
               s.t. T_w x_t = b_w - E_w x_{t-1}
                    x_t >= 0
                    # "single" cuts:
                    theta_global >= E[V_w] + E[pi_w]' (x_t - x_k)
                    # "multi" cuts:
                    theta_w >= V_w + pi_w' (x - x_k), w in W
                    # "risk-set" cuts
                    theta_global >= E[theta_w]

It sounds like you want to add a different type of a single-cut, using past realizations. So, my questions are:

I would prefer to clarify the design before forking and iterating.

These things usually take iterating. I would fork the library and hack in any way you want to get a minimum viable implementation working. Then we can step back and take a look to see if there is a better way to implement it.

It seems like you might want to create a backward_pass_sampling_scheme that can see the forward pass, and then add a way to modify existing cuts in the model.

roporte commented 4 years ago

Are you trying to do something like this paper: http://www.optimization-online.org/DB_FILE/2019/09/7395.pdf?

Is similar, you can see details in Stochastic Decomposition book, by Julia Higle. Page 65 Stochastic Cutting Plane Method.

It sounds like you want to add a different type of a single-cut, using past realizations. So, my questions are:

  • does this rely on the uncertainty being in the RHS only? Yes

  • the smoothing requires a lower-bound of 0, correct?

Could be 0 or a constant parameter.

These things usually take iterating. I would fork the library and hack in any way you want to get a minimum viable implementation working. Then we can step back and take a look to see if there is a better way to implement it.

I have forked and pushed the new branck (rp/stochCuttingPlane). In this branch i did what i explained (a third option in addition to SINGLE_CUT, and MULTI_CUT) and tried to keep the past noises in a collection inside the node but i get stucked and decide to open this issue. Maybe when you analyze this branch you suggest me to fork again from master branch and try another solution.

Thank you

odow commented 4 years ago

Is similar, you can see details in Stochastic Decomposition book, by Julia Higle. Page 65 Stochastic Cutting Plane Method.

Can you explain how your method is different to the paper I linked to? The paper is a direct extension of stochastic decomposition to multistage stochastic programs, and includes some nice tweaks. Email me privately if you don't want to share the details publicly. It'd be nice to see a write up of what you're trying to implement.

That said, I'm not in a rush to implement SLDP because I'm not convinced the computational benefit in some instances outweighs that additional code complexity that would be added to SDDP.jl.

odow commented 3 years ago

Closing as out-dated, and because I don't see a way of integrating this into SDDP.jl in the medium term.

However, if you want to keep working on this, please fork the library and hack away :smile:, and we can re-open this issue at a later time.