MODULE experien; IMPORT SIM, STAT, EVENT, RAND1, RES; FROM MYINOUT IMPORT WriteLn, ReadLn, WriteString, ReadString, ReadCard, WriteCard, OpenInput, CloseInput, OpenOutput, CloseOutput, WriteLongReal, ReadLongReal; FROM CHRONO IMPORT Chrono, TimeUnit, InitChrono, WriteChrono, TimeFormat; FROM EVENT IMPORT EventType, Schedule, Attrib; FROM RAND IMPORT Uniform01; FROM STAT IMPORT Update, Block, Tally, Average; FROM groupmac IMPORT Groupe, Create, Delete, Politique, DureeRepar; FROM commande IMPORT BalayageComplet, PlusPres; VAR N : CARDINAL; (* Nb. de machines. *) Lot : CARDINAL; (* No. du lot courant. *) NLots : CARDINAL; (* Nb. de lots a effectuer au total. *) Rechauf : CARDINAL; (* Nb. de lots pour le rechauffement. *) DureeLot : LONGREAL; (* Duree de simulation par lot. *) ProdMoy : Block; (* Stats. pour les differents lots. *) FinLot : EventType; (* La fin d'un lot. *) Alpha, Lambda, ProbSucces, DureeR, DureeRM : LONGREAL; (* Parametres des lois ci-bas. *) Ident : ARRAY [0..63] OF CHAR; Reparateur : RES.Resource; G : Groupe; C : Chrono; i : CARDINAL; PROCEDURE DFonc () : LONGREAL; (* Duree de fonctionnement entre deux pannes. *) BEGIN RETURN RAND1.Gamma (Alpha, Lambda, 1) END DFonc; PROCEDURE DRepMan (VAR S : BOOLEAN) : LONGREAL; (* Duree de reparation manuelle. *) BEGIN S := TRUE; RETURN DureeRM END DRepMan; PROCEDURE Const (VAR S : BOOLEAN) : LONGREAL; BEGIN S := TRUE; RETURN DureeR END Const; PROCEDURE Geo1 (VAR S : BOOLEAN) : LONGREAL; BEGIN IF Uniform01 (2) <= ProbSucces THEN S := TRUE ELSE S := FALSE END; RETURN DureeR END Geo1; PROCEDURE Geo2 (VAR S : BOOLEAN) : LONGREAL; BEGIN IF Uniform01 (2) <= ProbSucces THEN S := TRUE; RETURN DureeR END; IF Uniform01 (2) <= ProbSucces THEN S := TRUE ELSE S := FALSE END; RETURN (DureeR + DureeR) END Geo2; PROCEDURE ProcFinLot; BEGIN IF Lot > Rechauf THEN Update (ProdMoy, Average (G^.Prod)) END; STAT.Init (G^.Prod); IF Lot >= NLots THEN Rapport ELSE INC (Lot); Schedule (FinLot, DureeLot, NIL) END END ProcFinLot; PROCEDURE Rapport; (* Produit un rapport a la fin de la simulation d'une configuration. *) VAR MeanOp, MeanW, RadiusW, MeanProd, RadiusP, B1, B2 : LONGREAL; BEGIN WriteString ("Temps d'execution (CPU) : "); WriteChrono (C, sec); WriteLn; WriteString ("Temps de simulation (sec) : "); WriteLongReal (SIM.Time (), 9, 1); STAT.ReportConfidenceInterval (ProdMoy, 0.95); WriteLn; Delete (G); SIM.Stop END Rapport; PROCEDURE EssayerConfig ( Pol : Politique; DRep : DureeRepar; Nam : ARRAY OF CHAR ); (* Simule pour la configuration courante avec la politique Pol. *) (* La loi de prob. de la duree de repar. par le robot est DRep. *) BEGIN WriteString ("CONFIGURATION: "); WriteString (Ident); WriteString (", "); WriteString (Nam); WriteLn; SIM.Init; STAT.Init (ProdMoy); RES.Init (Reparateur); Lot := 1; Create (G, N, (N + 1) DIV 2, Pol, DFonc, DRep, DRepMan, Reparateur); Schedule (FinLot, DureeLot, NIL); InitChrono (C); SIM.Start END EssayerConfig; BEGIN EVENT.Create (FinLot, ProcFinLot, "Fin d'un lot"); STAT.Create (ProdMoy, Tally, "Prod. moyenne"); RES.Create (Reparateur, RES.Fifo, 1, "Le reparateur"); OpenInput (".DAT"); OpenOutput (".RES"); ReadCard (NLots); ReadCard (Rechauf); ReadLongReal (DureeLot); ReadLn; WriteString ("Simulation d'une serie de machines"); WriteString (" entretenues par un robot."); WriteLn; WriteLn; WriteString ("Nombre de lots : "); WriteCard (NLots, 8); WriteLn; WriteString ("Nombre de lots pour rechauffement : "); WriteCard (Rechauf, 8); WriteLn; WriteString ("Duree de la simulation pour chaque lot : "); WriteLongReal (DureeLot, 10, 1); WriteLn; WriteLn; ReadString (Ident); ReadLn; WHILE Ident [0] # "0" DO ReadCard (N); ReadLongReal (Alpha); ReadLongReal (Lambda); ReadLongReal (ProbSucces); ReadLongReal (DureeR); ReadLongReal (DureeRM); ReadLn ; EssayerConfig (BalayageComplet, Const, "Balayage complet, rep. const."); EssayerConfig (PlusPres, Const, "Plus pres, rep. const"); EssayerConfig (PlusPres, Geo1, "Plus pres, rep. Geo1"); EssayerConfig (PlusPres, Geo2, "Plus pres, rep. Geo2"); ReadString (Ident); ReadLn; END; CloseInput; CloseOutput END experien.