I am excited to announce 5 new packages for solving Multiobjective Mixed Integer Linear Programs:
FPBH.jl: It is a linear programming based heuristic for computing an approximate nondominated frontier of any (both structured and unstructured) multiobjective mixed integer linear program in Julia.
It has been successfully tested on nearly 700 (both structured and unstructured) instances, including instances up to 5 objectives, > 1000 constraints, > 10000 variables
It is compatible with JuMP and supports LP and MPS file formats
No mixed integer programming solver is required and any linear programming solver supported by MathProgBase.jl can be used. It has been tested with GLPK, CLP, SCIP, Gurobi and CPLEX
All parameters are already tuned, only timelimit is required.
Modof.jl: It is a framework used for solving multiobjective mixed integer programs in Julia. It can:
handle multiple linear objectives using ModoModel ( a JuMP extension )
select, sort, write and normalize a nondominated frontier
compute ideal and nadir points of a nondominated frontier
compute the closest and the farthest point from the ideal and the nadir points
compute quality of a nondominated frontier (hypervolume, cardinality, coverage and uniformity)
includes wrappers for (tested only on linux): MDLS (for multidimensional knapsack and biobjective set packing problems) and NSGA-II (for biobjective binary programs)
Modolib.jl: It is a collection of instances and their efficient frontiers (if available) of various classes of multiobjective mixed integer programs. Around 700 instances with their true frontiers (biobjective assignment, knapsack, set covering, set packing, mixed binary and uncapacitated facility location; multiobjective assignment, knapsack and mixed binary) are included. It can also generate different classes of random multiobjective mixed integer programs commonly used in the literature.
Modoplots.jl: It is a Julia package capable of plotting nondominated frontiers of biobjective and triobjective optimization problems.
A small example:
Solving the following multi-objective mixed integer linear program using FPBH.jl and Clp as the underlying LP Solver:
You should be aware that substantial changes will be needed to update your JuMP extension for JuMP 0.19. We have a lot on our plate at the moment, but post JuMP 0.19 we can also consider extending MathOptInterface to support multiple objectives, so that in the future no JuMP extensions would be needed to model multiobjective problems.
@miles.lubin Thank you!. I also hope that other users find it useful.
If MathOptInterface can support multiple objectives, that will be great.
Another great feature would be, if MathOptInterface can support deleting constraints and modifying rhs and lhs of certain constraints without having to rebuild the model every time from scratch. This feature would significantly improve the performance of FPBH.jl as it has to solve a lot of LPs. This is one of the major difference between FPBH.jl and FPBHCPLEX.jl, as in the latter case the LP model is created only once ( for each worker ) and is reused through out the whole algorithm.
Once a stable release of MathOptInterface and JuMP 0.19 is available, I will start porting FPBH.jl from MathProgBase.jl to MathOptInterface.
Another great feature would be, if MathOptInterface can support deleting constraints and modifying rhs and lhs of certain constraints without having to rebuild the model every time from scratch.
Dear all,
very nice to see the efforts invested for dealing with multi objective models. With vOptGeneric (part of vOptSolver), a bi-objective linear assignment is formulated with JuMP (extended) as follow:
n = 3
C1 = [ 3 9 7 ; 16 10 6 ; 2 7 11 ]
C2 = [ 16 15 6 ; 5 7 13 ; 1 2 13 ]
using vOptGeneric
using GLPK ; using GLPKMathProgInterface
m = vModel( solver = GLPKSolverMIP() )
@variable( m , x[1:n,1:n] , Bin )
@addobjective( m , Min, sum( C1[i,j]*x[i,j] for i=1:n,j=1:n ) )
@addobjective( m , Min, sum( C2[i,j]*x[i,j] for i=1:n,j=1:n ) )
@constraint( m , cols[i=1:n], sum(x[i,j] for j=1:n) == 1 )
@constraint( m , rows[j=1:n], sum(x[i,j] for i=1:n) == 1 )
@time solve( m , method = :epsilon , step = 0.5 )
print_X_E(m)
getY_N(m)
In this example, the instance is solved with the epsilon-constraint method calling the MIP solver of GLPK.
Several others algorithms have been integrated to the solver this summer. I am currently writting the documentation (the next release is coming soon). More: see tutorial, exemples, and talk(s) on github / project: vOptSolver.