BEGIN simulation CLASS statisticssimulation; COMMENT same as "simulation" plus automatic tracing and production of queue statistics; BEGIN PROCEDURE write_time; BEGIN outtext(" TIME:"); outfix(time,0,4); outchar('.'); outimage; END; process CLASS s_process(nameid, number); COMMENT same as "process" but has name and number to be used in output messages; VALUE nameid; TEXT nameid; INTEGER number; BEGIN REF(s_queue) my_queue; PROCEDURE s_out; INSPECT my_queue DO BEGIN increase_queuelength(-1); out; my_queue:- NONE; END of s_out; END of s_process; head CLASS s_queue(nameid); COMMENT same as "head" but trace messages are given when the queue length is changed, and queue length statistics are collected; VALUE nameid; TEXT nameid; BEGIN INTEGER queuelength; REAL previous_time, length_integral; PROCEDURE increase_queuelength(plus); INTEGER plus; BEGIN length_integral:= length_integral+queuelength*(time-previous_time); previous_time:= time; queuelength:= queuelength+plus; outtext("QUEUE AT "); outtext(nameid); outtext(" SIZE"); outint(queuelength,3); write_time; END of increase_queuelength; PROCEDURE write_mean_length; BEGIN increase_queuelength(0); outtext("QUEUE AT "); outtext(nameid); outtext(" MEAN LENGTH "); outfix(length_integral/time,1,5); outtext(" UNTIL"); write_time; END; END; PROCEDURE s_hold(the_time, place); COMMENT same as "hold" but writes a trace message for every event during the simulation; NAME place; REAL the_time; TEXT place; BEGIN INSPECT current WHEN s_process DO BEGIN outtext(nameid); outtext(" NO."); outint(number,3); outtext(" WILL BE "); outtext(place); write_time; END; hold(the_time); END of s_hold; PROCEDURE s_wait(queue); COMMENT same as "wait" but writes trace message when a queue is entered, and updates queue statistics; REF(s_queue) queue; BEGIN INSPECT current WHEN s_process DO BEGIN my_queue:- queue; outtext(nameid); outtext(" NO."); outint(number,3); END; INSPECT queue DO BEGIN outtext(" INTO QUEUE AT "); outtext(nameid); write_time; increase_queuelength(1); END; wait(queue); END of s_wait; END of statisticssimulation; REAL simulation_duration; simulation_duration:= 200; statisticssimulation BEGIN REF (platform) harbour, store, factory; INTEGER i, u; s_process CLASS truck; BEGIN WHILE TRUE DO BEGIN s_hold(harbour.travel_time,"LEAVING FOR HARBOUR"); ACTIVATE harbour DELAY 0; s_wait(harbour.queue); IF draw(0.5,u) THEN BEGIN s_hold(store.travel_time,"LEAVING FOR STORE"); ACTIVATE store DELAY 0; s_wait(store.queue); END ELSE BEGIN s_hold(factory.travel_time, "LEAVING FOR FACTORY"); ACTIVATE factory DELAY 0; s_wait(factory.queue); END; END; END of truck; s_process CLASS platform(platform_time, travel_time); REAL platform_time, travel_time; BEGIN REF (s_queue) queue; queue:- NEW s_queue(nameid); WHILE TRUE DO BEGIN INSPECT queue.first WHEN truck DO BEGIN s_out; s_hold(platform_time,"LOADING OR UNLOADING"); ACTIVATE THIS truck; END OTHERWISE passivate; END; END of platform; harbour:- NEW platform("HARBOUR",1,10,20); ACTIVATE harbour; store:- NEW platform("STORE",1,15,20); ACTIVATE store; factory:- NEW platform("FACTORY",1,17,20); ACTIVATE factory; FOR i:= 1 STEP 1 UNTIL 5 DO ACTIVATE NEW truck("TRUCK",i); hold(simulation_duration); outimage; outtext("END OF SIMULATION"); write_time; outimage; harbour.queue.write_mean_length; store.queue.write_mean_length; factory.queue.write_mean_length; END of simulation; END of program;