Rozšíření simulace building escape (NetLogo)

Tato práce je rozšířením učebního příklad building escape vyučovaném na kurzu 4IT495 Simulace systémů.

=Definice problému=

Zadání
 Název simulace: Rozšíření simulace Building escape

 Předmět: 4IT495 Simulace systémů (LS 2015/2016)

 Autor: Bc. Jakub Hejduk

 Typ modelu: multiagentní

 Modelovací nástroj: NetLogo 5.3.1

Definice
Simulace se bude týkat rozšíření učební úlohy Building escape. Ta v současném stavu poskytuje prázdnou místnost, ze které se snaží lidé uprchnout před požárem. Tento základní motiv bude rozšířen o přidání překážek, okolo kterých budou muset lidé chodit, taktéž přidání místností, ze kterých budou muset vylézt, případně chodeb k únikovým východům, kde se budou lidé štosovat. Taktéž bude přidáno okno, ze kterého bude možnost vyskočit ven a spoléhat, že budou hasiči mít připravenou plachtu, do které člověk spadne. Tato možnost bude podléhat náhodě, např. 10% z celku bude mít odvahu skočit a v 50% se skok povede. Všechny překážky a místnosti budou z druhu materiálu, předpokladem je beton, dřevo a plast, přičemž plast prohoří nejrychleji, naopak beton nejpomaleji. Možností rozšíření je přítomnost požárního alarmu, který lze spustit a dojde k vystříknutí určitého množství vody na povrch místnosti. Přes vodu se oheň nemůže šířit. Nastavení místnosti, počtu překážek a lidí bude k dispozici. Některé prvky budou ovšem limitovány z prostorových důvodů.

Cíl
Cílem práce bude nasimulování tohoto scénáře a zjištění zadaných parametrů přeživších, naopak mrtvých, odvážlivců, co skočili při různých podmínkách a nastavení. Taktéž bude provedeno srovnání získaných hodnot s čistou, základní simulací Building escape a dle porovnání bude stanoveno, která situace dopadla lépe, respektive ve kterém prostředí je větší šance na přežití. V prázdné místnosti se požár šíří rychle, jelikož se nemá o co zastavit. Zde bude mít určité blokády a je otázkou, jaké bude porovnání prázdné vs. "plné" místnosti.

=Metoda=

Celá simulace se odehrává v simulačním prostředí Netlogo 5.3.1. Toto simulační prostředí umožňuje vytvořit různé podmínky pro danou simulaci a testovat jejich vázjemné rozdíly. Lze vytvořit agenty, kterých se simulace týká, nastavit jejich parametry a dle těchto parametrů ovlivňovat jejich chování v prostředí. To samé se týká prostředí, které lze měnit na základě různých ovládacích prvků. Netlogo poskytuje mnoho možností co se týká uživatelského prostředí a jeho ovládání, proto je vhodné pro tento druh simulace.

Předpoklady

 * Simulace se odehrává v uzavřené místnosti
 * Lidé nemají jinou možnost východu z místnosti než východy či oknem
 * Počet překážek v nastavení simulace je limitován
 * Překážky se navzájem mohou prolínat

=Model=

Základní model(původní)
V základní verzi simulace je jednoduchá logika. Lidé jsou náhodně vygenerováni na plochu místnosti, která je prázdná. K dispozici mají dva východy situované v dolním levém, respektive pravém rohu. Následně se vygeneruje požár, který má kruhový tvar. Při spuštění simulace se následně lidé snaží dostat k nejbližšímu východu a zachránit se. Požár se šíří a případně přeřízne cestu unikajícím lidem. V této simulaci nebylo řešeno, jestli je před člověkem oheň, nebo ne. Automaticky do něj vběhl a uhořel. Pokud se lidé shlukli v hloučku, je možnost, že bude člověk ušlapán. Tento model byl rozšířen o skutečnosti popsané níže.

Agenti a atributy původního modelu

 * People (Lidé) - představují osoby, které jsou uvězněni v prostoru s požárem a chtejí se zachránit.
 * pace (rychlost) - představuje samotnout rychlost člověka, respektive kolik kroků udělá při jednom ticku (jedné iteraci simulace). Tento atribut je generovan z normálního rozdělení s parametry 1 0.2
 * headx - představuje horizontální souřadnici, kam člověk poběží. Jedná se tedy o atribut doorx nebližšího východu.
 * heady - představuje vertikální souřadnici, kam člověk poběží. Jedná se tedy o atribut doory nebližšího východu.


 * Exits (Východy) - představují východy, do kterých se lidé musí dostat.
 * doorx - představuje horizontální souřadnici východu. Slouží k určení, kam má člověk směřovat.
 * doory - představuje vertikální souřadnici východu. Slouží k určení, kam má člověk směřovat.

Parametry původního modelu

 * excaped-people - představuje počet zachráněných lidí.
 * burned-people - představuje počet uhořelých lidí.
 * crushed-people - představuje počet ušlapaných lidí.

