Mixed-Integer Multi-objective Constrained Optimization Problem Solving

Dear All,
I wonder if there is a direct package that can be used to solve a mixed-integer multi-objective constrained problem. I tried to use “Metaheuristics.jl” but failed to represent my model’s mixed-integer variables.

Best Regards
Magy

1 Like

Hi there,

There’s BlackBoxOptim: GitHub - robertfeldt/BlackBoxOptim.jl: Black-box optimization for Julia

But if you’re looking for something like a multi-objective mixed-integer linear programming solver, I don’t know of one in Julia. It’s on our roadmap though: Multiobjective support in JuMP · Issue #2099 · jump-dev/JuMP.jl · GitHub

1 Like

If you want an out-of-the-box package that will take as input a JuMP problem with multiple objectives, and returns a Pareto front, I’m afraid there is not on at the moment.

If you want to optimize for a weighted combination of objectives (without manually making it into a single objective), or want have a priority in your objectives, e.g., “minimize objective 1, then minimize objective 2 while remaining optimal for objective 1”, it is possible (but not officially supported) with JuMP+Gurobi.

Gurobi supports a range of mixed-integer problems (linear and quadratic) and has some support for multiple objectives. That latter feature is not officially available through JuMP, however, you can follow this example to make it work. Credits to @odow for that original solution.

1 Like

vOptGeneric.jl (https://github.com/vOptSolver/vOptGeneric.jl) takes a bi-objective JuMP model, and with the epsilon-constraint method available in vOptGeneric, you can sample the non-dominated set of your problem. Example

using vOptGeneric, JuMP, GLPK

# creating a random instance of 2-MILP
function createInstance2MILP(nZ, nR, nK)
    c1Z = rand(1:10,nZ)
    c1R = rand(1:10,nR)    
    c2Z = rand(1:10,nZ)
    c2R = rand(1:10,nR)  
    A  = rand(5:25,nK,nZ+nR)
    d  = rand(50:100,nK)
    return c1Z, c1R, c2Z, c2R, A, d
end

# creating the JuMP model of 2-MILP 
function createProblemBiMILP(nZ, nR, nK, c1Z, c1R, c2Z, c2R, A, d)
    model = vModel( GLPK.Optimizer )
    @variable(model, xZ[1:nZ] ≥0 , Int)
    @variable(model, xR[1:nR] ≥ 0)
    @addobjective(model, Max, sum(c1Z[i]*xZ[i] for i in 1:nZ) + sum(c1R[i]*xR[i] for i in 1:nR))
    @addobjective(model, Max, sum(c2Z[i]*xZ[i] for i in 1:nZ) + sum(c2R[i]*xR[i] for i in 1:nR))
    @constraint(model, [i=1:nK], sum((A[i,j]*xZ[j]) for j in 1:nZ) + sum((A[i,nZ+j]*xR[j]) for j in 1:nR) ≤ d[i])
    return model
end

# ---- Create a numerical instance
nZ=2; nR=3 ; nK=4
c1Z, c1R, c2Z, c2R, A, d = createInstance2MILP(nZ,nR,nK)

# ---- Define the 2-MILP model
mod2MILP = createProblemBiMILP(nZ,nR,nK,c1Z,c1R,c2Z,c2R,A,d)

# ---- Invoking the solver 
vSolve(mod2MILP, method=:epsilon, step = 1.0)

# ---- Querying the results
Y_N = getY_N( mod2MILP )

Example of an output (set of non-points):

11-element Vector{Vector{Float64}}:
 [14.283333333333335, 36.333333333333336]
 [14.633333333333333, 35.333333333333336]
 [14.98333333333333, 34.333333333333336]
 [15.333333333333334, 33.333333333333336]
 [16.166666666666668, 31.66666666666666]
 [16.516666666666666, 30.666666666666664]
 [16.866666666666667, 29.666666666666664]
 [17.18828901423583, 27.450980392156858]
 [18.701960784313727, 26.450980392156858]
 [19.215686274509803, 25.45098039215686]
 [20.8, 22.0]
1 Like

It seems a good solution, and I will try it. Thanks for the help.