Az elvárásokat legjobban az alábbi, futás során keletkezett ábrasor fejezi ki.
|
1. ábra. Egy futási kép Tájékoztató |
|
2. ábra. Egy futási kép Paraméterezés |
|
3. ábra. Egy futási kép Futás közben |
Mindenekelőtt lássunk egy próbát! (DarazsMo.exe)
A kezelés és a látvány, valamint a szimuláció specifikus problémái és megoldásötletei.
Normál / Lépésenkénti / Csendes / Vége
TÜzemMódok típus, ÜzemMód állapotváltozó
Karakteres tájékoztatás, paraméterezés
Grafikus modellezés
Miért célszerű ez így? Miért nem csak karakteres vagy csak grafikus képernyő?
Billentyűfigyelés, várakozás-kijelzés, állapotmódosítás (ÜzemMód állapotváltozó)
Egyszerű szerkezetű (=előre a képernyőre tördelt) Text fájlból, karakteres képernyőre, lapozottan.
Text-kezelési minimum emlékeztető:
ˇ Var f:Text; {karakterfájl} sor:String[80]; {egy sorát ebben olvassuk majd be}
ˇ Assign(f,fN); {$i} Reset(f); {$i+} hiba:=IOResult<>0; {ellenőrzött nyitás}
ˇ Eof(f) {=vége-e az f fájlnak?}
ˇ Readln(f,sor); {egy sor beolvasása f-ből sor-ba}
ˇ Close(f); {f lezárása}
Felépítése, állandó részei (keret, cím, idő, help-sor), ablakfajták (grafikon / eseménytér)
Turbo grafikai[1] egyszer-egy emlékeztető:
ˇ Graph unit ˇ InitGraph ˇ Detect
ˇ SetViewPort, GetMaxX ˇ ClearViewPort ˇ SetLineStyle, SolidLn
ˇ SetTextJustify, CenterText ˇ Rectangle ˇ OutTextXY
A Grafikon-ablak műveletei:
ˇ Létrehozás paraméterek szerint (hol, mekkora, cím, )
ˇ (Első) kirajzolás (az ablak statikus részeinek megjelenítése)
ˇ Teljes grafikon kirajzolás (pl. Csendes üzemmód után, vagy eloszlásgörbe)
ˇ Eloszlásdiagram csak a változó oszlop adminisztrálása, és üzemmódfüggően kirajzolása
ˇ IdőDiagram kirajzolás az új oszloppal bővítés (adminisztrálással), és üzemmódfüggően kirajzolása shift-eléssel
|
|
|
4. ábra. Eloszlásdiagram |
5. ábra. Idődiagram |
|
Az Eseménytér-ablak műveletei ˇ Eseménytér kirajzolása ˇ Elemi esemény követése |
|
|
|
6. ábra. Eseménytér-ablak |
|
A probléma forrása az, hogy bár előre tudhatók azok a végkifejletek, amelyek bekövetkezhetnek, de hogy mikor, és milyen mértékben azt a futás végén lehet csak tudni. Tehát a megjelenítendő információnak van előre megfogalmazható szöveges része, amelyekbe beleillesztendők a futás aktualitásai.
Megoldásötlet: a szövegben elhelyezni olyan speciális jeleket, amelyekről beolvasás közben ordít, hogy milyen aktualitást kell a helyére illeszteni. Tehát a megoldás algoritmusa hasonlít a tájékoztatóéra, azzal a különbséggel, hogy soronként ellenőrizni kell a speciális jelek meglétét, és esetleg be kell oda illeszteni a hozzátartozó aktualitás értékét.
Modell-reprezentáció a modell alapadatai:
ˇ T idő
ˇ N,K össz-darázs-szám, bal dobozbeli darázsszám (modell-specifikus)
ˇ UzemMod: TUzemModok aktuális üzemmód
ˇ Darazs darazsak holléte (modell-specifikus)
ˇ dobozTerkep szabad/foglalt helyek nyilvántartása (modell-specifikus)
ˇ darazsKep darázs rajza (modell-specifikus)
Modell-implemetáció a modell nagyvonalú algoritmusa (Pascal-ul):
UzemMod:=Lepesenkenti;
Tajekoztato;
Inicializalas;
T:=0;
KezdoKepernyo;
EredmenyMegjelenites;
While
not VegeE do
Begin
SzimulaciosLepes;
Inc(T);
EredmenyMegjelenites;
End;
OsszefoglaloMegjelenites;
Az eljárások/függvények rövid leírása:
ˇ Tájékozató:
L. feljebb
ˇ Inicializálás:
Paraméterbeolvasás (modell-specifikus)
Grafikonok parametrizálása
Eseménytér inicializálása
Darázskép-generálás (modell-specifikus)
Darazsak elhelyezése (modell-specifikus)
ˇ KezdőKépernyő
Grafikus képernyőre váltás
Grafikus képernyő (-alap)elkészítése (ablakok kirajzolása)
ˇ EredményMegjelenítés
Aktuális idő kiírása
Grafikus ablakok frissítése (a változó adatok módosítása)
ˇ VégeE
Billentyűfigyelés üzemmódtól függően: várakozás
Végállapot-figyelés (modell-specifikus)
(Esetleg) kijelzés frissítés (Csendes → Normál / Lépésenkénti)
ˇ SzimulációsLépés
A lényeg modellváltozók módosítása (modell-specifikus)
Az eseménytér módosítása (ha kell)
ˇ ÖsszefoglalóMegjelenítés
Konklúzió
levonása a végidőt, az össz- és a baloldali dobozbeli darázs-számot
tartalmazó, előre gyártott, fájlban levő szöveg megjelenítése (a szöveg: modell-specifikus)
L. a keretprogram OsszefoglaloMegjelenites eljárásában
Összefoglaló ábrák megjelenítése (modell-specifikus)
L. DarazsKe.pas.
Megértendő fogalmak, részek:
ˇ a feltételes fordítás lényege és itteni célja
ˇ a típusok főleg a THisztAblak
ˇ a globális adatok főleg a T, N, K, Darazs, DobozTerkep
ˇ az ablak-műveletek célja, paraméterezése
ˇ az inicializálás feladatai (és a fejlesztési kényszer miatt keletkezett TP2FP konverziós függvények)
ˇ a kezdő képernyő feladatai
ˇ az eredménymegjelenítés feladatai
ˇ a vége-e függvény (többletszolgáltatásai)
ˇ az összefoglaló megjelenítés kulisszatitkai
A keretprogramban az (*ide kell a kód*) megjegyzéssel megjelölt részek kitöltése:
ˇ Tajekoztato teljes megvalósítása
ˇ Inicializalas-ban
o az N és a K tisztességes beolvasása,
o az eseménytér inicializálásából a darazsak elhelyezése a Darazs-ban és a DobozTerkep kitöltése
ˇ SzimulaciosLepes-ben
o az átrepülő darázs kiválasztása,
o az eseménytér régi dobozából törlése,
o az eseménytér új dobozában hely keresése, és elhelyezése
A Darázs-modell keretprogramjából olyan szimulációs keretprogram elkészítése, amely a későbbiekben jobb kiindulópontul szolgálhatna, mint a Darázs-modellé. Azaz a biztosan fölösleges részeket ki kell hagyni. Annyit lehet előre tudni, hogy a későbbi modelljeinkben a mozgó alkatrészeket (a mostani darazsakat) már elegendő lesz egy valamilyen színes pöttyel jelölni, és csak egyetlen reakciótérben zajlanak majd az események (nem lesz több doboz).
Illesszünk be egy új diagramot a programba, amelyen megjelenítjük azt az eloszlást, amelyet a darázs-modell a konkrét paraméterekhez jósol. Ezt elegendő egyetlen egyszer kirajzolni, hiszen az idealizált végállapotot szemlélteti. Az összefoglalóban kiírjuk, hogy kezdetben és a végén mennyi volt az empirikus és az elméleti eloszlás távolsága. (Az elméleti eloszlás (N,½)-paraméterű binomiális eloszlás.[2])
Ezt a távolságot pl. az alábbi módon definiálhatjuk:
Ha N elemből áll az eloszlást reprezentáló sorozat (e0, , eN), akkor két ilyen távolsága legyen
Hogy mire is gondolok? Álljon néhány jellemző kép az elérendő cél bemutatására!
|
7. ábra. Egy futási kép a szimuláció elejéről (T=141) |
|
8. ábra. Egy futási kép a futás legvégén (T=23847) |
|
9. ábra. Egy futási kép Összefoglaló |
Ez a kézirat, források, lefordított kódok, súgófájl... : Darazs.zip.
[1] A Free Pascal implementálói elfogadták a Borland Turbo grafikáját (TG), és egy az egyben megvalósították a saját rendszerükben.
TG részletesebb leírását itt találja: http://pascal-programming.info/lesson8.php