Multi-criteria objectives in CP Optimizer

For some optimization problems, a single objective function is insufficient; several criteria are required to express the problem precisely. The different criteria are generally contradictory; for instance, when buying a car, it is not trivial to find a cheap model with a powerful engine, low fuel consumption, great comfort, a large inside and a small outside. Instead, a trade-off amongst the various criteria must be found. CP Optimizer allows the user to define a multi-criteria objective and to specify the type of trade-off between the criteria. Basically, a multi-criteria objective is constructed with three elements: an array of expressions representing the different criteria, the sense of the optimization which specifies whether the criteria are to be minimized or maximized and a policy to determine the trade-offs between the criteria.

Concert Technology uses instances of the class `IloMultiCriterionExpr` for regrouping the array of criteria and the trade-off policy. An instance of `IloMultiCriterionExpr` is created by the function `IloStaticLex()` that can be given as parameter to the function `IloMaximize` or `IloMinimize` to specify the sense of optimization and the multi-criteria objective. For example:

```IloMultiCriterionExpr moExpr = IloStaticLex(env, exprArray);
IloObjective obj = IloMaximize(env, moExpr);
The function `IloStaticLex()` defines a multi-criteria policy, ordering the different criteria and performing a lexicographic optimization: the first criterion is considered as the most important one, any improvement of this criterion is worth any loss on the other criteria. The second criterion is the second most important one and so forth. The last criterion is the least important one.
In the Java(TM) API, the `IloStaticLex()` method is called `IloCP.staticLex`. In the .NET Languages API, this new method is called `CP.StaticLex`.
For further illustration, see the examples `truckfleet.cpp`, `Truckfleet.java` and `Truckfleet.cs`.