Originally posted by: SystemAdmin
'Point cuts' are not contained in the branching process and are not left out by choice. Simply, in this example, they do not exist.
As you can see in the description of the example bendersatsp.py (i.e., in the comments to the code), the model that is decomposed and solved with Benders' cuts is a flow formulation for the Asymmetric Traveling Salesman Problem (ATSP). This model has a set of binary variables x and a set of continuous variables y.
The variables y that are removed by the decomposition do not appear in the objective function. Therefore, the dual of the flow constraints that are removed by the decomposition is defined on a cone.
This means that, whenever you solve the dual to find a violated cut, you have only two possibilities:
1. The optimal solution value of the dual is 0 --> no violated cut exists
2. The dual is unbounded --> you can find a 'ray cut' (also called a feasibility cut) by reading the unbounded ray of the dual.
You will never find a 'point cut' (also called an optimality cut) simply because the dual is defined on a cone.
In a more general context (maybe in your case), the dual is not defined on a cone, but on a polyhedron, with both vertices and rays. In such a case you have both 'ray cuts', associated with the extreme rays of the dual, and 'point cuts', associated with the vertices of the dual.
When you solve the dual you will have therefore these two possibilities:
1. The dual is bounded and the optimal solution is therefore a vertex.
In this case you need to check if the optimal solution value of the dual gives you a violated cut.
If it is the case, you can get the optimal solution of the dual and construct a 'point cut' from it.
2. As before, the dual is unbounded. In such a case you can get the unbounded ray of the dual that corresponds to a violated 'ray cut'.
#CPLEXOptimizers#DecisionOptimization