1

Need help in resolving issue of Constraints of type MathOptInterface.VariableIndex-in-MathOptInterface.ZeroOne are not supported by the solver. When using Ipopt solver in Julia for BinPacking problem

#variables declaration

@variable(model, x[1:length(packages[!,:PackagingID]), 1:length(items[!,:ItemNumber]), 1:length(bins[!,:binID])], Bin)
@variable(model, c[1:length(packages[!,:PackagingID]), 1:length(bins[!,:binID])], Bin)
function item_rule(item)
    return sum(x[i,item,k] for i in 1:length(packages[!,:PackagingID]) for k in 1:length(bins[!,:binID])) 
end
function pack_rule(pack,bin)
    return sum(x[pack,j,bin]*items.Weight[j] for j in 1:length(items[!,:ItemNumber]))
end
function pack_weight(pack,bin)
    return c[pack,bin]*packages.MaxWeight[pack]
end
function binpack_rule(bin)
    return sum(c[i,bin] for i in 1:length(packages[!,:PackagingID]))
end
   
#constaints 
for j in 1:length(items[!,:ItemNumber])
    A = @NLconstraint(model, item_rule(j) == 1)
end
for i in 1:length(packages[!,:PackagingID]), k in 1:length(bins[!,:binID])
    B = @NLconstraint(model, pack_rule(i,k) <= pack_weight(i,k))
end
for k in 1:length(bins[!,:binID])
    C = @NLconstraint(model,binpack_rule(k) <= 1)
end

#objectives
    
@NLobjective(
    model,
    Min,
    (sum(c[i,k]*packages.PackageCost[i] for i in 1:length(packages[!,:PackagingID]) for k in 1:length(bins[!,:binID])) + sum(c[i,k]*bins.binNo[k] for i in 1:length(packages[!,:PackagingID]) for k in 1:length(bins[!,:binID])) ),
)

Here is the screenshot of the error I got:

enter image description here

Vincent Doba
  • 4,343
  • 3
  • 22
  • 42
Dones
  • 5
  • 1

1 Answers1

1

A few points:

  • Ipopt does not support discrete variables
  • Your problem is actually linear, so you can use a MILP solver like Cbc
  • JuMP is not like Pyomo. Don't write everything as functions

I don't have the data so I haven't tested this (there might be typos or other mistakes), but this should point you in the right direction. You might want to read through the tutorials and examples in the JuMP documentation: https://jump.dev/JuMP.jl/stable/tutorials/getting_started/getting_started_with_JuMP/

using JuMP, Cbc
n_packages = size(packages, 1)
n_items = size(items, 1)
n_bins = size(bins, 1)
model = Model(Cbc.Optimizer)
@variable(model, x[1:n_packages, 1:n_items, 1:n_bins], Bin)
@variable(model, c[1:n_packages, 1:n_bins], Bin)
@constraint(model, [j=1:n_items], sum(x[:, j, :]) == 1)
@constraint(
    model, 
    [i=1:n_packages, k=1:n_bins],
    sum(x[i, j, k] * items.Weight[j] for j in 1:n_items) <= c[i, k] * packages.MaxWeight[i],
)
@constraint(model, [k=1:n_bins], sum(c[i, k] for i in 1:n_packages) <= 1)
@objective(
    model,
    Min,
    sum(
        c[i, k] * (packages.PackageCost[i] + bins.binNo[k])
        for i=1:n_packages for k=1:n_bins
    )
)
Oscar Dowson
  • 2,395
  • 1
  • 5
  • 13