MODULE Banque; IMPORT SIM, EVENT, STAT, PROCS, LIST, RES, GENEP; FROM RES IMPORT Resource, Request, Release, ServicePolicy; FROM PROCS IMPORT Delay, Terminate, Kill, ResetDelay, InstanceDelay; FROM EVENT IMPORT EventType, Schedule; FROM RAND IMPORT Uniform01; FROM RAND1 IMPORT Expon; FROM MYINOUT IMPORT WriteLn, WriteString, WriteLongInt, WriteCard; FROM NUM IMPORT LIToLR; FROM CHRONO IMPORT Chrono, TimeFormat, InitChrono, WriteChrono, ValChrono; CONST Minute = 1.0 / 60.0; (* Une minute. *) VAR Rep : LONGINT; (* Repetition courante. *) Caissiers : Resource; Client : PROCS.ProcessType; (* Un client. *) Prochain : PROCS.ProcessInstance; (* Prochain client a arriver. *) DelaiMoyen : LONGREAL; (* Moy. inter-arrivees. *) NbServis : LONGINT; (* Nb. servis aujourd'hui. *) StatServis : STAT.Block; E9h45, E10h, E11h, E14h, E15h : EventType; Time :Chrono; PROCEDURE Proc9h45; BEGIN RES.SetCapacity (Caissiers, 0); DelaiMoyen := 2.0 * Minute; PROCS.ScheduleNamed (Client, Expon (DelaiMoyen, 1), NIL, Prochain); END Proc9h45; PROCEDURE Proc10h; VAR U : LONGREAL; n : CARDINAL; BEGIN U := Uniform01 (3); IF U >= 0.2 THEN n := 3 ELSIF U < 0.05 THEN n := 1 ELSE n := 2 END; RES.SetCapacity (Caissiers, n); END Proc10h; PROCEDURE Proc11h; BEGIN ResetDelay (Prochain, InstanceDelay (Prochain) / 2.0); DelaiMoyen := Minute END Proc11h; PROCEDURE Proc14h; BEGIN ResetDelay (Prochain, 2.0 * InstanceDelay (Prochain)); DelaiMoyen := 2.0 * Minute END Proc14h; PROCEDURE Proc15h; BEGIN (* PROCS.CancelInstanceNotice (Prochain); *) Kill (Prochain) END Proc15h; PROCEDURE Balk () : BOOLEAN; VAR n : CARDINAL; BEGIN n := LIST.Size (RES.WaitList (Caissiers)); RETURN ((n > 9) OR ((n > 5) AND (5.0 * Uniform01 (4) < LIToLR (n-5)))) END Balk; PROCEDURE ProcClient; BEGIN PROCS.ScheduleNamed (Client, Expon (DelaiMoyen, 1), NIL, Prochain); IF NOT Balk () THEN Request (1, Caissiers); Delay (Expon (Minute, 2) + Expon (Minute, 2)); Release (1, Caissiers); INC (NbServis); END; Terminate END ProcClient; PROCEDURE UnJour; BEGIN WriteLn; WriteString ("Jour "); WriteLongInt (Rep, 5); SIM.Init; NbServis := 0; Schedule (E9h45, 9.75, NIL); Schedule (E10h, 10.0, NIL); Schedule (E11h, 11.0, NIL); Schedule (E14h, 14.0, NIL); Schedule (E15h, 15.0, NIL); SIM.Start; STAT.Update (StatServis, LIToLR (NbServis)); WriteLongInt (NbServis, 15); END UnJour; BEGIN EVENT.Create (E9h45, Proc9h45, 'Demarrage'); EVENT.Create (E10h, Proc10h, 'Ouverture'); EVENT.Create (E11h, Proc11h, '11 heures'); EVENT.Create (E14h, Proc14h, '14 heures'); EVENT.Create (E15h, Proc15h, 'Fermeture'); PROCS.Create (Client, ProcClient, 2048, 'Un client'); RES.Create (Caissiers, Fifo, 0, 'Les caissiers'); STAT.Create (StatServis, STAT.Tally, 'Nb. servis par jour'); InitChrono (Time); FOR Rep := 1 TO 100 DO UnJour END; WriteChrono (Time, hms); WriteLn; STAT.Report (StatServis) END Banque.