Rozšíření modelu
Původní model odpovídal na otázku počtu zachráněných při různém počtu lidí, avšak místnost nebývá prázdná. Proto na řadu přichází pár rozšíření, které pomohou simulaci obohatit. Jako první je přidání překážek, okolo kterých lidé budou muset chodit. Je to simulace reálnějších podmínek, kde jsou v místnosti umístěny různé překážky, které ve finále člověk musí obcházet. Tyto překážky ovšem také mohou shořet. Překážky jsou vyrobeny z různých materiálů, konkrétně ze tří a to beton, dřevo a plast. Každý z materiálů má různý stupeň prohoření, respektive dřevo a plast prohoří daleko snáze, než beton. O prohoření dále. Další částí rozšíření simulace je možnost přidání do simulace úzké chodby, která vede k dvěma východům. Pokud se tedy chtějí lidé zachránit, je nutno do této chodby vstoupit. A právě chování v chodbě, respektive ještě více uzavřeném prostoru je dalším reálnějším rozšířením. Do simulace bylo přidáno okno, ze kterého lze vyskočit. Je to druhá možnost záchrany, místo východů, které budou přeplněné. K tomu, aby člověk vyskočil z okna musí mít ale kuráž. Pod oknem by měli čekat hasiči, potažmo lidé s plachtou. Úspěšnost skoku ale není 100%. Je tu tedy jisté riziko. Dále se v modelu nachází možnost běhu lidí. Běh znamená, že lidé budou mít zvýšenou rychlost, ale podléhají riziku, že zakopnou a zlomí si nohu. V tom případě se jim razantně sníží rychlost, jelikož kvůli bolesti a fraktuře nebudou moci normálně chodit. Co se týká naivity lidí, kteří v základním modelu vběhli do ohně, byť ho viděli před sebou, tak v rozšířeném modelu je toto lépe ošetřeno. Pokud člověk vidí před sebou oheň, nevběhne do něj jako sebevrah, ale snaží se ho obejít, případně zůstane na svém místě. Určité riziko ovšem existuje a to, že se oheň prudce rozšíří i na místo, kde stojí člověk. V tom případě chytne a má špatně řečeno smůlu. Pokud kličkuje mezi ohněm má nastavený počet životů, který když mu vyprší, tak uhoří, respektive zemře. V rozšíření byla taktéž přidána možnost nastavení počtu východů. V nastavení simulace lze také spustit nouzový hasící systém, který části podlahy rozpráší vodu, po které se oheň nešíří.

Agenti a atributy
Následující jsou agenti a atributy, o které byla simulace rozšířena.
 * People (lidé) - rožšíření o:
 * stubled - boolean(pravda/nepravda) atribut, který označuje u člověka, zdali zakopl a zlomil si nohu, či nikoliv.
 * brave - označuje člověka, který se nebojí skočit z okna a taky tak udělá.
 * life - označuje počet životů, když člověk kličkuje mezi ohněm.


 * Obstacles (Překážky) - představuje agenta překážky, která je umístěná v prostoru a lidé okolo ní chodí.
 * material - představuje materiál, ze kterého je překážka vyrobena.
 * obstaclex - představuje horizontální souřadnici středu překážky.
 * obstacley - představuje vertikální souřadnici středu překážky.


 * Windows (Okna) - představuje agenta okna, ze kterého mohou lidé vyskočit.
 * windowx - představuje horizontální souřadnici středu okna.
 * windowy - představuje vertikální souřadnici středu okna.


 * Walls (Zdi) - představuje zdi chodby, která vede ke dvěma východům.
 * wallx - představuje horizontální souřadnici pravého konce zdi.
 * wally - představuje vertikální souřadnici pravého konce zdi.
 * alignment - určuje, zdali je zeď postavená vertikálně, nebo horizontálně. Možné nastavení: 1 - vertikální, 2 - horizontální jdoucí doleva, 3 - horizontální jdoucí doprava.


 * Waterdrops (Kapky vody) - představuje kapky vody, které se snášejí z požárního systému.
 * waterdx - představuje horizontální souřadnici středu kapky.
 * waterdy - představuje vertikální souřadnici středu kapky.

Parametry
Následující jsou parametry, o které byla simulace rozšířena.
 * jumpOK-people - indikuje počet lidí, kteří se skokem z okna zachránili.
 * jumpKO-people - indukuje počet lidí, kteří se skokem z okna zabili.

Grafické prostředí


Na větším obrázku, výše lze vidět náhled na grafické uživatelské prostředí simulace. V současné chvíli je simulace připravena ke spuštění a je nastaven režim chodby, tzn. k východům 1 a 2 vede ze středu chodba. Ve prostřed tedy lze vidět simulační plátno, na kterém se simulace odehrává. Vlevo od plátna lze vidět možnosti nastavení. Každá možnost má svůj popisek, co dělá. Základem jsou tlačítka setup a go, případně fire_alarm. Vpravo od tlačítek jsou posuvníky(slidery) a prvky, kterými lze nastavit parametry simulace. Jedná se o nastavení chodby, nastavení vyhýbání se ohni, nastavení východů atp. Vpravo od simulační plochy se nachází výstupy simulace a to jak relativní, tak absolutní hodnoty zachráněných, nebo naopak zemřelých lidí. V grafu lze vidět vývoj jednotlivých parametrů v čase, jak běžela simulace.

