6.4. Multi-Objective Optimization

When the problem is linear and users want to optimize multiple objectives simultaneously, the multi-objective functionality can be utilized.

In most cases, solvers cannot find optimal values for all objective functions simultaneously. Users must rank objectives by priority, ensuring the solver focuses on achieving optimal values for higher-priority objectives.

However, this is not absolute. Users can configure attributes to allow higher-priority objectives to degrade its optimality, thereby providing lower-priority objectives with greater optimization flexibility.

Users can access the multi-objective functionality through SDK APIs. Details are available in the API documentation.

Note

Multi-objective functionality only supports linear programming, including LP and MILP.

6.4.1. User Interface

6.4.1.1. Priority

Each objective function can be assigned a corresponding priority level (attribute ObjNPriority). When solving multi-objective problems, the solver typically performs multiple optimization rounds determined by the priority levels.

In each round, the current objective is optimized while maintaining the values of previously optimized objectives within defined tolerance constraints.

6.4.1.2. Weight

Each objective function can be assigned a corresponding weight (attribute ObjNWeight). When two or more objective functions share the same priority level, they are combined into a single objective and optimized in one round. The combined objective becomes a weighted sum of the original individual objectives.

6.4.1.3. Tolerance

Users can define absolute tolerance (ObjNAbsTol) and relative tolerance (ObjNRelTol) to moderately allow degradation of previously optimized higher-priority objective values. This typically enables significant improvement in the optimization of subsequent lower-priority objectives.

The definition and calculation method of tolerances will be introduced in the next section.

6.4.2. Computational Logic

6.4.2.1. Objective Combination and Sorting

For example, consider the following objective functions:

\[\begin{split}\begin{align*} &OBJ0 (Priority=1, Weight=2.0, AbsTol=1e-6, RelTol=0) \\ &OBJ1 (Priority=2, Weight=2.0, AbsTol=1e-5, RelTol=1e-5) \\ &OBJ2 (Priority=3, Weight=2.0, AbsTol=1e-6, RelTol=0) \\ &OBJ3 (Priority=2, Weight=1.0, AbsTol=1e-4, RelTol=1e-6) \end{align*}\end{split}\]

After priority sorting:

\[\begin{split}\begin{align*} &OBJ2 (Priority=3, Weight=2.0, AbsTol=1e-6, RelTol=0) \\ &OBJ1 (Priority=2, Weight=2.0, AbsTol=1e-5, RelTol=1e-5) \\ &OBJ3 (Priority=2, Weight=1.0, AbsTol=1e-4, RelTol=1e-6) \\ &OBJ0 (Priority=1, Weight=2.0, AbsTol=1e-6, RelTol=0) \end{align*}\end{split}\]

After merging same-priority objectives, three objectives remain:

\[\begin{split}\begin{align*} &OBJ2 (Priority=3, Weight=2.0, AbsTol=1e-6, RelTol=0) \\ &OBJ4 (Priority=2, Weight=1.0, AbsTol=1e-4, RelTol=1e-5) \\ &OBJ0 (Priority=1, Weight=2.0, AbsTol=1e-6, RelTol=0) \end{align*}\end{split}\]

Where:

\[OBJ4 = 2.0 \times OBJ1 + 1.0 \times OBJ3\]

Note that during combination, the maximum values of AbsTol and RelTol from the merged objectives are selected.

6.4.2.2. Optimization Process

The AbsTol and RelTol of the first objective will be ignored.

For subsequent objectives, AbsTol and RelTol are used to allow controlled degradation of previous objectives to improve the current objective’s optimization flexibility.

When optimizing \(OBJ4\), the previous objective is \(OBJ2\).

  • For MILP problems, a constraint will be added (assuming minimization):

    \[OBJ2 <= rhs\]

    where \(rhs\) is calculated from the previous round’s objective value plus the maximum allowable relaxation determined by AbsTol and RelTol.

  • For LP problems, variable fixing is used to maintain previous objectives. LP ignores RelTol and uses only AbsTol:

    In LP problems, the previous iteration determines the ReducedCost for each variable. If a variable’s ReducedCost satisfies \(ReducedCost \le AbsTol\), it will be fixed at its corresponding bound.

Users can force MILP branch logic in multi-objective optimization by adding dummy integer variables.