Overview | Group | Tree | Graph | Index | Concepts |
This macro creates an instance of the class DemonClass
which is a subclass of IlcAltRCDemon
.
When this demon is triggered, it executes the function method
of the constraint ConstraintClass
given as parameter to the
macro. The signature of this method must be:
void ConstraintClass::method(IlcAltResConstraint rc, IlcResource resource)
.
The argument resource
is a possible resource whose change in
some ranges for the alternative resource constraint is responsible for
the triggering of the demon; for example, the start min of the activity if
the resource was selected in the alternative resource constraint.
Actually, the demon is trigerred each time a change happens in the
start, end, duration, processing time, or capacity range.
Once the resource demon class has been defined with the macro
ILCALTRCDEMON(DemonClass, ConstraintClass, method)
, an
instance of this demon can be created by passing an instance of
ConstraintClass
as a parameter of the member function
IlcAltResConstraint::whenRange
as follows:
ConstraintClass* ct = ...; IlcAltRCDemon myDemon = DemonClass(ct);
Example
The following code defines a demon AltRCDemonCaller
that
prints pieces of information about the resources whose ranges change.
class AltRCDemonCallI : public IlcConstraintI { IlcAltResConstraint _ct; public: AltRCDemonCallI(IlcManager m, IlcAltResConstraint ct) :IlcConstraintI(m), _ct(ct) {} ~AltRCDemonCallI() {} virtual void post(); virtual void propagate(); void showInfo(IlcAltResConstraint rc, IlcResource resource); }; void AltRCDemonCallI::showInfo(IlcAltResConstraint rc, IlcResource resource) { IlcAltResSet set = rc.getAltResSet(); cout << endl << "--------AltRCDemonCallI---------" << endl; cout << "IlcAltResConstraint :" << rc << endl; cout << "IlcResource : " << resource << endl; cout << "Index : " << set.getIndex(resource) << " in " << rc.getIndexVariable() << endl; cout << "--------------------------------" << endl; } ILCALTRCDEMON(AltRCDemonCaller, AltRCDemonCallI, showInfo); void AltRCDemonCallI::post() { _ct.whenRange(AltRCDemonCaller(this)); } void AltRCDemonCallI::propagate() { cout << endl << "--------AltRCDemonCallI---------" << endl; cout << "Demon For " << _ct << endl; cout << "--------------------------------" << endl; } IloSolver ...; IlcSchedule schedule(s, 0, 500); IlcDiscreteResource r1(schedule, 2); IlcDiscreteResource r2(schedule, 2); r1.setName("r1"); r2.setName("r2"); IlcAltResSet set(schedule, 2, r1, r2); IlcActivity a1(schedule, 30); IlcAltResConstraint rc1 = a1.requires(set, 2); s.add(rc1); s.add(new (s.getHeap()) AltRCDemonCallI(s, rc1));
See Also: