Best way to improve local minimas in nonlinear optimization?

using JuMP, Ipopt
runs = Any[]
model = Model(Ipopt.Optimizer)
@variable(model, 0 <= x[1:4] <= 1)
my_objective(x...) = sum(sin((x[i] - i) / 10) for i in 1:4)
register(model, :mobj, length(x), my_objective; autodiff = true)
@NLobjective(model, Min, mobj(x...))
for i in 1:5
    x0 = rand(4)
    set_start_value.(x, x0)
    optimize!(model)
    push!(
        runs, 
        (
            obj = objective_value(model), 
            x = value.(x),
            x0 = x0,
        )
    )
end
obj, index = findmin(r -> r.obj, runs)
runs[index]
3 Likes