Branch and Cut

Example ILP Problem

consider the integer programming problem:

ILP Problem

  • objective function:
    min Z = -5x1 - 6x2
  • linear constraints:
    x1 + 2x2 ≤ 7
    2x1 - x2 ≤ 3
  • non-negative integer variables:
    x1, x2 ∈ non-negative integers

Branch and Cut - Algorithm Details

Branch and Cut - Algorithm Pseudocode

using Cutting Plane Algorithm and Branch & Bound - On Infinite Domain pseudocode

BRANCH-AND-CUT(ilp-problem) {
    relaxed-lp-problem = relax-integer-constraints(ilp-problem)
    (optimal-vector, optimal-z-value) = lp-solver(relaxed-lp-problem)
    if optimal-vector contains all integers
        return (optimal-vector, optimal-z-value)
    else
		// choose between cutting-plane or branch-and-cut
		return cpa(ilp-problem, optimal-vector)
		or
		retrun bb(ilp-problem, optimal-vector)
}

cpa() {
	c = get-arbitrary-vector()
    new-ilp-problem = add-constraint(ilp-problem, "cx ≤ floor(c- optimal-vector)")
    return BRANCH-AND-CUT(new-ilp-problem)
}

bb() {
	xᵢ = choose-variable-to-branch-from() # could be anything
    xᵢ-value = get-xᵢ-value-from(optimal-vector)
    ilp-subproblem-1 = add-constraint(ilp-problem, "xᵢ ≤ floor(xᵢ-value)")
    ilp-subproblem-2 = add-constraint(ilp-problem, "xᵢ ≥ ceiling(xᵢ-value)")
    (vector-1, value-1) = BRANCH-AND-CUT(ilp-subproblem-1)
    (vector-2, value-2) = BRANCH-AND-CUT(ilp-subproblem-2)
    if value-1 > value-2
        return (vector-1, value-1)
    else
        return (vector-2, value-2)
}