IBM ILOG Scheduler User's Manual > Advanced Concepts > Using Scheduler with Solver > Complete Program and Output |
Complete Program and Output |
INDEX
![]() |
You can see the entire program greedy.cpp
here or view it in the standard distribution.
#include <ilsched/iloscheduler.h> ILOSTLBEGIN #if defined(ILO_SDXLOUTPUT) #include "sdxloutput.h" #endif /////////////////////////////////////////////////////////////////////////////// // // PROBLEM DEFINITION // /////////////////////////////////////////////////////////////////////////////// IloModel DefineModel(IloEnv& env, IloNumVar& makespan) { IloModel model(env); /* CREATE THE ACTIVITIES. */ IloActivity masonry(env, 7, 0, "masonry "); IloActivity carpentry(env, 3, 0, "carpentry "); IloActivity plumbing(env, 8, 0, "plumbing "); IloActivity ceiling(env, 3, 0, "ceiling "); IloActivity roofing(env, 1, 0, "roofing "); IloActivity painting(env, 2, 0, "painting "); IloActivity windows(env, 1, 0, "windows "); IloActivity facade(env, 2, 0, "facade "); IloActivity garden(env, 1, 0, "garden "); IloActivity moving(env, 1, 0, "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. */ IloUnaryResource worker(env); /* ADD THE RESOURCE CONSTRAINTS. */ model.add(masonry.requires(worker)); model.add(carpentry.requires(worker)); model.add(plumbing.requires(worker)); model.add(ceiling.requires(worker)); model.add(roofing.requires(worker)); model.add(painting.requires(worker)); model.add(windows.requires(worker)); model.add(facade.requires(worker)); model.add(garden.requires(worker)); model.add(moving.requires(worker)); /* 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; } IlcBool SelFirstActStartMax(IlcActivity& selection, const IlcScheduler& scheduler) { /* IF A NOT BOUNDED ACTIVITY EXISTS IN THE SCHEDULE, RETURN ILCTRUE AND SET SELECTION AS THE ACTIVITY WITH THE MINIMAL LATEST START TIME. */ IlcInt startmax = IlcIntMax; IlcBool selected = IlcFalse; for (IlcActivityIterator iterator(scheduler); iterator.ok(); ++iterator) { IlcActivity activity = *iterator; if (!activity.getStartVariable().isBound() && (activity.getStartMax() <= startmax)) { startmax = activity.getStartMax(); selection = activity; selected = IlcTrue; } } return selected; } ILCGOAL0(SolveIlc) { IloSolver solver = getSolver(); IlcActivity chosenActivity; if (SelFirstActStartMax(chosenActivity, IlcScheduler(solver))) { chosenActivity.setStartTime(chosenActivity.getStartMin()); return this; } else return 0; } ILOCPGOALWRAPPER0(Solve, solver) { return SolveIlc(solver); } /////////////////////////////////////////////////////////////////////////////// // // PRINTING OF SOLUTIONS // /////////////////////////////////////////////////////////////////////////////// void PrintSolution(const IloSolver& solver) { IlcScheduler scheduler(solver); IloEnv env = solver.getEnv(); for(IloIterator<IloActivity> act(env); act.ok(); ++act) env.out() << scheduler.getActivity(*act) << endl; solver.printInformation(); } /////////////////////////////////////////////////////////////////////////////// // // MAIN FUNCTION // /////////////////////////////////////////////////////////////////////////////// int main() { try { IloEnv env; IloNumVar makespan; IloModel model = DefineModel(env, makespan); IloSolver solver(model); IloGoal goal = Solve(env); if (solver.solve(goal)) { PrintSolution(solver); #if defined(ILO_SDXLOUTPUT) IloSDXLOutput output(env); ofstream outFile("greedy.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 // /////////////////////////////////////////////////////////////////////////////// /* masonry [0 -- 7 --> 7] carpentry [15 -- 3 --> 18] plumbing [7 -- 8 --> 15] ceiling [18 -- 3 --> 21] roofing [21 -- 1 --> 22] painting [22 -- 2 --> 24] windows [26 -- 1 --> 27] facade [24 -- 2 --> 26] garden [27 -- 1 --> 28] moving [28 -- 1 --> 29] */
The start and end times of all activities are fixed in this example.
Figure 12.1 provides a graphic display of the solution to our problem.
© Copyright IBM Corp. 1987, 2009. Legal terms. | PREVIOUS NEXT |