MAIN MODULE BarP; FROM SimMod IMPORT StartSimulation, SimTime, TriggerObj; FROM GrpMod IMPORT QueueObj; FROM RandMod IMPORT RandomObj, FetchSeed; FROM StatMod IMPORT TSINTEGER, ITimedStatObj; FROM MathMod IMPORT SQRT; (* CONSTANT DECLARATIONS *) CONST cNumberOfCustomers = 1000; (* TYPE DECLARATIONS *) TYPE BarManObj = OBJECT TELL METHOD ServeCustomers; END OBJECT; (* BarManObj *) CustomerGeneratorObj = OBJECT iNumberGenerated: INTEGER; TELL METHOD GenerateCustomers; END OBJECT; (* CustomerGeneratorObj *) (* VARIABLE DECLARATIONS *) VAR oBarMan: BarManObj; oCustomerGenerator: CustomerGeneratorObj; oArrivalSignal: TriggerObj; oRandomA: RandomObj; oRandomS: RandomObj; iCustomerQueue: TSINTEGER; rMean: REAL; rVar: REAL; (* OBJECT IMPLEMENTATIONS *) OBJECT BarManObj; TELL METHOD ServeCustomers; BEGIN LOOP IF iCustomerQueue > 0 WAIT DURATION (ASK oRandomS Exponential(4.5)); END WAIT; iCustomerQueue := iCustomerQueue - 1; ELSE WAIT FOR oArrivalSignal TO Fire END WAIT; END IF; END LOOP; END METHOD; (* ServeCustomers *) END OBJECT; (* BarManObj *) OBJECT CustomerGeneratorObj; TELL METHOD GenerateCustomers; BEGIN WHILE iNumberGenerated < cNumberOfCustomers iNumberGenerated := iNumberGenerated + 1; iCustomerQueue := iCustomerQueue + 1; IF iCustomerQueue = 1 ASK oArrivalSignal TO Release; END IF; WAIT DURATION (ASK oRandomA Exponential(5.0)); END WAIT; END WHILE; END METHOD; (* GenerateCustomers *) END OBJECT; (* CustomerGeneratorObj *) (* MAIN PROGRAM *) BEGIN NEW(oBarMan); NEW(oCustomerGenerator); NEW(oArrivalSignal); NEW(oRandomA); NEW(oRandomS); ASK oRandomA TO SetSeed(FetchSeed(9)); ASK oRandomS TO SetSeed(FetchSeed(6)); TELL oCustomerGenerator TO GenerateCustomers; TELL oBarMan TO ServeCustomers; OUTPUT("Starting Simulation at ", SimTime); StartSimulation; OUTPUT("Ending Simulation at ", SimTime); rMean := ASK GETMONITOR(iCustomerQueue, ITimedStatObj) Mean; rVar := ASK GETMONITOR(iCustomerQueue, ITimedStatObj) Variance; OUTPUT("Mean Queue Size = ", rMean); OUTPUT("Var Queue Size = ", rVar); OUTPUT(" 95% CI = (", rMean - 1.96 * SQRT(rVar / FLOAT(cNumberOfCustomers)), ", ", rMean + 1.96 * SQRT(rVar / FLOAT(cNumberOfCustomers)), ")" ); DISPOSE(oBarMan); DISPOSE(oCustomerGenerator); (* DISPOSE(oArrivalSignal);*) DISPOSE(oRandomA); DISPOSE(oRandomS); END MODULE. (* Bar *)