Naopak na menším obrázku vpravo lze vidět simulační plochu bez chodby, tzn. možnost wall_on byla vypnutá.

Níže, v kapitole ovládání a monitory, jsou přesně definované všechny prvky v grafickém uživatelském rozhraní.

Ovládání a monitory

 * Původní
 * Tlačítka
 * setup - prvotní nastavení a vykreslení simulace na plátno.
 * go - tlačítko spustí simulaci a dokud je zmáčklé, simulace běží.
 * Ovládací prvky
 * Persons - umožňuje nastavit počet generovaných lidí.
 * Monitory
 * escaped-people / persons - relativní četnost uprchlých lidí.
 * crushed-people / persons - relativní četnost ušlapaných lidí.
 * burned-people / persons - relativní četnost uhořelých lidí.
 * escaped-people - absolutní četnost uprchlých lidí.
 * crushed-people - absolutní četnost ušlapanýnch lidí.
 * burned-people - absolutní četnost uhořelých lidí.
 * Rozšíření
 * Tlačítka
 * fire_alarm - možnost spuštění požárního alarmu, který na zem nastříká určité množství vody, přes kterou se požár nešíří.
 * Ovládací prvky
 * count_of_exits - umožňuje nastavit počet východů. Počet je limitován pouze na čtyři, inkrement jedna, minimální hodnota jedna, protože v místnosti musí být východ.
 * count_of_obstacles - umožňuje nastavit počet překážek. Počet je limitován na dvacet, inkrement jedna, minimální hodnota nula.
 * obstacle_size - možnost nastavení velikosti překážek. Velikost je limitována na deset, inkrement jedna, minimální hodnota jedna.
 * wall_on - přepínač na pravda/nepravda. Tímto přepínačem lze přidat zmiňovanou chodbu k spodním dvěma východům. Pokud je on, chodba se vykreslí, pokud je off, chodba v simulaci nebude. Nastavení chodby musí být provedeno před stisknutím tlačítka setup!
 * people_running - přepínač na pravda/nepravda. Tímto přepínačem lze nastavit v průběhu simulace, zdali lidé běží, či ne. Přínáší to s sebou riziko pádu a zlomeniny.
 * avoid_fire_tiles - přepínač na pravda/nepravda. Tímto je zajištěna naivita, respektive vyhýbání se ohni (při stavu pravda člověk nevběhne do ohně jako sebevrah).
 * Monitory
 * jumpOK-people - absolutní četnost zachráněných lidí skokem z okna.
 * jumpKO-people - absolutní četnost zemřelých lidí skokem z okna.
 * Count of people during simulation - vývoj absolutních počtů zachráněných, zemřelých (dle druhu) a počtu lidí k záchraně (kteří jsou stále v systému).

Průběh simulace
Simulace běží na základních dvou tlačítcích, respektive řídících procedurách. První, klíčovou částí je nastavení prostředí, ve kterém se bude simulovat. Toto zajišťuje tlačítko setup, které nastaví prostředí dle vybraných, respektive naklikaných paramterů. Tato procedura následně volá nastavovací procedury. Tato část pokrývá nastavení východů, překážek, okna, chodby a následně celé vykreslení na plátno. Taktéž založení želv lidí a založení požáru.

to setup clear-all reset-ticks setup-exits setup-windows setup-obstacles setup-walls setup-room
 * to setup

setup-people blow-up end

Druhá procedura zajišťuje průběh simulace, respektive únik lidí, jejich hoření, pohyb a také šíření ohně. Nejdříve je volána procedura pohybu, kde člověk udělá krok, následně je testováno, zdali nezakopl. A posléze probíhají další události jako, jestli už není na místě východu, aby se zachránil, případně u okna aby skočil. Nebo jestli není v hluku lidí, kde je ušlapán.

to go make-step stumble escape jump-out crush fire-spread burn tick end
 * to go

Tato procedura řídí požární ochranu. Lze ji zmáčknout pouze jednou, tudíž je tato skutečnost ošetřena podmínkou.

to fire_alarm if count_fire_alarm < 1[ make-water-alarm ask patches[ let x pxcor let y pycor
 * to fire_alarm

ask waterdrops[ if (x > (waterdx - 0)) and (x < (waterdx + 1)) and (y > (waterdy - 1)) and (y < (waterdy + 1)) [ ask myself [ set pcolor blue] ]     ]    ]]  set count_fire_alarm count_fire_alarm + 1 end


 * Náhled na GUI v průběhu simulace

