Difference between revisions of "Optimalizace kapacity vleku (NetLogo)"

From Simulace.info
Jump to: navigation, search
m
Line 134: Line 134:
 
Může být smazán člověk který prošel kolem
 
Může být smazán člověk který prošel kolem
 
*Pokud je člověk na kolem procházející cestě a opustil obrazovku (ycor < 1), je smazán (die).
 
*Pokud je člověk na kolem procházející cestě a opustil obrazovku (ycor < 1), je smazán (die).
 +
 +
Nastaví se proměnné pro daný tick a sečtou se lidé:
 +
*set lastPersonLifted lastPersonLifted + 1
 +
*let inQueue 0
 +
*let onTheTop 0
 +
*let blocked 0
 +
*Pokud jsou lidé ve frontě nebo na cestě do fronty, přičte se k inQueue 1
 +
*Pokud jsou lidé na začátku sjezdovky, přičte se k onTheTop 1
 +
 +
Zajistí pohyb všech lidí:
 +
 +
Pokud je osoba na kolem procházející cestě, na úrovni cesty do fronty, a lidí ve frontě je méně než maxQueueLength:
 +
* nastaví se její poloha na cestu ke frontě (place="roadUp") a směr nahoru (facexy 69 11)
 +
* k počtu lidí ve skiareálu se přičte 1
 +
* popojde o walkSpeed
 +
 +
Pokud je osoba na cestě ke frontě:
 +
*Pokud je na úrovni fronty (ycor > 11), zařadí se do ní, otočí se doleva, nastaví se jí místo na frontu (place="queue").
 +
**Pokud není na úrovni fronty (ycor > 11), popojde o walkSpeed.

Revision as of 15:10, 5 June 2016


Zadání

Název simulace: Optimalizace kapacity vleku

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

Autor: Bc. Martin Hradil

Typ modelu: Multiagentní

Modelovací nástroj: NetLogo 5.3.1

Definice problému

Příjmy skiareálu s jednou sjezdovkou jsou z drtivé většiny tvořeny z prodeje permanentek. Pro největší příjmy je tedy vhodné, aby se do skiareálu vešlo co nejvíce lidí.

Celý skiareál má ale určitou kapacitu lidí, kteří se do něj vejdou, a při tom se ještě vzájemně na sjezdovce neblokují. Limitovat počet lidí na sjezdovce je možné kapacitou vleku (kolik lyžařů/čas vlek vyveze na kopec, nebo po jaké době vyveze jednoho lyžaře).

Cíl

Cílem simulace je při zadané šířce sjezdovky nalézt maximální kapacitu vleku, při které se lyžaři ještě nebudou blokovat tolik, aby se hromadili na kopci kvůli ucpání sjezdovky.

Metoda

Jelikož se jedná o multiagentní simulaci, jako prostředek byl zvolen program NetLogo, v poslední verzi 5.3.1. V něm byl vytvořen model skiareálu, ve kterém se jednotliví agenti pohybují.

Jelikož každý člověk má jiné schopnosti a chová se na sjezdovce jinak, lze jednotlivé lyžaře obtížně vyjádřit čísly. V nástroji NetLogo je možné vlastnosti lažařů jako rychlost nebo velikost obloučků náhodně generovat. Podklady pro nastavení generování těchto parametrů by bylo možné získat pozorováním na nějaké sjezdovce. To však nebylo vzhledem k aktuálnímu ročnímu období možné a tak byly odhadnuty.

Model

Tato část obsahuje popis modelu, jeho grafické rozhraní a logiku. První je vysvětlen samotný model, následně jak ho používat.

Popis Modelu

Grafické Rozhraní

Grafické rozhraní se skládá z části nastavení a ovládání, hlavního okna s vizualizací děje, a grafů a monitorů.

Xhram29-UI2.PNG

Část s ovládáním obsahuje posuvníky pro nastavení parametrů v rámci vhodných mezí a tlačítka pro prvotní nastavení a běh.


Hlavní okno s vizualizací obsahuje grafický model skiareálu. Ten se skládá z několika částí:

  • Kolem procházející cesta
  • Příchozí cesta do fronty
  • Fronta
  • Vlek
  • Výstup z vleku
  • Sjezdovka

Celé pozadí je zelené a má znázorňovat les nebo louku.


