Originally posted by: EdKlotz
>
> First of all, you are using opportunistic parallel mode. This means that two runs of the same binary with the same parameter settings on the same problem data can produce different paths through the search tree and hence very different performance (even though the final objective value will be the same).
> I guess you have explicitly set the "threads" parameter to 4, which will implicitly switch to opportunistic parallel. If you want to have deterministic parallel runs (which might be slightly slower but give reproducible results), you also need to set the "parallel mode" parameter to 1.
>
> Indeed, the run with lazy constraints is using dynamic search, while the run with a lazy constraint callback is using traditional branch-and-cut. This is no surprise, as control callbacks are not compatible with dynamic search.
> This may or may not explain the big difference in run-time. You can simply find out whether this is the case by using traditional branch-and-cut for your lazy constraint approach: just set the "MIPSearch" parameter to CPX_MIPSEARCH_TRADITIONAL.
>
> Tobias
Based on these logs, I believe that dynamic search vs. traditional branch and cut is the primary
contributor to the big difference in run time. However, I see a few other aspects of these runs
that may contribute as well:
1) These runs depend heavily on heuristics for solutions. Each feasible solution with a + sign
suffixed to the node number at which the solution was found indicates that heuristics, not branching,
found a solution. Given their heuristic nature, changes in the path of the branching can affect
the heuristics. In both your runs, I only saw heuristically found solutions.
2) The runs are to a finite MIP gap rather than too optimality. While the second run still would have been slower, the results would have been much different if you had set the MIP gap to .0008 instead of .0005; the second run would have finished in about 4 minutes. Particularly when combined
with heuristics, setting to an arbitrary MIP gap can increase performance variability on a model
if the optimizer is configured so that the two runs don't follow the same path.
With this in mind, as a test you might want to try running to optimality with heuristics disabled,
along with Tobi's recommendation to do both runs with traditional branch and cut. While you
probably won't want to use these settings in your final production runs, this should help you
better assess whether the difference in performance involves the lazy constraint callback.
Ed
#CPLEXOptimizers#DecisionOptimization