Nastaveny jsou tři východy a je zapnutá chodba. Je vidět, že lidé blízko levému hornímu rohu utíkají k tomuto východu. Lidé, kteří byli mimo chodbu se nejdříve musí dostat ke vstupu, posléze mohou postupovat chodbou dolů. Zde je vidět, že v chodbě lehce překáží překážka. Simulace je naprogramována, dokud je průchod v chodbě, překážka tam může být. Je vidět, jak se lidé štosují za sebou a obíhají překážku. Lze vidět, že se zachránilo již 116 lidí, ale o trochu méně, 73 jich bylo ušlapáno. Je to dáno hlavně těmi hloučky, které se tvoří u třetího východu a u vstupu do chodby. Tyto místa budou vždycky kritická. Na grafu lze vidět vývoj hodnot. Modrá čára indikuje počet zachráněných lidí, červená počet uhořelých lidí, hnědá počet ušlapaných lidí a černá počet lidí, kteří jsou stále v systému a jdou k východu.

Kód procedur
to setup-exits
 * to setup-exits

create-exits count_of_exits ; creating exits and coordinates of each exit if count_of_exits = 1 [ ask exit 0 [ set doorx 1 set doory 1 ] ]  if count_of_exits = 2 [ ask exit 0 [ set doorx 1 set doory 1 ] ask exit 1 [ set doorx 63 set doory 1 ] ]  if count_of_exits = 3 [ ask exit 0 [ set doorx 1 set doory 1 ] ask exit 1 [ set doorx 63 set doory 1 ] ask exit 2 [ set doorx 1 set doory 63 ] ]  if count_of_exits = 4 [ ask exit 0 [ set doorx 1 set doory 1 ] ask exit 1 [ set doorx 63 set doory 1 ] ask exit 2 [ set doorx 1 set doory 63 ] ask exit 3 [ set doorx 63 set doory 63 ] ]  ask exits [ setxy doorx doory hide-turtle ]

end

Tato procedura nastavuje souřadnice východů. Ty jsou důležité pro určení lidem, kam mají jít. V proceduře je větvení na základě počtu nastavených východů ze slideru. Řešení je nepraktické, ale pro takhle malý, omezený počet východů postačí.

to setup-obstacles create-obstacles count_of_obstacles
 * to setup-obstacles

ask obstacles [ let matobst random 100 set obstaclex random-pxcor set obstacley random-pycor if wall_on = true[ if obstacley < 7 [ set obstacley obstacley + 7 ]     if ((obstaclex > 27) and (obstaclex < 37)) and ((obstacley <= 25) and (obstacley >= 3)) [ ;ensuring that obstacle will not be in a way of walls set obstaclex obstaclex - 10 ]   ]    if matobst >= 33 and matobst < 66 [ ; setting the material type set material "concrete" ]   if matobst < 33 [ set material "pvc" ]   if matobst >= 66 [ set material "wood" ]   setxy obstaclex obstacley set shape "square" hide-turtle ] end

V této proceduře se vytvoří želvy překážek. Pokud je zaplá zeď, resp. chodba k východům, tak je zajištěno, aby překážky neucpaly tuto chodbu. Je to pro dobro simulace. Následně je nastaven náhodně materiál překážky, který může být beton, plast nebo dřevo. Každý má nasledně jinou úroveň prohoření.

to setup-windows create-windows 1
 * to setup-windows

ask windows [ set windowx 32 set windowy 63 setxy windowx windowy hide-turtle ] end

Tato procedura se týká tvorby želvy okna a nastaví souřadnice okna.

to setup-room
 * to setup-room

ask patches [ set pcolor brown + 4 let x pxcor let y pycor let help_material 0 ask exits [ if (x > (doorx - 2)) and (x < (doorx + 2)) and (y > (doory - 2)) and (y < (doory + 2)) [ ask myself [ set pcolor green] ]   ]

ask windows [ ; painting up the window with blue color if (x > (windowx - 2)) and (x < (windowx + 2)) and (y > (windowy - 2)) and (y < (windowy + 2))[ ask myself [ set pcolor blue + 4] ]     ]

ask obstacles[ ; painting up the obstacles with a color coresponding to material if (x > (obstaclex - obstacle_size)) and (x < (obstaclex + obstacle_size)) and (y > (obstacley - obstacle_size)) and (y < (obstacley + obstacle_size))[ if material = "concrete" [ set help_material 1 ]       if material = "pvc"[ set help_material 2 ]       if material = "wood"[ set help_material 3 ]     ask myself [ if help_material = 1 [ set pcolor grey ]       if help_material = 2[ set pcolor white ]       if help_material = 3[ set pcolor brown ]       ]        ]      ]

if wall_on = true [ ; if walls are on, painting the walls for a path to exits0 and 1 ask walls [ if alignment = 0 [ if (x > (wallx - 1)) and (x < (wallx + 1)) and (y > (wally - 22)) and (y < (wally + 2)) [ ask myself [ set pcolor grey] ]]       if alignment = 1[ if (x > (wallx - 28)) and (x < (wallx + 1)) and (y > (wally - 1)) and (y < (wally + 1)) [ ask myself [ set pcolor grey] ]         ]        if alignment = 2[ if (x > (wallx - 1)) and (x < (wallx + 28)) and (y > (wally - 1)) and (y < (wally + 1)) [ ask myself [ set pcolor grey] ]         ]    ]

]   ]