V pravé části jsou zobrazeny číselné výstupy simulace v číslech a grafech.

Implementace

V modelu existují lyžaři, kolem kterých se celá simulace odehrává. Ti mohou být v několika stavech, podle kterých se různě chovají chovají. Tyto stavy jsou uloženy v proměnných. Dále model obsahuje globální proměnné a několik lokálních proměnných.

Proměnné, parametry, obory hodnot

Proměnné z nastavení v UI:

  • slopeWidth - šířka sjezdovky, udáváná v "patches". Může nabývat hodnot od 10 do 55.
  • slopeMaxCurve - maximální úhel obloučku lyžaře vzhledem k jeho pohledu. Může nabývat hodnot od 0 do 90. Tzn. při 0° jede rovně přímo dolů, při 90° dělá obloučky až do pravého úhlu ke směru sjezdovky.
  • slopeSpeedDeviation - směrodatná odchylka pro generování náhodně rychlosti lyžařů. Může nabývat hodnot od 0 do 0,01.
  • liftCapacity - tato proměnná limituje, po jakém čase (po kolika ticích) vlek vyveze dalšího lyžaře. Když se má v daném ticku vyvézt další lyžař, tato proměnná se porovná a je-li větší než "lastPersonLifted", první lyžař z fronty nastoupí na vlek a proměnná se vynuluje. Může nabývat hodnot od 0 do 400.
  • newPeopleFrequency - Šance # z 1000, že se v daném ticku vytvoří nový člověk. Může nabývat hodnot od 0 do 100.
  • maxQueueLenght - Pokud je fronta na vlek delší než #, kolem procházející lidé nevstoupí do skiareálu. Může nabývat hodnot od 0 do 50.
  • stopChance - Šance # z 1 000 000, že se lyžař na sjezdovce v daném ticku zastaví. Může nabývat hodnot od 1 do 500.
  • StopDuration - Na jak dlouho se lyžař zastaví, udávaná v ticks. Může nabývat hodnot od 0 do 3000.

Globální proměnné:

  • lastNewPerson - tato proměnná limituje, po jakém čase mohou kolem procházet noví potencionální lyžaři. Jestliže je na ně fronta moc dlouhá, procházejí kolem skiareálu a mizí. S každým tickem se přičítá 1. Když se má v daném ticku vytvořit další člověk, tato proměnná se porovná a je-li větší než 10, vytvoří se nový člověk a proměnná se vynuluje.
  • liftSpeed - tato proměnná vyjadřuje rychlost pohybu lyžařů na vleku. Je nastavena na 0,05.
  • walkSpeed - tato proměnná vyjadřuje rychlost chůze lyžařů. Je použita, pokud je lyžař kdekoli kromě sjezdovky nebo vleku. Je nastavena na 0,13.
  • lastPersonLifted - tato proměnná vyjadřuje, před kolika ticky byl vyvezen poslední lyžař. S každým tickem se přičítá 1. Může nabývat hodnot od 0 do hodnoty nastavené v "liftCapacity".
  • personsInSkiareal - Proměnná vyjadřující počet lidí ve skiareálu. Tzn. těch, kteří jsou kdekoli kromě cesty procházející okolo. Může nabývat hodnot od 0 do nekonečna. (při hodně dlouhé době běhu simulace)
  • QueueLength - Proměnná vyjadřující počet lidí ve frontě nebo na cestě na konec fronty. Může nabývat hodnot od 0 do nekonečna. (při hodně dlouhé době běhu simulace a změně určitých nastavení)
  • onTheTopCount - Proměnná vyjadřující počet lidí na výstupu z vleku, kteří jsou zablokování a nemohou jet po sjezdovce dolů. Může nabývat hodnot od 0 do nekonečna. (při hodně dlouhé době běhu simulace)
  • blockedTotal - Proměnná vyjadřující počet lidí zablokovaných ostatními lyžaři, na sjezdovce a výstupu z vleku. Může nabývat hodnot od 0 do nekonečna. (při hodně dlouhé době běhu simulace)

