Originally posted by: EdKlotz
You can address the integrality of the objective in a MILP with all integer variables either by adjusting the lower bound as you have described, or by adjusting the cutoff value associated with the best integer solution found so far. CPLEX does the latter, rather than the former. So, you can indeed see fractional objective values in the best node (i.e. lower bound) column of the node log, like you reported. But, with an all integer objective value, you won't see CPLEX explore node LPs with relaxation objective values within 1.0 of the best integer solution objective. Adding a constraint like you describe actually has some disadvantages in terms of introducing degeneracy into the node LPs and distorting the branching information obtained in CPLEX's pseudo cost calculations. I believe that is why CPLEX refrains from tightening the model in the way you describe.
That said, I did some tests with the model stein45.mps, available publicly from the MIPLIB 3.0 web site at http://miplib.zib.de/miplib3/miplib.html. While CPLEX behaved as I described above when running to optimality, I was somewhat surprised to see that it did not take advantage of the tightening you describe when running with a non default MIP gap. For example, since the minimal objective is 30, with a MIP gap setting of .04 (i.e. 4%) I expected CPLEX to use the integrality of the objective to stop here:
38804 7464 cutoff 30.0000 28.0000 281037 6.67%
38805 7463 cutoff 30.0000 28.0000 281042 6.67%
38806 7464 29.0000 22 30.0000 28.0135 281061 6.62%
38807 7463 cutoff 30.0000 28.0135 281064 6.62%
38808 7462 cutoff 30.0000 28.0135 281069 6.62%
After all, at this point, we know that the best possible integer objective is 29.0, so we are within the requested 4% gap.
Contrary to my expectations, CPLEX continued until the fractional best node value truly guaranteed a 4% gap:
48363 3157 cutoff 30.0000 28.7778 335335 4.07%
48364 3156 cutoff 30.0000 28.8000 335338 4.00%
I will take a closer look at this and reply again when I have an explanation of this.
Meanwhile, getting back to your original question, CPLEX does not have any API calls to adjust the lower bound in the way you describe. However, you can always add such a constraint using CPLEX's cut callback functionality. You would query the best node value within the callback framework, then use the rounded value in your cut. But, as described above, you may find that this actually hurts performance rather than helps.
#CPLEXOptimizers#DecisionOptimization