An integer programming problem (IPP) is a linear program with the added restriction that some or all decision variables must be integers.
- Pure integer programming
Every decision variable must be an integer. - Mixed integer linear programming (MILP)
Only some decision variables must be integers. - Binary (0-1) integer programming
Every decision variable is restricted to .
Solving an IPP
The LP relaxation (dropping the integer restriction) is solved first, since it gives an upper bound (maximization) on the IPP’s optimal value. If the relaxation’s optimal solution happens to be integral, it’s also optimal for the IPP.
Rounding the LP relaxation’s solution to the nearest integer doesn’t reliably give a feasible or optimal IPP solution. Dedicated methods are needed:
- Branch and bound
- Gomory’s cutting plane method
Branch and Bound
Searches the IPP’s feasible integer solutions by treating the LP relaxation as a search tree, splitting (branching) a fractional solution into 2 stricter subproblems and discarding (bounding) subproblems that can’t beat the best integer solution found so far.
A subproblem is the IPP’s LP relaxation with extra or bound constraints on individual variables, added by earlier branching steps. The search starts with 1 subproblem: the LP relaxation with no added bounds.
Steps
- Solve the LP relaxation of the current subproblem.
- If the solution is integral, it’s a candidate solution. Update the best solution found so far if it’s better.
- If the subproblem’s relaxed objective value is worse than the best solution found so far, discard it (bound). The relaxation’s value is an upper bound (maximization) on any integer solution inside the subproblem, so none of them can beat the best solution either.
- Otherwise, pick any variable whose value in the relaxed solution isn’t an integer, e.g. . Branch on it: make 2 copies of the current subproblem, keep every constraint the same in both, then add (here ) to 1 copy and (here ) to the other. No integer lies strictly between and , so every integer point feasible in the parent subproblem stays feasible in 1 of the 2 children, just not itself.
- Repeat on each open subproblem until none remain.
The best solution found when the search ends is the IPP’s optimal solution. An infeasible subproblem (empty feasible region) is discarded without branching.
Gomory’s Cutting Plane Method
Solves a pure IPP by adding constraints (cuts) to the LP relaxation’s optimal tableau that exclude the fractional solution without excluding any feasible integer solution.
Fractional Cut
For a basic variable with a fractional value in the optimal tableau’s row:
Split each coefficient into integer and fractional parts, and (with ). The Gomory constraint is:
Steps
- Solve the LP relaxation with simplex.
- If every basic variable is integral, stop. The solution is optimal for the IPP.
- Otherwise, pick a row with a fractional basic variable and derive its Gomory constraint.
- Add the constraint (as a new row with a surplus variable) to the tableau and resolve with the dual simplex method, since the new RHS is negative.
- Repeat until every basic variable is integral.
Worked Example
Maximize subject to , , and integer.
LP relaxation optimum: , , .
Via Branch and Bound
- Branch on into and .
- : LP optimum , . Branch on into and .
- : LP optimum , integral, . Best solution so far.
- : infeasible, since forces . Discard.
- : LP optimum , integral, . Better than the best solution so far. New best.
- The branch’s bound (12.5) is below the best solution (13). No open subproblems remain.
Optimal solution: , , .
Via Gomory’s Cutting Plane Method
Standard form: , .
Optimal tableau rows, basis :
The row has , so . Its coefficients split as (since is already an integer) and (since ).
Gomory constraint: , i.e. .
entering column leaving row pivot element updated this step
added as a new row. The tableau is still optimal ( row non-negative) but infeasible (), so leaves. Its only negative entry is under , so enters. Pivot on .
Every RHS is and , , are all integral. Optimal at , , .
Optimal solution: , , . Matches branch and bound.