Originally posted by: AndreaTramontani
Dear Serveh,
I really do not understand why you need a strong-branching score for a branching that is not needed.
Following your example, assume at a node N0 you have 5 fractional variables, x1, ..., x5, with values x1*, ..., x5*.
You do strong branching on them and, for instance, you find out that branching up on x1 and on x2 yields an infeasible node.
On the other hand, for variables x3, x4, x5 you can compute strong branching scores s3, s4, s5.
You know that you don't need to branch on x1 and x2. I.e., the bound changes x1 <= floor (x1*) and x2 <= floor (x2*) are valid for every child node of N0.
So you have two possibilities:
1. You want to branch using the current scores you computed for x3, x4, x5.
Assume s3 > s4 and s3 > s5, so you want to branch on x3.
Then, you create two children nodes N1 and N2.
On N1, you impose the branching conditions x1 <= floor (x1*), x2 <= floor (x2*), x3 <= floor (x3*).
On N2, you impose the branching conditions x1 <= floor (x1*), x2 <= floor (x2*), x3 >= ceil (x3*).
The branching is valid, because you know that x1 >= ceil (x1*) or x2 >= ceil (x2*) lead to an infeasibility.
2. You want first to update the node by imposing x1 <= floor (x1*) and x2 <= floor (x2*), and then (if you still have some fractional variables),
you want to recalculate the strong branching scores.
Then, you create only one child node N1, in which you impose the "fake" branching conditions x1 <= floor (x1*) and x2 <= floor (x2*).
I say "fake" because you are creating only one child node, so you are not really branching but you are instead tightening node N0 as N1.
Both options above can be implemented from within a branching callback, they are both correct, and they do not require to calculate scores for infeasible nodes.
Best,
Andrea
#DecisionOptimization#MathematicalProgramming-General