Once the activities have all been marked, we create as many submodels as there are subproblems, and post the constraints into each submodel.
// 2. CREATE SUB-MODELS
subModels = IloModelArray(env,nbSubProblems);
for (i = 0; i < nbSubProblems; i++) {
subModels[i] = IloModel(env);
}
// 2.1 DECOMPOSE RESOURCE CONSTRAINTS
for(IloIterator<IloResourceConstraint> iterct(env);
iterct.ok();
++iterct) {
IloResourceConstraint rct(*iterct);
Activity* act = ((Activity*) rct.getActivity().getObject());
subModels[act->getSubProblem()].add(rct);
}
// 2.2 DECOMPOSE PRECEDENCE CONSTRAINTS
for(IloIterator<IloPrecedenceConstraint> itepct(env);
itepct.ok();
++itepct) {
IloPrecedenceConstraint pct(*itepct);
Activity* precAct = ((Activity*) pct.getPrecedingActivity().getObject());
Activity* follAct = ((Activity*) pct.getFollowingActivity().getObject());
if ((precAct->getSubProblem() == follAct->getSubProblem()) ||
((precAct->getSubProblem() == follAct->getSubProblem() - 1) &&
(precAct->isCritical())))
subModels[follAct->getSubProblem()].add(pct);
}
// 2.3 SET SUB-MODELS MAKESPAN VARIABLES
for (i = 0; i < numberOfActivities; i++) {
Activity* act = ((Activity*) activities[i].getObject());
if (act->isCritical()) {
IloNumExpr subModelMakespan = activities[i].getEndExpr();
subModels[act->getSubProblem()].add(IloMinimize(env, subModelMakespan));
}
if (act->getSubProblem() == nbSubProblems - 1) {
subModels[act->getSubProblem()].add(activities[i].endsBefore(makespan));
}
}
subModels[nbSubProblems-1].add(IloMinimize(env, makespan));