jvm.97
jvm.97

Reputation: 247

Can't solve my non linear optimization problem Julia

i'm trying to run the following a model in Julia JUMP, Optimizer Ipopt:

    J = 2
    c = [10, 20] 
    d = [10, -5]  
    n = 120 
    s = [100, 50]
    e = [500, 300]
    
    model = Model()
    set_optimizer(model, Ipopt.Optimizer)
    @variable(model, w[j = 1:J], Bin)
    @variable(model, v[j = 1:J]) 
    @constraint(model, sum(w[j] for j = 1:J) >= 1)
    @constraint(model, sum(v[j]*w[j] for j = 1:J) == n)
    @constraint(model, limi[j=1:J], e[j] - s[j] >= v[j]*w[j])
    @objective(model, Min, sum(v[j]*w[j]*(c[j]+d[j]) for j in 1:J))
    optimize!(model)

I don't have errors when running the variables, constraints and objetive, but when i try to solve it, i get this message:

ERROR: MathOptInterface.UnsupportedConstraint{MathOptInterface.SingleVariable, MathOptInterface.ZeroOne}: `MathOptInterface.SingleVariable`-in-`MathOptInterface.ZeroOne` constraint is not supported by the model.
Stacktrace:
  [1] bridge_type(b::MathOptInterface.Bridges.LazyBridgeOptimizer{Ipopt.Optimizer}, S::Type{MathOptInterface.ZeroOne})       
    @ MathOptInterface.Bridges C:\Users\tatty\.julia\packages\MathOptInterface\YDdD3\src\Bridges\lazy_bridge_optimizer.jl:423
  [2] concrete_bridge_type
    @ C:\Users\tatty\.julia\packages\MathOptInterface\YDdD3\src\Bridges\Variable\bridge.jl:248 [inlined]
  [3] add_constrained_variable(b::MathOptInterface.Bridges.LazyBridgeOptimizer{Ipopt.Optimizer}, set::MathOptInterface.ZeroOne)
    @ MathOptInterface.Bridges C:\Users\tatty\.julia\packages\MathOptInterface\YDdD3\src\Bridges\bridge_optimizer.jl:1679
  [4] copy_single_variable(dest::MathOptInterface.Bridges.LazyBridgeOptimizer{Ipopt.Optimizer}, src::MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.GenericModel{Float64, MathOptInterface.Utilities.ModelFunctionConstraints{Float64}}}, idxmap::MathOptInterface.Utilities.IndexMap, S::Type{MathOptInterface.ZeroOne}, copy_constrained_variable::typeof(MathOptInterface.add_constrained_variable))
    @ MathOptInterface.Utilities C:\Users\tatty\.julia\packages\MathOptInterface\YDdD3\src\Utilities\copy.jl:376
  [5] try_constrain_variables_on_creation(dest::MathOptInterface.Bridges.LazyBridgeOptimizer{Ipopt.Optimizer}, src::MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.GenericModel{Float64, MathOptInterface.Utilities.ModelFunctionConstraints{Float64}}}, idxmap::MathOptInterface.Utilities.IndexMap, copy_constrained_variables::typeof(MathOptInterface.add_constrained_variables), copy_constrained_variable::typeof(MathOptInterface.add_constrained_variable))
    @ MathOptInterface.Utilities C:\Users\tatty\.julia\packages\MathOptInterface\YDdD3\src\Utilities\copy.jl:630
  [6] default_copy_to(dest::MathOptInterface.Bridges.LazyBridgeOptimizer{Ipopt.Optimizer}, src::MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.GenericModel{Float64, MathOptInterface.Utilities.ModelFunctionConstraints{Float64}}}, copy_names::Bool, filter_constraints::Nothing)
    @ MathOptInterface.Utilities C:\Users\tatty\.julia\packages\MathOptInterface\YDdD3\src\Utilities\copy.jl:691
  [7] #automatic_copy_to#127
    @ C:\Users\tatty\.julia\packages\MathOptInterface\YDdD3\src\Utilities\copy.jl:24 [inlined]
  [8] #copy_to#4
    @ C:\Users\tatty\.julia\packages\MathOptInterface\YDdD3\src\Bridges\bridge_optimizer.jl:401 [inlined]
  [9] attach_optimizer(model::MathOptInterface.Utilities.CachingOptimizer{MathOptInterface.AbstractOptimizer, MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.GenericModel{Float64, MathOptInterface.Utilities.ModelFunctionConstraints{Float64}}}})
    @ MathOptInterface.Utilities C:\Users\tatty\.julia\packages\MathOptInterface\YDdD3\src\Utilities\cachingoptimizer.jl:185
 [10] optimize!(m::MathOptInterface.Utilities.CachingOptimizer{MathOptInterface.AbstractOptimizer, MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.GenericModel{Float64, MathOptInterface.Utilities.ModelFunctionConstraints{Float64}}}})
    @ MathOptInterface.Utilities C:\Users\tatty\.julia\packages\MathOptInterface\YDdD3\src\Utilities\cachingoptimizer.jl:248
 [11] optimize!(model::Model, optimizer_factory::Nothing; bridge_constraints::Bool, ignore_optimize_hook::Bool, kwargs::Base.Iterators.Pairs{Union{}, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
    @ JuMP C:\Users\tatty\.julia\packages\JuMP\Xrr7O\src\optimizer_interface.jl:185
 [12] optimize! (repeats 2 times)
    @ C:\Users\tatty\.julia\packages\JuMP\Xrr7O\src\optimizer_interface.jl:157 [inlined]
 [13] top-level scope
    @ c:\Users\tatty\Desktop\COPEC\Transferencia.jl:57

I don't know what the problem is! Can you help me fix it?

Upvotes: 1

Views: 318

Answers (1)

Przemyslaw Szufel
Przemyslaw Szufel

Reputation: 42244

Binary variables are not supported by Ipopt and your model is non linear too. You could either look for a way to reformulate your model (best something that is no more complex than quadratic optimization) or use a solver that combines nonlinear optimization with integer optimization (a solver having both NLP and MI - see https://jump.dev/JuMP.jl/stable/installation/ for a full list).

An example of such solver is Juniper:

using Juniper
nl_solver = optimizer_with_attributes(Ipopt.Optimizer, "print_level"=>0)
minlp_solver = optimizer_with_attributes(Juniper.Optimizer, "nl_solver"=>nl_solver)
model = Model(minlp_solver)

# ... your model formulation goes here ...

which now yields:

julia> optimize!(model)
nl_solver         : MathOptInterface.OptimizerWithAttributes(Ipopt.Optimizer, Pair{MathOptInterface.AbstractOptimizerAttribute, Any}[MathOptInterface.RawOptimizerAttribute("print_level") => 0])
feasibility_pump  : false
log_levels        : [:Options, :Table, :Info]

#Variables: 4
#IntBinVar: 2
Obj Sense: Min

Start values are not feasible.
Status of relaxation: LOCALLY_SOLVED
Time for relaxation: 3.2210001945495605
Relaxation Obj: 1799.999812698674
Obj: 1799.999812698674

julia> value.(v), value.(w)
([3746.1783356276496, 120.00003686167656], [-9.99987585278312e-9, 1.000000004999938])

Upvotes: 1

Related Questions