Advertisement
Guest User

Untitled

a guest
Jul 6th, 2017
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Modula 3 13.03 KB | None | 0 0
  1. Simulation Begin
  2.   !fronty;
  3.   Ref(Head)  FrontaVoziky, FrontaLahudky;
  4.   Ref(Head) Array Pokladna(1:8);  
  5.  
  6.   ! obsazene obsluhy;
  7.   Boolean array PokladnaObsazena(1:8);
  8.   Integer  ObsazeneVoziky, ObsazeneLahudky;
  9.  
  10.   ! pocty obsluh;
  11.   Integer  Lahudky, Voziky, Pokladny;       ! počet obsluh;
  12.  
  13.   ! statitistiky;
  14.   Long Real  TotalTime, TimeSpent;          ! proměnné pro statistiky;
  15.   Integer  CustomersOut;                    ! Počet obsloužených zákazníků;
  16.   Integer MaxZakazniku, MaxLahudky, MaxFronta, PrisloZakazniku;
  17.   Integer  LahudkyZakaznici;
  18.   Ref(OutFile) Statistiky;
  19.  
  20.  
  21.   ! parametry modelu;
  22.   Real  DobaPrichodu, DobaObsluhy, DobaPlatbyMin, DobaPlatbyMax;   ! Parametry rozdeleni;
  23.   Real  DobaNakupuMin, DobaNakupuMax;
  24.   Real  Pravdepodobnost;
  25.   Integer  Seed;          ! Nasada pro generatory nahodnych promennych;
  26.   Real  TrialDuration;                            ! Délka experimentu [min];
  27.  
  28.   ! citac;
  29.   integer i;
  30.  
  31.   ! generator do systemu posila nove zakazniky s exp. rozlozenim;
  32.   Process Class Generator;
  33.   Begin
  34.     ! v nekonecnem cyklu;
  35.     While true do begin
  36.       ! vytvori noveho zakaznika;
  37.       Activate New Zakaznik(Time);
  38.       ! a na nahodny cas se uspi;  
  39.       Hold(Negexp(DobaPrichodu, Seed));
  40.     End While;
  41.   End of Generator;
  42.  
  43.   ! proces Zakaznik s jednim parametrem - casem vstupu do systemu;
  44.   Process Class Zakaznik(Prichod);  Real Prichod;
  45.   Begin
  46.  
  47.     Integer poradi; ! poradi zakaznika v systemu;
  48.     Ref(Zakaznik)  Next; ! dalsi zakaznik ve fronte;
  49.     integer i; ! citac cyklu;
  50.    
  51.     ! promenne pro vyber pokladny s nejmensi frontou;
  52.     integer NejvolnejsiPokladna, min;
  53.     boolean NalezenaPrazdnaPokladna;
  54.    
  55.     ! inicialisace promennych;
  56.     NejvolnejsiPokladna := 1;
  57.     min := MaxInt;
  58.     poradi := PrisloZakazniku + 1;
  59.     PrisloZakazniku := poradi;
  60.  
  61.     ! pokud existuje pred voziky fronta nebo pokud voziky dosly;
  62.     If not FrontaVoziky.Empty or (ObsazeneVoziky >= Voziky) then
  63.     begin
  64.       OutText("Zakaznik "); OutInt(poradi ,0); OutText(" ceka ve frontena vozik."); OutImage;
  65.       Wait(FrontaVoziky); ! stoupne si do fronty a ceka;                      
  66.     end;
  67.    
  68.     OutText("Zakaznik "); OutInt(poradi,0); OutText(" ma vozik"); OutImage;
  69.     ! zakaznik obsadi vozik;  
  70.     ObsazeneVoziky := ObsazeneVoziky + 1;
  71.    
  72.     If ObsazeneVoziky>MaxZakazniku then MaxZakazniku := ObsazeneVoziky;
  73.    
  74.     ! Cas se zacne pocitat az kdyz se dostane do obchodu!!!;
  75.     Prichod := Time;
  76.        
  77.     ! s danou pravdepodobnosti pujde zakaznik k lahudkam;
  78.     If draw(Pravdepodobnost,Seed) then
  79.     Begin  
  80.       ! k lahudkam prisel dalsi zakaznik;
  81.       LahudkyZakaznici := LahudkyZakaznici + 1;
  82.      
  83.       ! pripadne upraveni statisticke promenne;    
  84.       If LahudkyZakaznici>MaxLahudky then
  85.         MaxLahudky := LahudkyZakaznici;      
  86.                    
  87.             ! pokud je pred lahudkami fronta nebo pokud jsou obe prodavacky vytizene;    
  88.             If not FrontaLahudky.Empty or (ObsazeneLahudky >= Lahudky) then
  89.       Begin
  90.                 OutText("Zakaznik "); OutInt(poradi,0); OutText(" ceka na lahudky"); OutImage;
  91.                 ! zakaznik si stoupne do fronty a ceka;
  92.                 Wait(FrontaLahudky);
  93.             End;
  94.        
  95.             ! zakaznik prijde na radu a obsadi obsluhu ;
  96.             ObsazeneLahudky := ObsazeneLahudky + 1;    
  97.             OutText("Zakaznik "); OutInt(poradi,0); OutText(" je v lahudkach"); OutImage;
  98.             OutText("Zakazniku v lahudkach "); OutInt(LahudkyZakaznici,0); OutImage;
  99.             ! je obsluhovan;
  100.             Hold(Negexp(DobaObsluhy, Seed));
  101.             OutText("Zakaznik "); OutInt(poradi,0); OutText(" jde z lahudek"); OutImage;
  102.       ! obsluha dokoncena a uvolnena;
  103.       ObsazeneLahudky := ObsazeneLahudky - 1;
  104.      
  105.       ! aktivace dalsiho zakaznika ve fronte;
  106.             If not FrontaLahudky.Empty then
  107.       Begin
  108.                Next :- FrontaLahudky.First;
  109.                Next.Out;                      
  110.                Activate Next after Current;
  111.             End;
  112.            
  113.             ! uprava statisticke promenne;
  114.             LahudkyZakaznici := LahudkyZakaznici - 1;
  115.            
  116.            
  117.     End;
  118.          
  119.     OutText("Zakaznik "); OutInt(poradi,0); OutText(" jde nakupovat"); OutImage;
  120.     ! vlastni nakup;
  121.     Hold(Uniform(DobaNakupuMin, DobaNakupuMax, Seed));
  122.     OutText("Zakaznik "); OutInt(poradi,0); OutText(" jde k pokladnam."); OutImage;
  123.    
  124.     NalezenaPrazdnaPokladna := false;
  125.    
  126.     ! nakup dokoncen, hleda nejvolnejsi pokladnu;
  127.     for i := 1 step 1 until Pokladny do
  128.     begin
  129.       OutInt(i, 0); OutText(": "); OutInt(Pokladna(i).Cardinal,0); OutImage;
  130.       ! pokud nenalezl prazdnou pokladnu;    
  131.       if (not NalezenaPrazdnaPokladna) then
  132.       begin
  133.    
  134.         If Pokladna(i).Cardinal>MaxFronta then MaxFronta := Pokladna(i).Cardinal;  
  135.         ! hleda pokladnu s nejmensim poctem lidi ve fronte;
  136.         if (min > Pokladna(i).Cardinal) then
  137.         begin
  138.           ! nalezena prazdna pokladna;
  139.           if (Pokladna(i).Cardinal = 0) and (not PokladnaObsazena(i)) then
  140.             NalezenaPrazdnaPokladna := true;
  141.           ! ulozeni minima lidi ve fronte a polohy teto pokladny;
  142.           min := Pokladna(i).Cardinal;
  143.           NejvolnejsiPokladna := i;
  144.         end;
  145.       end;    
  146.     end;
  147.    
  148.     OutText("Zakaznik "); OutInt(poradi,0); OutText(" si vybral pokladnu c. "); OutInt(NejvolnejsiPokladna, 0); OutImage;
  149.    
  150.     ! pokud je pred pokladnou fronta nebo je obsazena;
  151.     If not Pokladna(NejvolnejsiPokladna).Empty or (PokladnaObsazena(NejvolnejsiPokladna)) then
  152.     begin
  153.       OutText("Zakaznik "); OutInt(poradi,0); OutText(" ceka u pokladny c. "); OutInt(NejvolnejsiPokladna, 0); OutImage;
  154.       ! zaradi se do fronty;
  155.       Wait(Pokladna(NejvolnejsiPokladna));  
  156.     end;
  157.    
  158.     ! obsadi pokladnu;
  159.     PokladnaObsazena(NejvolnejsiPokladna) := true;
  160.     OutText("Zakaznik "); OutInt(poradi,0); OutText(" zacina platit u pokladny c. "); OutInt(NejvolnejsiPokladna, 0); OutImage;
  161.     ! je obsluhovan;
  162.     Hold(Normal(DobaPlatbyMin, DobaPlatbyMax, Seed));
  163.     OutText("Zakaznik "); OutInt(poradi,0); OutText(" zaplatil u pokladny c. "); OutInt(NejvolnejsiPokladna, 0); OutImage;
  164.     !uvolni pokladnu;
  165.     PokladnaObsazena(NejvolnejsiPokladna) := false;
  166.     ! aktivace dalsiho ve fronte;
  167.     If not Pokladna(NejvolnejsiPokladna).Empty then
  168.     Begin
  169.       Next :- Pokladna(NejvolnejsiPokladna).First;
  170.       Next.Out;                
  171.       Activate Next after Current;
  172.     End;
  173.  
  174.     TotalTime := TotalTime + (Time - Prichod);
  175.     !OutText("Zakaznik "); !OutInt(poradi,0); !OutText(" celkova doba nakupu: ");
  176.     !OutFix((Time - Prichod), 3, 10); !OutImage;
  177.    
  178.     ! vrati vozik;    
  179.     ObsazeneVoziky := ObsazeneVoziky - 1;
  180.    
  181.     ! aktivace dalsiho zakaznika ve fronte;
  182.         If not FrontaVoziky.Empty then
  183.     Begin
  184.           Next :- FrontaVoziky.First;
  185.             Next.Out;                      
  186.             Activate Next after Current;
  187.         End;
  188.    
  189.     OutText("Zakaznik "); OutInt(poradi,0); OutText(" vratil vozik a jde do riti."); OutImage;
  190.     CustomersOut := CustomersOut + 1;
  191.  
  192.   End of Zakaznik;
  193.  
  194.   ! trida pro vypis informaci do souboru;  
  195.   Process Class Monitor;
  196.   Begin
  197.     While true do
  198.     Begin
  199.       Statistiky.OutFix(Time,0,5);
  200.       Statistiky.OutInt(ObsazeneVoziky,10);
  201.       Statistiky.OutInt(FrontaVoziky.Cardinal,9);
  202.       Statistiky.OutInt(LahudkyZakaznici,9);
  203.       Statistiky.OutInt(FrontaLahudky.Cardinal,10);
  204.       Statistiky.OutInt(Pokladna(1).Cardinal,8);
  205.       Statistiky.OutInt(Pokladna(2).Cardinal,9);
  206.       Statistiky.OutInt(Pokladna(3).Cardinal,9);
  207.       Statistiky.OutInt(Pokladna(4).Cardinal,9);
  208.       Statistiky.OutInt(Pokladna(5).Cardinal,9);
  209.       Statistiky.OutInt(Pokladna(6).Cardinal,9);
  210.       Statistiky.OutInt(Pokladna(7).Cardinal,9);
  211.       Statistiky.OutInt(Pokladna(8).Cardinal,9);
  212.       Statistiky.OutImage;
  213.       Hold(1);
  214.     End While
  215.   End;
  216.  
  217.  
  218.   ! Tělo hlavního programu ;
  219.   ! nastaveni parametru modelu;
  220.   Seed            := ClockTime;           ! Nasada pro nahodne promenne;
  221.   Voziky          := 100;                 ! pocet voziku;
  222.   Lahudky         := 2;                   ! pocet obsluhujicich v lahudkach;
  223.   Pokladny        := 8;                   ! pocet pokladen;
  224.   DobaPrichodu    := 5;                   ! zakaznici chodi po 1 minute;
  225.   DobaObsluhy     := 1/2;                 ! doba obsluhy u lahudek 2 minuty;
  226.   DobaPlatbyMin   := 1;                   ! min doba placeni u pokladny 1 minutu;
  227.   DobaPlatbyMax   := 3;                   ! max doba placeni u pokladny 3 minuty;
  228.   DobaNakupuMin   := 10;                  ! min doba stravena nakupovanim;
  229.   DobaNakupuMax   := 20;                  ! max doba stravena nakupovanim;
  230.   Pravdepodobnost := 0.3;                 ! pravdepodobnost navstiveni lahudek po prichodu;
  231.  
  232.   ! inicialisace promennych;
  233.   LahudkyZakaznici  := 0;            
  234.   MaxZakazniku      := 0;              
  235.   MaxLahudky        := 0;              
  236.   MaxFronta         := 0;                  
  237.   ObsazeneVoziky    := 0;
  238.   ObsazeneLahudky   := 0;
  239.   FrontaVoziky      :- New Head;
  240.   FrontaLahudky     :- New Head;       
  241.  
  242.   for i:= 1 step 1 until Pokladny do
  243.   begin
  244.     Pokladna(i) :- new Head;
  245.     PokladnaObsazena(i) := false;
  246.   end;
  247.  
  248.   ! ziskani delky simulace od uzivatele;
  249.   OutText("Zadejte delku simulace : "); OutImage;
  250.   TrialDuration := InInt;              
  251.  
  252.   ! do souboru vypiseme popis a hlavicku tabulek;
  253.   Statistiky:- new OutFile("monitor.txt");
  254.   Statistiky.open(blanks(150));
  255.  
  256.   Statistiky.OutText("Vystup simulace Samoobsluhy");  Statistiky.OutImage;
  257.   Statistiky.OutText("---------------------------");  Statistiky.OutImage;
  258.   Statistiky.OutImage;
  259.   Statistiky.OutText("Legenda");  Statistiky.OutImage;
  260.   Statistiky.OutText("-------");  Statistiky.OutImage;
  261.   Statistiky.OutText("Cas       ");  Statistiky.OutText("Cas od zacatku simulace (v minutach)");  Statistiky.OutImage;
  262.   Statistiky.OutText("ZakSam    ");  Statistiky.OutText("Aktualni pocet zakazniku v samoobsluze");  Statistiky.OutImage;
  263.   Statistiky.OutText("ZakVoz    ");  Statistiky.OutText("Aktualni pocet zakazniku, kteri cekaji na voziky");  Statistiky.OutImage;
  264.   Statistiky.OutText("ZakLah    ");  Statistiky.OutText("Aktualni pocet zakazniku, kteri jsou obsluhovani v lahudkach");  Statistiky.OutImage;
  265.   Statistiky.OutText("ZakLahF   ");  Statistiky.OutText("Aktualni pocet zakazniku, kteri ve fronte na lahudky");  Statistiky.OutImage;
  266.   Statistiky.OutText("Pokl.1    ");  Statistiky.OutText("Aktualni pocet zakazniku, kteri jsou u pokladny c.1");  Statistiky.OutImage;
  267.   Statistiky.OutText("Pokl.2    ");  Statistiky.OutText("Aktualni pocet zakazniku, kteri jsou u pokladny c.2");  Statistiky.OutImage;
  268.   Statistiky.OutText("Pokl.3    ");  Statistiky.OutText("Aktualni pocet zakazniku, kteri jsou u pokladny c.3");  Statistiky.OutImage;
  269.   Statistiky.OutText("Pokl.4    ");  Statistiky.OutText("Aktualni pocet zakazniku, kteri jsou u pokladny c.4");  Statistiky.OutImage;
  270.   Statistiky.OutText("Pokl.5    ");  Statistiky.OutText("Aktualni pocet zakazniku, kteri jsou u pokladny c.5");  Statistiky.OutImage;
  271.   Statistiky.OutText("Pokl.6    ");  Statistiky.OutText("Aktualni pocet zakazniku, kteri jsou u pokladny c.6");  Statistiky.OutImage;
  272.   Statistiky.OutText("Pokl.7    ");  Statistiky.OutText("Aktualni pocet zakazniku, kteri jsou u pokladny c.7");  Statistiky.OutImage;
  273.   Statistiky.OutText("Pokl.8    ");  Statistiky.OutText("Aktualni pocet zakazniku, kteri jsou u pokladny c.8");  Statistiky.OutImage;
  274.   Statistiky.OutImage;
  275.   Statistiky.OutText("Statistiky v zavislosti na case");  Statistiky.OutImage;
  276.   Statistiky.OutText("-------------------------------");  Statistiky.OutImage;
  277.   Statistiky.OutText("Cas      ");
  278.   Statistiky.OutText("ZakSam   ");
  279.   Statistiky.OutText("ZakVoz   ");
  280.   Statistiky.OutText("ZakLah   ");
  281.   Statistiky.OutText("ZakLahF  ");
  282.   Statistiky.OutText("Pokl.1   ");
  283.   Statistiky.OutText("Pokl.2   ");
  284.   Statistiky.OutText("Pokl.3   ");
  285.   Statistiky.OutText("Pokl.4   ");
  286.   Statistiky.OutText("Pokl.5   ");
  287.   Statistiky.OutText("Pokl.6   ");
  288.   Statistiky.OutText("Pokl.7   ");
  289.   Statistiky.OutText("Pokl.8   ");
  290.   Statistiky.OutImage;
  291.  
  292.   ! vytvorime novy monitor, ktery pobezi celou dobu a vypisuje statistiky;
  293.   Activate New Monitor;
  294.  
  295.   ! vytvoreni noveho generatoru;
  296.   Activate New Generator;      
  297.   ! nastaveni trvani experimentu po zadanou dobu;      
  298.   Hold(TrialDuration);                
  299.  
  300.   ! tisk souhrnnych statistik;
  301.   TimeSpent := TotalTime/(CustomersOut-1);
  302.   Statistiky.OutImage;
  303.   Statistiky.OutText("Souhrnne statistiky");  Statistiky.OutImage;
  304.   Statistiky.OutText("-------------------");  Statistiky.OutImage;
  305.   Statistiky.OutText("Prumerna doba nakupu:                             ");
  306.   Statistiky.OutFix(TimeSpent, 3, 6);  Statistiky.OutImage;
  307.   Statistiky.OutText("Maximalni soucasny pocet zakazniku v lahudkach:   ");
  308.   Statistiky.OutInt(MaxLahudky, 0);  Statistiky.OutImage;
  309.   Statistiky.OutText("Maximalni soucasny pocet zakazniku v samoobsluze: ");
  310.   Statistiky.OutInt(MaxZakazniku, 0);  Statistiky.OutImage;
  311.   Statistiky.OutText("Nejdelsi fronta u pokladen:                       ");
  312.   Statistiky.OutInt(MaxFronta, 0);  Statistiky.OutImage;
  313.  
  314.   Statistiky.close;
  315.  
  316. End of program;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement