User:Isar00
Úvodní odstavec
Contents
Definice problému
Simulace provozu čajovny s vodními dýmkami slouží k analýze vytíženosti podniku v průběhu dne a identifikaci klíčových bodů, kde může docházet k problémům, jako je nedostatek zaměstnanců, surovin, nebo volných míst k sezení, a nebo třeba také optimalizace nákladů a tedy zvětšení zisku. Čajovna je v provozu každý den mezi 16:00 až 01:00, má 40 míst k sezení a 1-3 zaměstnance co jsou momentálně v čajovně. Nabízí vodní dýmky, čaj a vodu. Globálním cílem simulace je tedy ověřit, zda jsou stávající provozní parametry dostačující a kde by bylo vhodné je optimalizovat.
Metoda
Prvně, během cca 10 návštěv podniku vznikla určitá představa o chodu podniku založená na pozorování chování návštěvníků a hlavně diskuzi s personálem, díky čemuž se podařilo odhalit sezonalitu denního i týdenního charakteru. Ukázalo se, že špičky návštěvy spadají do časového okna mezi 19:00 a 23:00. Zároveň platí, že se čajovna navštěvuje nejvíce během pátků a sobot - což dává smysl, jelikož od pondělí do pátečního večera průměrný návštěvník podniku takového charakteru pracuje a v neděli se opět chystá do práce.
Simulace je provedena pomocí systému Vensim. Po namáhavých pokusech o zprovoznění simulace s krokem o 1 minutě, která bohužel ve Vensimu stabilně padala, bylo rozhodnuto modelovat klíčové proměnné modelovány diskrétně s krokem 15 minut - pro každý datový bod z časové řady se tedy jedná o akumulaci měřené charakteristiky během následujících 15 minut. Vstupní data - primárně tedy proměnná arrivals pro příchody klientů - byla agregována z odhadnutých dat, která jsem simuloval v Pythonu se znalostí nabytých během návštěvy podniku. Během tvorby dat v Pythonu byla zohledněna i již zmíněná sezonalita jak denní, tak týdenní. Simulace ve Vensimu předpokládá, že každý klient setrvá v čajovně přibližně 120 minut, je to tedy zafixováno jako konstanta.
Data vytvořená v Pythonu jsou oindexovaná od 1 do 3780. Logika je následující: čajovna pracuje 7 dní v týdnu, jeden její pracovní den trvá 9 hodin, což je 540 minut. Tedy za jeden týden se odpracuje 3780 minut.
Ve Vensimu byla tato data pro proměnnou arrivals zaintegrována pomocí lookup funkce s dvojicemi (čas, počet příchodů) a v modelu se sleduje zpoždění mezi příchodem a odchodem. Tabák, uhlí, citrony, bylinky a peníze jsou modelovány jako stavy, do kterých vstupují a vystupují odpovídající toky podle spotřeby na jednoho klienta. Dále se zohledňuje kolik během každého kroku simulace podnik vydělá (moneyIn) a kolik utratí (moneyOut).
Model
Model má následující nastavení:
• Units for Time = Minute
• INITIAL TIME = 0 (první minuta pracovního týdne)
• FINAL TIME = 3780 (poslední pracovní minuta pracovního týdne)
• TIME STEP = 15 (data o evidenci příchodů návštěvníků, jak bylo psáno výše, jsou agregovaná po 15 minutových blocích)
Model má následující nastavení:
• Units for Time = Minute
• INITIAL TIME = 0 (první minuta pracovního týdne)
• FINAL TIME = 3780 (poslední pracovní minuta pracovního týdne)
• TIME STEP = 15 (data o evidenci příchodů návštěvníků, jak bylo psáno výše, jsou agregovaná po 15 minutových blocích)
Proměnné:
• myT: TIME BASE( 0 , 1 ).
• arrivals: Počet příchozích klientů v daném časovém kroku (tj. každých 15 minut).
• arrivedClients: Počet klientů, kteří do čajovny dorazili v daném časovém kroku – hodnota se bere z arrivals pomocí arrivals(myT).
• departures: Počet klientů, kteří čajovnu v daném intervalu opouštějí (fixně zadaná časové zpoždění o 120 minut po příchodu – vycházím z toho, co bylo popsáno v sekci Metoda). Počítá se jako DELAY FIXED(arrivals(myT), 120, 0).
• currentClients: Aktuální počet klientů přítomných v čajovně (vypočítává se jako arrivedClients minus departures). Počítá se jako INTEG((arrivals(myT) - departures)/15, 0).
• occupiedSeats: Počet obsazených míst v čajovně, daný aktuálním počtem klientů a kapacitou.
• neededWorkloadUnits: Celková potřebná pracovní kapacita (počet jednotek práce potřebných pro obsluhu všech klientů).
• deltaWorkload: Rozdíl mezi potřebnou pracovní kapacitou a skutečně dostupnou prací zaměstnanců; ukazuje, jestli je obsluha přetížena.
• inPreparationTeas: Počet čajů, které jsou právě ve fázi přípravy. Počítá se jako arrivedClients * 0.5, jelikož na základě konzultace s obsluhou si vodu dává každý druhý klient.
• inPreparationHookas: Počet vodních dýmek (hookah), které jsou právě připravovány. Počítá se jako arrivedClients * 0.95. Empiricky bylo vypozorováno, že téměř každý návštěvník si dá vodní dýmku, používám konstantu 0.95 pro případné odchylky.
• inPreparationWater: Počet porcí vody, které jsou aktuálně ve fázi přípravy. Počítá se jako arrivedClients * 0.5, nebo-li každý druhý zákazník si objedná karafu vody.
• moneyIn: Celkové tržby (příjmy) za objednávky klientů v daném intervalu. Počítáno jako 400 * inPreparationHookas + 200 * inPreparationTeas + 80 * inPreparationWater, kde jednotlivé konstanty značí prodejní cenu položek.
• moneyOut: Výdaje čajovny na suroviny, mzdy a další provozní náklady. Počítá se jako herbs + charcoalBriquettes + tobacco + wage + lemon.
• herbs: Náklady za čajovou směs pro čaj v daném časovém kroku (tj. každých 15 minut).
• charcoalBriquettes: Náklady za uhlí pro vodní dýmku v daném časovém kroku (tj. každých 15 minut).
• tobacco: Náklady za tabák v daném časovém kroku (tj. každých 15 minut).
• lemon: Náklady za citrón v daném časovém kroku (tj. každých 15 minut).
• employees: Počet zaměstnanců na směně. Typicky se rovná 2.
• wage: Výše vyplácené mzdy zaměstnancům za daný časový krok (za každých 15 minut). Hodinová mzda je 200 Kč čistého na zaměstnance.
• herbsAveragePrice: Průměrná cena bylinek na jednu porci čaje. Činí 50 korun.
• charcoalBriquetteAveragePrice: Průměrná cena jednoho uhlíku/brikety. Činí 3 koruny per briketa.
• charcoalBriquettePerHookah: Počet uhlíků/briket potřebných na jednu vodní dýmku během celé doby pobytu klienta. Typicky 12 briket.
• tobaccoGramAveragePrice: Průměrná cena gramu tabáku. Typicky 4 koruny.
• tobaccoGramPerHookah: Počet gramů tabáku na jednu vodní dýmku. Typicky 15 gramů.
• lemonAveragePrice: Průměrná cena jednoho citronu. Typicky 12 korun.
• lemonPerCarafe: Počet citronů potřebných na jednu karafu nápoje. Typicky 0.5, tedy půlka citrónu.