end

Tato procedura se stará o vykreslení všech objektů do místnosti. Tzn. vykreslení východů, vykreslení okna, vykreslení překážek ve správné barvě dle výběru při tvorbě. Taktéž vykreslení zdí chodby. Chodba je vykreslena na čtyři části a to každá vodorovná či svislá část zvlášť.

to setup-people
 * to setup-people

create-people persons

ask people [ move-to one-of patches with [ pcolor = brown + 4 ] set size 2 set pace random-normal 1 0.2 set stumbled false set brave random 100 set life random-normal 2 1

let min-dist 1000000

ifelse brave < 1 [ ;setting way to window and jump out of it     ask windows [ set min-exit self ]     set headx [windowx] of min-exit set heady [windowy] of min-exit ]   [    ask exits [ if distance myself < min-dist [ set min-dist distance myself set min-exit self ]     ]    set headx [doorx] of min-exit set heady [doory] of min-exit ]   if wall_on = true [ ; if wall is on, setting coordinates to go to the entry if ((headx = 1 and heady = 1) or (headx = 63 and heady = 1)) and (ycor > 3) and ((xcor < 27) or (xcor > 37))[ set headx 32 set heady 28 ]     if (((headx = 1 and heady = 1) or (headx = 63 and heady = 1)) and ((ycor > 3) and (ycor < 25)) and ((xcor > 27) and (xcor < 37)))[ set headx 32 set heady 0 ]   ]  ] end

V této části se generují lidé na plochu, která už je připravená. Lidé zpočátku nemají vygenerované souřadnice, ale jsou přesunuti na plochu, která má barvu brown + 4, což je podlaha místnosti. Je tomu tak, protože při náhodném generování lidí by se mohlo stát, že by byli vygenerováni na překážku, což by nebylo ideální, jelikož dále v kódu je nastaveno, že lidé nemají chodit na políčka s barvou překážek. Následně je nastavena odvaha, jestli skočí z okna. Poté je přiřazování, do jakého východu má daná osoba směřovat. Když je zaplá chodba, je tu speciální nastavení souřadnic pro ty, co jdou do východu 1 či 2.

to blow-up
 * to blow-up

let firex random-xcor let firey random-xcor

ask patches [ if ((firex - pxcor) ^ 2 + (firey - pycor) ^ 2 <= 10) [ set pcolor red ]   ] end

Založení požáru, respektive jádra, ze kterého se následně požár bude šířit.

to make-step
 * to make-step

