Originally posted by: SystemAdmin
[EdKlotz said:]
> I am trying to write a specific cut generation algorithm for cplex using goals.
> So I wrote a goal which determines which local cuts are to be added.
> Then, these cuts are added by returning:
>
> return AndGoal(IloCplex::Goal(rngs), this);
>
> where rngs is an IloRangeArray representing the set of local cuts.
> By checking the Node Id, I realized that this operation created a new node equivalent > to the current node plus the local cuts (the Node Id is different after adding the cuts).
>
> Is it possible that Cplex stores the newly created node in the active nodes set and
> then process another node ?
Correct; CPLEX is not obligated to traverse the active nodes depth first. It has multiple
node selection strategies. You can ask CPLEX to traverse the nodes depth first, but
in general this is not an effective node selection strategy.
> It is somehow equivalent to saying that cplex stops processing the current node
> because the local cuts added have increased the lower bound in such a way that it
> might be interesting to look for another node and maybe come back to this one later.
That is correct. If the child node objective is significantly worse than the parent node objective, there is a good chance that continued examination of additional child nodes
along this path won't yield anything useful. So, CPLEX will often defer the exploration of those child nodes and look elsewhere, hoping that it finds a better solution elsewhere that enables it to prune the nodes it deferred without any additional exploration.
In addition to the node selection parameter, CPLEX has a backtrack tolerance you can set to control the amount of backtracking of this type that is done.
#CPLEXOptimizers#DecisionOptimization