Originally posted by: SystemAdmin
Thomas,
The "no-good" that I use is typically in a problem where the master is all binary variables. This one I think you already know: \sum_{i in Z} x_i + \sum_{i in O} (1-x_i) >= 1, where Z and O are the sets of indices where the solution to be cut off is respectively zero or one.
For problems with general integer variables (but no real variables) in the master, to cut off a
single solution, one can introduce two new binary variables and two new constraints for each general integer variable. The binaries effectively say the variable must either exceed its current value by at least one if the first binary is 1, or be at least one smaller than its current value if the second binary is 1. In addition to the new variables and constraints, there is one more constraint, that the sum of all the new binaries must be at least 1.
All that mounts up fairly quickly, so unless the integer variables have very large bounds, it's almost surely better just to do a binary expansion (replacing each general integer variable x with log_2(U_x) binary variables, where U_x is the upper bound of x, and charitably assuming that the lower bound of x is zero).
"No-good" constraints tend not to cut very deeply, so I actually think of them mainly when it is reasonably easy to detect that the subproblem is infeasible but somewhat difficult to determine precisely why.
For what it's worth, another approach I've used (when the master has only binary variables and the subproblem is a linear program) is to find an IIS for the subproblem and then do a "no-good" cut for those members of the IIS that are affected by the master problem solution. That's often better than an "no-good" cut of the entire master solution, but perhaps not as good as a ray cut.
Cheers,
Paul
Mathematicians are like Frenchmen: whenever you say something to them, they translate it into their own language, and at once it is something entirely different. (Goethe)
#CPLEXOptimizers#DecisionOptimization