IBM ILOG Scheduler User's Manual > Getting Started with Scheduler > Using Discrete Resources > Working with Discrete Resources > Complete Program and Output--Example 3

You can see the entire program gsDisc.cpp here or view it online in the standard distribution.

#include <ilsched/iloscheduler.h>
 
ILOSTLBEGIN
 
#if defined(ILO_SDXLOUTPUT)
#include "sdxloutput.h"
#endif
 
///////////////////////////////////////////////////////////////////////////////
//
// PROBLEM DEFINITION
//
///////////////////////////////////////////////////////////////////////////////
 
IloModel DefineModel(const IloEnv env, IloNumVar& makespan)
{
  IloModel model(env);
  
  /* CREATE THE ACTIVITIES. */
  IloActivity masonry(env,   7, "masonry   ");
  IloActivity carpentry(env, 3, "carpentry ");
  IloActivity plumbing(env,  8, "plumbing  ");
  IloActivity ceiling(env,   3, "ceiling   ");
  IloActivity roofing(env,   1, "roofing   ");
  IloActivity painting(env,  2, "painting  ");
  IloActivity windows(env,   1, "windows   ");
  IloActivity facade(env,    2, "facade    ");
  IloActivity garden(env,    1, "garden    ");
  IloActivity moving(env,    1, "moving    ");
  
  /* ADD THE TEMPORAL CONSTRAINTS. */
  model.add(carpentry.startsAfterEnd(masonry));
  model.add(plumbing.startsAfterEnd(masonry));
  model.add(ceiling.startsAfterEnd(masonry));
  model.add(roofing.startsAfterEnd(carpentry));
  model.add(painting.startsAfterEnd(ceiling));
  model.add(windows.startsAfterEnd(roofing));
  model.add(facade.startsAfterEnd(roofing));
  model.add(facade.startsAfterEnd(plumbing));
  model.add(garden.startsAfterEnd(roofing));
  model.add(garden.startsAfterEnd(plumbing));
  model.add(moving.startsAfterEnd(windows));
  model.add(moving.startsAfterEnd(facade));
  model.add(moving.startsAfterEnd(garden));
  model.add(moving.startsAfterEnd(painting));
  /* CREATE THE RESOURCE. */
  IloDiscreteResource workers(env, 2); 
  /* ADD THE RESOURCE CONSTRAINTS. */
  model.add(masonry.requires(workers));
  model.add(carpentry.requires(workers));
  model.add(plumbing.requires(workers));
  model.add(ceiling.requires(workers));
  model.add(roofing.requires(workers));
  model.add(painting.requires(workers));
  model.add(windows.requires(workers));
  model.add(facade.requires(workers));
  model.add(garden.requires(workers));
  model.add(moving.requires(workers));
  /* SET THE MAKESPAN VARIABLE. */
  makespan = IloNumVar(env, 0, IloInfinity, ILOINT);
  model.add(moving.endsAt(makespan));
  /* SET THE OBJECTIVE */
  model.add(IloMinimize(env, makespan));
  return model;
}
 
///////////////////////////////////////////////////////////////////////////////
//
// PRINTING OF SOLUTIONS
//
///////////////////////////////////////////////////////////////////////////////
 
void PrintSolution(const IloSolver solver, const IloNumVar makespan)
{
  IlcScheduler scheduler(solver);  
  IloEnv env = solver.getEnv();
  env.out() << "Solution with makespan " 
            << solver.getIntVar(makespan).getMin() << endl;
  for(IloIterator<IloActivity> act(env);
      act.ok();
      ++act)
    env.out() << scheduler.getActivity(*act) << endl;
  solver.printInformation();
}
 
///////////////////////////////////////////////////////////////////////////////
//
// MAIN FUNCTION
//
///////////////////////////////////////////////////////////////////////////////
 
int main()
{
  try {
    // Model
    IloEnv env;
    IloNumVar makespan;
    IloModel model = DefineModel(env, makespan);
  
    // Algorithm
    IloSolver solver(model);
    IloGoal goal = IloSetTimesForward(env, makespan);
 
    if (solver.solve(goal)) {
      PrintSolution(solver,makespan);
 
#if defined(ILO_SDXLOUTPUT)
      IloSDXLOutput output(env);
      ofstream outFile("gsDisc.xml");
      output.write(IlcScheduler(solver), outFile, solver.getIntVar(makespan));
      outFile.close();
#endif
 
    }
    else
      solver.out() << "No Solution" << endl;
 
    env.end();
    
  } catch (IloException& exc) {
    cout << exc << endl;
  }
  return 0;
}
 
///////////////////////////////////////////////////////////////////////////////
//
// RESULTS
//
///////////////////////////////////////////////////////////////////////////////
 
/*
  Solution with makespan 19
  masonry    [0 -- 7 --> 7]
  carpentry  [7 -- 3 --> 10]
  plumbing   [7 -- 8 --> 15]
  ceiling    [11 -- 3 --> 14]
  roofing    [10 -- 1 --> 11]
  painting   [16 -- 2 --> 18]
  windows    [14 -- 1 --> 15]
  facade     [15 -- 2 --> 17]
  garden     [15 -- 1 --> 16]
  moving     [18 -- 1 --> 19]
*/
 

The start and end times of all activities are fixed and the total time to complete the project is 19 days. Worker1 works from day 0 to day 17, Worker2 works from day 7 to day 19. Notice that the tasks could be switched between the workers at days 7 and 15.

Figure 4.1 provides a graphic display of the solution to our problem.

discreteResourcesw.gif

Figure 4.1 Solution with Discrete Resource of Capacity 2