Jobs and Activities |
INDEX
PREVIOUS
NEXT
|
An item occupies the trolley from the moment it is loaded on the trolley until the moment it is unloaded. As a consequence, three activities _onTrolleyA1, _onTrolley12, and _onTrolley2S, corresponding to the occupation of the trolley by the item, are added to the Job class.
class Job {
private:
const char* _name;
IloActivity _loadA;
IloActivity _unload1;
IloActivity _process1;
IloActivity _load1;
IloActivity _unload2;
IloActivity _process2;
IloActivity _load2;
IloActivity _unloadS;
IloInt _area1;
IloInt _area2;
IloUnaryResource _machine1;
IloUnaryResource _machine2;
public:
Job(IloEnv env,
const char*,
IloNum loadDuration,
IloUnaryResource machine1, IloNum duration1, IloInt area1,
IloUnaryResource machine2, IloNum duration2, IloInt area2);
void addToModel(IloModel model,
IloStateResource trolley,
IloNumVar makespan,
IloDiscreteResource trolleyCapacity,
IloTransitionParam transitionParam);
~Job();
void printSolution(IlcScheduler scheduler, ILOSTD(ostream)& out);
const char* getName() const { return _name;}
IloActivity getLoadA() const { return _loadA;}
IloActivity getUnload1() const { return _unload1;}
IloActivity getProcess1() const { return _process1;}
IloActivity getLoad1() const { return _load1;}
IloActivity getUnload2() const { return _unload2;}
IloActivity getProcess2() const { return _process2;}
IloActivity getLoad2() const { return _load2;}
IloActivity getUnloadS() const { return _unloadS;}
};
In the constructor of a Job, we specify that the trolley is occupied by the item for the interval between the start of the load activity and the end of the corresponding unload activity. The activities _onTrolley require one unit of trolley capacity each.
Job::Job(IloEnv env,
const char* name,
IloNum loadDuration,
IloUnaryResource machine1, IloNum duration1, IloInt area1,
IloUnaryResource machine2, IloNum duration2, IloInt area2)
: _name(name),
_loadA( env,loadDuration),
_unload1( env,loadDuration),
_process1( env,duration1),
_load1( env,loadDuration),
_unload2( env,loadDuration),
_process2( env,duration2),
_load2( env,loadDuration),
_unloadS( env,loadDuration),
_area1(area1),
_area2(area2),
_machine1(machine1),
_machine2(machine2)
{
char buffer[256];
sprintf(buffer, "arrival_load_%s", name);
_loadA.setName(buffer);
sprintf(buffer, "area%ld_unload_%s", area1, name);
_unload1.setName(buffer);
sprintf(buffer, "machine%ld_%s", area1, name);
_process1.setName(buffer);
sprintf(buffer, "area%ld_load_%s", area1, name);
_load1.setName(buffer);
sprintf(buffer, "area%ld_unload_%s", area2, name);
_unload2.setName(buffer);
sprintf(buffer, "machine%ld_%s", area2, name);
_process2.setName(buffer);
sprintf(buffer, "area%ld_load_%s", area2, name);
_load2.setName(buffer);
sprintf(buffer, "stock_load_%s", name);
_unloadS.setName(buffer);
/* ADD TRANSITION TYPE */
_loadA.setTransitionType(AREAA - 1);
_unload1.setTransitionType(area1 - 1);
_load1.setTransitionType(area1 - 1);
_unload2.setTransitionType(area2 - 1);
_load2.setTransitionType(area2 - 1);
_unloadS.setTransitionType(AREAS - 1);
}
void Job::addToModel(IloModel model,
IloStateResource trolley,
IloNumVar makespan,
IloDiscreteResource trolleyCapacity,
IloTransitionParam transitionParam)
{
/* ADD MACHINE REQUIREMENT CONSTRAINTS */
model.add(_process1.requires(_machine1));
model.add(_process2.requires(_machine2));
/* ADD TEMPORAL CONSTRAINTS BETWEEN ACTIVITIES */
model.add(_unload1.startsAfterEnd(_loadA));
model.add(_process1.startsAfterEnd(_unload1));
model.add(_load1.startsAfterEnd(_process1));
model.add(_unload2.startsAfterEnd(_load1));
model.add(_process2.startsAfterEnd(_unload2));
model.add(_load2.startsAfterEnd(_process2));
model.add(_unloadS.startsAfterEnd(_load2));
/* ADD TROLLEY POSITION REQUIREMENTS */
model.add(_loadA.requires(trolley,(IloAny)AREAA));
model.add(_unload1.requires(trolley,(IloAny)_area1));
model.add(_load1.requires(trolley,(IloAny)_area1));
model.add(_unload2.requires(trolley,(IloAny)_area2));
model.add(_load2.requires(trolley,(IloAny)_area2));
model.add(_unloadS.requires(trolley,(IloAny)AREAS));
/* ADD TROLLEY CAPACITY REQUIREMENTS */
IloNum delay = transitionParam.getValue((IloInt)_loadA.getTransitionType(),
(IloInt)_unload1.getTransitionType());
IloIntVar durationA1(model.getEnv(),
2*(IloInt)loadDuration + (IloInt)delay,
(IloInt)makespan.getUB());
IloActivity onTrolleyA1(model.getEnv(), durationA1);
onTrolleyA1.shareStartWithStart(_loadA);
onTrolleyA1.shareEndWithEnd(_unload1);
model.add(onTrolleyA1.requires(trolleyCapacity));
delay = transitionParam.getValue((IloInt)_load1.getTransitionType(),
(IloInt)_unload2.getTransitionType());
IloIntVar duration12(model.getEnv(),
2*(IloInt)loadDuration + (IloInt)delay,
(IloInt)makespan.getUB());
IloActivity onTrolley12(model.getEnv(), duration12);
onTrolley12.shareStartWithStart(_load1);
onTrolley12.shareEndWithEnd(_unload2);
model.add(onTrolley12.requires(trolleyCapacity));
delay = transitionParam.getValue((IloInt)_load2.getTransitionType(),
(IloInt)_unloadS.getTransitionType());
IloIntVar duration2S(model.getEnv(),
2*(IloInt)loadDuration + (IloInt)delay,
(IloInt)makespan.getUB());
IloActivity onTrolley2S(model.getEnv(), duration2S);
onTrolley2S.shareStartWithStart(_load2);
onTrolley2S.shareEndWithEnd(_unloadS);
model.add(onTrolley2S.requires(trolleyCapacity));
/* ADD MAKESPAN CONSTRAINT */
model.add(_unloadS.endsBefore(makespan));
}
The same trade-off between efficiency of computation time and quality of the solution is made as for the previous version of the trolley example.
| © Copyright IBM Corp. 1987, 2009. Legal terms. | PREVIOUS NEXT |