No description, website, or topics provided.
Switch branches/tags
Nothing to show
Clone or download
WPettersson Create and use symgroup.cpp if it is missing
symgroup.cpp and symgroup_extern.h are both generated before
compilation. They contain details of the symmetric group on up to n
elements (specified in src/
Latest commit 60a1818 Jul 26, 2018
Type Name Latest commit message Commit time
Failed to load latest commit information.
1701.08920 Update Feb 6, 2017
Examples Complete merge to CMake Mar 31, 2017
cmake_modules CMake compilation Mar 31, 2017
scripts Actually use options Nov 2, 2017
src Create and use symgroup.cpp if it is missing Jul 26, 2018
utils Make the script executable Oct 24, 2016
.gitignore Complete merge to CMake Mar 31, 2017
CMakeLists.txt Require newer version of CMake Mar 31, 2017 Update May 10, 2017
license.txt Initial commit Oct 3, 2016


This is a multi-objective integer programming (MOIP) algorithm, which is heavily based on the work discussed in the following paper.

Ozlen, M., Burton, B. A., & MacRae, C. A. (2014). Multi-objective integer programming: An improved recursive algorithm. Journal of Optimization Theory and Applications, 160(2), 470-482.

The original algorithm implementation can be found at but this version has significant changes, noticeably a switch to C++ and boost for various utility functions, as well as the use of parallel processing.

What is this repository for?

This software can be used to optimise various multi-objective integer programming problems. Currently, work is not yet stabilised and no guarantees can be offered on the correctness of various versions of the implementation. Official releases will hopefully be coming shortly.

How do I use it?

The program itself is called aira and is a command-line program. A complete listing of usage options can be found by simply running aira from a command prompt. Only one parameter is required, the program file to read. All other options tweak the parallelisation options and algorithm selection.

Algorithm selection

moip_aira has two in-built parallelisation algorithms, Efficient Projection Parallelisation (EPP) from and the synergistic parallelisation from The default is the synergistic parallelisation, as it performs better. Both algorithms have a few common options:

  • -t controls how many workers the parallel algorithm should start
  • -c controls how many threads each worker will use when calling CPLEX

Note that the above means that the total number of threads to use is t * c. For instance, -t 4 -c 3 will utilise up to 12 threads at once. Both of these options default to 1.


EPP splits the solution space up into t divisions, based on the possible values the last objective function can reach. One worker is then started for each such division.


For a proper understanding of this approach, I highly recommend reading the paper as it is not simple to describe. This algorithm has one more possible option, --spread. This option selects between the "clustering" and "spreading" algorithms as described in the paper. The default is "spreading" as this was the faster algorithm in the paper, but to select "clustering" simply pass --spread=0 to aira.

How do I specify a problem.

moip_aira uses an extended LP file format where multiple objectives are defined as additional constraints after the original problem's constraints. The right-hand-side value of the last constraint defines the number of objectives. Example LP files are provided under the examples folder.

No, really, just give me an example

Fine. Running aira -p Examples/3AP05.lp will solve the problem specified in the file Examples/3AP05.lp. If you inspect this file, you will note that the last constraint is of the form "... ≤ 3". This 3 indicates that the last 3 constraints in the file are not actually constraints to our problem, but are instead 3 distinct objective functions.

The output will be written to Examples/3AP05.out. This will show some timing and algorithm information, but mostly it will show rows of output containing 3 numbers. Each of this is a Pareto solution. Note that you can write the output to any file you choose by using the -o MyOutput.txt option.

How do I install it?

The implementation works on Linux operating systems, and requires IBM ILOG CPLEX (tested with versions 12.6.3 and 12.7.0) and Boost (specifically the program_options library). It also uses CMake (version 3.4 or higher) for building. This implementation should work just fine on Windows and OSX as well, however I do not have the ability to test those builds. If you can give me access to machines and software with which to test these, I will gladly try my best to provide some help.


Clone the repository

$ git clone

Create a directory in which to build

$ mkdir build && cd build

Set up the build environment

$ cmake ../ -DCPLEX_ROOT=/path/to/IBM/ILOG/CPLEX_Studio127/


$ make

Your executable now resides in the src directory. If you wish, you can run make install to install it to /usr/local/bin, assuming you have rights to do so. You can also run the included test suite by calling make test.

Who do I talk to?

Dr William Pettersson ( is the lead developer of this particular implementation of this algorithm. For more details on the original algorithm, you may also wish to talk to Assoc. Prof. Melih Ozlen (