Documentation

Improving ranges for variables and constraints

There are three common ways to improve ranges for objectives, constraints and variables:

  • Use problem-specific information to tighten bounds:

    Although presolve, and, in particular, bound strengthening, is quite good at deriving implied variables bounds, it may not have access to all of the information known to the modeler. Incorporating tighter bounds directly into the model can not only improve the numerical behavior, but it can also speed up the optimization process.

  • Choose the right units to express your variables and constraints:

    When defining your variables and constraints, it is important to choose units that are consistent with tolerances. To give an example, a constraint with a $10^{10}$ right-hand side value is not going to work well with the default $10^{-6}$ feasibility tolerance. By changing the units (e.g., replacing pounds with tons, or dollars with millions of dollars, or ...), it is often possible to significantly improve the numerics of the problems.

  • Disaggregate multiple objectives:

    A common source for very large range of objective coefficients is the practice of modeling hierarchical objectives as an aggregation of objective functions with large multipliers. For example, if the user wants to optimize a problem $P$ with objective function $f_1(x)$ and then, subject to $f_1(x)$ being optimal, optimize $f_2(x)$, a common trick is to use as surrogate objective $\bar{f}(x) = M f_1(x) +
f_2(x)$ where $M$ is a large constant. When you combine a large $M$ with a relatively tight dual feasibility tolerance, it becomes much harder for the solver to find solutions that achieve dual feasibility. We recommend that you either use as small a constant $M$ as possible or reformulate your model using a hierarchical objective (which is made easier by our multi-objective optimization features).

These techniques are usually sufficient to eliminate the problems that arise from bad scaling.