From 8231f9da3266163f3e69613363f34e509ec1b666 Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Wed, 9 Nov 2022 11:34:37 -0600 Subject: [PATCH] Implement full recourse; remove feasibility cuts --- src/model/build.jl | 17 +++++++++++++++-- src/model/solve.jl | 4 +++- test/model/solve_test.jl | 22 +++++++++++++--------- 3 files changed, 31 insertions(+), 12 deletions(-) diff --git a/src/model/build.jl b/src/model/build.jl index 7e668b4..9764666 100644 --- a/src/model/build.jl +++ b/src/model/build.jl @@ -24,6 +24,7 @@ function build_model( probs::Vector{Float64}; optimizer, method=:ef, + tol=0.1, ) T = instance.time @@ -118,6 +119,13 @@ function build_model( upper_bound = graph.collection_shipping_nodes[n].location.amount[t], ) + # Var: collection_shortfall + @recourse( + model, + collection_shortfall[n in 1:CSN, t in 1:T], + lower_bound = 0, + ) + # Var: store @recourse( model, @@ -209,6 +217,11 @@ function build_model( csn[n].location.product.disposal_cost[t] * collection_dispose[n, t] for n in 1:CSN for t in 1:T + ) + sum( + # Collection shortfall + 1e4 * collection_shortfall[n, t] + for n in 1:CSN + for t in 1:T ) ) @@ -280,7 +293,7 @@ function build_model( sum( flow[arc.index, t] for arc in csn[n].outgoing_arcs - ) == csn[n].location.amount[t] - collection_dispose[n, t] + ) == csn[n].location.amount[t] - collection_dispose[n, t] - collection_shortfall[n, t] ) # Material flow at plant shipping nodes @@ -323,7 +336,7 @@ function build_model( sp = instantiate(model, ΞΎ; optimizer=LShaped.Optimizer) set_optimizer_attribute(sp, MasterOptimizer(), optimizer) set_optimizer_attribute(sp, SubProblemOptimizer(), optimizer) - set_optimizer_attribute(sp, FeasibilityStrategy(), FeasibilityCuts()) + set_optimizer_attribute(sp, RelativeTolerance(), tol) else error("unknown method: $method") end diff --git a/src/model/solve.jl b/src/model/solve.jl index fdd4177..2e6b8b4 100644 --- a/src/model/solve.jl +++ b/src/model/solve.jl @@ -29,6 +29,8 @@ function solve_stochastic(; scenarios::Vector{String}, probs::Vector{Float64}, optimizer, + method=:ef, + tol=0.1, ) @info "Reading instance files..." instances = [parsefile(sc) for sc in scenarios] @@ -37,7 +39,7 @@ function solve_stochastic(; graphs = [build_graph(inst) for inst in instances] @info "Building stochastic model..." - sp = RELOG.build_model(instances[1], graphs, probs; optimizer) + sp = RELOG.build_model(instances[1], graphs, probs; optimizer, method, tol) @info "Optimizing stochastic model..." optimize!(sp) diff --git a/test/model/solve_test.jl b/test/model/solve_test.jl index d20ec99..361211b 100644 --- a/test/model/solve_test.jl +++ b/test/model/solve_test.jl @@ -40,13 +40,13 @@ function model_solve_test() solution = RELOG.solve(fixture("instances/s1.json"), heuristic = true) end - @testset "solve (infeasible)" begin - json = JSON.parsefile(fixture("instances/s1.json")) - for (location_name, location_dict) in json["products"]["P1"]["initial amounts"] - location_dict["amount (tonne)"] *= 1000 - end - @test_throws ErrorException("No solution available") RELOG.solve(RELOG.parse(json)) - end + # @testset "solve (infeasible)" begin + # json = JSON.parsefile(fixture("instances/s1.json")) + # for (location_name, location_dict) in json["products"]["P1"]["initial amounts"] + # location_dict["amount (tonne)"] *= 1000 + # end + # @test_throws ErrorException("No solution available") RELOG.solve(RELOG.parse(json)) + # end @testset "solve (with storage)" begin basedir = dirname(@__FILE__) @@ -75,7 +75,11 @@ function model_solve_test() fixture("instances/case3_p010_s1.25.json"), ], probs=[0.5, 0.5], - optimizer=HiGHS.Optimizer, + optimizer=optimizer_with_attributes( + HiGHS.Optimizer, + "log_to_console" => false, + ), + method=:lshaped, ) end -end \ No newline at end of file +end