Reputation: 247
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
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