all of the variables are integer, the solution to the integer program has been found. If
not, x
1
will turn out to be either an integer or a fraction. If it is a fraction, Solver replaces
the original problem with two derived problems (P
1
and P
2
), each with an additional
constraint that forces the solution away from the fractional value in the original. On
the other hand, if x
1
is an integer, Solver then examines x
2
. Two alternatives may
arise, depending on whether x
2
is an integer or a fraction. If it is a fraction, Solver
creates two derived problems containing additional constraints that force the solution
away from the fractional value of x
2
. Otherwise, Solver proceeds to examine x
3
, and
so on.
At each stage in this procedure, Solver maintains a list of unsolved problems.
This list is structured so that the best integer-feasible solution to the problems on
the list will be the optimal solution for the original model. One at a time, problems
are removed from the list and addressed by solving them as linear programs. Either
the solution will be integer-feasible, or the problem will be replaced by two other
problems, each containing an additional constraint. This procedure requires the
solution of a series of linear programs. The list might get quite long, but the proce-
dure ultimately produces an optimal solution with integer-valued decision variables.
The replacement of a problem on the list by two others is called branching. This
name comes from a tree-like diagram that traces the different problems (as in
Figure 6.22).
As we saw, it is possible to curtail the list of problems that have to be solved. Any
time we encounter an integer-feasible solution, the branching in that portion of the tree
is finished. Elsewhere, branching may lead to an infeasible linear program, which also
terminates branching. Otherwise, we can try to use the bounds to fathom certain
problems and also terminate the branching. Suppose that, at some stage of solving a
maximization problem, the list contains a problem with a value (upper bound) that
is worse than the value of the objective function in an integer-feasible solution already
encountered. Whenever the bound on a derived problem is worse than the value of a
known integer solution, then the derived problem may be removed from the list
because its solution could never be optimal. (The mirror image of this statement
holds when we are minimizing: in that case, whenever the bound on a derived problem
is higher than the value of a known integer solution, then we can remove the derived
problem from the list.)
The generic name for the overall procedure Solver uses is branch and bound,
reflecting the two mechanisms that guide the search. Branching replaces a problem
on the list with two problems that are, in some sense, closer to being solved as integer
programs. Bounding explores whether a particular problem could just be deleted from
the list because it offers no hope of finding an optimum. Nevertheless, the essence of
the procedure is to solve a number of linear programs, to replace one problem with two
whenever an integer constraint is violated, and to use bounds to remove problems from
the list in order to reduce the workload. Because this procedure relies on the solution of
many linear programs, it is as reliable a procedure as the linear solver on which it
depends. That is, the branch and bound procedure is guaranteed to produce a global
optimum.
242
Chapter 6 Integer Programming: Binary Choice Models