ask people [ facexy headx heady if stumbled = true [;if stumbled pace 0.01 set pace 0.01 ]   if wall_on = true [ ;setting directions if wall is on      if ((xcor > 27 and xcor < 37) and (ycor > 27 and ycor < 32))[ let direction random 100 if direction < 50 [ ;ensuring splitting at the end of wall that half would go left and half right set headx 30 set heady 0 ]       if direction >= 50[ set headx 34 set heady 0 ]     ]    if ((xcor > 27 and xcor < 31) and (ycor > 0 and ycor < 3))[ set headx 1 set heady 1 ]   if ((xcor >= 32 and xcor < 37) and (ycor > 0 and ycor < 3))[ ifelse count_of_exits >= 2[ ;if count of exits is not one, split people else set exit0 set headx 63 set heady 1 ]       [          set headx 1 set heady 1 ]     ]    ]    if people_running = true [ ; if people are running set pace * 1.25 set pace pace * 1.25 ]   ifelse avoid_fire_tiles = true [ ; help to ensure avoiding red tiles (tiles with fire) set fire_tile red ]   [set fire_tile yellow ; movement of person - trying go ahead, if not posible left and right in angle 45, if not trying left and right in angle 90, if not trying go backwards, angle 180 ]   ifelse (patch-ahead pace != nobody) and ((not any? turtles-on patch-ahead pace) or ((count turtles-on patch-ahead pace = 1) and (one-of turtles-on patch-ahead pace = self))) and ([pcolor] of patch-ahead pace != grey) and ([pcolor] of patch-ahead pace != white) and ([pcolor] of patch-ahead pace != brown) and ([pcolor] of patch-ahead pace != fire_tile) [ jump pace ] [     ifelse (patch-right-and-ahead 45 pace != nobody) and (not any? turtles-on patch-right-and-ahead 45 pace) and ([pcolor] of patch-right-and-ahead 45 pace != grey) and ([pcolor] of patch-right-and-ahead 45 pace != white) and ([pcolor] of patch-right-and-ahead 45 pace != brown) and ([pcolor] of patch-right-and-ahead 45 pace != fire_tile) [ right 45 jump pace ] [       ifelse (patch-left-and-ahead 45 pace != nobody) and (not any? turtles-on patch-left-and-ahead 45 pace) and ([pcolor] of patch-left-and-ahead 45 pace != grey) and ([pcolor] of patch-left-and-ahead 45 pace != white) and ([pcolor] of patch-left-and-ahead 45 pace != brown) and ([pcolor] of patch-left-and-ahead 45 pace != fire_tile) [ left 45 jump pace ] [       ifelse (patch-right-and-ahead 90 pace != nobody) and (not any? turtles-on patch-right-and-ahead 90 pace) and ([pcolor] of patch-right-and-ahead 90 pace != grey) and ([pcolor] of patch-right-and-ahead 90 pace != white) and ([pcolor] of patch-right-and-ahead 90 pace != brown) and ([pcolor] of patch-right-and-ahead 90 pace != fire_tile) [ right 90 jump pace ] [       ifelse (patch-left-and-ahead 90 pace != nobody) and (not any? turtles-on patch-left-and-ahead 90 pace) and ([pcolor] of patch-left-and-ahead 90 pace != grey) and ([pcolor] of patch-left-and-ahead 90 pace != white) and ([pcolor] of patch-left-and-ahead 90 pace != brown) and ([pcolor] of patch-left-and-ahead 90 pace != fire_tile) [ left 90 jump pace ] [         ifelse (patch-left-and-ahead 180 pace != nobody) and (not any? turtles-on patch-left-and-ahead 180 pace) and ([pcolor] of patch-left-and-ahead 180 pace != grey) and ([pcolor] of patch-left-and-ahead 180 pace != white) and ([pcolor] of patch-left-and-ahead 180 pace != brown) and ([pcolor] of patch-left-and-ahead 180 pace != fire_tile)[ left 180 jump pace ]         [            ifelse (patch-right-and-ahead 180 pace != nobody) and (not any? turtles-on patch-right-and-ahead 180 pace) and ([pcolor] of patch-right-and-ahead 180 pace != grey) and ([pcolor] of patch-right-and-ahead 180 pace != white) and ([pcolor] of patch-right-and-ahead 180 pace != brown) and ([pcolor] of patch-right-and-ahead 180 pace != fire_tile) [ right 180 jump pace ]           [ forward -1 * pace ]           ]          ]        ]      ]        ]    if people_running = true [ ;decreasing pace when running, if it would not be here, the pace will go faster and faster every tick set pace pace / 1.25 ] ] ] end

Tato procedura se stará o pohyb člověka. Je zde nastavení rychlosti v případě, že je nastaveno, že lidé běží. Taktéž jsou zde nastavené souřadnice pro lidi, kteří mají jako nejbližší východ 1 a 2 v případě, že je zaplá chodba. Následně je řešen jejich pohyb, kdy je mimo jiné nastaveno, že nesmí šlapat na políčka barev překážek. Pohyb je nastaven pro úhly rovně, 45°, 90° a v případě, že se nelze pohnout ani do 90°, tak zpět, o 180°.

to stumble ; setting by random value if people stumbled if people_running = true [ ask people[ if random 1000 < 0.5 [ set stumbled true ] ]  ] end
 * to stumble

Procedura, která řeší, jestli člověk zakopl a něco si zlomil. V případě, že ano, zapíše mu to do atributu stumbled.

to crush
 * to crush

ask people [ ask patch-here [ if count turtles-on neighbors >= 6 and random 100 < 5 [ ask myself [ set crushed-people crushed-people + 1 die ]       ]      ]    ]

end

Tato procedura řeší ušlapání v davu. Pokud se shlukne více jak 6 osob okolo sebe, je zde možnost, že někoho ušlapou.

to burn
 * to burn

ask people [

ask patch-here[ if avoid_fire_tiles = true[ if any? neighbors with [pcolor = red] [ ; decreasing life while next to fire tile ask myself[ set life life - 1 if life = 0 [ set burned-people burned-people + 1 die ]       ]        ]      ]      if pcolor = red [ ask myself [ set burned-people burned-people + 1 die ]       ]

] ] end

Tato procedura řeší shoření člověka, respektive pokud naivně naběhne do ohně, nebo je blízko ohně a vyprší mu životy.

to escape ask people[ ask patch-here[ if (pcolor = green) [ ask myself [ set escaped-people escaped-people + 1 die ]       ]      ]    ] end
 * to escape

Zde simulace řeší zachránění člověka. Pokud šlápne na zelené políčko východu, je zachráněn.

to jump-out ; jumping out of window. Further random value whether the tarp is ready ask people[ ask patch-here[ if (pcolor = blue + 4) [ ask myself [ let tarp-ready random 100 ifelse tarp-ready < 10[ set jumpKO-people jumpKO-people + 1 die ]         [            set jumpOK-people jumpOK-people + 1 die ]         ]        ]      ]    ] end
 * to jump-out

Skok z okna je předmětem této procedury. Je zde náhodně určováno, zdali člověk přežije či nikoliv.

to fire-spread
 * to fire-spread

