# Multi-Objective Optimization Support

I’m working on my master thesis on Multi-Objective Optimization (MOO) and I found JuMP to be a clean and elegant framework. However, JuMP does not currently support Multi-Objective optimization. Are you planning to support it in the future?

Of course, I do know I could instead establish a preference articulation on my objectives and formulate my problem as a Single-Objective Optimization problem. However, I am more interested in providing the users a clear picture of the trade-offs involved in the optimization problem itself, rather than on providing a single solution. I’m aware of MultiJuMP but it does not satisfy my needs as I have not been able to solve the DLTZ1 problem.

Additionally, the lack of documentation on MultiJuMP also makes it a bit difficult to perceive if I am doing something wrong or not.

using JuMP, MultiJuMP
using NLopt

m = MultiModel(solver = NLoptSolver(algorithm=:GN_CRS2_LM, maxeval=100))
f(z...) = 2 + sum([(z[i]-0.5)^2 - cos(20 * 3.14 *(z[i]-0.5)) for i in 1:length(z)])
JuMP.register(m, :f, 2, f; autodiff=true)

@variable(m, 0 <= x <= 1)
@variable(m, 0 <= y <= 1)
@NLexpression(m, f2, 0.5*(1-x)*(1+f(x, y)))
@NLexpression(m, f1, 0.5*x*(1+f(x, y)))

obj1 = SingleObjective(f1, sense = :Min)
obj2 = SingleObjective(f2, sense = :Min)

md = getMultiData(m)
md.objectives = [obj1,obj2]
md.pointsperdim = 10
solve(m, method = :NBI)

Also, are you planning on supporting derivative-free optimization? NLopt supports derivative-free optimization, however, JuMP currently claims that such optimization is not supported. And although I’m aware of BlackBoxOptim, they only provide a unique multi-objective optimization algorithm…

2 Likes

A while ago I successfully used MultiJuMP. I don’t exactly remember if I tweaked the code or not. Also you are mixing too many things are not giving information on what’s not working. Any error messages?. So start simple.

1. Solve an LP using JuMP with CBC as solver (If you have CPLEX or Gurobi, use that)
2. Solve a multiobjective LP using MultiJuMP with epsilon constraint method
3. Solve a single objective of your problem with whatever solver you want to use.
4. Solve the multiobjective you want

My model was a MILP, and these are last lines of the code I used to solve it.

obj1 = SingleObjective(fixedCost, sense = :Min)
obj2 = SingleObjective(transportationCost + inventoryCost, sense = :Min)

md = getMultiData(m)
md.objectives = [obj1, obj2]
md.pointsperdim = 20

solve(m, method = :EPS)

cheers

Hi Miles,

I’ve already reached out the MultiJuMP community about updating it to work with JuMP 0.19. I haven’t heard back from them yet and the project doesn’t seem to be very active. You mentioned on the GitHub issue that if anyone was interested in developing such a feature that you could provide them some pointers. Myself and a few colleagues of mine are very interested having this feature. What can we do to make this happen?

Thank you so much!