30.01.2015 Views

ILOG CPLEX C++ API 9.0 Reference Manual

ILOG CPLEX C++ API 9.0 Reference Manual

ILOG CPLEX C++ API 9.0 Reference Manual

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

IloCplex<br />

classes that allow the user to monitor solution progress at each level. Callbacks derived<br />

from IloCplex::ContinuousCallbackI or one of its derived classes are called<br />

regularly during the solution of a node relaxation (including the root), and callbacks<br />

derived from IloCplex::MIPCallbackI or one of its derived callbacks are<br />

called regularly during branch & cut search. All callbacks provide the option to abort the<br />

current optimization.<br />

Branch Priorities and Directions<br />

When a branch occurs at a node in the branch & cut tree, usually there is a set of<br />

fractional-valued variables available to pick from for branching. IloCplex has several<br />

built-in rules for making such a choice, and they can be controlled by the parameter<br />

IloCplex::VarSel. Also, the method setPriority allows the user to specify<br />

a priority order. An instance of IloCplex branches on variables with an assigned<br />

priority before variables without a priority. It also branches on variables with higher<br />

priority before variables with lower priority, when the variables have fractional values.<br />

Frequently, when two new nodes have been created (controlled by the parameter<br />

IloCplex::BtTol), one of the two nodes is processed next. This activity is known<br />

as diving. The branch direction determines which of the branches, the up or the down<br />

branch, is used when diving. By default, IloCplex automatically selects the branch<br />

direction. The user can control the branch direction by the method setDirection.<br />

As mentioned before, the greatest flexibility for controlling the branching during branch<br />

& cut search is provided through goals (see IloCplex::Goal) or through the<br />

callbacks (see IloCplex::BranchCallbackI). With these concepts, you can<br />

control the branching decision based on runtime information during the search, instead<br />

of statically through branch priorities and directions, but the default strategies work well<br />

on many problems.<br />

Cuts<br />

An instance of IloCplex can also generate certain cuts in order to strengthen the<br />

relaxation, that is, in order to make the relaxation a better approximation of the original<br />

MIP. Cuts are constraints added to a model to restrict (cut away) noninteger solutions<br />

that would otherwise be solutions of the relaxation. The addition of cuts usually reduces<br />

the number of branches needed to solve a MIP.<br />

When solving a MIP, IloCplex tries to generate violated cuts to add to the problem<br />

after solving a node. After IloCplex adds cuts, the subproblem is re-optimized.<br />

IloCplex then repeats the process of adding cuts at a node and reoptimizing until it<br />

finds no further effective cuts.<br />

An instance of IloCplex generates its cuts in such a way that they are valid for all<br />

subproblems, even when they are discovered during analysis of a particular node. After<br />

a cut has been added to the problem, it will remain in the problem to the end of the<br />

optimization. However, cuts are added only internally; that is, they will not be part of<br />

the model extracted to the IloCplex object after the optimization. Cuts are most<br />

<strong>ILOG</strong> <strong>CPLEX</strong> <strong>C++</strong> <strong>API</strong> <strong>9.0</strong> REFERENCE M ANUAL 50

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!