ask patches [ if pcolor = red [ if random 100 < 2 [ set pcolor black ]     ]    if pcolor = grey and any? neighbors with [pcolor = red] [ ;rules for spreading of fire through obstacles. Random value with set probability if random 500 < 5 [ set pcolor red ]     ]    if pcolor = white and any? neighbors with [pcolor = red] [ if random 500 < 20 [ set pcolor red ]     ]    if pcolor = brown and any? neighbors with [pcolor = red] [ if random 500 < 15 [ set pcolor red ]     ]    if pcolor = brown + 4 and any? neighbors with [pcolor = red] [ if random 100 < 5 [ set pcolor red ]     ]    if pcolor = green and any? neighbors with [pcolor = red] [ if random 500 < 2 [ set pcolor red ]     ]

]

end

Tato procedura se týká šíření ohně. Je zde nastaveno šíření po podlaze, tudíž barvě brown + 4. Taktéž ale i šíření ohně skrz překážky. Šíření přes beton je popsáno náhodnou proměnnou (random 500 < 5), přes plast random 500 < 20 a přes dřevo 500 < 15. Taktéž je zde nastaveno, že může shořet východ, avšak pravděpodobnost je malá, random 500 < 2.


 * to make-water-alarm

to make-water-alarm create-waterdrops 120 [   set waterdx random-xcor set waterdy random-pycor setxy waterdx waterdy set size 1 set color blue hide-turtle ] end

Tvorbou kapek z požárního alarmu, za zabývá tato procedura. Je vytvořeno celkem 120 kapek, které se rozpráší po místnosti.

=Výsledky=

Tabulka naměřených hodnot

 * Nastavené parametry simulace
 * Počet generovaných lidí - 750
 * Počet překážek - 8
 * Velikost překážek - 4
 * Nastavení kličkování mezi ohněm - ano/ne (u daného scénáře ve sloupci vyhýbání).
 * Oheň vždy založen vpravo od středu [x,y;42,32)

Krátce ke sloupcům v tabulce. První sloupec počet východů indikuje počet východů nastavených v simulaci. Druhý sloupec nastavení ukazuje jaké hlavní nastavení bylo aplikováno na simulaci. Další sloupce posléze indikují absolutní hodnoty naměřených hodnot pro daný scénář.


 * Jeden východ
 * Pokud se podíváme na naměřené hodnoty při nastavení jednoho východu. S výchozí simulací lze porovnat hodnoty rozšířené simulace, u kterých není nastaveno vyhýbání na ano. Z naměřených hodnot můžeme vidět, že rozdíl mezi výchozí simulací a rozšířenou pouze s překážkami není tak velký. Ovšem při porovnání, když je přítomna chodba už rozdíl lze vidět, hlavně v počtu zachráněných. S překážkami a chodbou se zachránilo 246. Hlavně rapidně stoupnul počet ušlapání, což indikuje místo, kde lidé vlézají do chodby. Lidé se tam shlukují a tím se ušlapou. S nastavením pouze chodby se zachránilo ještě méně lidí, 212, přitom nebyly v místnosti žádné překážky. Vysvětluji si to tím, že překážky v místnosti působily jako menší zbžďovalo, než je lidé obešli, tudíž se nesešlo tolik lidí najednou v ústí chodby a byl zajištěn daleko lepší průchod chodbou.
 * Pokud porovnáme mezi sebou hodnoty, kde bylo nastaveno vyhýbání lidí ohni, tak můžeme konstatovat, že se hodnoty zachráněných mírně zvedly. Je to tedy tím, že v tomhle nastavení lidé nejdou střemhlav k cíli, ale koukají i před sebe, jestli před sebou nemají oheň. To dokumentuje i stav, že pokles počet uhořelých, avšak bohužel se většina uhořelých přesunula k ušlapaným. Takže lze říci, že se vyhnuli ohni, ale byli ušlapáni.


 * Dva východy
 * U počtu východů rovno dvěma porovnám nejdříve první dva řádky. Zde jsem chtěl otestovat pouze činnost vyhýbání. Tzn. ve výchozí simulaci lidé vběhnou do ohně, v rozšířené se jí vyhnou. Je vidět, že vyhýbání funguje. Ve výchozí simulaci uhořelo 77 lidí, v rozšířené pouze 31.
 * Dále bych rozebral simulování dvou východů s chodbou a bez. Tuto simulaci jsem udělal i pro počet východů tři a čtyři. Tímto chci ověřit vliv chodby na průběh simulace. Pokud se podíváme tedy na tento případ, tak s chodbou se zachránilo 345 lidí, bez chodby 497. Navíc bylo ušlapáno daleko méně lidí. Taktéž jich méně uhořelo, protože oheň byl započat vpravo od středu, takže se brzy dostal k ústí chodby a hořel do chodby.


 * Tři východy
 * Stejná analogie jako u dvou východů. Testování situace s chodbou a bez chodby. Zde je rozdíl víc méně stejný. S chodbou se zachránilo 357 lidí, bez chodby 512. Ovšem velký rozdíl je v počtu ušlapaných, protože při třech východech ubylo razantně ušlapaných.


 * Čtyři východy
 * U čtyř východů je situace stejná, s chodbou se zachrání méně lidí a více jich bude ušlapaných. Jediný rozdíl je v počtu uhořelých, jelikož každý segment (pokud rozdělíme čtverec na čtyři díly) si jde do svého rohu a oheň je založen lehce vpravo od středu, tak se většina ohni vyhne. Toto je asi nejideálnější scénář.

