Search code examples
schedulingpartitioninglinear-programmingbranch-and-bound

Variable branching vs. constraint branching


Can someone explain to me, what the difference is between variable branching and constraint branching (Ryan and Foster)?

I was reading the article:

" The Solution of Massive Generalized Set Partitioning Problems in Aircrew Rostering" by D.M. Ryan (J. Op1 Res. Soc. Vol. 4)

It seems to me, that it is exactly the same thing in a crew scheduling or nurse rostering problem formulated as a set partition problem.

Both branching methods branch on 1 variable, what is the difference?

I'm trying to implement Branch-and-Price in Python using SCIP.


Solution

  • I haven't read the text that you are referring to, but can hopefully impart a vague/handwavey understanding of why constraint branching is a powerful technique.

    Consider a large set partitioning problem for scheduling nurses. If we were to solve this with variable branching, each branch would be akin to saying something like "nurse 1,543 can/cannot work shift 16,325". Each branch in this instance has only a minor effect on the overall soution.

    Instead, we can use constraint branching, which allows us to make many changes at each branch. We do this to force more integrality into the solution.

    The "imaginary variables" y_ij which we define ourselves and branch on can be chosen from a row coverage table. Given we have a fractional set of x variables, y_ij is the fractional amount by which we satisfy constraints i and j together. While you are right that this is "one variable" that we are branching on, it will have a much larger effect on the solution.

    For instance, if we 1-branch on y_12, then we ban all columns that do not satisfy constraints 1 and 2 together. A method for picking a y_ij to branch on is whichever is closest to being integer (but still fractional), preferring 1-branches to 0-branches.