Originally posted by: TobiasAchterberg
What is the sense of you objective function: minimization or maximization?
Assuming you are minimizing, then an upper bound would be provided by a feasible solution, which you can add through a heuristic callback (or just provide in advance using a MIP start). A lower bound would be a dual bound on the objective. This is the thing that is not helping much performance, except if it allows you to cut off a node. So, if you have a way of calculating a valid dual bound at each node that is stronger than the LP relaxation bound, you could do this inside a branch callback. If your bound allows to prune the node, then just create 0 children. If it does not allow to prune the node, just do nothing and accept the branching decision that was suggested by CPLEX.
If you insist on providing a better dual bound for a node, even though it is not good enough to cut off the node, then I would add an auxiliary variable z to your problem, link it to the objective function using a constraint z >= c*x (for minimization; use <= for maximization), and replace the objective function by z. Then, protect z from presolve reductions (so it will remain in the problem), and in your branch or cut callback you could then just tighten the lower bound (or upper bound for maximization) of this z variable. But still it is typically true that such an approach will typically downgrade the performance of CPLEX. The main reason is that adding a cut that is parallel to the objective function will produce a high dimensional optimal face in the LP relaxation. Thus, any cut or any branching decision will often just push the LP solution to a different vertex on this optimal face, so that it looks as if cuts and branching are just ineffective to move the objective function value. Hence, CPLEX would conclude that this type of cut or this particular variable is bad and would disable such cuts and branch on different variables (just to find out that those branches are equally bad as well). Overall, you will cripple CPLEX' main tool to dynamically evaluate and adapt heuristic decisions like branching, so that the resulting search procedure boils down to basically a random tree search.
Tobias
#CPLEXOptimizers#DecisionOptimization