Skip to content
Snippets Groups Projects
Verified Commit a05ac42c authored by Michiel Cottaar's avatar Michiel Cottaar
Browse files

Keep optimising until stable objective_value is reached

parent 818d8cb6
No related branches found
No related tags found
No related merge requests found
module BuildSequences module BuildSequences
import JuMP: Model, optimizer_with_attributes, optimize!, AbstractJuMPScalar, value, solution_summary, termination_status, LOCALLY_SOLVED, OPTIMAL, num_variables, all_variables, set_start_value, ALMOST_LOCALLY_SOLVED import JuMP: Model, optimizer_with_attributes, optimize!, AbstractJuMPScalar, value, solution_summary, termination_status, LOCALLY_SOLVED, OPTIMAL, num_variables, all_variables, set_start_value, ALMOST_LOCALLY_SOLVED, objective_value
import Ipopt import Ipopt
import Juniper import Juniper
import ..Scanners: Scanner, gradient_strength, Default_Scanner import ..Scanners: Scanner, gradient_strength, Default_Scanner
...@@ -54,6 +54,7 @@ function build_sequence(f::Function, scanner::Union{Nothing, Scanner}, model::Mo ...@@ -54,6 +54,7 @@ function build_sequence(f::Function, scanner::Union{Nothing, Scanner}, model::Mo
sequence = f() sequence = f()
if optimise if optimise
if !iszero(num_variables(model)) if !iszero(num_variables(model))
min_objective = Inf
for attempt in 1:n_attempts for attempt in 1:n_attempts
if attempt != 1 if attempt != 1
old_values = value.(all_variables(model)) old_values = value.(all_variables(model))
...@@ -65,8 +66,12 @@ function build_sequence(f::Function, scanner::Union{Nothing, Scanner}, model::Mo ...@@ -65,8 +66,12 @@ function build_sequence(f::Function, scanner::Union{Nothing, Scanner}, model::Mo
end end
optimize!(model) optimize!(model)
if termination_status(model) in (LOCALLY_SOLVED, OPTIMAL) if termination_status(model) in (LOCALLY_SOLVED, OPTIMAL)
println("Optimisation succeeded after $(attempt-1) restarts.") if objective_value(model) < min_objective
break min_objective = objective_value(model)
elseif isapprox(min_objective, objective_value(model), rtol=1e-6)
println("Optimisation succeeded after $(attempt-1) restarts.")
break
end
end end
end end
if !(termination_status(model) in (LOCALLY_SOLVED, OPTIMAL)) if !(termination_status(model) in (LOCALLY_SOLVED, OPTIMAL))
...@@ -84,7 +89,7 @@ function build_sequence(f::Function, scanner::Union{Nothing, Scanner}, model::Mo ...@@ -84,7 +89,7 @@ function build_sequence(f::Function, scanner::Union{Nothing, Scanner}, model::Mo
end end
end end
function build_sequence(f::Function, scanner::Union{Nothing, Scanner}, optimiser_constructor; optimise=true, n_attempts=100, kwargs...) function build_sequence(f::Function, scanner::Union{Nothing, Scanner}, optimiser_constructor; optimise=true, n_attempts=1000, kwargs...)
if optimise || GLOBAL_MODEL[] == IGNORE_MODEL if optimise || GLOBAL_MODEL[] == IGNORE_MODEL
model = Model(optimizer_with_attributes(optimiser_constructor, [string(k) => v for (k, v) in kwargs]...)) model = Model(optimizer_with_attributes(optimiser_constructor, [string(k) => v for (k, v) in kwargs]...))
else else
...@@ -93,7 +98,7 @@ function build_sequence(f::Function, scanner::Union{Nothing, Scanner}, optimiser ...@@ -93,7 +98,7 @@ function build_sequence(f::Function, scanner::Union{Nothing, Scanner}, optimiser
build_sequence(f, scanner, model, optimise, n_attempts) build_sequence(f, scanner, model, optimise, n_attempts)
end end
function build_sequence(f::Function, scanner::Union{Nothing, Scanner}=Default_Scanner; print_level=2, kwargs...) function build_sequence(f::Function, scanner::Union{Nothing, Scanner}=Default_Scanner; print_level=0, kwargs...)
build_sequence(f, scanner, Ipopt.Optimizer; print_level=print_level, kwargs...) build_sequence(f, scanner, Ipopt.Optimizer; print_level=print_level, kwargs...)
end end
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment