Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- MAIN MODULE bank;
- FROM SimMod IMPORT StartSimulation, SimTime, StopSimulation, InterruptMethod;
- FROM RandMod IMPORT RandomObj;
- FROM StatMod IMPORT IStatObj, ITimedStatObj, TSINTEGER, SREAL, RStatObj;
- FROM IOMod IMPORT StreamObj, ALL FileUseType;
- FROM ListMod IMPORT QueueList;
- TYPE
- KlientRec = RECORD
- czasWej: REAL;
- nr: INTEGER;
- czasCierp: REAL;
- actid: ACTID;
- END RECORD;
- KolejkaObj = OBJECT; FORWARD;
- OtoczenieObj = OBJECT(RandomObj);
- lambda: REAL;
- kolejka: KolejkaObj;
- liczKlDoWygen: INTEGER;
- ASK METHOD Init(IN lbd: REAL; IN kol: KolejkaObj; IN lk: INTEGER);
- TELL METHOD GenerujKlientow();
- END OBJECT;
- GniazdoObj = OBJECT(RandomObj);
- mi: REAL;
- liczOkienek: INTEGER;
- liczZajOkienek: TSINTEGER;
- kolejka: KolejkaObj;
- czasObslugi: SREAL;
- ASK METHOD Init(IN m: REAL; IN lo: INTEGER; IN kol: KolejkaObj);
- TELL METHOD Obsluguj();
- END OBJECT;
- KolejkaObj = OBJECT(QueueList);
- maxDlugosc: INTEGER;
- gniazdo: GniazdoObj;
- dlugosc: TSINTEGER;
- ASK METHOD Init(IN maxdl: INTEGER; IN gnd: GniazdoObj);
- ASK METHOD Wstaw(IN klient: KlientRec);
- ASK METHOD Usun(): KlientRec;
- TELL METHOD Niecierpliwosc (IN kl: KlientRec);
- END OBJECT;
- OBJECT OtoczenieObj;
- ASK METHOD Init(IN lbd: REAL; IN kol: KolejkaObj; IN lk: INTEGER);
- BEGIN
- lambda:= lbd;
- liczKlDoWygen:=lk;
- kolejka:=kol;
- END METHOD;
- TELL METHOD GenerujKlientow();
- VAR i: INTEGER;
- VAR a: REAL;
- kl: KlientRec;
- BEGIN
- a:= 2.0;
- FOR i:= 1 TO liczKlDoWygen
- WAIT DURATION Exponential(1.0 / lambda)
- NEW(kl);
- kl.czasCierp := Exponential(1.0/a);
- ASK kolejka TO Wstaw(kl);
- ON INTERRUPT
- END WAIT;
- END FOR;
- END METHOD;
- END OBJECT;
- OBJECT GniazdoObj;
- ASK METHOD Init(IN m: REAL;IN lo: INTEGER; IN kol: KolejkaObj);
- BEGIN
- mi:=m;
- liczOkienek:=lo;
- kolejka:=kol;
- END METHOD;
- TELL METHOD Obsluguj();
- VAR kl: KlientRec;
- BEGIN
- INC(liczZajOkienek);
- WHILE ASK kolejka TO numberIn > 0
- kl := ASK kolejka TO Usun();
- InterruptMethod(kl.actid);
- WAIT DURATION Exponential(1.0/mi)
- czasObslugi:=SimTime - kl.czasWej;
- DISPOSE(kl);
- ON INTERRUPT
- END WAIT;
- END WHILE;
- DEC(liczZajOkienek);
- END METHOD;
- END OBJECT;
- OBJECT KolejkaObj;
- ASK METHOD Init(IN maxdl: INTEGER; IN gnd: GniazdoObj);
- BEGIN
- maxDlugosc:=maxdl;
- gniazdo := gnd;
- END METHOD;
- ASK METHOD Usun(): KlientRec;
- BEGIN
- IF dlugosc > 0
- DEC(dlugosc);
- END IF;
- RETURN Remove();
- END METHOD;
- TELL METHOD Niecierpliwosc(IN kl: KlientRec);
- BEGIN
- WAIT DURATION kl.czasCierp
- RemoveThis(kl);
- DISPOSE(kl);
- ON INTERRUPT
- END WAIT;
- END METHOD;
- ASK METHOD Wstaw(IN klient: KlientRec);
- BEGIN
- IF maxDlugosc > numberIn
- INC(dlugosc);
- klient.czasWej:=SimTime;
- Add(klient);
- klient.actid := TELL SELF TO Niecierpliwosc(klient);
- IF gniazdo.liczZajOkienek < gniazdo.liczOkienek
- TELL gniazdo TO Obsluguj;
- END IF;
- ELSE
- DISPOSE(klient);
- END IF;
- END METHOD;
- END OBJECT;
- VAR
- otoczenie: OtoczenieObj;
- gniazdo: GniazdoObj;
- kol: KolejkaObj;
- plik: StreamObj;
- monITS: ITimedStatObj;
- monRS: RStatObj;
- BEGIN
- NEW(otoczenie);
- NEW(gniazdo);
- NEW(kol);
- ASK otoczenie TO Init(1.5,kol,1000);
- ASK gniazdo TO Init(2.0, 1 , kol);
- ASK kol TO Init(10, gniazdo);
- TELL otoczenie TO GenerujKlientow();
- StartSimulation;
- NEW(plik);
- ASK plik TO Open("wyniki.txt",Output);
- ASK plik TO WriteString("srednia dlugosc kolejki: ");
- monITS:= GETMONITOR(ASK kol TO dlugosc, ITimedStatObj);
- ASK plik TO WriteLn;
- ASK plik TO WriteString("sredni czas obslugi klienta: ");
- monRS:=GETMONITOR(ASK gniazdo TO czasObslugi, RStatObj);
- ASK plik TO WriteReal(ASK monRS TO Mean, 10, 4);
- ASK plik TO WriteLn;
- ASK plik TO WriteString("odchylenie standardowe dla kolejki: ");
- ASK plik TO WriteReal(ASK monITS TO StdDev, 10, 4);
- ASK plik TO WriteLn;
- ASK plik TO WriteString("odchylenie standardowe dla obslugi klienta: ");
- ASK plik TO WriteReal(ASK monRS TO StdDev, 10, 4);
- ASK plik TO WriteLn;
- ASK plik TO Close;
- DISPOSE(plik);
- DISPOSE(otoczenie);
- DISPOSE(gniazdo);
- DISPOSE(kol);
- OUTPUT("koniec");
- END MODULE.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement