VYSOKÁ ŠKOLA EKONOMICKÁ V PRAZE FAKULTA INFORMATIKY A STATISTIKY
DIPLOMOVÁ PRÁCE
2009
Karel Charvát
VYSOKÁ ŠKOLA EKONOMICKÁ V PRAZE FAKULTA INFORMATIKY A STATISTIKY Hlavní specializace: Ekonometrie a operační výzkum
Název diplomové práce
Diskrétní simulace v MS Excel
Diplomant: Vedoucí diplomové práce:
Bc. Karel Charvát Ing. Martina Kuncová
Prohlášení: Prohlašují, že jsem diplomovou práci na téma „Diskrétní simulace v MS Excel“ zpracoval samostatně. Veškerou použitou literaturu a další podkladové materiály uvádím v seznamu použité literatury.
Jinočany, 10. 8. 2009
Karel Charvát
Poděkování Na tomto místě bych rád vyjádřil poděkování vedoucí mé diplomové práce Ing. Martině Kuncové za vstřícný přístup. Zároveň bych rád poděkoval všem, kteří mě podporovali během celého studia.
Obsah 1
Úvod ............................................................................................................... 7
2
Diskrétní simulace .......................................................................................... 9
3
2.1
Základní pojmy diskrétní simulace ......................................................... 9
2.2
Základní principy diskrétní simulace .................................................... 11
2.3
Postupy využívané v simulačních programech ..................................... 13
Fungování doplňku SIMULANT ................................................................. 16 3.1
Představení doplňku .............................................................................. 16
3.2
Proč Excel 2007 .................................................................................... 17
3.3
Data ....................................................................................................... 17
3.4
Využití náhodných čísel ........................................................................ 19
3.5
Simulační algoritmus ............................................................................ 21
3.5.1 Úvodní fáze ....................................................................................... 21 3.5.2 Simulační cyklus ............................................................................... 21 3.6
Zpracování událostí ............................................................................... 24
3.6.1 Vstup entity do modelu ..................................................................... 25 3.6.2 Příchod entity..................................................................................... 25 3.6.3 Zahájení aktivity ................................................................................ 26 3.6.4 Příchod zdrojů na místo určení .......................................................... 26 3.6.5 Konec aktivity ................................................................................... 26 3.6.6 Odchod z aktivity .............................................................................. 27 3.6.7 Ověření stavu modelu ........................................................................ 27 3.6.8 Odchod z fronty ................................................................................. 28 3.6.9 Přidělování zdrojů ............................................................................. 28 3.6.10 Volba cesty ...................................................................................... 29 3.7
Zpracování výsledků ............................................................................. 30
3.8
Animace ................................................................................................ 31
3.9
Vybrané technické detaily ..................................................................... 32
3.9.1 Umisťování a přesuny objektů .......................................................... 32 3.9.2 Nastavení chování jednotlivých elementů ......................................... 34 3.9.3 Provedení pohybů při animaci ........................................................... 36 4
Používání doplňku SIMULANT .................................................................. 38 4.1
Instalace a zprovoznění doplňku ........................................................... 38
4.2
Tvorba modelu ...................................................................................... 38
4.2.1 Práce s jednotlivými objekty ............................................................. 39 4.2.2 Dialogy a nastavení společné pro více typů objektů. ........................ 44
5
6
4.3
Chod simulace ....................................................................................... 46
4.4
Výsledková zpráva ................................................................................ 47
4.5
Příklad ................................................................................................... 50
Testování doplňku SIMULANT................................................................... 53 5.1
Odhalování chyb ................................................................................... 53
5.2
Výkonnost doplňku SIMULANT ......................................................... 54
Závěr ............................................................................................................. 55
Použitá literatura.................................................................................................... 56 Internetové zdroje .................................................................................................. 56
1 Úvod S pojmem simulace se můžeme setkat v nejrůznějších souvislostech. Ačkoliv se jednotlivé významy tohoto pojmu liší, většině lidí se v souvislosti se slovem simulace vybaví slovo napodobování. V rámci této práce budeme pod pojmem simulace chápat počítačovou simulaci reálného systému. Je tedy zřejmé, že i tento význam pojmu simulace má s napodobováním spojitost, neboť se zde jedná o napodobování určitého reálného systému pomocí počítačového modelu. Cílem simulačního modelování tedy bývá studium chování tohoto reálného systému. Model zde vystupuje jako zjednodušené zobrazení reality vytvářené pomocí počítače. Zjednodušení je zde proto, že složitý reálný systém není možné ani sebedokonalejším modelem popsat zcela přesně. Při tvorbě modelu se tedy snažíme o zachycení těch prvků a souvislostí v reálném systému, které jsou relevantní pro účel našeho zkoumání. Pokud se jedná o systém, který již existuje, motivací pro modelování obvykle bývá snaha o předvídání důsledků změn v tomto systému. Může se jednat o změny vstupních charakteristik některých částí systému i o změnu struktury systému. Simulace však může poskytnout cenné poznatky i ve fázi návrhu zcela nového systému a může tak pomoci při rozhodování o jeho budoucí podobě. S rozvojem a zvyšováním dostupnosti výpočetní techniky a simulačních nástrojů začíná být simulace čím dál tím více využívána v podnikové praxi. Nalézá uplatnění například při optimalizaci výrobních procesů v mnoha odvětvích, analýze a optimalizaci logistických systémů či jejich dílčích částí, modelování odstávek výrobních nebo jiných zařízení, analýze různých typů systémů hromadné obsluhy a v mnoha dalších oblastech. Výhody simulace vynikají především tam, kde se jedná o natolik složité systémy, že se klasické analytické přístupy stávají v podstatě nepoužitelnými. Na druhou stranu není možno opomíjet fakt, že simulace je statistickým experimentem a získané informace jsou pouze odhadem charakteristik reálného systému. Statistická teorie, o kterou se simulace opírá, však předmětem této práce není. Diplomová práce je zaměřena na jeden ze dvou základních typů simulace, a to diskrétní simulaci. Druhá kapitola seznamuje čtenáře se základními pojmy a principy diskrétní simulace, především těmi, které jsou nezbytné pro hlavní předmět práce, jímž je doplněk SIMULANT pro MS Excel, který jsem v rámci této práce vytvořil. 7
O doplňku SIMULANT pojednávají zbývající kapitoly. Třetí kapitola popisuje postupy, které zajišťují jeho fungování, čtvrtá kapitola slouží jako návod k obsluze a pátá kapitola přináší několik informací o odlaďování a testování výkonu tohoto doplňku. Prvním impulzem ke vzniku doplňku SIMULANT byl předmět Simulační modely, ve kterém jsem se seznámil s principy diskrétní simulace a s programy SIMPROCESS a SIMUL8, které jsou pro tento typ simulace určeny. Vedle diskrétní simulace se studenti v tomto kurzu seznamují i se simulací Monte Carlo a možností využít pro tento typ simulace aplikaci MS Excel. Déle je v tomto kurzu aplikace MS Excel používána i k simulaci jednoduchých systémů hromadné obsluhy. V obou případech se jedná o simulaci při použití pouze funkcí pracovního listu, bez využívání jazyku VBA. Zjištění, že v aplikaci MS Excel lze určité typy simulace provozovat i bez jazyku VBA, mě přivedlo k otázce, jaké možnosti simulace využití VBA otevře. Většina firem, které vyvíjejí nebo distribuují software zaměřený na diskrétní simulaci či software zahrnující diskrétní simulaci jako jednu ze svých součástí, nabízejí různé zkušební a vzdělávací verze svých produktů zdarma, či za zvýhodněných cenových podmínek. Licenční politika v oblasti vzdělávacích a zkušebních verzí se mezi jednotlivými firmami liší [7]. Zkušební a vzdělávací verze bývají, stejně jako u mnoha jiných kategorií softwaru, omezeny časově, maximálním možným rozsahem modelů, či funkcionalitou. Některé firmy nabízejí individuální licence každému jedinci, který projeví zájem, jiné umožňují instalaci svých produktů pouze studentům škol, které vzdělávací licenci jejich produktů zakoupily, a některé neumožňují instalaci a užívání zdarma vůbec. I v případě zkušebních verzí přístupných každému však stažení a instalace bývají spojeny minimálně s nutností registrace na webu příslušné firmy. Doplněk SIMULANT pro MS Excel 2007 nevyvíjím s cílem konkurovat jeho funkcionalitou plným ani zkušebním verzím komerčního softwaru a zřejmě by to z důvodů velké časové náročnosti takového vývoje a nedostatku osobních zkušeností s využitím simulace v praxi ani nebylo v mých silách. Hlavní, cílem je vytvořit snadno přístupný nástroj umožňující přehledným a pohodlným způsobem otestovat fungování základních principů diskrétní simulace. Není-li uvedeno jinak, teorie a obecné informace o simulaci, použité v úvodu, druhé a třetí kapitole, jsou čerpány z [1].
8
2 Diskrétní simulace 2.1 Základní pojmy diskrétní simulace Za dynamickou považujeme takovou simulaci, ve které je důležitým faktorem čas. Pokud se pomocí modelu snažíme popsat chování nějakého systému, obvykle nás zajímají změny uvnitř tohoto systému v čase. Způsob, jakým jsou tyto změny v modelu zaznamenávány, je klíčový při dělení simulace na diskrétní a spojitou. Pokud považujeme charakter změn za kontinuální, pak přístupem zpracovávajícím tyto změny bude spojitá simulace. Typickou aplikační oblastí pro spojitou simulaci je například zkoumání různých fyzikálních procesů, kde ke změnám důležitých veličin dochází průběžně. V některých případech nás však zajímají pouze změny systému, ke kterým dochází při výskytu určitých událostí, a změny, ke kterým dochází v reálném systému mezi těmito událostmi, jsou z hlediska účelu zkoumání daného systému nezajímavé. V takovém případě tedy pomocí modelu zaznamenáváme pouze tyto relevantní události a časové okamžiky, ve kterých nastávají. Potom hovoříme o diskrétní simulaci. Tento modelový přístup často nachází uplatnění při zkoumání různých ekonomických jevů, podnikových procesů a činnosti systémů hromadné obsluhy. Za velice jednoduchý systém hromadné obsluhy můžeme považovat například činnost vyučujícího, ke kterému během konzultačních hodin přicházejí studenti se svými požadavky. Zajímá-li nás průměrná doba čekání studenta, vytíženost vyučujícího, průměrná dálka fronty a podobné charakteristiky, jsou pro nás významnou událostí příchod studenta před dveře kanceláře, začátek rozhovoru vyučujícího se studentem, konec rozhovoru a odchod studenta. Detaily o rychlosti pohybu studenta v závislosti na čase a trajektorii jeho pohybu uvnitř kanceláře jsou přitom z hlediska zkoumání uvedených charakteristik nezajímavé. Samozřejmě, že u takto jednoduchého systému hromadné obsluhy je možné uvedené charakteristiky snadno vypočítat podle vzorců pro systém s jedním procesorem známých z teorie hromadné obsluhy, pokud známe vstupní parametry intenzita příchodů, intenzita obsluhy a režimu fronty. [5] S narůstající složitostí systému se však velice zvyšuje komplikovanost takových výpočtů a výhody simulace oproti klasickým analytickým přístupům vynikají. Pokud budeme za systém hromadné obsluhy považovat například výdej obědů v menze, kde 9
budou zahrnuty aktivity jako vyzvednutí podnosu a příbory, výdej obědů u některého z výdejních míst, natočení nápoje a následné placení u některé z pokladen, výpočet již bude mnohem komplikovanější. Simulování chodu takového systému však při použití vhodného nástroje není o mnoho náročnější než simulování systému hromadné obsluhy s jedním procesorem. Pro ilustraci základních principů a pojmů diskrétní simulace zůstaňme u příkladu s konzultačními hodinami vyučujícího. Je zřejmé, že interval mezi událostmi, které mohou v takovém systému nastat, nebude vždy stejně dlouhý. Studenti pravděpodobně nebudou přicházet se stejným časovým odstupem a rovněž délka rozhovoru s vyučujícím bude u každého z nich jiná. Student přicházející pouze kvůli zapsání zápočtu do indexu obvykle stráví v kanceláři kratší dobu, než student přicházející kvůli konzultaci diplomové práce. Ani student přicházející kvůli diplomové práci však nestráví v kanceláři pokaždé stejnou dobu. Doba obsluhy v takovém systému stejně jako interval mezi příchody požadavků má tedy charakter náhodné veličiny. Student přicházející na konzultace je v tomto systému entitou. Entity jsou prvky, které jsou před začátkem simulace již v systému umístěny, nebo během simulace do systému přicházejí, v systému procházejí různými aktivitami, systém opouštějí, nebo v něm zůstávají. Konzultace může být v tomto případě označena jako aktivita, nebo proces. Tyto termíny mají v simulačním modelování podobný význam, a liší se v tom, že pojem proces obvykle znamená vyšší úroveň v hierarchii než aktivita, je-li model členěn do několika úrovní. Předpokládejme, že vyučující se nemůže věnovat více studentům současně. Po příchodu entity student před kancelář vyučujícího může nastat jeden z případů: •
V procesu konzultace se nenachází žádná entita student. Nově příchozí entita student tedy vstupuje do kanceláře a zahájí proces konzultace
•
V kanceláři se již nějaký student nachází. Nově příchozí student se řadí do fronty před kanceláří. Vyučující a místo v kanceláři jsou v tomto případě zdroji. Zdroje jsou součásti
systému, které jsou vyžadovány entitami k průchodu aktivitami a procesy, které jsou v před zahájením aktivity obsazeny a později uvolněny, nebo spotřebovány. Ačkoliv konzultace na začátku zkouškového období mohou být pro vyučujícího vyčerpávající, předpokládejme, že se jedná o zdroj, který není spotřebován a po odchodu jednoho studenta je k dispozici dalším. Ve většině simulačních programů však není některé zdroje nutné do simulace zařazovat, pokud se jedná o zdroj, který po celou dobu 10
simulace náleží k jednomu procesu, jako například vyučující v našem případě. Pokud bychom však uvažovali pracovníka obsluhujícího více strojů či zaměstnance obsluhujícího klienty u více přepážek, je v takovém případě potřeba zařadit je mezi zdroje, neboť logicky předpokládáme, že jeden zdroj nemůže být na více místech současně. Po odchodu studenta z kanceláře nuže nastat jedna ze situací: •
Před kanceláří žádný student nečeká. Zdroj vyučující zůstává tedy z hlediska simulace v nečinnosti až do příchodu dalšího studenta
•
Před kanceláří čeká jeden či více studentů. Je zde tedy fronta. Některý z nich vstoupí do kanceláře. O tom, který student vstoupí do kanceláře, bude rozhodnuto podle režimu fronty.
Existují tři základní režimy pro určení pořadí odchodu z fronty. •
FIFO – first in first out. Do procesu nejdříve vstupuje entita, která do fronty přišla jako první. Tímto režimem se nejspíše bude řídit fronta v našem případě.
•
LIFO – last in first out. Do procesu vstupuje entita, která do fronty přišla jako poslední.
•
SIRO – select in random order. Do procesu vstupuje entita, která je náhodně vybrána. Krom těchto případů však může nastat situace, kdy po odchodu jednoho studenta
vyučující prohlásí ke studentům čekajícím ve frontě: „Pokud je tu někdo, kdo si jde jen pro zápočet, ať jde napřed.“ Jedná se tedy o přiřazení vyšší priority některým entitám.
2.2 Základní principy diskrétní simulace Různé simulační programy využívají pro diskrétní simulaci různé přístupy. V literatuře zabývající se diskrétní simulací se můžeme setkat například s pojmy Procesně orientovaný přístup a Událostně orientovaný přístup. [4] Oba tyto přístupy vycházejí ze stejné myšlenky, kterou je časový krok proměnlivé délky. Smyslem časového kroku proměnlivé délky je přeskočení časového úseku, během kterého v modelu nenastala žádná událost, tedy vybrání minima ze všech v danou chvíli známých časů výskytu událostí, které mají nastat a posun do tohoto času. V tomto čase je potom třeba zpracovat všechny události, které se mají v daném okamžiku odehrát, pokud je to možné, vygenerovat nové časy výskytu těchto událostí a vrátit se ke kroku, ve kterém vybíráme minimální čas.
11
Vraťme se nyní k příkladu s konzultačními hodinami vyučujícího. Uvažujme výchozí stav, kdy na počátku konzultačních hodin se v procesu konzultace nenachází žádný student a žádný nestojí ani ve frontě před kanceláří. U tohoto modelu hromadné obsluhy při stanovení času nejbližší události vybíráme vždy pouze ze dvou typů událostí: •
P - příchod dalšího studenta před kancelář,
•
K- ukončení konzultace studenta v kanceláři.
Označme časy těchto událostí: •
TP - čas příchodu dalšího studenta,
•
TK - čas konce právě probíhající konzultace. Jelikož se však na počátku konzultace nenachází v kanceláři žádný student, čas
konce konzultace zatím není znám. V takovém případě budeme při stanovování času první události uvažovat pouze čas příchodu prvního studenta TP, který je známý na základě náhodně vygenerované hodnoty intervalu mezi příchody. Za dosud neznámý čas TK dosadíme nějaké dostatečně velké číslo, které v měřítku ostatních časů v simulaci představuje prakticky nekonečno. Obvykle postačí hodnota, které je o několik řádu vyšší, než hodnoty, kterých nabývají ostatní časy. Konkrétní řešení situace, kdy některý z časů není znám, se však v jednotlivých programech liší. Jelikož až do času TP nemůže nastat žádná jiná událost, dojde k posunu simulačních hodin na čas TP.
Protože je vyučující k dispozici, student okamžitě
vstupuje do kanceláře a zahajuje konzultaci. V tomto okamžiku vygenerujeme novou hodnotu TP, a protože se nyní v procesu konzultace nachází student, vygenerujeme i hodnotu TK. Pokud jsou tyto hodnoty generovány z rozdělení se spojitou hustotou pravděpodobnosti, nebudeme uvažovat možnou rovnost těchto časů. Může tedy nastat jeden z případů: •
TP
- V takovém případě nastane příchod druhého studenta před
ukončením konzultace prvního studenta. Posouváme čas do okamžiku TP. Nově příchozí student se staví do fronty. Generujeme tedy nový čas příchodu TP a při stanovování nejbližší události opět porovnáváme časy TP a TK •
TP>TK - V tomto případě je konzultace ukončena před příchodem druhého studenta. Posouváme čas simulace do okamžiku TK. V okamžiku TK student opouští kancelář. Jelikož však ve frontě nečeká žádný jiný student, nemůže 12
ihned začít nová konzultace. Nový čas TK zatím nemůže být vygenerován. Jelikož čas události TP je v tuto chvíli minimem, následuje posun do času TP. V tomto okamžiku nově příchozí student rovnou vstupuje do kanceláře a můžeme opět vygenerovat časy TP i TK a posunout simulační čas na hodnotu menšího z nich S každým posunem do nového času TP nastane v závislosti na stavu systému jedna ze situací: •
Nově příchozí student prodlouží frontu v případě, že momentálně probíhá konzultace s jiným studentem. Je vygenerován pouze nový čas TP, protože čas TK je již znám.
•
nově příchozí student vstupuje a zahajuje konzultaci, pokud v kanceláři žádný student není. Jsou vygenerovány nové časy TP i TK
Opět je zvoleno minimum z těchto časů. Při každém dalším posunu do času TK nastane jedna z možností: •
Před kanceláří není žádný student. Nový TK tedy zatím nemůže být vygenerován, protože není zahájena konzultace.
•
Před kanceláří čeká minimálně jeden student. Jeden ze studentů ve frontě zahajuje konzultaci a délka fronty je zkrácena o 1. Je vygenerován nový čas TK.
Opět posuneme simulační čas do minima z hodnot TP a TK Postup opakujeme až do splnění podmínky pro ukončení simulace, kterou může být například dosažení určitého simulačního času, nebo určitý celkový počet příchozích studentů.
2.3 Postupy využívané v simulačních programech Pro algoritmy využívané v diskrétní simulaci existuje jen velmi málo pravidel považovaných většinou vývojářů simulačního softwaru za obecně závazná. Ve většině simulačních programů se pod různými názvy setkáme se součástmi modelu popsanými v úvodní části této kapitoly. V některých bodech se však jejich zpracování v mezi jednotlivými simulačními programy liší. V zásadě existují dva typy odlišností: •
Odlišné přístupy ke zpracování činnosti některých elementů a vztahů mezi nimi, které se však neprojevují žádnými pozorovatelnými změnami chování simulačního modelu.
•
Odlišné zpracování, které má za následek i více či méně odlišné chování.
13
Detaily o algoritmech zajišťujících simulaci obvykle vývojáři simulačního softwaru nezveřejňují a pro uživatele potom takový software, stejně jako mnoho jiných typů softwaru, do určité míry představuje jakousi černou skříňku. Porozumění prvnímu zmíněnému typu odlišností není pro část uživatelů ke správné tvorbě modelů a interpretaci výsledků simulace klíčové. Druhému typu odlišností by však měla být věnována pozornost. Pokud například jeden z rozdílů spočívá v tom, že některý simulační program provádí obsazení zdrojů, jen pokud jsou v daném okamžiku dostupné všechny zdroje vyžadované pro určitý proces, a v jiném programu jsou požadované zdroje obsazovány postupně, může zdánlivě stejný model sestavený v prvním a druhém programu projevovat velice odlišné chování. [2] Jednotlivé simulační programy se však také odlišují právě mírou volitelnosti chování určitých elementů. Je poměrně zřejmé, že výhodou větší volitelnosti takového chování, kterou ocení především zkušenější uživatelé, je možnost modely více přiblížit realitě. Nevýhodou s tímto spojenou je fakt, že větší volitelnost obvykle znamená složitější ovládání, které může být pro uživatele nepřehledné, a osvojuje si práci s takovým simulačním programem pomaleji. I na jednoduchém příkladu je možné si všimnout, že v jednom časovém okamžiku někdy musí být zpracováno více událostí. Při posunu simulačního času v našem příkladu nastává vždy jedna z událostí těchto typů •
Příchod studenta
•
Ukončení konzultace Každá z těchto událostí však v některém případě vyvolává další událost, které je
přiřazen stejný čas.
Příchod studenta v některém případě ihned vyvolává zahájení
konzultace. Ukončení konzultace v některém případě ihned vyvolává zahájení konzultace dalšího studenta v pořadí. U složitějších modelů, kde navíc rozlišujeme více typů událostí, může jedna událost buď přímo, nebo řetězovým efektem vyvolat dokonce více než jednu další událost ve stejném čase.
Stejně tak je možné, obzvláště v rozsáhlejších modelech
s mnoha různými procesy, že více událostem je přiřazen stejný čas již ve fázi posunu simulačního času a každá z těchto událostí vyvolá několik dalších událostí. Existuje mnoho možností, jak zpracování událostí zajistit. V literatuře je jako převládající popsán přístup, jehož název může být volně přeložen jako sledování toku transakcí. [2] Pojem transakce zde znamená entita. 14
Podstatou tohoto přístupu je rozdělení entit do několika skupin podle stavu, ve kterém se nacházejí a jejich migrace mezi jednotlivými stavy. Jako obecné označen základních typů stavů, jejichž názvy se při konkrétních realizacích tohoto liší, bývají uváděny: •
aktivní stav,
•
stav připravenosti,
•
čekání do určitého času,
•
čekání do splnění podmínek,
•
uspaný stav. Kromě inicializační a závěrečné fáze potom Simulační algoritmus pracuje ve dvou
hlavních fázích, které bývají označeny jako fáze pohybu entit a fáze posunu hodin. Ve fázi pohybu entit dochází k migraci entit mezi uvedenými stavy a ve fázi pohybu hodin je stanoven čas nejbližší události a proveden posun simulačního času. V publikaci [2] jsou na příkladech v podobě programů Siman, ProModel a GPSS/H nastíněny tři odlišné varianty implementace tohoto přístupu. Přístup použitý v aplikaci SIMULANT, který bude podrobněji popsán v následující kapitole, je od sledování toku transakcí značně odlišný. Nejedná se žádný všeobecně rozšířený přístup, který by byl výsledkem detailního studia simulačních algoritmů použitý v jiných simulačních programech, ale o poměrně snadný a intuitivní způsob realizace diskrétní simulace, který se opírá jen o minimum teorie a je odvozený hlavně od myšlenky využití časového kroku proměnlivé délky.
15
3 Fungování doplňku SIMULANT 3.1 Představení doplňku Doplněk SIMULANT pro MS Excel 2007 je nástrojem pro diskrétní simulaci, jehož první verze byla vytvořena v rámci této diplomové práce. Jedná se o program, který umožňuje snadnou tvorbu simulačních modelů v grafickém režimu. Jednotlivé elementy je možno do modelu umisťovat kliknutím na podklad a stejně snadno lze i definovat vazby mezi těmito elementy. Vlastnosti jednotlivých elementů modelu i pravidla pro volbu cest mezi těmito elementy je možno nastavit pomoci dialogů vyvolaných kliknutím na příslušné elementy. Pro nastavování intervalů mezi vstupy entit do modelu i dob trvání aktivit je na výběr několik běžně používaných rozdělení náhodných veličin, pro určování pořadí je v každé frontě možno zvolit jeden z režimu FIFO, LIFO, SIRO a k dispozici je rovněž několik různých pravidel pro určení cest entit v místech, kde dochází k větvení. Pro snadnější ověření správného nastavení modelu je k dispozici jednoduchá animace znázorňující pohyb entit. Během simulace je možno přímo v modelu průběžně sledovat počty entit nacházejících se v daném čase v jednotlivých elementech. Tato kapitola slouží jako nahlédnutí do principů, na kterých je fungování doplňku SIMULANT založeno. Cílem této kapitoly je popsat fungování doplňku SIMULANT v takové míře, aby pro čtenáře nepředstavoval černou skříňku, nikoliv vytvořit kompletní dokumentaci tohoto doplňku.
Obr 3.1: Vzhled doplňku simulant
16
3.2 Proč Excel 2007 Pro tvorbu aplikace sloužící k účelům zmiňovaným v úvodu je MS Excel 2007 a jeho součást VBA poměrně dostupným a snadno použitelným nástrojem. S aplikací vytvořenou jako doplněk je na druhou stranu samozřejmě spojena nevýhoda v podobě nutnosti přístupu k aplikaci MS Excel 2007pro spuštění takového doplňku. Přestože MS Excel 2007není automatickou součástí vybavení počítače a doplňky vytvořené pro jednotlivé verze aplikace MS Excel nebývají plně kompatibilní s jinými verzemi, považuji MS Excel 2007 za vhodné prostředí pro vývoj doplňků, neboť se postupně stává nejrozšířenějším tabulkovým kalkulátorem. V současnosti je sice stále ještě poměrně rozšířena verze MS Excel 2003, se kterou doplněk SIMULANT není kompatibilní, přesto však lze očekávat, že starší verze budou verzí 2007 a případnými budoucími verzemi postupně vytlačeny. Vzhledem k tomu, že změny mezi verzemi 2003 a 2007 jsou poměrně radikální, je pravděpodobné, že úprava doplňků tak, aby byly kompatibilní s případnými budoucími verzemi Excelu, bude snadnější z doplňků vytvořených pro verzi 2007 spíše než z doplňků pro verzi 2003 a starší. Z těchto důvodů jsem se rozhodl pro MS Excel 2007.
3.3 Data Jednou z výhod vývoje simulačního programu v podobě doplňku pro MS Excel je pohodlná práce s daty využívanými pro chod simulace. Objektový model jazyku Visual Basic for Applications(VBA), který je součástí MS Excel, nabízí různé způsoby přístupu k datům uloženým v buňkách pracovních listů.
I když pro uživatele doplňku není
přístup k většině dat nezbytně nutný, přístup k těmto datům může usnadnit pochopení činnosti programu. Zejména při vývoji programu je možnost snadného přístupu k datům v kterémkoliv okamžiku velice užitečná. Jednotlivé listy nejsou při práci s doplňkem SIMULANT vytvářeny. Listy s předem definovanou strukturou dat jsou zahrnuty jako součást doplňku SIMULANT a do aktivního sešitu jsou při používání doplňku kopírovány.
17
Mezi Listy využívané doplňkem simulant patří: •
List sloužící jako podklad pro model a součást uživatelského rozhraní. Jeho jméno určí uživatel.
•
Db_entity: list sloužící jako databáze entit.
V tomto listu je mimo jiné
zaznamenáváno, v jakém objektu se každá z entit v daném okamžiku nachází. Mezi další klíčové informace patří čas příchodu jednotlivých entit do objektu, ve kterém se právě nacházejí. •
Seznam_typu_entit: údaje o jednotlivých typech entit.
•
Nastaveni: list sloužící pro uchovávání různých interních informací, jako jsou například údaje o celkovém počtu aktivit, front, vstupů, výstupů a o režimu, ve kterém se aplikace momentálně nachází.
•
Seznam_aktivit: údaje o jednotlivých aktivitách. V tomto listu je obsažen seznam všech aktivit obsažených v modelu i s jejich parametry zadanými uživatelem. Jsou zde umístěny i údaje o požadavcích na jednotlivé typy zdrojů potřebných pro tyto aktivity.
•
Seznam_front: údaje o jednotlivých frontách a jejich parametrech. Krom parametrů zadaných uživatelem je do tohoto listu zaznamenávána informace o délkách jednotlivých front během simulace.
•
Seznam_spojnic: údaje o ID každé spojnice a ID objektů nacházejících se na obou koncích spojnic.
•
Seznam_vstupu: údaje o jednotlivých vstupech a jejich parametrech
•
Seznam_vystupu: údaje o výstupech a jejich parametrech
•
Routing: údaje o pravidlech, podle kterých entity volí svou cestu.
•
Seznam_zdroju: údaje o jednotlivých zdrojích a jejich parametrech. Jsou zde uchovávány i informace o aktuálně volném počtu jednotlivých zdrojů během simulace.
•
Rizeni_behu: interní údaje využívané při chodu simulace. Je zde zaznamenáván například simulační čas, čas ukončení simulace a hodnoty některých proměnných, které jsou výsledkem ověřování stavu modelu během simulace.
•
Aktivity_beh: údaje o jednotlivých aktivitách v průběhu simulace. Jedná se například o stav replikací jednotlivých aktivit, plánované časy ukončení aktivit a informace o aktuálně přidělených zdrojích. Každé replikaci aktivity je zde přiřazen samostatný řádek. 18
•
Vstupy_beh: údaje o jednotlivých vstupech během simulace. Jsou zde zaznamenávány informace o stavu jednotlivých vstupů a informace o plánovaném čase příchodu entit do modelu.
•
Todo: seznam událostí, které mají být zpracovány v simulačním čase, ve kterém se simulace momentálně nachází. Tento seznam je průběžně aktualizován během zpracovávání událostí.
•
Udalosti: seznam všech událostí, které se odehrály od začátku simulace. Tato data nijak chod simulace neovlivňují. Slouží jako podklad pro zpracování výsledků simulace.
•
Zdroje_na_ceste: seznam zdrojů, které se přesouvají na místo určení a příslušných časů, ve kterých budou na místě určení k dispozici.
Ostatní listy slouží pouze jako pomocné například při řazení dat, nebo zpracování výsledků. Pro zvýšení přehlednosti jsou všechny listy kromě hlavního listu s modelem skryty. Proti zobrazení však nejsou nijak chráněny, takže je možno do nich nahlédnout v libovolném okamžiku, kdy je simulace zastavena.
3.4 Využití náhodných čísel Několik druhů vstupních charakteristik, které v doplňku SIMULANT popisují elementy modelu, jsou náhodnými veličinami. Jedná se o interval mezi vstupy entit do modelu a doby trvání aktivit. Pro každý typ rozdělení je v doplňku SIMULANT vytvořena funkce, která generování hodnot zajišťuje. Tyto funkce přebírají parametry rozdělení, které uživatel zadává během tvorby modelu. Platnost hodnot parametrů je ověřována přímo při tvorbě modelu. Základem pro generování hodnot z různých náhodných rozdělení jsou náhodná čísla, tedy nezávislé hodnoty generované z rovnoměrného rozdělení na intervalu (0;1). Tyto hodnoty jsou následně využity pro získání hodnot jiných náhodných rozdělení. Generování hodnot z exponenciálního, rovnoměrného a celočíselného rovnoměrného rozdělení, které je použito v doplňku SIMULANT, vychází z metody inverzní transformace. Pro generování hodnot z normálního rozdělení je využit algoritmus vycházející z polární verze Box-Mullerovy metody. Ze dvou nezávislých hodnot normálního rozdělení, které lze touto metodou získat, je vždy využívána jen jedna. Náhodná čísla mají však význam i na dalších místech aplikace SIMULANT. V režimu odchodů Pravděpodobnost jsou s jejich pomocí určovány elementy, do 19
kterých se přesouvají entity opouštějící jiné elementy, v režimu fronty SIRO slouží pro určení entity vstupující do aktivity. Při přidělování zdrojů jsou pomocným kritériem pro určení, kterým aktivitám budou zdroje přiřazeny. VBA disponuje generátorem pseudonáhodných čísel. Jejich hodnoty získáváme pomocí funkce Rnd. Generátor využívaný VBA, stejně jako většina jiných generátorů náhodných čísel, vypočítává novou hodnotu náhodného čísla z hodnoty čísla předchozího. Pro sérii náhodných čísel, která je generována, je tedy klíčová výchozí hodnota, takzvaný seed, který jednoznačně určuje další čísla v pořadí. Mechanismus učení seedu je však v nápovědě aplikace MS Excel popsán poněkud nedostatečně. Pro inicializaci generátoru slouží příkaz Randomize. Je-li volán bez parametrů, jako seed je určena hodnota funkce Timer. Chybí však vysvětlení, jakým způsobem je generátor inicializován, není-li příkaz Randomize použit. Dle mého zjištění je stejný seed zvolen při každém spuštění aplikace MS Excel. Pro zajištění různých náhodných čísel v každém běhu simulace je tedy příkaz Randomize na počátku každého běhu simulace použit. Je-li příkaz Randomize z kódu vypuštěn, dva po sobě jdoucí běhy simulace nedospějí ke stejným výsledkům, pokud není mezi těmito běhy aplikace Excel ukončena a znovu spuštěna. Samotné přerušení běhu kódu VBA
generátor znovu neinicializuje. V případě vypuštění příkazu
Randomize a restartu aplikace Excel tedy dochází při nezměněných podmínkách ke shodě výsledků mezi běhy simulace, které se shodují v pořadí. Tedy první běh simulace po restartu aplikace MS Excel by dospěl ke stejným výsledkům jako první běh po minulém restartu, druhý běh ke stejným jako druhý běh po minulém restartu a stejná shoda by nastala i mezi dalšími běhy. Pro případy, že je opakování stejné řady náhodných čísel žádoucí, ve VBA existuje způsob, jakým lze pomocí kombinace parametrů funkce Rnd a příkazu Randomize takového opakování dosáhnout i bez restartu aplikace MS Excel. Metodu společných náhodných čísel, která slouží pro srovnávání jednotlivých systémů, jsem však do aplikace SIMULANT nezahrnul.
20
3.5 Simulační algoritmus Základním principem pro doplněk SIMULANT je, stejně jako u většiny programů pro diskrétní simulaci, časový krok proměnlivé délky. Postup popisovaný zde je však pouze jedním z mnoha způsobů, kterými lze tento princip implementovat. Celou třetí kapitolu je nutno brát pouze jako konkrétní příklad realizace simulace, nikoliv jako obecně platné zásady.
3.5.1 Úvodní fáze V úvodní fázi dochází k přípravě dat na některých listech. Následuje stanovení časů všech událostí, u kterých může být v tomto okamžiku jejich čas stanoven. Jedná se tedy o čas prvního příchodu entit každým ze vstupů. Pro každý vstup na listu vstupy_beh je tedy tento čas vygenerován na základě informací o rozdělení náhodné veličiny, kterým se čas mezi příchody daným vstupem řídí. Pro generování časů mezi příchody je určena procedura, která jako parametr přebírá ID vstupu. Tato procedura dle nastavení vstupu volá funkci, která zajišťuje generování hodnot z příslušného náhodného rozdělení. Vrácená hodnota zvýšená o aktuální simulační čas je zaznamenána jako čas příštího příchodu entity daným vstupem. V úvodní fázi je tato procedura postupně volána pro každý vstup. Tato fáze je realizována pouze v případě zahájení simulace z výchozího stavu v simulačním čase 0. Je-li po přerušení spuštěno pokračování simulace, úvodní fáze je přeskočena. Na konci úvodní fáze dochází k nalezení nejbližší události.
3.5.2 Simulační cyklus Po úvodní fázi následuje cyklus, který se opakuje až do dosažení stanoveného času, nebo zastavení simulace uživatelem. V úvodu cyklu vždy dochází k posunu simulačního času do okamžiku, který byl v úvodní fázi, nebo v minulém průchodu cyklem stanoven jako čas nejbližší události. Následně je zjištěno, které události se mají odehrát v aktuálním simulačním čase. Tyto události jsou přidány do TodoListu. Zpracování TodoListu Po přidání událostí je voláno zpracování TodoListu. Hlavní procedura, která má práci s listem na starosti, provádí vždy seřazení TodoListu tak, aby bylo dodrženo stanovené pořadí, ve kterém mají být události zpracovány. Jedná se sice o události, které se odehrávají ve stejném simulačním čase, ale z důvodu správného chodu programu je nutné, aby některé typy událostí byly zpracovány dříve než jiné. V TodoListu je tedy 21
jeden sloupec vyhrazen pro zápis číselných hodnot, které určují pořadí daného typu události. Pro seřazení TodoListu je volána metoda, která slouží k řazení dat v pracovních listech. Jedná se o metodu, která je v Aplikaci MS Excel běžně dostupná přes uživatelské rozhraní a většině uživatelů dobře známa. Jako klíč pro řazení je použit zmiňovaný sloupec určující pořadí a směr řazení je vzestupný. Zpracována je vždy první událost, která se nachází na TodoListu a celý postup pro zpracování událostí se opakuje, dokud není TodoList prázdný. Před zpracováním každé události následuje nové řazení TodoListu. Důvodem tohoto opakovaného řazení je skutečnost, že v důsledku zpracování některých událostí mohou být do TodoListu přidány nové události, které je někdy třeba zařadit před události, jež byly do TodoListu umístěny dříve. Některé typy událostí však nejsou přímo vyvolány jinými událostmi, ale do TodoListu jsou přidávány ověřovací procedurou, která je volána v případě, že je po zpracování libovolné události TodoList prázdný. Ověření stavu modelu Tato procedura ověřuje stav modelu a zjišťuje, zda nemůže být nějaká událost na TodoList
přidána. Při první nalezené události je ověřovací procedura ukončena a
TodoList znovu zpracován. Činnost procedury ověřující stav modelu bude podrobněji popsána později. Přidělení zdrojů V případě, že při ověřování stavu modelu žádná událost nebyla přidána, dochází k volání procedury, která zajišťuje přidělování zdrojů, jež může mít za následek přidání i několika událostí zároveň. Pokud žádná událost nebyla přidána ani po alokaci zdrojů, je zpracování TodoListu ukončeno. Ukončení kroku cyklu Následuje stanovení času nejbližší události. Nejbližší událostí může být: •
vstup nové entity do modelu,
•
dokončení některé z aktivit,
•
příchod některého ze zdrojů na místo určení. Při stanovení nebližší události je tedy hledán minimální čas v listech aktivity_beh,
vstupy_beh a zdroje_na_ceste. Nejprve je nalezen nejnižší čas v každém z těchto listů a výsledný nejnižší čas je vybírán mezi těmito třemi minimy. V doplňku SIMULANT existuje více typů událostí, ale pouze tři výše jmenované typy jsou brány v úvahu při
22
posunu simulačního času. Ostatní události se odehrávají pouze v přímém či nepřímém důsledku některé z těchto těchto událostí.
Obr 3.2: Zpracování Todolistu
Na ukázce zdrojového kódu je možné si všimnout, že zpracování TodoListu probíhá pomocí dvou do sebe vnořených cyklů. Na začátku obou cyklů je ověřována stejná podmínka. Dvakrát bezprostředně po sobě je však ověřována pouze po každém posunu simulačního času, nebo po přidání nové události během ověřování systému. Celý simulační algoritmus si můžete prohlédnout na následujícím obrázku.
23
Obr 3.3: Hlavní simulační algoritmus
3.6 Zpracování událostí Nyní se budeme podrobněji věnovat procedurám pro zpracování jednotlivých událostí. Na TodoListu se mohou ocitnout tyto typy událostí: •
vstup entity do modelu,
•
příchod entity do libovolného objektu,
•
odchod entity z fronty,
•
konec aktivity,
•
příchod zdrojů na místo určení,
•
odchod entity z aktivity. Typů
událostí
existuje
více.
Ostatní
typy
však
nejsou
zpracovávány
prostřednictvím Todolistu. Procedury pro jejich zpracování jsou volány přímo
24
z procedur, které realizují jiné události, nebo z procedury pro ověřování stav modelu. Jedná se především o: •
přidělení zdrojů,
•
zahájení aktivity. V některých případech jsou přímo z jiných procedur volány i procedury pro
zpracování událostí, které jindy bývají zařazeny do TodoListu.
3.6.1 Vstup entity do modelu Tato událost je zajišťována procedurou, která jako jediný parametr přebírá ID daného vstupního objektu. Na počátku je vytvořena nová entita. Následně je volána funkce Route_out, která je součástí doplňku SIMULANT a dle pravidel pro volbu cest z daného vstupu zjišťuje, který z následníků se stane cílem vstupující entity. Činnost funkce Route_out bude později popsána podrobněji, neboť se jedná o velice důležitou součást doplňku SIMULANT, která je využívána i na několika jiných místech. Je-li zjištěno, že dle zvolených pravidel žádný následník vstupující entitu přijmout nemůže, je tato entita odmítnuta a vyřazena z modelu. V opačném případě je do TodoListu zařazená událost Příchod, která reprezentuje příchod vytvořené entity na místo určení. Následuje volání procedury, která vygeneruje čas příštího vstupu entity. Vstupuje-li do modelu jedním objektem více entit současně, příchod každé z nich je zpracován jako samostatná událost.
3.6.2 Příchod entity Procedurou pro zpracování této události jsou přebírány parametry ID objektu a ID entity, která do daného objektu přichází. Průběh zpracování příchodu se liší podle toho, do jakého typu objektu entita přichází. Jedná-li se o frontu, je entita do této fronty zařazena a aktuální délka fronty je zvýšena o 1. Jedná-li se o aktivitu, je nejprve nalezena volná replikace. Poté jsou vzneseny požadavky na zdroje, jsou-li k vykonávání této aktivity nějaké zdroje potřeba. K přidělení zdrojů však nedochází během zpracování příchodu entity, ale až ve chvíli, kdy jsou známy požadavky na zdroje u všech aktivit, které čekají na své zahájení. Pokud žádné zdroje nejsou třeba, je aktivita zahájena okamžitě. Zahájení aktivity však neprobíhá prostřednictvím přidání události do TodoListu. Procedura pro zahájení aktivity je v tomto případě volána přímo z procedury zajišťující zpracování příchodu. 25
Je-li objektem, do kterého entita přichází, výstup z modelu, dojde pouze k znamenání této informace do databáze entit a v důsledku tohoto příchodu nenásleduje žádná akce. Příchod entity patří při zpracování TodoListu mezi události s nejvyšší prioritou. V žádném okamžiku se událost tohoto typu nemůže na TodoListu nacházet více než jednou, protože pokud je příchod entity na TodoList přidán, při řazení je umístěn před všechny události, které mohou další příchod vyvolat. Důvodem pro toto řešení je skutečnost, že k ověřování, zda může být entita přijata některým z následníků objektu, který má opustit, dochází před opuštěním tohoto objektu, nikoliv před přijetím objektem následujícím. Porušení tohoto pořadí zpracování událostí by tedy mělo za následek narušení správného chodu simulace. Pokud by se v TodoListu najednou nacházelo více příchodů směřujících do stejného objektu, nebyly by mezi těmito příchody zkontrolovány podmínky pro přijetí entity a mohlo by dojít k překročení maximální možné délky fronty, nebo zařazení více entit do jedné replikace některé z aktivit.
3.6.3 Zahájení aktivity Procedura zajišťující zahájení aktivity je volána z procedury, která zpracovává příchod entity, nebo z procedury, která zajišťuje událost příchod zdrojů. Parametry přebírané při zahájení aktivity jsou ID aktivity, číslo replikace a ID entity. Po spuštění procedury je vygenerován čas trvání aktivity. Je-li tento čas nulový, je do TodoListu přidána událost konec aktivity.
3.6.4 Příchod zdrojů na místo určení Pro zpracování příchodu zdrojů jsou nutné parametry ID aktivity, číslo replikace, typ zdroje a počet jednotek tohoto zdroje. Ve stejném simulačním čase může tato událost nastat pro více typů zdrojů, nebo i pro jeden typ zdrojů na více místech. Každý z těchto příchodů je však zpracován samostatně. Po příchodu zdrojů je ověřeno, jestli se v objektu dané aktivity nacházejí všechny potřebné zdroje. V případě, že ano, je voláno zahájení aktivity.
3.6.5 Konec aktivity Procedura přebírá parametry ID aktivity, číslo replikace a ID entity v dané replikaci aktivity. Po ukončení aktivitě jsou uvolněny zdroje, pokud byly nějaké použity. Dále je ověřeno, zda entita může opustit aktivitu. V případě že ano, je vybrán 26
cílový následník a do TodoListu umístěna událost odchod z aktivity. Pokud entita aktivitu opustit nemůže, není na rozdíl od zpracování vstupu do modelu odmítnuta a vyřazena, ale setrvává v dané aktivitě a brání příchodu dalších entit.
3.6.6 Odchod z aktivity Tato událost může být do TodoListu přidána událostí konec aktivity, nebo během procedury ověřující stav systému, je-li zjištěno, že některý z následníků je schopen odcházející entitu přijmout a odchod z aktivity tedy již není blokován. Přebíraná parametry jsou ID aktivity, číslo replikace, ID entity a ID cíle. Přidává do TodoListu příchod entity. Aktivita, kterou entita opouští, je nyní připravena k přijetí entity nové.
3.6.7 Ověření stavu modelu Procedura pro ověření stavu modelu je volána, pokud je zpracována jakákoliv událost a TodoList je po jejím zpracování této události prázdný. Ověřování je ukončeno nalezením první události, kterou je možno přidat do TodoListu, nebo zjištěním, že žádná událost přidána být nemůže. Nejprve dochází k ověření, zda nějaká entita nemůže opustit frontu. K tomuto ověřování dochází pomocí postupného volání funkce Route_out pro každou frontu. Může-li nějaká entita frontu opustit, je do TodoListu přidána událost Odchod z fronty Následně jsou ověřeny možnosti odchodu z blokovaných replikací aktivit, tedy takových, kde aktivita byla již ukončena, ale neexistoval žádný následník dané aktivity, který by byl odcházející entitu schopen přijmout. K tomuto ověřování rovněž slouží funkce Route_out. Při ověřování je vždy zaznamenáváno ID poslední ověřované fronty a ID poslední ověřované aktivity. Při následujícím volání procedury pro ověřování stavu modelu je vždy během ověřování front jako první ověřována fronta nacházející se v seznamu bezprostředně za frontou, které patří zaznamenané ID a stejně tak je postupováno během ověřování aktivit. V obou případech platí, že po prověření posledního objektu v seznamu daného typu objektů ověřování pokračuje od začátku daného příslušného seznamu. Pokud je ověřování ukončeno a žádná událost nebyla přidána dochází k přidělování zdrojů aktivitám
27
3.6.8 Odchod z fronty Odchod z fronty může být do TodoListu umístěn pouze při ověřování stavu modelu. Procedura pro tuto událost přebírá parametry, ID fronty, ID entity a ID cíle. O tom, která entita má opustit frontu, je rozhodnuto již během ověřování stavu modelu, kdy je volána procedura, která na základě informaci o režimu dané fronty entitu vybírá. Volba entity již při ověřování stavu modelu je nutná z toho důvodu, že může nastat situace, ve které je možný odchod entity jednoho typu, ale odchod jiného nikoliv. Tato situace může nastat, pokud volba následníka závisí na typu entity. Při zpracování odchodu z fronty je aktuální dálka dané fronty zkrácena o 1 a do TodoListu přidán příchod entity na cílové místo.
3.6.9 Přidělování zdrojů Přidělování zdrojů je voláno, pokud během ověřování stavu modelu není do TodoListu přidána žádná událost. Rozhodování o tom, k jakým aktivitám budou zdroje přiděleny, probíhá pro každý typ zdroje zvlášť. Nejprve je zjištěno, jaké replikace různých aktivit daný typ zdroje požadují. Požadavky jsou vloženy do tabulky a seřazeny dle pravidla, které určuje pořadí, v jakém budou uspokojeny. V současnosti je jediným dostupným pravidlem přednostní přiřazení zdrojů replikacím aktivit, které od příchodu entity na přidělení zdrojů čekají nejdelší dobu. Replikaci některé z aktivit, která je dle tabulky první v pořadí, je daný typ zdroje přiřazen. Pokud může být požadavek replikace uspokojen zcela, je jí daný zdroj přiřazen v požadovaném množství. Není-li tento typ zdroje dostupný v požadovaném množství, jsou dané replikaci přiřazeny všechny volné jednotky daného typu zdroje. V obou případech je požadavek replikace na tento typ zdroje snížen o přidělené množství a rovněž v seznamu zdrojů je snížen počet volných jednotek daného zdroje. Je-li prodleva mezi přidělením zdroje a jeho příchodem na místo určení nulová, je do TodoListu rovnou vložen příchod zdrojů. V opačném případě jsou přidělené zdroje, včetně plánovaného času jejich příchodu na místo určení, zařazeny do seznamu zdroje na cestě. Pokud po přidělení některého typu zdroje první replikaci v tabulce zbývají volné jednotky tohoto zdroje, jsou stejným způsobem uspokojovány požadavky i dalších replikací různých aktivit. Přidělování určitého typu zdroje je ukončeno buď splněním všech požadavků, nebo vyčerpáním volných jednotek daného typu zdroje. Stejným způsobem jsou zpracovány i požadavky na všechny ostatní typy zdrojů. 28
3.6.10
Volba cesty
Volba elementu, do kterého vstupuje entita opouštějící jiný element modelu, je zajišťována pomocí funkce Route_out. Tato funkce přebírá jako parametry ID elementu, který má entita opustit a typ této entity. Funkce vrací ID cílového elementu, nebo hodnotu Nemožno v případě, že v danou chvíli neexistuje žádný element schopný odcházející entitu přijmout. Po zavolání funkce Route_out je zjištěno, jakým pravidlem se řídí odchody z daného objektu. K dispozici jsou následující pravidla: •
Pravděpodobnost: Entita opouštějící daný typ objektu volí každý z cílových objektů s určitou pravděpodobností. Součet těchto pravděpodobností vždy musí být roven jedné.
Jedná se o výchozí nastavení, při kterém je každému
následníkovy daného objektu přiřazena stejná pravděpodobnost, tedy například 0,5, pokud má objekt dva následníky. Tyto pravděpodobnosti může uživatel změnit. •
Dle typu: Toto pravidlo určuje, ke kterým následníkům budou různé typy entit směřovat.
•
Nejkratší fronta: Entita opouštějící objekt volí následníka dle aktuálně nejmenší délky fronty. V případě většího počtu následníků, kteří mají frontu nejmenší délky, je náhodně vybrán jeden z nich. Je-li některým z následníků aktivita, která má alespoň jednu replikaci volnou, je automaticky považována za následníka s nulovou délkou fronty. Výstup je vždy považován za objekt s nulovou délkou fronty.
•
Preference: Entita opouštějící objekt vybírá následníka dle seznamu preferencí. Výběr probíhá od následníka s nejvyšší preferencí. Jako následník je vybrána položka nejvýše v seznamu, která má volnou kapacitu.
Při výběru podle kteréhokoliv z výše uvedených pravidel jsou ignorováni následníci, kteří nemají volnou kapacitu, tedy fronty, které dosáhly maximální povolené délky a aktivity, které nemají žádnou z replikací volnou. Nyní bude věnována pozornost pravidlu Pravděpodobnost. V tomto režimu je následník volen pomocí vygenerovaného náhodného čísla. Označme toto náhodné číslo r a číslo následníka i Každému z následníků i=1..n. je dle hodnoty, kterou při tvorbě modelu zadá uživatel přiřazena pravděpodobnost pi .
29
Následníkům je poté přiřazena hodnota, kterou označíme Fi. Toto přiřazení probíhá dle následujícího pravidla: Je- li následník i schopen danou entitu přijmout, potom: Fi=pi
pro i=1,
Fi=Fi-1+ pi
pro i=2,3..n.
Není li schopen entitu přijmout, potom: Fi=0
pro i=1
Fi=Fi-1
pro i=2,3..n.
Jednotlivým následníkům i=1..n je potom při splnění podmínky Fn>0, přiřazeny kumulované pravděpodobnosti Pi= Fi / Fn V případě, že Fn=0, vrací funkce hodnotu Nemožno. Pokud Fn>0, je postupně pro každého následníka i=1..n porovnávána hodnota Pi s hodnotou náhodného čísla r. Jako cíl je zvolen první následník, pro kterého platí Pi ≥r. Princip volby dle ostatních pravidel nevyžaduje podrobnější výklad.
3.7 Zpracování výsledků Zpracování výsledků zde neprobíhá současně se simulací, ale je zahájeno až na žádost uživatele po dosažení stanoveného simulačního času, nebo po zastavení simulace uživatelem. Data pro zpracování výsledků jsou čerpána ze seznamu událostí, který je vytvářen během simulace. Do tohoto seznamu je zaznamenána každá událost, která se během simulace odehraje. Záznam události je vždy vytvořen procedurou, která příslušnou událost zpracovává. Struktura zaznamenávaných dat je velice podobná struktuře dat v TodoListu. Hlavní rozdíl mezi seznamem událostí a TodoListem spočívá v tom, že do TodoListu jsou zapsány události, které se mají v daném časovém okamžiku uskutečnit, dále jsou seřazeny podle priority daného typu události a po zpracování příslušnou procedurou jsou z TodoListu odstraněny. Do seznamu událostí jsou však data zaznamenávána při zpracování těchto událostí a nový záznam je vždy zařazen na konec seznamu. Takto je tedy postupně vytvářen úplný přehled událostí v každém okamžiku simulace. V tomto seznamu data v nezměněném pořadí setrvávají po celou dobu simulace, až do případného přemazání opakovaným během simulace.
30
Před výpočtem charakteristik, které jsou uvedeny ve výsledkové zprávě, jsou volány procedury, které pro každý typ elementů modelu vytvářejí pomocný přehled usnadňující výpočet těchto charakteristiky. Těmito přehledy jsou: •
délky front,
•
doby čekání entit,
•
počet entit v jednotlivých aktivitách,
•
počet využitých zdrojů,
•
doba setrvání entit v systému.
Na základě výše uvedených údajů lze potom snadno vypočítat požadované charakteristiky, které jsou zobrazeny ve výsledkové zprávě.
3.8 Animace Animace v diskrétní simulaci má několik významů. V první řadě se stává cennou pomůckou při tvorbě a odlaďování simulačního modelů. Vizualizace pohybu entit a sledování počtu entit, které procházejí jednotlivými elementy modelu, mohou pomoci odhalit určité nesrovnalosti, které jsou v rozporu se záměrem autora modelu. Pokud například tvůrce modelu vidí, že do některého elementu vstupuje značně méně entit, než očekává, je tento poznatek signálem k překontrolování nastavení, které mohou tento typ nesrovnalosti způsobovat. I v případě, že simulační modelování dospěje do fáze, ve které je model shledán vyhovujícím, animace poskytuje oproti výstupům dodatečnou informaci, která může být významná pro chápání činnosti reálného systému. Jak se ukázalo při vývoje aplikace SIMULANT, animace je velice užitečnou pomůckou i během tvorby simulačního programu. Obzvláště při rozšiřování funkcionality aplikace, jako například přidávání nových možností pro volby cest odcházejících entit, animace často bývá prvotním indikátorem chyb, i když sama o sobě samozřejmě nestačí k odhalení jejich přesných příčin. Pro vizualizaci pohybu entit slouží dvě procedury. Procedura Sim_pridej_animaci je volána z procedur, které zpracovávají vstup entit do modelu, odchod entit z fronty a odchod entit z aktivity. Jako parametry přebírá ID výchozího místa, ID cílového místa a typ entity. Slouží k vytváření seznamu všech pohybů, které mají být zobrazeny v daném simulačním čase.
31
Procedura Sim_animace je volána před stanovením času nejbližší události a slouží k zobrazení všech pohybů, které byly v aktuálním simulačním čase přidány do seznamu pohybů. K zobrazení dochází v takovém pořadí, v jakém byly jednotlivé pohyby do seznamu přidány. Během animace tedy nedochází k posunu simulačního času. Zobrazování pohybů v pořadí, v jakém byly do seznamu animací přidány, ilustruje návaznosti jednotlivých akcí lépe, než by tomu bylo v případě současného zobrazení všech pohybů, které se v daném simulačním čase uskuteční. Pro zobrazení každého pohybu jednotlivě není nezbytně nutné vytváření seznamu všech pohybů pro daný časový okamžik. Bylo by možno pohyby zobrazovat bezprostředně po zpracování událostí, se kterými tyto pohyby souvisejí. Použitý způsob však usnadňuje případné změny zobrazení animace nepříliš komplikovaným zásahem do procedury Sim_animace.
3.9 Vybrané technické detaily V této podkapitole se zaměřím na technické detaily fungování některých částí aplikace SIMULANT. Pro popis záměrně vybírám především takové postupy, které mohou být potenciálně užitečné i při tvorbě jiných doplňků souvisejících se simulacemi nebo nerůznějšími typy úloh operačního výzkumu. Způsob umisťování jednotlivých elementů modelu uvedený v následujícím textu považuji za použitelný například pro umisťování hran a uzlů v jakémkoliv doplňku aplikace MS Excel 2007, který je zaměřen na úlohy z oblasti teorie grafů a způsob, který je použit pro nastavení chování jednotlivých elementů modelu může být použit například pro spojení grafické reprezentace jednotlivých hran a vrcholů s daty.
3.9.1 Umisťování a přesuny objektů Jedním z cílů, které si při tvorbě aplikace kladu, je přívětivé uživatelské rozhraní. Základem pohodlného ovládání dnešních simulačních programů je možnost umisťovat jednotlivé elementy modelu a definovat vazby mezi těmito elementy pomocí myši. Otázkou tedy je, jaký typ objektu aplikace MS Excel použít jako podklad pro model. Je zřejmé, že podklad je třeba vytvořit tak, aby bylo nějakým způsobem možno detekovat, že uživatel na podklad kliknul a také zjistit pozici kurzoru vzhledem k nějakému místu tohoto podkladu v okamžiku kliknutí. Je tedy třeba, aby zvolený
32
objekt umožňoval zaznamenat určité události. V tomto případě se však nejedná o události, tak jak je známe v pojetí simulace, ale o události aplikace Excel. Při různých experimentech se ukázalo, že kvůli těmto požadavkům možných způsobů řešení podkladu není mnoho. Mým původním záměrem bylo využít jako podklad modelu Obrázek patřící mezi ovládací prvky ActiveX, protože ovládací prvky tohoto typu mimo jiné umožňují zpracovat událost MouseDown. Jedná se o událost stisknutí tlačítka myši, která navíc umožňuje zjistit pozici kurzoru (v bodech) vzhledem k levému hornímu okraji daného objektu. Toto řešení se však nakonec ukázalo jako nevyhovující, protože v aplikaci MS Excel 2007 neexistuje žádný způsob, který by umožňoval tvary umístit do vrstvy nad ovládacími prvky ActiveX. Znamená to, že například spojnice, která patří mezi tvary (kolekce Shapes) by vždy byla tímto podkladem modelu překryta. Existují sice možnost nastavit ovládací prvek ActiveX jako průhledný, nicméně průhlednost těchto ovládacích prvků je v aplikaci MS Excel 2007 spojena s nepříjemnou chybou, jejíž ošetření je poměrně komplikované. Po experimentech s různými typy podkladů jsem se tedy nakonec rozhodl využít patřičně upravený pracovní list (Worksheet). Jako podklad modelu tedy slouží pracovní list se skrytou mřížkou a zmenšenými buňkami. Sledovanou událostí je událost SheetSelectionChange, tedy výběr buňky, nebo oblasti buněk. Tato událost je sledována na úrovni aplikace. Následně dochází k ověření, na jakém listu k výběru buněk došlo. Jedná-li se o list, který slouží jako podklad modelu, je volána procedura, která ověřuje, v jakém režimu se aplikace nachází. Dle tohoto režimu jsou volány událostní procedury provádějící požadované akce. Při umisťování nových prvků do modelu či jejich přesunech jsou využívány vlastnosti Top a Left vybrané buňky. Jedná se o svislou a vodorovnou vzdálenost (v bodech) levého horního okraje vybrané buňky od levého horního okraje buňky A1. Na tuto pozici je pak umístěn nebo přesunut tvar reprezentující příslušný objekt. Umístění na požadovanou pozici je provedeno nastavením vlastností Top a Left daného tvaru na hodnoty vlastností Top a Left vybrané buňky. Sledování události SheetSelectionChange na úrovni aplikace je spojeno s nevýhodou v podobě spuštění dané událostní procedury při výběru buňky v jakémkoliv listu libovolného souboru aplikace MS Excel, pokud je doplněk
33
SIMULANT nainstalován. Při výběru buněk na jiných listech než na podkladu modelu však nepozoruji žádné zdržení spojené s touto událostní procedurou. Dalším možným řešením by bylo sledovat tuto událost jen na úrovni listu, který slouží jako podklad modelu. V tomto případě je však třeba umístit danou událostní proceduru do modulu tohoto listu. S tím je však spojena nevýhoda v podobě nutnosti ukládání souboru obsahujícího model ve formátu xlsm, tedy formátu s podporou maker, protože v případě uložení ve formátu xlsx by docházelo k odstranění VBA kódu z modulu příslušného listu.
3.9.2 Nastavení chování jednotlivých elementů Jak již bylo zmíněno, dialogy pro nastavení chování různých elementů modelu jsou zobrazeny po kliknutí na tvary reprezentující příslušné elementy. Tvarům, které tyto elementy reprezentují, je tedy třeba přiřadit určitou proceduru. Po kliknutí na jakýkoliv tvar nacházející se na podkladu modelu je volána vždy stejná procedura nazvaná Sim_klik_objekt. Volání této procedury po kliknutí na jednotlivé tvary je zajištěno pomocí vlastnosti OnAction každého z tvarů. Vlastnost OnAction je nastavována přímo při vkládání jednotlivých tvarů. Na následujícím obrázku si můžete prohlédnout část procedury, která zajišťuje vkládání aktivit do modelu.
3.4: Vložení aktivity
Všimněte si, že jako jméno je pro každý tvar použito ID elementu, který je tímto tvarem reprezentován. Písmeno a na prvním místě v ID v tomto případě značí, že se jedná o aktivitu. Po spuštění procedury Sim_klik_objekt v doplňku SIMULANT je však třeba zjistit, který z tvarů proceduru vyvolal. To je pochopitelně nutné proto, aby bylo možné nalézt příslušný řádek v seznamu objektů daného typu. Na následujícím obrázku se nachází celý kód procedury, která je volána při kliknutí na libovolný z tvarů.
34
Obr 3.5: Procedura volaná při kliknutí na libovolný objekt
Pro zjištění jména tvaru, pomocí kterého byla procedura vyvolána, je použit příkaz: kdo_vola = Application.Caller. Vlastnost Caller objektu Application vrací informaci, jakým způsobem byl spuštěn kód VBA. V případě, že byl spuštěn kliknutím na některý z prvků kolekce Shapes, vrácenou informací je vlastnost Name tohoto prvku. V aplikaci SIMULANT nese vlastnost Name jednotlivých tvarů ID elementu modelu, který je tímto tvarem reprezentován. Proměnná kdo_vola je deklarovaná jako veřejná v modulu, který jsem pro účely deklarace veřejných proměnných vyhradil. Proto je tedy přístupná i v modulech kódu jednotlivých formulářů sloužících pro nastavení vlastností jednotlivých elementů modelu. Funkce Mid slouží pro vrácení části textového řetězce. První parametr obsahuje samotný textový řetězec, druhý parametr udává, kolikátý znak původního řetězce se stane prvním znakem nového řetězce. Nepovinný třetí parametr nese informaci, kolik znaků má být vráceno. Výsledkem volání funkce Mid způsobem, který je použit v předchozí ukázce, je tedy první znak jména tvaru, na který bylo kliknuto. Jelikož stejné typy elementů mají
35
v aplikaci SIMULANT první znak ID vždy shodný, ale unikátní pro daný typ elementu, slouží první znak jako jednoznačný způsob určení toho, o jaký typ elementu se jedná.
3.9.3 Provedení pohybů při animaci Zobrazení animace je provedeno pomocí následující procedury:
Obr 3.6: Animace
Seznam_pohybu je pole proměnných uživatelem definovaného datového typu animace a obsahuje informace potřebné pro zobrazení pohybu jednotlivých entit. Složky odkud_x a odkud_y obsahují informaci o souřadnicích výchozího místa a složky kam_x a kam_y o souřadnicích cílového místa. Tyty souřadnice jsou určeny již ve fázi zařazování jednotlivých pohybů do seznamu, dle vlastností Top, Left, Height a Width, tvarů, které reprezentují vybrané elementy modelu. Cesta entity od výchozího elementu do cílového je vždy rozdělena do stejného počtu kroků. Změna souřadnic x a y během jednoho kroku je určena pomocí rozdílů těchto souřadnic mezi výchozím a cílovým objektem. Na počátku jsou souřadnice entity nastaveny na hodnotu souřadnic výchozího objektu. Poté následuje cyklus, který je zopakován v počtu odpovídajícím nastavenému počtu kroků. Během tohoto cyklu se vždy odehrává změna obou souřadnic příslušné entity. 36
Problematické je nastavení časové prodlevy mezi jednotlivými posuny. Ve VBA aplikace MS Excel, neexistuje příkaz, který by přímo umožňoval definovat prodlevu mezi akcemi. Metoda Wait způsobuje zastavení vykonávání všech příkazů do určitého časového okamžiku. Maximální rozlišení této metody je však v řádu celých sekund, což je pro nastavení prodlevy v animaci nevyhovující. Jediným relativně snadným způsobem je tedy využití funkce Timer. Tato funkce vrací čas v sekundách od poslední půlnoci s rozlišením na tisíciny sekundy. Proměnné Start je tedy přiřazen aktuální čas získán pomocí této funkce. Funkce Timer je následně opakovaně volána až do chvíle, kdy její hodnota překročí součet hodnoty proměnné Start a nastavené prodlevy animace.
37
4 Používání doplňku SIMULANT 4.1 Instalace a zprovoznění doplňku •
Umístěte soubor simulant.xlam do libovolného adresáře.
•
Spusťte aplikaci MS Excel 2007, klepněte na Tlačítko Office a poté na tlačítko Možnosti aplikace Excel.
•
Vyberte položku Doplňky, v rozevíracím seznamu zvolte možnost Doplňky aplikace Excel (tato možnost by měla být nastavena jako výchozí volba) a klepněte na tlačítko Přejít.
•
Klepněte na tlačítko Procházet a nastavte cestu k souboru s doplňkem.
•
V příslušném adresáři vyberte soubor simulant.xlam a klepněte na tlačítko Otevřít
•
Nyní bude doplněk SIMULANT zobrazen v okně Doplňky k dispozici
•
Zkontrolujte, zda je u tohoto doplňku zaškrtnuto políčko a klepněte na OK. Doplněk byl nainstalován a na pásu karet přibyla nová karta SIMULANT. Při
každé další instalaci nebo odebrání doplňku bude nyní stačit zaškrtnout, nebo zrušit zaškrtnutí políčka v seznamu Doplňky k dispozici. •
Pokud karta SIMULANT na pásu karet nepřibyla, nebo se po klepnutí na tlačítko Nový model, které je umístěno na této kartě, neobjeví dialogové okno, pravděpodobně je příčinou nastavení doplňků v centru zabezpečení. Klepněte na Tlačítko Office a poté na tlačítko Možnosti aplikace Excel. Vyberte položku Centrum zabezpečení a klepněte na tlačítko Nastavení centra zabezpečení. Zvolte položku Doplňky a zrušte zaškrtnutí u všech políček této nabídky.
4.2 Tvorba modelu Při vybrání karty SIMULANT je na této kartě k dispozici nejprve pouze tlačítko Nový model. •
Po klepnutí na toto tlačítko budete vyzváni k zadání jména modelu. Zadejte toto jméno a stiskněte OK.
Na kartě SIMULANT nyní přibyla nová tlačítka potřebná ke tvorbě modelu a řízení simulace. Tato tlačítka jsou k dispozici pouze ve chvíli, kde je vybrán list obsahující model. Každý soubor aplikace MS Excel může obsahovat maximálně jeden model.
38
Ve skupině Tvorba modelu je k dispozici několik tlačítek:
Obr 4.1: Tvorba modelu
•
Normální: Přepne aplikaci do režimu, ve kterém při klepnutí na list modelu nenastane žádná akce. Při klepnutí na některý objekt v tomto režimu bude otevřen dialog pro nastavení vlastností příslušného objektu.
•
Aktivita: Přepne aplikaci do režimu, ve kterém je při klepnutí na list modelu na příslušné místo vložen objekt reprezentující aktivitu.
•
Fronta: Přepne aplikaci do režimu pro vkládání front.
•
Vstup: Přepne aplikaci do režimu vkládání vstupů.
•
Výstup: Přepne aplikaci do režimu vkládání výstupů.
•
Zdroje: Přepne aplikace do režimu, ve kterém je při klepnutí na list modelu na příslušné místo vložen objekt, který reprezentuje zdroj.
•
Spojnice: Přepne aplikaci do režimu tvoření vazeb mezi jednotlivými objekty. První objekt, na který kliknete, bude vždy zvolen jako počátek spojnice a následující kliknutí na druhý objekt vytvoří spojnici od prvního ke druhému objektu.
•
Přesun: Přepne aplikaci do režimu, pro přesouvání objektů. Klepnutím na některý z objektů vyberte objekt k přesunutí a následným klepnutím na libovolné místo listu vyberte novou pozici objektu. Tato možnost má vliv pouze na vzhled. Nijak neovlivňuje chod simulace.
•
Odstranit: Přepne aplikaci do režimu, ve kterém dochází při klepnutí na libovolný objekt k jeho odstranění. Stejným způsobem lze odstranit i spojnice. Odstranění objektu navíc způsobí odstranění všech spojnic, které daný objekt propojují s ostatními.
•
Entity: Otevře dialog pro definování nových typů entit, nebo pro změnu vlastností existujících typů entit.
4.2.1 Práce s jednotlivými objekty Dialog pro nastavení vlastností určitého objektu vyvoláte kliknutím na tento objekt, pokud je aplikace v jakémkoliv jiném režimu než vkládání spojnic, přesun 39
objektů, nebo odstraňování. Pokud nejsou vlastnosti některého objektu změněny, bude tento objekt pracovat ve svém výchozím režimu. Nastavení, která fungují stejným způsobem pro více typů objektů, budou popsána později. Nyní se zaměříme na popis jednotlivých objektů a možnosti, které jsou pro každý typ objektu specifické. Vstup Slouží jako místo, kterým přicházejí entity do modelu. V seznamu Typ entit vyberte typ entit, který má tímto vstupem do modelu přicházet. Je možno vybírat pouze z typů, které předem vytvoříte pomocí dialogu entity. Každým vstupem může do modelu přicházet pouze jeden typ entit. Pokud nevytvoříte žádný typ, k dispozici bude pouze výchozí typ entit nazvaný Základní. Políčko Počet entit slouží k zadání počtu entit vstupujících najednou. S každou z nich je později zacházeno jako se samostatnou entitou. Políčko Priorita slouží pro nastavení priority entit přicházejících daným vstupem. Tato hodnota má význam při určování pořadí odchodů entit z front, je-li fronta nastavena tak, aby priority entit zohledňovala. Rámeček Interval mezi příchody slouží k zadání informací o rozdělení náhodné veličiny, kterou se řídí interval mezi příchody entit přicházejících tímto vstupem. Po výběru rozdělení v seznamu Typ rozdělení je automaticky aktualizovány vstupní pole pro parametry tohoto rozdělení včetně jejich popisků.
40
Obr 4.2: Vlastnosti vstupu
Aktivita Aktivity reprezentují činnosti, kterými entity v modelu procházejí. V políčku Násobnost zadejte počet replikací dané aktivity. Je-li násobnost větší než 1, graficky je aktivita reprezentována stále jen jedním objektem, ale do simulačního modelu je zařazena vícekrát paralelně, v nastaveném počtu. Jsou-li všechny replikace obsazeny, žádná další entita nemůže až do uvolnění některé z replikací danou aktivitu zahájit. Rámeček Trvání aktivity slouží k zadání informací o náhodném rozdělení, kterým se řídí doba trvání aktivity. Stejně jako u nastavení vstupu je po výběru rozdělení aktualizován seznam parametrů.
41
Obr 4.3: Vlastnosti aktivity
Pro vykonávání aktivit je možno požadovat různé typy zdrojů.
Je-li
k vykonávání aktivity potřebný jeden či více typů zdrojů, po vstupu entity do objektu reprezentujícího aktivitu je vznesen požadavek na tyto zdroje. Aktivita nemůže být zahájena, dokud jí nejsou všechny potřebné zdroje přiděleny. Potřebné zdroje je možno definovat pomocí dialogu, vyvoleného stisknutím tlačítka Zdroje. V tomto dialogu vybereme potřebné zdroje ze seznamu všech definovaných zdrojů a nastavíme, jaký počet těchto zdrojů bude požadován. Stisknutím tlačítka Přidat zařadíme zdroj v příslušném počtu do seznamu požadovaných zdrojů. Odebrání zdroje ze seznamu požadavků provedeme označením tohoto zdroje a stisknutím tlačítka Odebrat.
Obr 4.4: Přiřazení zdrojů
42
Fronta Fronta obvykle slouží jako místo, ve kterém se dočasně zdržují entity čekající na uvolnění místa v některém z objektů, který je do modelu zařazen jako následník dané fronty. U fronty můžeme nastavit parametr Maximální délka. Ve frontě se nikdy nemůže nacházet počet entit přesahující hodnotu tohoto parametru. Je-li místo číselné hodnoty zadáno písmeno M, maximální délka fronty je neomezená. Zásadním nastavením pro tento typ objektu je Režim fronty, pomocí kterého je určováno pořadí, ve kterém entity frontu opouštějí. K dispozici jsou režimy FIFO, LIFO a SIRO. Princip jednotlivých režimů byl popsán v druhé kapitole. Je-li zaškrtnuto políčko Priorita, stává se priorita entit primárním klíčem při určování pořadí. Výběr entity, která má frontu opustit, se v takovém případě omezuje pouze na entity, které mají nejvyšší prioritu ve srovnání s ostatními entitami momentálně se nacházejícími ve frontě. Je-li entit s nejvyšší prioritou více, volba mezi nimi probíhá dle zvoleného režimu.
Obr 4.5: Nastavení fronty
Výstup Výstup slouží jako místo, kterým entity opouštějí model. Kromě změn vzhledu neexistují v doplňku SIMULANT pro tento typ objektu žádné parametry. Entity V dialogu Entity můžeme definovat typy entit, které se budou v modelu vyskytovat. Po stisknutí tlačítka Nový typ budete vyzváni k zadání jména nového typu entity. Po stisknutí Ok bude tento typ zařazen do seznamu dostupných typů.
43
Zdroje Zdroje mohou být vyžadovány pro vykonávání aktivit. Nastavením parametru Počet určíme, kolik jednotek daného typu zdroje bude v modelu k dispozici. Při běhu simulace nemůže součet všech jednotek tohoto typu zdroje nacházejících se kdekoliv v modelu překročit hodnotu tohoto parametru. Je-li tedy zdroj v jednom okamžiku požadován ve větším počtu, než jaký je momentálně k dispozici, zahájení některých aktivit je odloženo až do chvíle, kdy je k ním příslušný zdroj v požadovaném počtu přesunut a jsou splněny všechny další podmínky pro zahájení aktivity. Parametr Prodleva udává, jaká doba uplyne mezi přidělením zdroje aktivitě a okamžikem, kdy je tento zdroj na požadovaném místě k dispozici.
Obr 4.6: Nastavení zdroje
4.2.2 Dialogy a nastavení společné pro více typů objektů. Routing Tlačítko Routing je k dispozici pro objekty typu Vstup, Fronta a Aktivita. Stisknutí tohoto tlačítka vyvolá dialog, pomocí kterého nastavíme pravidla, dle kterých entity opouštějící daný objekt volí svou cestu. Toto nastavení má pochopitelně význam hlavně v případech, kdy z jednoho objektu vede více spojnic. Přepínání mezi jednotlivými pravidly provádíme vybráním záložky s názvem požadovaného pravidla. K dispozici jsou pravidla: •
Pravděpodobnost: Jedná se o výchozí pravidlo. Každému následníkovi je přiřazena určitá pravděpodobnost, se kterou je volen. V seznamu Následníci označíme příslušného následníka, do políčka Pravděpodobnost vepíšeme novou hodnotu pravděpodobnosti a stiskneme Změnit.
•
Dle typu: Pomocí tohoto pravidla můžeme určit, ke kterým následníkům budou různé typy entit směřovat. V seznamu Typy entit zvolíme typ entity, kterému následníka přiřazujeme a v seznamu Následníci vybereme požadovaného následníka. Stisknutím tlačítka Přiřadit volbu potvrdíme a příslušné přiřazení 44
bude přidáno do celkového přehledu. Při užití tohoto pravidla je možno jednomu následníkovi přiřadit více typů entit, ale ne více následníků jednomu typu entity. •
Nejkratší fronta: Opouštějící entita volí jako následníka objekt s nejkratší délkou fronty. Podrobnější popis tohoto pravidla se nachází v minulé kapitole.
•
Preference:
Toto
pravidlo
umožňuje
nastavit
preference
jednotlivým
následníkům. Jako cíl je zvolen následník s volnou kapacitou, který se nachází nejvýše v seznamu. Přesun následníku v seznamu Řazení dle preference provádíme označením příslušného následníka a stisknutím tlačítek Nahoru, nebo Dolů Následníci, kteří nemají volnou kapacitu, jsou při výběru podle každého z těchto pravidel ignorováni.
Obr 4.7: Volba cest
Nastavení vzhledu U většiny typů objektu, které jsou vkládány do modelu, je možno změnit jejich výšku, šířku a barvu. Změny se projeví ihned po nastavení příslušných vlastností pomocí posuvníků a stisknutí tlačítka Změnit. Změna vzhledu entit je viditelná až během simulace po vstupu entity příslušného typu do modelu. Tyto změny nijak neovlivňují samotný chod simulace.
45
4.3 Chod simulace Ve skupině Simulace se nacházejí tlačítka:
Obr 4.8: Řízení simulace
Spustit Chod simulace zahájíme tlačítkem Spustit. Po stisknutí tlačítka následuje výzva k zadání času simulace. Simulace nyní bude probíhat až do dosažení určeného simulačního času, nebo do stisknutí tlačítka Stop na nově zobrazeném dialogu Čas. Stisknutí tlačítka Stop však nemusí vždy způsobit okamžité zastavení simulace. Ověřování, zda bylo stisknuto toto tlačítko, probíhá vždy až po zpracování všech událostí, které nastaly v simulačním čase zobrazeném na ukazateli v okamžiku stisknutí tlačítka Stop. V případě opětovného stisknutí tlačítka Spustit běh simulace pokračuje. Maximálně však do původně zadaného času, ve kterém má být simulace ukončena. Pokud simulace dospěje až do zadaného času ukončení, nebo je během svého průběhu zastavena uživatelem, skupina tlačítek sloužících pro tvorbu a úpravy modelu je skryta. V tomto stadiu tedy není možno model upravovat. Krokovat Tlačítko Krokovat způsobí spuštění simulace, posun simulačního času na čas nejbližší události a realizaci všech událostí, které se mají v daném čase odehrát. Poté je simulace přerušena. Stisknutí tlačítka Krokovat ve výchozím stavu simulace rovněž vyvolá zobrazení dialogu Čas. Používání tlačítek Spustit a Krokovat lze při řízení chodu simulace libovolně kombinovat. Vynulovat Tlačítko vynulovat vrací simulační čas i všechny elementy modelu do výchozího stavu. Po stisknutí tohoto tlačítka jsou opět zpřístupněny úpravy modelu. Animace Přepínací tlačítko Animace slouží k vypnutí nebo zapnutí zobrazení přesunů entit. Popisky Tlačítko Popisky slouží k zobrazení a skrytí popisků jednotlivých elementů modelu.
46
Výsledky Tlačítko výsledky slouží pro zobrazení výsledkové zprávy. Každé stisknutí tohoto tlačítka vyvolá výpočet výstupních charakteristik a vytvoření nové výsledkové zprávy. Výsledkovou zprávu je možno vytvořit i v případě, že simulace nedosáhla stanoveného času. Při jednom běhu simulace je tedy možno získat více výsledkových zpráv z různých okamžiků simulace a je možno uchovávat výsledkové zprávy z různých simulací i v případě, že mezi jednotlivými simulacemi dojde k úpravám modelu. Výsledková zpráva je podrobněji popsána v následující podkapitole.
4.4 Výsledková zpráva Ačkoliv některé informace o chování systému lze získat již během samotné simulace, klíčovým podkladem pro rozhodování o dalších úpravách modelu nebo implementaci poznatků získaných pomocí simulace jsou bezpochyby výsledky. Pojem výsledky zde znamená závěrečné hlášení zobrazené po ukončení simulace, které obsahuje informace o zkoumaných charakteristikách sytému. Forma těchto hlášení se samozřejmě mezi jednotlivými simulačními programy liší a profesionální simulační software obvykle nabízí různé možnosti přizpůsobení výsledkových zpráv. Aplikace SIMULANT nabízí pouze jediný způsob zobrazení výsledků. Výstupní charakteristiky pro všechny elementy modelu jsou umístěny v jedné výsledkové zprávě. První sloupec výsledných hodnot obsahuje souhrnné údaje pro všechny typy entit. Zbývající sloupce obsahují údaje pro jednotlivé typy zvlášť. Jedinou výjimkou jsou výstupní charakteristiky zdrojů, které nejsou dle typů entit tříděny. V následujícím seznamu si můžete prohlédnout přehled výstupních charakteristik pro jednotlivé typy elementů.
47
Fronta •
Aktuální délka fronty
•
Průměrná délka fronty1
•
Maximální délka fronty
•
Počet příchozích entit
•
Počet entit s nenulovou dobou čekání
•
Průměrná doba čekání2
•
Maximální doba čekání
•
Směrodatná odchylka doby čekání
Aktivita •
Aktuální počet obsluhovaných entit
•
Průměrný počet obsluhovaných entit
•
Maximální počet obsluhovaných entit
•
Počet obsloužených entit
•
Podíl využitého času3
•
Podíl volného času
Vstup •
Celkový počet příchozích entit
•
Počet odmítnutých entit
Výstup •
Celkový počet odchozích entit
•
Minimální doba entity v systému
•
Průměrná doba entity v systému4
•
Maximální doba entity v systému
•
Směrodatná odchylka doby v systému 1
Pro všechny typy elementů jsou charakteristiky vyjadřující průměrné počty entit konstruovány jako vážený průměr, kde váhami jsou délky časových úseků mezi jednotlivými změnami počtu. Toto pravidlo platí pro průměrnou délku fronty, průměrný počet obsluhovaných entit i průměrný počet využitých zdrojů. 2 Do ukazatelů týkajících se doby strávené ve frontě jsou zahrnuty pouze entity, které do času, ve kterém je výsledková zpráva sestavena, frontu opustily. 3
Za využitý čas je považován takový, během kterého se nacházela entita alespoň v jedné replikaci dané aktivity. 4 Ukazatele doby strávené v systému jsou rovněž vypočteny pouze dle entit, které do ukončení simulace systém opustily
48
Zdroje •
Procentní využití
•
Podíl času strávený přesuny
•
Aktuálně počet využitých jednotek zdroje
•
Průměrný počet využitých jednotek zdroje
•
Maximální počet využitých jednotek zdroje Pokud jsou alespoň některé vstupní charakteristiky, jak tomu v simulaci většinou
bývá, náhodné veličiny, jsou i výstupní charakteristiky náhodné veličiny. Údaje obsažená ve výsledkové zprávě jsou vypočtené na základě jednoho běhu simulace. Nejedná se tedy o bodový ani intervalový odhad daných náhodných veličin. Současná verze aplikace SIMULANT nepodporuje statistické metody pro bodové či intervalové odhady výstupních charakteristik, neboť hlavním cílem této práce je především demonstrace simulačního algoritmu. Pokud tedy chcete získat tyto odhady, můžete k nim dospět například pomocí replikační metody realizované opakovaným ručním spuštěním simulace a následným výpočtem dle známých vzorců[1] s použitím dat obsažených ve výsledkových zprávách každého ze simulačních běhů.
49
4.5 Příklad Použijme jako ilustrační příklad zjednodušený model provozu v menze. •
Sledujeme chování tohoto systému po dobu 120 minut.
•
Předpokládejme, že do menzy přichází ve sledovaném časovém úseku průměrně 180 studentů za hodinu.
•
Každý student vyzvedne podnos s příbory z jednoho ze dvou stojanů. Tato akce mu zabere přibližně 5–10 sekund.
•
Následuje výdej jídla, který trvá 40-50 sekund. K dispozici jsou 3 výdejní místa. V prostoru mezi stojany s podnosy a výdejem jídla je místo maximálně pro 10 studentů.
•
Po výdeji jídla studenti míří k várnicím s čajem. Natočení čaje trvá 30-60 sekund. Zjistí li-student, že ve frontě před várnicemi čeká alespoň 5 dalších studentů, nehodlá čekat a zamíří bez čaje rovnou k pokladnám.
•
K dispozici jsou 3 pokladny. Doba placení u kterékoliv z nich se pohybuje v rozmezí 30-60 sekund.
Cílem je zjistit: •
kolik studentů ve sledovaném časovém úseku projde celým výdejem obědů od začátku až po zaplacení,
•
jak dlouho dobu průměrně student stráví mezi příchodem do menzy a zaplacením,
•
kolik studentů vzdá čekání na čaj v důsledku příliš dlouhé fronty.
Sestavte tedy model o struktuře znázorněné na obrázku 4.9.
Obr 4.9: Struktura modelu
50
Předpokládejme, že interval mezi příchody studentů se řídí exponenciálním rozdělením. Pro doby trvání všech aktivit použijme rovnoměrné rozdělení. Změňme tedy nastavení jednotlivých objektů. Časové údaje je nutno vyjádřit v minutách. •
Vstup: Je-li průměrný počet studentů, kteří za hodinu přijdou, 180, střední hodnota exponenciálního rozdělení, kterým se řídí interval mezí příchody je 1/3 minuty. Změňte tedy parametr Střední hodnota na 0,333 minuty.
•
F. podnosy: Frontě na vyzvednutí podnosů ponechte výchozí nastavení.
•
Podnosy: Aktivitě nazvané Podnosy změňte Násobnost na hodnotu 2, Typ rozdělení na Rovnoměrné a meze tohoto rozdělení nastavme na hodnotu přibližně odpovídající intervalu 5-10 sekund, tedy 0,083-0,1666 minut.
•
F. výdej: U této fronty změňte parametr Maximální dálka na 10
•
Výdej: Změňte parametr Násobnost na hodnotu 3, Typ rozdělení na Rovnoměrné a parametry tohoto rozdělení na 0,5 a 0,833. Klikněte na tlačítko Routing, vyberte kartu nazvanou Preference. Pořadí následníků v seznamu je ovlivněno pořadím vkládání jednotlivých objektů do modelu. Pokud se následník nazvaný F. čaj nenachází na horní pozici, označte tuto položku a stiskněte Nahoru.
•
F. čaj: Parametr Maximální délka změňte na 5.
•
Počítadlo: Tato fronta má význam pouze pro snadnější zjištění počtu studentů. Kteří vzdali čekání na čaj. Do této fronty tedy zamíří jen ti studenti, pro které byla fronta F. čaj v době jejich odchodu z aktivity Výdej blokována dosažením své maximální délky.
•
Čaj: Změňte Násobnost této aktivity na 2, Typ rozdělení na rovnoměrné a parametry rozdělení na 0,5 a 1.
•
F. placení: Ponechme ve výchozím nastavení.
•
Placení: Změňte Násobnost na 3, Typ rozdělení na rovnoměrné a parametry rozdělení na 0,5 a 1.
Spusťte simulaci. Do dialogu Čas běhu zadejte hodnotu 120. Nyní vyčkejte do ukončení simulace. Stisknutím tlačítka Výsledky zahájíte tvorbu výsledkové zprávy, která bude následně zobrazena.
51
Počet obsloužených studentů i průměrnou dobu strávenou v systému zjistíme dle tabulky na obrázku 4.10. Počet obsloužených studentů v běhu simulace, jehož výsledky tabulka zobrazuje, byl 378. Každý student strávil v systému průměrně 3,56 minuty.
Obr 4.10: Ukázka výsledků – výstup
Z výsledkové tabulky na obrázku 4.11 zjistíme, že čekání na čaj vzdalo celkem 69 studentů.
Obr 4.11: Ukázka výsledků - fronta
Vyzkoušíte-li stejnou simulaci sestavit a spustit sami, je velice pravděpodobné, že výsledky, ke kterým dospějete, se budou odlišovat, protože zde zobrazené tabulky obsahují hodnoty získané pouze z jednoho běhu simulace, nikoliv odhady daných charakteristik.
52
5 Testování doplňku SIMULANT 5.1 Odhalování chyb Pro ověření správnosti fungování simulačních algoritmů využívám několik pomůcek. Hlavními pomůckami jsou: •
animace,
•
listy obsahující data,
•
výsledková zpráva. Jak již bylo zmíněno, animace mimo jiné slouží jako jeden z indikátorů
nesrovnalostí, a mnohdy se tak stává signálem k jejich podrobnějšímu prošetření. Hlavní význam při ověřování správnosti však mají listy obsahující data, z nichž je pro tento účel nejvýznamnější seznam událostí. Podle seznamu událostí je možno poměrně snadno ověřovat: •
zda se události odehrávají ve správném sledu,
•
zda není vynechána některá událost, která se musí vyskytnout v návaznosti na jinou událost,
•
zda se v nějakém okamžiku neobjevuje událost, která se při správném fungování v daném okamžiku vyskytnout nemůže
•
zda se události odehrávají se správným časovým odstupem. Kontrolu velice usnadňuje možnost použití filtrů. Díky tomu je například možné
sledovat cestu jedné konkrétní entity celým modelem, nebo zkontrolovat pouze události spojené s jedním elementem modelu. Filtrováním dat a vypočtením určitých statistických ukazatelů je možno ověřit, zda intervaly mezi příchody vykazují shodu s rozdělením, ze kterého jsou generovány, tedy zda algoritmus pro generování hodnot z určitého rozdělení není chybný. Dalším mechanismem pro odhalení případných chyb je porovnávání událostí se stavem modelu. Jedná se například o kontrolu, zda ID a počty entit nacházejících se v jednotlivých
elementech
modelu
v daném
okamžiku
simulace
odpovídají
zaznamenaným událostem, zda je jednotlivým aktivitám přiřazen správný stav a zda přiřazené zdroje odpovídají požadovaným množstvím, pokud je nějaká aktivita vykonávána. Výsledková zpráva hraje roli hlavně při souhrnné kontrole, protože je sestavována na základě seznamu událostí, který poskytuje detailnější přehled. 53
Během odlaďování doplňku SIMULANT jsem několikrát využil program SIMUL8 k sestavení modelu se stejnými vstupními charakteristikami a následnému porovnávání výstupních charakteristik obsažených ve výsledkových zprávách. K odhalování problémových míst
v samotném kódu VBA a důkladné
znovukontrole určitých procedur či funkcí přistoupím obvykle až v případě, kdy naleznu rozpory některým z výše uvedených způsobů.
5.2 Výkonnost doplňku SIMULANT Maximální počet elementů zahrnutých do modelu se čistě teoreticky může pohybovat i v desítkách tisíc.5 Simulační algoritmy jsou navržené tak, aby fungovali pro libovolný počet elementů modelu. V realitě ovšem existují omezení, kvůli kterým jsou simulace tak velkých rozsahů v doplňku SIMULANT prakticky neproveditelné. Hlavním omezením je skutečnost, že s rostoucím počtem elementů modelu, vazeb mezi nimi i s rostoucí délkou simulace se znatelně zvyšuje čas potřebný k realizaci simulace i ke zpracování výsledků a doba nutná k realizaci simulace narůstá prudčeji než délka simulace. Doplněk SIMULANT však nebyl vytvořen pro účely simulace velkých rozsahů, ale pro účely ilustrace základních principů diskrétní simulace. Při tvorbě simulačních algoritmů tedy byla upřednostňována jednoduchost před efektivitou. Pro simulace takového rozsahu, s jakými jsem se setkával na kurzu Simulační modely, je výkonnost doplňku SIMULANT uspokojivá. V doplňku SIMULANT existují místa, u kterého si uvědomuji, že nabízejí prostor pro zvýšení výkonnosti. Některé by vyžadovaly menší zásahy do kódu VBA a některé zcela zásadní změny. Velkých časových úspor lze v mnoha případech dosáhnout například pomocí udržování dat v paměti namísto opakovaného načítání z buněk a zapisování do buněk pracovních listů. Přesto se domnívám, že výkonnost simulačního doplňku pro MS Excel vytvořeného ve VBA se nikdy nemůže ani zdaleka přiblížit výkonnosti profesionálních simulačních programů.
5
Počet každého typu elementů je zde omezen rozsahem datového typu Integer.
54
6 Závěr Hlavním cílem této práce bylo vytvoření snadno dostupného nástroje sloužícího pro ilustraci principů diskrétní simulace. Doplněk SIMULANT 1.0 je výsledkem mé snahy o splnění tohoto cíle. Samotný text práce slouží k seznámení s principy simulace, ukazuje jeden konkrétní způsob jejich implementace a zároveň hraje roli návodu k obsluze pro doplněk SIMULANT. Teoretickým přínosem je popis činnosti tohoto doplňku, který ukazuje, že uplatňování principů diskrétní simulace nabízí velký prostor pro improvizaci. Tento prostor pro improvizaci činí simulaci perspektivní, neboť flexibilní metody lze relativně snadno přizpůsobovat reálným potřebám a zastarávají tak pomaleji než přístupy, které jsou svázány pevnými pravidly. Za praktický přínos práce považuji vznik doplňku SIMULANT 1.0, jehož distribuci ani instalaci nesvazuji žádnými podmínkami a nabízím ho k užívání všem případným zájemcům. Soubor doplňku simulant.xlam je umístěn na CD přiloženém k diplomové práci a od okamžiku odevzdání práce bude ke stažení na adrese http://charvat.k.sweb.cz/simulant.zip. Obsah souboru doplňku je chráněn heslem a veřejnosti volně přístupný není. V případě individuální dohody podmínek, za jakých může být soubor měněn nebo využívány jeho části, jsem však ochoten případným zájemcům přístup k tomuto obsahu poskytnout. Směrů, ve kterých je možné tento doplněk rozšířit a zdokonalit, je více. Některá možná rozšíření nevyžadují o nic komplikovanější řešení než ta, která byla využita dosud. Například přidávání dalších náhodných rozdělení vyžaduje minimální zásahy do zbývajících částí programu. Poměrně nekomplikovanou záležitostí je rovněž přidání nových pravidel pro volbu cest entit. Protože zpracování výsledků je odděleno od samotné simulace, připadá v úvahu i vytvoření procedur, které zajisti detailnější výsledkové zprávy či efektivnější zpracování výsledků. Dále se nabízí několik rozšíření, jejichž případná integrace do doplňku bude vyžadovat větší zásahy. Jedná se například o řízení vstupů do aktivit založené na pull principu. Vývoj dalších verzí doplňku bude záviset na odezvě uživatelů a mých časových možnostech. Dotazy, náměty na rozšíření i případná upozornění na chyby jsou vítány. Můžete je směřovat na mou adresu
[email protected]. 55
Použitá literatura [1] Dlouhý, M, Fábry, J, Kuncová, M, Hladík, T. Simulace podnikových procesů. Brno : Computer Press, a.s., 2007. [2] Banks, J. Handbook of Simulation: Principles, Methodology, Advances, Applications, and Practice. New York : John Wiley & Sons, 1998. [3] Walkenbach a J. Microsoft Office Excel 2007 Programování ve VBA. Brno : Computer Press, a.s, 2008. [4] Mitrani, I. Simulation Techniques for Discrete Event Systems. místo neznámé : Cambridge University Press , 1982. [5] Jablonský, J. Operační výzkum Kvantitativní modely pro ekonomické rozhodování. Praha : PROFESSIONAL PUBLISHING, 2002. [6] Dlouhý, M, Fábry, J a Kuncová, M. Simulace pro ekonomy. Praha : VŠE, 2005.
Internetové zdroje [7] Simulation Software Survey. OR/MS Today . [Online] 2007 http://www.lionhrtpub.com/orms/surveys/Simulation/Simulation1.html [8] MREXCEL.COM. [Online] 2009. http://www.mrexcel.com/ [9] Excel VBA -Excelplus.net. [Online] 2009. http://excelplus.net/news.php
56