Grafy

 * Následující grafy jsou výstupem části předchozí tabulky.
 * Pro lepší rozlišení výsledků.

Graf při nastavení chodby s překážkami



 * Graf znázorňuje hodnoty zachráněných, úšlapaných atp. pro různý počet východů při nastavení chodba ano, překážky ano. Lze vidět, že optimální výsledek dostaneme až při nastavení 4 východů. Vývoj tohoto scénáře lze rozložit na tři části. První, s jedním východem, situace kritická, lidé se hlavně ušlapou, než že by uhořeli. Následně část druhá, kdy nastavení dvou a tří východů poskytuje téměř stejné hodnoty, respektive s malými odchylkami. Třetí část je ta nejideálnější v tomto scénáři a to nastavení čtyř východů. Procento zachránění je velké a jako jediný problém se jeví problém ušlapání.
 * Zajímavou hodnotu poskytuje počet lidí, kteří vyskočili z okna při nastavení tří východů. Tuto hodnotu si vysvětluji tak, jelikož cestou z horního pravého kvadrantu k východu 3 je i okno, tak se lidé omylem dostali do zóny, kdy vyskočili z okna.

Graf při nastavení bez chodby a s překážkami



 * Při pohledu na tento graf jsou vidět patrné změny. Hodnoty zachráněných stouply řádově o stovku, někde více než sto, někde o kousek méně. Navíc silně kleslo uhořelých i ušlapaných. Část ušlapaných tvoří volnost, protože při absenci chodby se nemusí lidé shlukovat u ústí. Samozřejmě i zde je nejideálnější řešení to řešení se čtyřmi východy. Jediným zarážejícím faktem je, že u nastavení tří východů prudce vzrostl počet uhořelých. Vysvětluji si to tím, že se jednalo o uhořelé z pravého horního segmentu, kteří šli do levého horního rohu (východ 3) a ze zadu se na ně řítil požár a dohnal je, případně se v této lokaci nenacházely překážky, které by částečně požár zpomalily.

=Závěr=

Obecný
V simulaci jsem udělal pár změn oproti zadání, například místo místnosti jsem udělal chodbu, protože mi přišla jako daleko lepší objekt k otestování úniku, než kdyby lidé vylézali z místnosti. Taktéž jsem jenom změnil materiál překážky ze sádrokartonu na plast. Taktéž jsem upravil hodnoty pro skok z okna, myšleno pravděpodobnost, že skok vyjde.

Celkově se mi základní prvky rozšíření, zapojení překážek, obcházení lidmi, šíření ohně skrz překážky podařily. Model by se určitě dal vyladit a rozšířit o další možnosti, například o paniku lidí. Někteří by chytli histerický záchvat, že se stejně nezachrání, přestali by se pohybovat a mohli by ucpat část místnosti. Následně by bylo nutné nastavit, jestli by člověk stojící za nimi je prostě proboural, nebo by hledal jinou cestu. Dalším možnýnm rozšířením by mohla být změna souřadnic, kam jít, pokud by člověk v dálce před sebou viděl ucpanou cestu, nebo požár.

Nevýhodou modelu, problém, který jsem nedokázal vyřešit, je, že při obcházení překážky se občas řada, lidí v shluku, zasekne u překážky a "odsekne" je pouze zapnutí běžeckého režimu.

Zhodnocení výsledků
Při porovnání výsledků simulací se jako evidentně nejlepší jeví varianta čtyř východů. Minimalizuje rizika ušlapaní a uhoření. Záleží ovšem, kde požár propukne. Na tomto záleží asi u každého scénáře.

Naopak jako nejhorší se jeví varianta jednoho východu s chodbou. Celkově jakékoliv nastavení s chodbou je horší, než nastavení bez chodby. Ale v případě pouze jednoho východu je situace ještě horší. V případě nastavení chodby se jeví jako velký problém ušlapání, posléze pokud je oheň blízko chodby, tak jsou lidé v uzavřeném prostoru snadnou kořistí.

Doporučením pro stavby kanceláří či budov by měly být openspacy, což jsou vlastně velké místnosti, kde lidé pracují. Byť jsou tam překážky, tak naopak chodby tam chybí a lze daleko lépe utíkat. Taktéž lze doporučit, čím více východů, tím lépe.

=Kód / Soubory=

Soubor do Netloga s rozšířenou simulací: Výsledky v Excelu: Výchozí simulace z předmětu 4IT495: