As in a large neighborhood search approach, only a subpart of the decisions stored in the current solution is restored, we need to a apply a search goal to transform the partial schedule into a complete solution. Notice that the more decisions are restored, the lower the size of the search tree is and also the lower the number of solutions that can be reached. Clearly there is trade-off between the complexity of the subproblem and the number of solutions that can be reached. Notice also, that although the size of the search tree is generally much smaller, the complexity of the subproblem can still be very high: again there is a trade-off between exploring a large part of the search tree and few neighbors and exploring a small part of the search tree and many neighbors.
To solve the subproblem, we choose to apply a combination of the predefined goals IloAssignAlternatives
and IloRankForward
.
IloGoal subGoal =
IloAssignAlternative(env) &&
IloRankForward(env) &&
IloInstantiate(env, makespan);
|
We also choose to apply an incomplete search by limiting the number of failures while exploring the search tree of the subproblem. In case a solution is found before this limit, we choose to let the search continue to find an even better solution until this limit is reached, as follows.
IloInt failLimit = 2000;
if (failLimit < IloIntMax) {
subGoal = IloLimitSearch(env, subGoal, IloFailLimit(env, failLimit));
}
|