IBM ILOG Scheduler User's Manual > Advanced Concepts > Scheduling with Discrete Resources: the Ship-loading Problem, Second Version > Decomposing the Problem > Assigning Resource Constraints to Subproblems

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));