Show
Ignore:
Timestamp:
07/27/10 06:50:13 (14 years ago)
Author:
jabu
Message:
 
Files:
1 modified

Legend:

Unmodified
Added
Removed
  • applications/doprava/texty/delka_cyklu/05_AlgorithmDescription/AlgorithmDescription.tex

    r1147 r1150  
    5757    UI::get(inputs,set,"inputs",UI::compulsory); 
    5858\end{lstlisting} 
    59 zapíše na adresu proměnné inputs hodnotu v oběktu \texttt{set} třídy \texttt{Setting}, 
    60 označenou jako \texttt{\"inputs\"}. Oběkt \texttt{set} reprezentuje načtený konfigurační soubor. 
     59zapíše na adresu proměnné \texttt{inputs} hodnotu v objektu \texttt{set} třídy \texttt{Setting}, 
     60označenou jako \texttt{\"inputs\"}. Objekt \texttt{set} reprezentuje načtený konfigurační soubor. 
    6161\texttt{UI::compulsory} značí, že daná hodnota musí být zadána. 
    6262 
    6363 
    6464 
    65 \subsubsection{Třída datalink} 
     65\subsubsection{Třída Datalink} 
    6666Tato třída definuje spojení mezi dvěma vektory, mezi kterými zprostředkovává spojení 
    6767pomocí metody \texttt{filldown}. 
     
    7070Následující kód popisuje vytvoření dvou vektorů \texttt{from} a \texttt{to}, 
    7171popsaných \texttt{RV} vektory \texttt{rv\_from} a \texttt{rv\_to}, a zkopání odpovídajících 
    72 údajů z \texttt{from} do \texttt{to} pomocí třídy \texttt{datalink}. Výsledkem je, že vektor 
     72údajů z \texttt{from} do \texttt{to} pomocí třídy \texttt{Datalink}. Výsledkem je, že vektor 
    7373\texttt{to} bude obsahovat hodnoty 1 a 2. 
    7474 
     
    102102 
    103103\section{Třída LaneHandler} 
    104 Tato třída zprostředkovává přístup agentovi k ůdajům z jednotlivých pruhů. 
    105 Stará se o zaznamenávání a statistické spracování dat z AIMSUNu. 
     104Tato třída zprostředkovává přístup agentovi k údajům z jednotlivých pruhů. 
     105Stará se o zaznamenávání a statistické zpracování dat z AIMSUNu. 
    106106Také je zde implementován odhad čekací doby automobilu do průjezdu křižovatkou, 
    107107což je údaj používaný v hodnotící délky cyklu funkci agenta. 
     
    109109\subsection{Fronta} 
    110110Agent předává třídě LaneHandler údaj o maximální délce fronty za vzorkovací periodu. 
    111 Jedná se o největší počet automobilů v příslušném jízdním pruhu, jejichž rychlost reřesahuje 
     111Jedná se o největší počet automobilů v příslušném jízdním pruhu, jejichž rychlost nepřesahuje 
    112112určitou hodnotu. V našem konkrétním případě je tato mezní rychlost nastavena na 3,6 km/h. 
    113 Tento ůdaj je však pro naše potřeby zkreslený, a to hlavně tím, že ve většině případů se délka cyklu neshoduje 
     113Tento údaj je však pro naše potřeby zkreslený, a to hlavně tím, že ve většině případů se délka cyklu neshoduje 
    114114se vzorkovací periodou. Uvažujme jízdní pruh s poměrem délky zelené 0,5. 
    115115Pokud bude například délka cyklu 180 sekund, a budeme li předpokládat, že začátek jedné periody se bude shodovat s časem, 
     
    118118 
    119119\subsection{Odhad fronty}\label{ss:odhad_fronty} 
    120 K odhadu fronty je použito metody tzv. exponencionálního zapomínání. Metoda vychází z povoucího průměru 
     120K odhadu fronty je použito metody tzv. exponenciálního zapomínání. Metoda vychází z plovoucího průměru 
    121121Který je vhodný pro odhad nekonstantní hodnoty. Označíme si veličinu $\overline{q_i}$  jako plovoucí průměr 
    122 fronty v kroce $i$, kam budeme ukládat posledních $n$ měření. Označme si velikost fronty naměřenou v $i$-tém kroce jako$q_i$. 
    123 V kroce $i+1$ je hodnota hodnota plovoucího průměru přepřičytením poslední naměřené hodnoty rovna 
     122fronty v kroku $i$, kam budeme ukládat posledních $n$ měření. Označme si velikost fronty naměřenou v $i$-tém kroku jako$q_i$. 
     123V kroku $i+1$ je hodnota hodnota plovoucího průměru před přičtením poslední naměřené hodnoty rovna 
    124124$$ 
    125125\overline{q_i} = \frac{1}{n} \sum_{j=0}^{n-1} q_{i-j} . 
     
    135135\overline{q_{i+1}} = \frac{1}{n} ( n \overline{q_i} - \overline{q_i} + q_{i+1} ) = \overline{q_i} + \frac{1}{n} (q_{i+1} - \overline{q_i}). 
    136136$$ 
    137 $\frac{1}{n} (q_{i+1} - \overline{q_i}$ je vlastně přírustek v kroku $i+1$, označme si ho jako $\Delta q_{i+1}$, 
     137$\frac{1}{n} (q_{i+1} - \overline{q_i}$ je vlastně přírůstek v kroku $i+1$, označme si ho jako $\Delta q_{i+1}$, 
    138138a faktor $1/n$ můžeme chápat jako jeho váhu $w$. Po dosazení dostáváme jednoduchý tvar 
    139139$$ 
    140140\overline{q_{i+1}} = \overline{q_i} + w \Delta q_{i+1}. 
    141141$$ 
    142 Průměr s exponenciálním zapomínáním se nazývá proto, že je v něm v $i$-tém kroce uložena i první hodnota, 
     142Průměr s exponenciálním zapomínáním se nazývá proto, že je v něm v $i$-tém kroku uložena i první hodnota, 
    143143má však zanedbatelnou váhu $\left(\frac{n-1}{n}\right)^i$. Jedná se o jaksi zjednodušenou verzi Kalmanova filtru. 
    144144Grafy \ref{fig:q1} a \ref{fig:q2} znázorňují rozdíl mezi okamžitou a filtrovanou délkou fronty při váze $w = 0.2$. 
    145 Graf \ref{fig:q1} pro konstantní délku cyklu 80 sekund, graf \ref{fig:q2} pro délku cyklu peridicky se měnící od 40 
     145Graf \ref{fig:q1} pro konstantní délku cyklu 80 sekund, graf \ref{fig:q2} pro délku cyklu periodicky se měnící od 40 
    146146do 120 sekund. 
    147147 
     
    161161 
    162162 
     163V reálném případě je potřeba vypočítat délku fronty podle záznamů z detektorů. 
     164Prostý výpočet délky fronty například jako rozdíl počtu vozidel, která odjela a která přijela však není možný. 
     165V důsledku problémů popsaných v \ref{sss:zpracovani_dat}. Výpočet délky fronty není předmětem zkoumání této práce. 
     166Podrobnější pojednání o tomto problému lze najít například v \cite{pecherkova}. 
     167\\ 
     168\\ 
     169Protože časté přenastavování délky cyklu působí řadičům problémy, přenastavuje se tento parametr jednou za časový 
     170úsek, ktrý je několikanásobně delší než 90 sekund. Je tedy nutné modelovat časový průběh fronty. Při rozšiřování testovacího 
     171prostředí tento model ovlivní i údaj o počtu vozidel, které přijedou ze sousední křižovatky. Tento údaj závisí na délce cyklu 
     172a není agentovy dostupný přímo. Bude tedy nutné rozšířit komunikaci agentů, popsanou v \ref{ss:komunikace}, o tento údaj. 
     173 
     174 
    163175\subsection{Odhad čekací doby}\label{ss:odhad_cekaci_doby} 
    164176Jednou z nejdůležitějších částí logiky, implementovaná v třídě \texttt{LaneHandler} je 
    165 odhad čekací doby vozidel stojících v, nebo přijíždějících do příslušnéjo jízdního pruhu. 
     177odhad čekací doby vozidel stojících v, nebo přijíždějících do příslušného jízdního pruhu. 
    166178Tento odhad se používá při výběru a ohodnocení délky cyklu. 
    167179\\ 
     
    170182Do proměnné \texttt{q} se uloží aktuální hodnota fronty.  
    171183Simulace začíná v čase \texttt{t = 0}. V každém kroku simulace 
    172 se zvětší fronta o hustotu provozu (počt aut za sekundu), odhadovanou z údaů z detektorů, a pokud se čas nachází 
     184se zvětší fronta o hustotu provozu (počt aut za sekundu), odhadovanou z údajů z detektorů, a pokud se čas nachází 
    173185ve průjezdné fázi, zmenší se o konstantu, nazývanou saturovaný tok, která udává maximální počet aut, které projedou 
    174186křižovatkou. K čekací době vozidel, uložené v proměnné \texttt{wt}, se potom přičte délka zbývající fronty a čas  
     
    176188\\ 
    177189\\ 
    178 Odhad probíhá ve dvou fázích, realizovaných cykly typu \texttt{for}. V první běží čas do nevětší části \texttt{T}, 
    179 soudělné s \texttt{tc}, v duhé po zbytek \texttt{T}. níže uvádím popis všech proměnných. 
     190Odhad probíhá ve dvou fázích, realizovaných cykly typu \texttt{for}. V první běží čas do největší části \texttt{T}, 
     191soudělné s \texttt{tc}, v druhé po zbytek \texttt{T}. níže uvádím popis všech proměnných. 
    180192\begin{description} 
    181193 \item[tc] délka cyklu, pro kterou je odhad prováděn (parametr funkce) 
     
    231243 
    232244 
    233  
    234245\section{Hlavní smyčka} 
    235246Hlavní smyčka programu se stará o synchronizaci všech potřebných parametrů a provádění iterací. 
     
    240251Délka kroku simulace je pevně nastavena na 90 sekund shodně s periodou sběru dat z AIMSUNu. 
    241252V jednom kroku se nejprve načtou data z AIMSUNu do vektoru \texttt{glob\_dt}, který se následně předá  
    242 každému z agentů jako paramentr jejich metody \texttt{adapt}. Následně se zprostředkuje komunikace mezi 
     253každému z agentů jako parametr jejich metody \texttt{adapt}. Následně se zprostředkuje komunikace mezi 
    243254agenty tak, že se naplní fronta zpráv voláním metody \texttt{broadcast} jednotlivých agentů. Z této fronty 
    244255se postupně odebírají zprávy, které se předávají agentům parametrem jejich metody \texttt{receive} 
     
    247258 
    248259\section{Třída agenta} 
    249 Třída \texttt{TrafficAgentCycleTime} je odvozena od obecného návrhu agnta \texttt{BaseTrafficAgent}. 
     260Třída \texttt{TrafficAgentCycleTime} je odvozena od obecného návrhu agenta \texttt{BaseTrafficAgent}. 
    250261Jsou v ní implementovány metody pro načtení dat, komunikaci a nastavení délky cyklu za účelem řízení 
    251262jedné konkrétní křižovatky. 
    252263 
    253264\subsection{Stručný popis algoritmu} 
    254 Cíl algoritmu je zlepšit dopravní situaci nastavením délky cyklu řadiče na tekouvou 
    255 hodnotu, při níž bude celková čekací doba všech vozidel mininmální. 
     265Cíl algoritmu je zlepšit dopravní situaci nastavením délky cyklu řadiče na takovou 
     266hodnotu, při níž bude celková čekací doba všech vozidel minimální. 
    256267Nejprve agent odhadne délku cyklu, která je ideální pro něj, poté vyšle zprávu, zda je tato hodnota 
    257268vyšší nebo nižší než aktuální. Pokud je nadpoloviční většina agentů pro změnu stejným směrem, 
     
    268279\subsubsection{Metoda findIdealTc}\label{sss:ideal_tc} 
    269280Pro určení, zda vznést návrh na zvýšení či snížení délky cyklu, slouží metoda \texttt{findIdealTc}. 
    270 Ta zjišťuje čekací doby pro všechny možnosti rozsahu od mininmální do maximální hodnoty, určené atributy 
     281Ta zjišťuje čekací doby pro všechny možnosti rozsahu od minimální do maximální hodnoty, určené atributy 
    271282\texttt{minTc} a \texttt{maxTc}. Vrátí takovou délku cyklu, pro kterou je čekací doba nejmenší. 
    272283\\ 
     
    277288 
    278289\subsection{Přepsané metody předka} 
    279 Hlavní smyčka progaramu automaticky volá v každém cyklu metody určené 
     290Hlavní smyčka programu automaticky volá v každém cyklu metody určené 
    280291k načtení dat, komunikaci a nastavení dalšího řízení. 
    281292 
     
    283294 
    284295\subsubsection{Metoda validate} 
    285 K předání požadovaných hodnot parametrů v průběhu vsimulace slouží vektor \texttt{actions}. 
     296K předání požadovaných hodnot parametrů v průběhu simulace slouží vektor \texttt{actions}. 
    286297Významy těchto hodnot vysvětluje \texttt{rv\_actions} třídy \texttt{RV}. V metodě \texttt{validate}, 
    287 která se volá na začátku simulace, přidáme do \texttt{rv\_actions} hodntu \texttt{Tc}. Tím 
     298která se volá na začátku simulace, přidáme do \texttt{rv\_actions} hodnotu \texttt{Tc}. Tím 
    288299vlastně sdělíme AIMSUNu, že budeme přenastavovat délku cyklu. Protože délka jednotlivých fází se nepřenastavuje automaticky, 
    289 přidáme do \texttt{rv\_actions} také označení těchto fází. Vpraxi je tento postup realizován kódem 
     300přidáme do \texttt{rv\_actions} také označení těchto fází. V praxi je tento postup realizován kódem 
    290301\begin{lstlisting} 
    291302  rv_action = RV("Tc",1); 
     
    301312\subsubsection{Metoda adapt} 
    302313Na začátku každého simulačního cyklu se jako první volá u všech agentů metoda \texttt{adapt}. 
    303 V parametru se jí předá adresa vektrou výstupních údajů simulace \texttt{glob\_dt}, k jejichž zpracování je metoda určena. 
    304 Zde se předávají údaje z detektorů a délky front istancím třídy \texttt{LaneHandler} a poté se volá jejich metoda 
     314V parametru se jí předá adresa vektoru výstupních údajů simulace \texttt{glob\_dt}, k jejichž zpracování je metoda určena. 
     315Zde se předávají údaje z detektorů a délky front instancím třídy \texttt{LaneHandler} a poté se volá jejich metoda 
    305316\texttt{countAvgs}, která počítá filtrované hodnoty způsobem popsaným v sekci \ref{ss:odhad_fronty}. 
    306317 
    307318 
    308 \subsubsection{Metoda receive a broadcast} 
     319\subsubsection{Metoda receive a broadcast} \label{ss:komunikace} 
    309320Po načtení a zpracování dat začíná komunikace. Ta je realizována metodami 
    310321\texttt{broadcas} a \texttt{receive}, které se volají střídavě. Přesněji řečeno, 
     
    321332Každý agent má v atributu \texttt{name} uloženo jméno křižovatky, kterou ovládá. 
    322333Toto jméno je uloženo v konfiguračním souboru a odpovídá označením ze sekce \ref{ss:oblast_simulace}. 
    323 Pokud je jméno agenta stejné jako parametr zprávy \texttt{to}, vyjme se zpráva z frony a předá se  
     334Pokud je jméno agenta stejné jako parametr zprávy \texttt{to}, vyjme se zpráva z fronty a předá se  
    324335metodě \texttt{receive}.V momentě, kdy je fronta prázdná, zavolají se metody \texttt{broadcast} všech agentů. 
    325 Metoda broadcast opět plní frontu zprávami, které chce agent vyslat. Po jejím ukončení se opět volá \texttt{receive}. 
     336Metoda \texttt{broadcast} opět plní frontu zprávami, které chce agent vyslat. Po jejím ukončení se opět volá \texttt{receive}. 
    326337Střídavé volání těchto dvou metod probíhá, dokud \texttt{broadcast} produkuje nějaké zprávy. 
    327338\\ 
     
    358369 
    359370 
    360 \subsubsection{Metoda act} 
    361 Pokud se agenti dohodly na změně délky cyklu, probíhá její přenastavení v metodě act. 
     371\subsubsection{Metoda act}\label{sss:metoda_act} 
     372Pokud se agenti dohodly na změně délky cyklu, probíhá její přenastavení v metodě \texttt{act}. 
    362373Nejprve se projde pole \texttt{received\_profit\_sum} a vybere se z něj maximum. 
    363374Poté se podle indexu maximálního zisku určí ideální délka fronty.