Proměnné lyžařů:

  • place - Proměnná vyjadřující, kde se daný člověk nachází. Může nabývat hodnot road, roadUp, queue, lift, liftExit, slope, toQueue.
  • slopeSpeed - Proměnná vyjadřující rychlost lyžaře na sjezdovce. Může nabývat hodnot z normálního rozdělení 0,03;slopeSpeedDeviation, minimálně však 0,005.
  • slopeAngle - totéž jako interní proměnná heading, ale používána pouze, pokud je proměnná place="slope". Vyjadřuje aktuální směr pohybu na sjezdovce. U jednotlivých lyžařů může nabývat hodnot od 180 - slopeCurve do 180 + slopeCurve. Při určitém nastavení tedy u všech od 90 do 270.
  • slopeCurve - Proměnná vyjadřující maximální úhel obloučku daného lyžaře. Generována po opuštění vleku, náhodně v rozmezí od 0 do slopeMaxCurve. Při určitém nastavení tedy u všech od 0 do 90.
  • personsBeforeMe - Proměnná vyjadřující počet lidí, kteří jsou před daným lyžařem na sjezdovce a blokují ho (Počet lidí na sousedech patche o 2 před lyžařem). Může nabývat hodnot od 0 do nekonečna.
  • stoppedAgo - Proměnná vyjadřující, před jak dlouho dobou (počet ticků) lyžař náhodně zastavil. S každým tickem se přičítá 1. Může nabývat hodnot od 0 do nekonečna.

Lokální proměnné jednotlivých procedur:

  • inQueue - Proměnná používaná pro sečtení lidí ve frontě a na cestě na konec fronty v daném ticku. Může nabývat hodnot od 0 do nekonečna.
  • onTheTop - Proměnná používaná pro sečtení lidí na vršku sjezdovky v daném ticku. Může nabývat hodnot od 0 do nekonečna.
  • personCount - Proměnná používaná pro sečtení lidí před daným lyžařem v daném ticku, pokud by bylo potřeba sčítat více než jeden patch. Může nabývat hodnot od 0 do nekonečna.
  • blocked - Proměnná používaná pro sečtení všech zablokovaných lidí v daném ticku. Může nabývat hodnot od 0 do nekonečna.

Postup simulace

Simulace sestává z několika fází.

Vygenerování plochy

Po stistknutí tlačítka setup se vše vymaže a nastaví se plocha (zabarví se zeleně a přes ní následně obdélníky označující vlek, sjezdovku, frontu, výstup z vleku, cestu kolem a cestu ke frontě). Nastaví se také liftSpeed na 0.05 a walkSpeed na 0.13

Běh simulace

Simulace se spustí nebo zastaví stisknutím tlačítka Go, které funguje jako přepínač a stále dokola tedy volá jednu "Go". V rámci procedury Go se:

Může vytvořit nový člověk:

  • Pokud byl předchozí člověk vytvořen před více než 10 ticky a platí, že (random 1000 < newPeopleFrequency), je vytvořen.
  • Jeho pozice je nastavena na 90,4, tzn úplně vpravo na kolem procházející cestě. Jeho velikost na 3, a směr na 0,4, tzn vodorovně doleva.
  • je umístěn na kolem procházející cestu (proměnná place="road").
  • stoppedAgo je mu nastaveno na 100 000 (záměrně veliké číslo, větší než StopDuration).

Může být smazán člověk který prošel kolem

  • Pokud je člověk na kolem procházející cestě a opustil obrazovku (ycor < 1), je smazán (die).

Nastaví se proměnné pro daný tick a sečtou se lidé:

  • set lastPersonLifted lastPersonLifted + 1
  • let inQueue 0
  • let onTheTop 0
  • let blocked 0
  • Pokud jsou lidé ve frontě nebo na cestě do fronty, přičte se k inQueue 1
  • Pokud jsou lidé na začátku sjezdovky, přičte se k onTheTop 1

Zajistí pohyb všech lidí:

Pokud je osoba na kolem procházející cestě, na úrovni cesty do fronty, a lidí ve frontě je méně než maxQueueLength:

  • nastaví se její poloha na cestu ke frontě (place="roadUp") a směr nahoru (facexy 69 11)
  • k počtu lidí ve skiareálu se přičte 1
  • popojde o walkSpeed

Pokud je osoba na cestě ke frontě:

  • Pokud je na úrovni fronty (ycor > 11), zařadí se do ní, otočí se doleva, nastaví se jí místo na frontu (place="queue").
    • Pokud není na úrovni fronty (ycor > 11), popojde o walkSpeed.