Originally posted by: SystemAdmin
What you propose is possible, but I doubt that it is practical.
What you would need to do is a combination of an incumbent callback, branch callback, and node selection callback.
The incumbent callback would just reject any solution, and set some flag in your branch callback. Now, in your branch callback, if the flag is set, you would just create a single child without any modifications (i.e., a node that is equivalent to the current node), but assign a user node data object to the node to mark it for the node selection callback. Finally, the node selection callback would never select any of the marked nodes, provided that there are still other nodes available.
But as I said: this is really not practical. Very complicated implementation, and you lose dynamic search due to the usage of control callbacks. And even disregarding all of this, I think your current approach of resolving the master problem from scratch after each round of Bender's cuts will perform better, because then presolving, cutting plane separation, and branching can exploit the new Bender's cuts in the subsequent master problem solve.
Paul pointed you to a potential improvement: you can set the solution pool parameters in such a way that all feasible solutions that are encountered during the solving process are collected. You can even use the populate command to enumerate all feasible solutions, all optimal solutions, or all feasible solutions that are within a certain gap to optimality. When you generate your Bender's cuts for the optimal solution, you could then filter out all solutions of the pool that are cut off by your cuts. If there is a solution left in the pool, just create another set of Bender's cuts for this solution and iterate until all solutions in the pool are cut off or you have generated enough Bender's cuts.
Tobias
#CPLEXOptimizers#DecisionOptimization