root/applications/doprava/texty/Zelena_vlna/vnitrek-kapitola3.tex @ 1129

Revision 1127, 35.9 kB (checked in by ondrak, 14 years ago)

very small code cleaning

+texty

Line 
1\chapter{Algoritmus ��
2\section{N�h algoritmu}
3\label{sec:navrh}
4�olem v~t� pr� bylo navrhnout algoritmus vyjedn�n�ezi jednotliv�i�ovatkami tak, aby koordinovanou zm�u sv�fset�vo�zelenou vlnu a~tedy aby projelo co nejv� vozidel bez zbyte�ho zastavov�.
5
6Jedn�z nosn�vk�rhu je funkce, kter�hodnot�onkr��astaven�ffsetu a umo�n�ak tedy porovnat r�jeho hodnoty a vybrat tu mo�n�ejlep��Za tuto m� kvality byl zvolen odhad po� aut, kter�rojedou k�atkou bez zastaven�
7
8Pro v� hodnocen�v programu naz� \texttt{rating}) je t�pro ka�d�n�ruh na vjezdech do k�atky zn�d�u fronty a o��n�asy p�d�idel od sousedn��atky. D�a fronty se v sou�n�ob��� ze simul�ru, p�dy pak p�od souseda. Ten je po��odle vztahu
9\begin{equation}
10        t_z = t_{zz} + \frac{d}{v_P} + \mathit{offset}
11        \label{eq:tz}
12\end{equation}
13a
14\begin{equation}
15        t_k = t_z + t_{dz} \;,
16        \label{eq:tk}
17\end{equation}
18kde $t_z$ je � za�ku p�du aut a $t_k$ � konce. D� pak $t_{zz}$ je � za�ku sv�n�elen�$d$ vzd�nost ke k�atce, kter�� o �y p�d�_P$ pr��ychlost vozidel, $\mathit{offset}$ nastaven�et a $t_{dz}$ d�a sv�n�eln�K t�o dv� vypo�an�not�se je�t����kl�n�t aut. Jeho odhad je z��z hustoty provozu v minul�cyklu. K�atka zas�j� odhady takov�trojic � p���lik -- podle toho, kolik f� rozsv� zelenou ve sm� p��t�c�j�u k sousedovi ��j�mu o odhady.
19
20Po shrom�� v�ech p�klad�soused�e agent p�upit k samotn� v� hodnocen�Ten spo�� tom, �e agent spo���vky v�ech j�n� pruh�kter� n�k�nformace o �ech p�d�o ka�d� se pak nejprve spo���a fronty v �e, kdy se na jeho odjezdu rozsv� zelen�To znamen�
21\begin{equation}
22        Q_V = Q + \sum_{i=1}^{k}{\left|T_i\right|\cdot n_i}
23        \label{eq:qv}
24\end{equation}
25kde $Q_V$ je d�a tak zvan�irtu��ronty, zde jde o d�u fronty p�zsv�n�elen�$Q$ je odhadovan��a fronty, $\left|T_i\right|$ je d�a $i$-t� intervalu, ve kter�p�d� vozidla, $n_i$ je po� t�to vozidel a $k$ je po� interval��dy p�ozsv�n�zelen�
26
27Z tohoto odhadu pak vych� v� p�kl�n��y fronty v okam�iku, kdy zelen�� zp�na �venou. K tomu je t�rozd�t interval od prvn� o��n� p�du nebo rozsv�n�elen�podle toho, co nastane d� po zhasnut�elen�tento interval ozna�e $T$) na posloupnost interval�eft(T_i\right)^{k}_{i=1}$. $T_i$ jsou intervaly typu $\left<a_i;b_i\right>$, kde $b_i=a_{i+1}$ $\forall i \in \left\{ 1, \ldots, k-1\right\}$, $a_1$ a $b_k$ jsou krajn�ody intervalu $T$ a $a_i$ jsou chronologicky ���echny v��ody, tedy body, ve kter� m� signalizovan� nebo ve kter���i kon�p�d vozidel od souseda.
28
29S pomoc�ohoto d�n�ak m� po�at
30\begin{equation}
31        Q_K = Q_V + \sum_{i=1}^{k}{u(T_i)}\,,
32        \label{eq:qk}
33\end{equation}
34
35kde $u(T_i)$ je funkce $u:\; \left<a;b\right> \rightarrow \mathbb{R}$
36\begin{equation}
37        u(T_i)=
38        \begin{cases}
39                n_i                                                             &\text{pokud v intervalu } T_i \text{ pouze p�d� vozidla}  \\
40                -|T_i|\cdot c_o                 &\text{pokud v intervalu } T_i \text{ pouze odj�� vozidla}  \\
41                n_i-|T_i|\cdot c_o      &\text{pokud v intervalu } T_i \text{ p�d� i odj�� vozidla} 
42        \end{cases}
43        \;.
44        \label{eq:uti}
45\end{equation}
46
47$Q_K$ zna�kone�u d�u fronty, $Q_V$ je virtu��ronta z rovnice (\ref{eq:qv}), $k$ je po� interval�r�i vjezdy a v��. $|T_i|$ je d�a intervalu $T_i$, $n_i$ po� vozidel, kter��ou v intervalu $T_i$ a $c_o$ je empiricky zji�t� konstanta -- po� vozidel, kter�a sekundu opust��atku.
48
49Definice funkce $u(T_i)$ jak je zaps� vztahem (\ref{eq:uti}) nen�pln�Je�t�e nutn�oplnit omezen�\begin{equation}
50        u(T_i)
51        \begin{cases}
52                \geq -Q_i               &\text{pokud v intervalu } T_i \text{ pouze odj�� vozidla}  \\
53                \leq n_i        &\text{pokud v intervalu } T_i \text{ p�d� i odj�� vozidla} 
54        \end{cases}\,,
55        \label{eq:uti-omez}
56\end{equation}
57kde $Q_i$ je d�a fronty na za�ku intervalu $T_i$.
58
59Tyto podm�y zar���e pokud z j�n� pruhu jen odj�� vozidla, nem�ich odjet v� ne� jich ��a za�ku ve front� �e pokud vozidla z�ve�ij�� a odj��, projede jich bez zastaven�axim��olik, kolik doraz�d souseda.
60
61Pokud vyjde $Q_K$ z�rn�p�avuje (odhadovan�et aut, kter�ohou k�atkou projet bez zastaven� tato hodnota se tedy ode� od hodnocen�an��atky (a t�se hodnocen�v�
62
63Vyvst� ot�a jak zjistit aktu���y fronta na jednotliv�menech jen pomoc�daj�etektor�er�sou k dispozici. Ukazuje se, �e toto nen�rivi��robl�a jeho ���uje r�c t� pr�. Z toho d� nejsou v programu d�y front odhadov� tak, jak by to bylo nutn� re��ituaci, ale pou��j�e hodnoty, kter�ze z�at ze simul�ru Aimsun. Podrobn��nformace o modelov� d�y fronty p�avuje nap�d \cite{pecherkova}.
64
65P�motn�vyjedn�n�ak maj�genti dv�ole, jeden z nich je ozna� jako \emph{pasivn� zat�o druh� pozici aktivn�. Pasivn�gent m�evn�astaven�et a jen reaguje na pokyny aktivn�. Pokyny tvo���st o o��n�asy p�d�o n�h na zm� offsetu. Na prvn� nich agent v�dy odpov� zasl�m po�adovan�aj�druh� pak zva�uje, jestli by zm� v celkov�sou� p�la zlep�en�texttt{ratingu}. Z tohoto popisu u� pak vypl�le aktivn� agenta. Ten stejn�racuje se ��stmi o �y p�d�v�ale aktivn�� sv�fset a pokou��e vyjednat zm� u soused�
66Vyjedn�c�yklus pak prob� v n�lika kroc�. Nejprve si v�ichni agenti vy��j���n��dy vozidel na z�ad�ffset�taven�minul�cyklu. S p�dnut�k t�o o��n�pak aktivn�genti spo�aj�texttt{rating} sv� nastaven�ffsetu a pokus�e zjistit, jestli by n�k�m� vlastn� offsetu nevedla ke zlep�en�odnocen�
67
68Hled� nejlep�� vlastn� offsetu prob� ve t�kroc�. Nejprve se porovn�ktu��ffset, offset zv�o 8 sekund a offset sn�n�sekund. Vybere se nejl� hodnocen���nost� pokra�e se s n�stejn�sobem, jen dal��va�ovan�m� je $\pm4$ sekundy. V posledn�kroku je pak otestov�posun o $\pm2$ sekundy.
69
70Kdy� aktivn�genti naleznou sv�ejlep��ffsety, roze�le se v�em �n�m zpr� o nalezen�tabiln� stavu, kter�bsahuje nov�odnoty o��n��zd�idel. Nyn�ktivn�genti vyzkou��jestli by k dal�� zlep�en�evedla zm� offsetu u n�er� z jejich soused�ejn�sobem jako p�ed� vlastn� nejlep�� offsetu zkus�dhadnout zm� \texttt{ratingu} p�sunu sousedova offsetu o $\pm$ 4, 2 a 1 sekundu. Pokud m�ejlep��odnocen�enulov�m�, za�le se sousedovi ��st o tuto zm� spolu se zm�u \texttt{ratingu}, kterou by p�la.
71
72Ka�d�vn�gent pot�esb� v�echny n�hy a otestuje, kter�ch m�ejv��ou� zm� ratingu u n�samotn� a zm� u navrhovatele a ten potom p� za vlastn�Pokud by v�echny n�hy p�ly z�rnou zm�, jsou zam�uty a ���m� nenast�. V ka�d�p��sou pak rozesl� informace o nov�stabiln�stavu a s nimi op�o��n��dy.
73
74T�o ka�d��atka nalezne sv�ne� offset. Probl�nast� p�sl� tohoto offsetu do �e k�atky. Od toho nen�arantov� okam�it�kce, zp�jak�an� offsetu dos�e je jen v jeho re�ii a ne� se tak stane m�rvat i n�lik cykl�tohoto d� se vypo�n�et nepos� hned po nalezen�ale agent v�dy v p� cyklech napo��ptim��ffset, z t�to p� hodnot spo��r�a a� ten se n�edn���i pro zpracov�. T�je tak�n�na reaktivnost agenta a zamez�e p�n�hnan�kc�na chvilkov�m� popt�y, kter�jn�en�o�n�e p�sobit.
75
76\section{Pou�it�nihovny}
77Pro usnadn� pr� a tak� d� lep�� za�n� do sou�n� ��e v~programu pou��j��ln�ostupn�nihovny: \texttt{IT++}, zjednodu�uj� pr� s~vektory, maticemi a~poli, \texttt{BDM} (Bayesian Decision Making), kter�bsahuje u�ite� n�roje pro pr� s~popisy k~vektor�obsahuje tak��roj pro ukl�n�r��dnoot z experimentu a~\texttt{libconfig}, slou�� p���pro pr� s~konfigura�mi soubory. Prvn�v�nihovny jsou distribuov� pod GPL licenc�t�pak pod licenc�GPL.
78
79\subsection{IT++}
80\texttt{IT++} je knihovna pro C++, kter�bsahuje t�a~funkce pro prov�n��er�tematick�erac�zpracov� sign� a~dal��Pro � t� pr� jsou zaj�v�r� funkce matematick�
81
82Pro zach�n� vektory jsou v~knihovn�imo jin�avedeny typy \texttt{vec} a~\texttt{ivec}. Prvn�menovan�ektor obsahuj� prvky typu \texttt{double}, tedy �la s~desetinou �kou, druh�ak slo�en z~prvk�xttt{int}, �i �el cel�r� s~vektory je velmi intuitivn�nav�lze �to pou��t syntaxi podobnou jako v~programu MATLAB.
83
84Vektor m� nadefinovat jedn�z~t�to zp�
85\lstset{language=C++, showstringspaces=false}
86\begin{lstlisting}
87vec my_vector;
88vec my_vector(10);
89\end{lstlisting}
90p�� prvn� nich pro vektor nealokuje pam� To je pak nutn�d�t funkc�lstinline{setsize()}. N�edn�e pak mo�n�lo�it do vektoru jednotliv�rvky a~to nap�d jedn�z n�eduj�ch p��begin{lstlisting}
91vec  a = "0 0.7 5 9.3";        // tedy a = [0 0.7 5 9.3]
92ivec b = "0:5";                // tedy b = [0 1 2 3 4 5]
93vec  c = "3:2.5:13";           // tedy c = [3 5.5 8 10.5 13]
94ivec d = "1:3:5,0:2:4";        // tedy d = [1 3 5 0 2 4]
95vec e("1.2,3.4,5.6");          // tedy e = [1.2 3.4 5.6]
96\end{lstlisting}
97Nav�lze i-t� prvku vektoru \texttt{a} p�povat pomoc�lstinline!a(i)! nebo \lstinline[]!a[i]!.
98
99D� p�en�per�r� s~vektory p�prov�t b��atematick�perace, jako jsou:
100\begin{lstlisting}
101a+b     // sou� vektor�5        // p�n��a 5 ke v�em prvk�ktoru
102a*b     // skal��ou� vektor�9   // vyn�ben��ech prvk�toru �lem 9
103\end{lstlisting}
104a~tak podobn�
105
106Pr� s maticemi pak funguje podle obdobn�avidel.
107
108D� se v knihovn�ach� t�\texttt{Array}. D� n�e mo�n�ytv�t pole prvk�ovoln� typu (v�n��psan�ktor�prov�t s nimi mnoh�perace. P�dem u�it�r� pro pole vektor�nap�d n�eduj� k�
109\begin{lstlisting}
110Array<vec> pole_vektoru(2);
111my_vec_array(0) = "2 4 5 0 3";;
112my_vec_array(1) = "0.1 0.2 0.3 0.4 0.3 0.2 0.1";
113\end{lstlisting}
114U takto definovan� pole pak lze pak intuitivn��povat k jeho prvk�moc�lstinline!pole_vektoru(i)! a nav�prov�t operace jako jsou posuny prvk�b�podmno�iny prvk�o t�prost�ho prvku a mnoh�al��
115
116\subsection{BDM}
117Knihovna \texttt{BDM} (Bayesian Decision Making) se zab�ak n�v napov�, bayesovsk�hodov�m. Ov�em v~t� pr� jsou z~n��pou�ity jen n�er�� jmenovit�texttt{UI}, \texttt{RV}, \texttt{datalink} a~\texttt{logger}.
118
119T�\texttt{UI} (User Info) slou��ro ukl�n�~�n�ibovoln�ivatelsk�t. Zde se pou�� pro na�n�onfigurace pro simul�r a~pro jednotliv�genty a~d� jako form�pro ukl�n�~pos�n�pr�mezi agenty.
120
121�elem t�\texttt{RV} je poskytovat popisn�nformace k~datov� vektoru. Prom��ypu \texttt{RV} se skl� z~jedn�ebo n�lika polo�ek. Ka�d�akov�olo�ka m�voje jm� (\texttt{name}) a~d�u -- po� prvk�er�omuto jm� odpov�j�Sou� d�k v�ech takov�polo�ek se potom mus�ovnat d�e vektoru, kter�anou prom�ou typu \texttt{RV} popisov� Fungov� je ilustrov� na obr�u \ref{fig:rv}.
122
123\begin{figure}%
124        \centering
125        \includegraphics[width=7cm]{rv}%
126        \caption{Vektor typu \texttt{RV} (vlevo) funguj� jako popis k vektoru typu \texttt{vec}~(vpravo). Ka�d�olo�ka z \texttt{rv\_vector} m� lev�sloupci sv�m� (\texttt{name}) a v prav�velikost (\texttt{size}). V tomto p��e tedy podvektor \texttt{c} rovn�ektoru [5~4]}%
127        \label{fig:rv}%
128\end{figure}
129
130Pro kop�v� dat mezi vektory existuje t�\texttt{datalink}. Vytv� spojen�ezi dv� datov�ktory na z�adn�hodn�ojmenovan�vk� nim p��n�pisn�ktorech. Po propojen�ektoru s podvektorem pak funkce data\-linku umo�� snadn�op�v� dat ob� sm�.
131
132Na z�r \texttt{Logger} je t�ur��ro ukl�n�at z~programu. Tvo�straktn�rstvu mezi programem a~samotn�isem dat. P�u�it�e jen na za�ku nastav�~jak�orm�hceme z�at v��daje (nap�o�it do pam�, do souboru, do datab�, atd.) a~d� t�pou��me bez ohledu na tuto volbu. Je t�zaji�t� flexibilita pro p�, �e se zm� po�adavky na v� z~programu.
133
134\subsection{Libconfig}
135Konfigura� parametry pro simulaci se ukl�j�o souboru ve form�, kter�d�nihovna \texttt{libconfig}. Jde o~textov�� kter�tru�j��~pro �v� l� �eln� XML.
136
137(...rozv� nebo zru�it...)
138
139\section{VGS API}
140Velmi d�t�lem p�mulaci re��blasti v mikrosimul�ru Aimsun je vlo�en�e��tupn� intenzit dopravy do zkouman� modelu. B��tupem je ru� s�� vozidel v dan�blasti, zpravidla v hodinov�rastru. Takto z�an�ata je mo�n�lo�it do simul�ru Aimsun jako hodinov���e, ov�em toto je t�prov� tak�u�.
141
142%Jedn�z nejd�t�� � p�mulaci re�� zat�n�opravn�s� v mikrosimul�ru Aimsun je zat�n�el�imulovan�opravn�� re��tupn� intenzitami dopravy, odpov�j�mi m�n�v simulovan��. P��n�stupech se intenzity dopravy ur��omoc�u�ho s�� dopravy, zpravidla v hodinov�rastru. Data, z�an��o postupem, je mo�no potom p�vlo�it op�ru� do Aimsunu jako hodinov�opravn���e.
143
144P�j��o�nost�e z�at intenzity provozu z dat z�an�� z dopravn� detektor�talovan�p�tn�blasti. To v�ak znamen�u� zad� stovek � do simul�ru. Pr� z tohoto d� vzniklo VGS API. To se star� nastartov� Aimsunu a vpou�t� vozidel do oblasti. Vjezdy vozidel se p�m �� v extern�souboru, obsahuj�m intenzity na jednotliv�menech. U�ivatel pak jen zad�m� a um�� tohoto souboru a v�e ostatn�e d� automaticky. Nav�lze volit mezi r�i rozd�n�ravd�dobnosti vjezd�i�� nej�t� pou��n�e rovnom��i Poissonovo rozd�n�
145
146%Pokud se sna�� o p�j��imulaci, m� pro zati�en�opravn�� pou��data z�an��z dopravn� detektor�talovan�simulovan�blasti. V takov�p��y bylo pot�ru� vkl�t n�lik set hodnot vstupn� intenzit pro ka�d�lovan� VGS API vzniklo ve snaze tento handicap odstranit -- na za�ku simulace rozhran�ouze u�ivatewl p�informace o tom, kde je um��soubor s intenzitami vjezd�jednotliv�men a o jak�jezdov�amena jde, VGS API se automaticky postar� nastartov� Aimsunu a automaticky vpou�t�ozidla do syst� podle �, obsa�en�souboru s intenzitami vjezd�ivatel m�olit r�druhy rozd�n�ravd�dobnosti vjezd�j�t� se pou�� rovnom��ebo Poissonovo rozd�n�
147
148Vedle pr� se vstupn�aty pro simulaci se VGS API star� o zpracov� dat v��. Aimsun sice zvl� export v��ulac�o textov�ubor�bsahuje i n�roje pro jejich vizualizaci, neumo�� p�ale n�er��t�� jako je nap�d porovn� v��dvou r�h sc��GS proto v pr� cel� experimentu ukl� � o sledovan�blasti a to jak pro jednotliv�ekce, tak pro cel�� Ve v�u u�ivatel z�� informace o po� zastaven�ozidel, o jeho zpo�d�, pr��ychlosti, dob��y a dob�t�, o doprav�toku a hustot�opravy na jednotliv�gmentech �o d�� front vozidel. �aje o d�� front jsou specialitou VGS, Aimsun tento �pro jednotliv��n�ruhy p�neposkytuje a VGS m�roto implementov�vlastn�lgoritmus pro jejich s��.
149
150%Druh�e�it��m VGS API je zhroma��at data pot� pro vyhodnocen�xperimentu. Aimsun sice disponuje jednoduch�hran�pro vizualizaci dat a jejich export do textov�ubor�n�le mo�n�ap�d porovn�t jednotliv�c��mulac�VGS API proto periodicky ukl� v�echny kl�v�kazatele jak pro jednotliv�egmenty dopravn��, tak i pro cel�lovan�� U�ivatel m�o ukon��imulace k dispozici � o po� zastaven�ozidla, o jeho zpo�d�, pr��ychlosti, dob��y a dob�t�, o doprav�toku a hustot�opravy na jednotliv�gmentech �o d�� front vozidel. Vzhledem k tomu, �e Aimsun neposkytuje informace o d�e fronty vozidel pro ka�d��n�ruh zvl᚝ (k dispozici jsou pouze � o akumulovan��e fronty vyj�en�o�m vozuidel, kter�a segmentu dopravn�� v dan��ik stoj� m�GS API implementovan�tn�lgoritmus v� d�y fronty vozidel na ka�d�j�n�pruhu a poskytuje u�ivateli i takto z�an�nformace o d�e fronty.
151
152Implementac�GS API je DLL knihovna napsan� jazyce C pro 32 a 64 bitov�yst� Windows XP a v�av�je sou�t�GStoolbox, sada skript� zpracov� v�� dat v programu Matlab.
153
154%Vlastn�GS API je implementov� v jazyce C jako DLL pro 32- a 64-bitov�yst� po�aje Windows XP, rozhran�e dopln� funkcemi pro obsluhu API a vyhodnocov� statistick�formac� prost�n�roje Matlab
155
156\section{Struktura programu}
157
158Fungov� simula�ho prost�tak jak bylo navr�eno v �IA je na obr�u (\ref{fig:struktura}). Sklad�e ze t�avn� blok�krosimul�ru Aimsun, emul�r�i�ELS3 a z tzv. Aimsun agenta.
159
160Aimsun agent p�avuje ��rvek cel� syst�. P�texttt{vgs_api} spou�t�imsun a stejn�sobem od n�pr����odnoty sledovan�pravn� veli�. D� prost�ctv�\texttt{eh_api} z�� � z ���ovatek. Na z�ad��ech sesb�n�aj� sestavuje pokyny pro zm� v sign�� pl�ch a op�pomoc�texttt{eh_api} tyto pokyny zas� ��
161
162Na z�r komunikace mezi mikrosimul�rem a emul�ry ��er�bsahuje � z detektor�ednom sm� a ze stav�n�� skupin ve druh� prob� p�texttt{ea_api}.
163
164\begin{figure}%
165\centering
166\includegraphics[width=\columnwidth]{aimsun-agents}%
167\caption{Struktura cel�imulace}%
168\label{fig:struktura}%
169\end{figure}
170
171\section{Program \texttt{main_loop.exe}}
172\label{sec:main_loop}
173
174Simulace je obsluhov� z~programu \emph{main\_loop.exe}. Ten se star�~na�n�onfigurace, spu�t� simul�ru Aimsun a~zaji��uje komunika�ho prost�ka mezi jednotliv�enty. Program se d�ozd�t na jednotliv�loky jak je zobrazeno na obr�u \ref{fig:mainloop}. Z tohoto n�esu bude vych�t n�eduj� popis.
175
176\begin{figure}[t]%
177\centering
178\includegraphics[width=8.5cm]{mainloop3}%
179\caption{Strukuta fungov� programu \texttt{main_loop.exe}, podrobn� popsan� podkapitole \ref{sec:main_loop}}%
180\label{fig:mainloop}%
181\end{figure}
182
183B�m \emph{inicializace} je na�n konfigura� soubor, jeho� jm� se p��ako jedin�metru p�ou�t� \texttt{main_loop.exe}. Konfigura� soubor je ve form� stanoven�knihovnou \texttt{libconfig}. Po na�n�sou parametry ze skupiny \texttt{system} p�y VGS API, kter�e postar� spu�t� Aimsunu s t�to parametry. Jde p���o~intenzitu provozu na vstupech do dopravn�� a~d�u simulace.
184
185N�edn�e dle konfigurace vytvo�pole ukazatel�agenty \texttt{Ags}. P�nstrukci jednotliv�ent�vol� jejich funkce \texttt{from_setting()} na�aj� konkr��arametry ka�d� agenta. 
186
187Pot�e vytv� instance t�\texttt{logger} a jej�rov�n� agenty. V tu chv� se pou�t� funkce \texttt{ds_register()} umo��c�ktualizaci datalink� spojen�ezi agenty a simul�rem. Na z�r tohoto bloku programu je provedena inicializace fronty zpr�a zaregistrov� vektor�r�e budou v pr� simulace logovat.
188
189D� se pokra�e �dn�for cyklem. �st \texttt{z�� dat} v sob�ahrnuje ulo�en�ogovan�dnot ze simul�ru a pak p���ulo�en�ektor $d_t$ do prom��texttt{glob_dt} a jeho odesl� agent� zpracov� funkc�texttt{adapt()}. Pot��z�a �vyjedn�c�yklus.
190
191Vyjedn�c�yklus se zab�sluhou fronty zpr� Nejprve prob�e \emph{doru��pr�, kter�sou aktu��e front�V prvn�kroku vyjedn�c� cyklu je fronta zpr�samoz� pr�n�v n�eduj�m se od konce proch� a adresovan�nt�ou p�y p��n�pr�. To se d� zavol�m funkce \texttt{recieve()} se zpr�u jako parametrem. V p���e adres�nen�alezen a zpr� tedy nelze doru� je ozn�no varov�, ale pokra�e se d�v �nosti.
192       
193Po vypr�n� fronty nast� � pro \emph{vys�n�pr�. To spo��e spu�t� funkce \texttt{broadcast()} u v�ech agent�n�aj��itost vlo�it do fronty zpr�libovoln�t sd�n�ro ostatn�genty, nemus�v�em vys�t ���
194
195Dal��ostup z�s�a stavu fronty zpr� Pokud je pr�n�tedy ���t nevyslal ��ou zpr�, kon�vyjedn�c�yklus a pokra�e se v b� programu. V p���e fronta pr�n�en�cyklus se opakuje a prob�e dal��oru�� zpr�z fronty. Vyjedn�n���n�o je�t� p��kdy prob�e stanoven�m��o� vyjedn�c� cykl�staven�om��texttt{max_cycles}. Limit by v�ak m�b�taven tak, aby k jeho dosa�en�edoch�lo, pokud se tak stane, m� by to b�n�m probl� v programu.
196
197Posledn�� hlavn� cyklu je nazvan�emph{krok simulace}. Spo��ejprve v zavol� funkce \texttt{act()} u ka�d� agenta. To je okam�ik, kdy mohou agenti ovlivnit ��ignalizace. Pr� zde prob� zkop�v� vypo�an�dnot do vektoru \mbox{\texttt{glob_ut}}, tedy do prom���avuj� vektor vstupn� hodnot $u_t$. Na z�r hlavn� cyklu je cel�imulace posunuta o jeden krok d� vol�m funkc�texttt{step()} u loggeru \texttt{L}, \texttt{Ds} a u v�ech agent�
198Tato smy� se opakuje dokud nen�osa�en v konfigura�m souboru nastaven�simulace. \emph{Zakon��spo��i� jen v zaps� log souboru.
199
200\section{Implementace navr�en� algoritmu}
201
202Algoritmus popsan�pitole \ref{sec:navrh} je implementov�ve t�\texttt{GreenWaveTrafficAgent}. Instance t� t�p�avuj�genty p�en� jednotliv��ovatk�(respektive jej���
203
204T�je odvozena od p� jm�m \texttt{BaseTrafficAgent}. Ten slou��en jako prakticky pr�n�t, po p�en� n�k��atce nekon��ou akci a umo�� tak simulovat syst�bez decentralizovan� ��P�m t� t�je t�\texttt{Participant} z knihovny BDM. \texttt{Participant}, tedy �n� p�avuje z�adn�ednotku v rozhodovac�procesu. Ka�d�tn�m�v�m� (\texttt{name}) a je schopen ukl�t v�y. U� pr� t�\texttt{Participant} deklaruje existenci funkc�texttt{adapt()}, \texttt{broadcast()}, \texttt{recieve()}, \texttt{act()} a \texttt{step()}. Tyto jsou v n�definov� jako virtu��\texttt{virtual}), tedy pokud je v potomkovi redefinujeme, je zaru�o vol� t�to nov�nkc�
205
206Prvn�o vytvo�instance agenta prob�e zavol� funkce \texttt{from_setting()} vypsanou jako k�ref{lst:from}. V t�e nejprve vol�tejnojmenn�unkce p�, kter�a�� konfigurace z�adn�arametry, jmenovit�
207\begin{description}
208        \item[lanes] informace o j�n� pruz�,
209        \item[neighbours] -- jm� agent�ousedn� k�atek,
210        \item[green_names] -- jm� jednotliv�gn�� skupin,
211        \item[green_starts] -- �, ve kter�lu�n�ign��kupiny rozsv� zelenou,
212        \item[green_times] -- d�a trv� sv�n�elen�an�ign��kupiny, uv�na jako pom�$\text{doba sv�n�\text{d�a cyklu}$,
213\end{description}
214a n�er�al��kter�ro tuto pr� nejsou d�t�
215
216D� se v t� funkci nastavuj�odnoty konstant a v� hodnoty n�er�om��onkr��de o
217\begin{description}
218        \item[car_leaving] -- � v sekund�, ze kter�o auto opust�rontu
219        \item[VP] -- pr��ychlost j�y automobilu mezi k�atkami na voln�ilnici
220        \item[actual_time] -- uchov� aktu��as simulace (v sekund�)
221        \item[negot_cycle] -- po� ji� prob��jedn�c� cykl�posledn� (! zformulovat !)
222        \item[cycle_count] -- hranice, po kter�ast� pr�v� kone�ho offsetu
223        \item[total_offset] -- hodnota sou� dosud vyjednan�fset�posledn� pr�v�
224        \item[negot_offset] -- krok, kter�za���ed� ide�� offsetu u souseda
225        \item[negot_limit] -- krok, kter�kon�p�ed� ide�� offsetu u souseda
226        \item[passive] --       indikuje zda agent zast� pasivn�ebo aktivn�oli
227\end{description}
228
229V z�ru jsou je pak z konfigurace na�n v� offset, role agenta a p�ven vektor v�� hodnost \texttt{outputs} spolu s jeho popisem \texttt{rv_outputs}. Na �m konci je je�t�apnuto logov� hodnot offset� pozd��yhodnocen�
230
231\lstset{language=[Visual]C++,showstringspaces=false,numbers=left, numberstyle=\tiny, numbersep=0pt, tabsize=2, breaklines, breakautoindent=false, captionpos=b}
232\begin{lstlisting}[caption=Funkce from_setting(), label=lst:from, firstnumber=587]
233        void from_setting(const Setting &set) {
234                BaseTrafficAgent::from_setting(set);
235
236                RV rv_exp;
237
238                car_leaving=2;
239                VP=45;
240                actual_time=0;
241               
242                negot_cycle=1;
243                cycle_count=5;
244                total_offset=0;
245
246                negot_offset=4;
247                negot_limit=1;
248
249                passive=0;
250               
251                UI::get(last_offset, set, "offset", UI::compulsory);
252                UI::get(passive, set, "passive", UI::optional);
253
254                for (int i=0;i<lanes.length();i++) {
255                        for (int j=0;j<lanes(i).outputs.length();j++) {
256                                if (lanes(i).outputs(j)!="DUMMY_DET") {
257                                        rv_exp=RV(lanes(i).outputs(j)+"-"+name+"_"+to_string(i),3);
258                                        rv_outputs.add(rv_exp);
259                                }
260                        }
261                }
262                outputs.set_size(rv_outputs._dsize()); 
263
264                log_level[logoffset]=true;
265        }
266\end{lstlisting}
267
268Dal��olanou funkc� agentech je \texttt{adapt()}. Podobn�ako \texttt{from_setting()} nejprve spou�t�tejnomenou funkci u sv� p�. V t�rob� vypln� vektor�xttt{inputs} a \texttt{queues} daty z Aimsunu, ulo�en� vektoru \texttt{glob_dt}. �aje z \texttt{queues} se p����n�xttt{LaneHandler}�� je nastaven \texttt{planned_offset} na hodnotu z�anou v minul�cyklu a stavov�rom��sou nastaveny do sv�choz� hodnot.
269
270\begin{lstlisting}[caption=Funkce adapt(), label=lst:adapt, firstnumber=415]
271        void adapt(const vec &glob_dt) {
272                BaseTrafficAgent::adapt(glob_dt);
273                       
274                for (int i=0;i<lanehs.length();i++) {
275                        lanehs(i)->queue=queues(lanehs(i)->queue_index);               
276                }
277
278                planned_offset=last_offset;
279               
280                //set state variables to default values
281                final_state=false;
282                new_stable_state=false;
283                send_requests=false;
284                need_exps=true;
285                negot_offset=4;
286        }
287\end{lstlisting}
288
289Funkce \texttt{recieve} zpracov� p��pr� od ostatn� agent� za�ku je p��pr� rozd�na do jednotliv�om��
290\begin{lstlisting}[caption={Fragment funkce \texttt{recieve()}, inicializace}, label=lst:recieveInit, firstnumber=491]
291        void receive(const Setting &msg){
292                string what;
293                string to;
294                string from;
295                vec value;
296                RV *rv;
297               
298                UI::get(what, msg, "what", UI::compulsory);
299                UI::get(to, msg, "to", UI::compulsory);
300                UI::get(from, msg, "from");
301                UI::get(rv, msg, "rv");
302                UI::get(value, msg, "value");
303\end{lstlisting}
304
305D� se �nost li��odle �p�tu� zpr�, tedy podle �ce ulo�en� v �ti \texttt{what}. V p�����sti o o��n�asy p�d�jen ulo�eno jm� odes�tele do seznamu �adatel�xttt{requesters}.
306
307\begin{lstlisting}[caption={Fragment funkce \texttt{recieve()}}, label=lst:recieveExpReq, firstnumber=last]
308                if (what=="expected_times_request"){ 
309                        requesters.push_back(from);
310                } 
311                               
312\end{lstlisting}
313
314Pokud jsou naopak obsahem p��pr� o��n�asy p�d�omobil�souseda, aktivn�gent najde nov�m��ffset pro sv�gn��l�a spo��texttt{rating}, pasivn�rovede jen tento v�. Na konci je stavov�rom��astavena \texttt{new_stable_state} na \texttt{true}, co� ur�e dal��innost agent ve f� vys�n�pr�
315
316\begin{lstlisting}[caption={Fragment funkce \texttt{recieve()}}, label=lst:recieveNewExp, firstnumber=last]
317                else if (what=="new_expected_cars") {
318                        rv_recieved_exps=*rv;
319                        recieved_exps=value;
320                       
321                        if (!passive) {
322                                planned_offset=find_best_offset(planned_offset,8);
323                                planned_offset=normalize_offset(planned_offset);
324                        }
325
326                        planned_rating=count_rating(planned_offset, recieved_exps, rv_recieved_exps);
327                       
328                        // we have new stable state to broadcast
329                        new_stable_state=true;
330                }
331\end{lstlisting}
332Obdr�en�pr� s hlavi�u �\texttt{stable_state}� znamen��e n�er�oused�nil sv�astaven�ffsetu a zas� tedy nov�odnoty o��n��zd�kud je aktu��odnota \texttt{negot_offset} v��ebo rovna \texttt{negot_limit}, zkou��ktivn�kter� hodnot $0$, $+\mathtt{negot\_offset}$ nebo $-\mathtt{negot\_offset}$ by po p�n� sousedov�ffsetu znamenala nejlep��ating. Hodnota \texttt{negot_offset} je sn�na na polovinu a je p�veno odesl� ��sti pro souseda. Pokud Pokud byla prom��texttt{negot_offset} ji� ni���e� ne� \texttt{negot_limit}, p��e agent do kone�ho stavu, neb ji� nem�al��rostor k vyjedn�n�e sousedy.
333\begin{lstlisting}[caption={Fragment funkce \texttt{recieve()}}, label=lst:recieveStable, firstnumber=last]
334                else if (what=="stable_state") {
335                        rv_recieved_exps=*rv;
336                        recieved_exps=value;
337
338                        planned_rating=count_rating(planned_offset, recieved_exps, rv_recieved_exps);
339
340                        if (!passive) {
341                                for (int i=0;i<neighbours.length();i++) {
342                                        rv_change_request.add(RV(neighbours(i)+"_change",2));
343                                        change_request.set_size(rv_change_request._dsize());
344                                        ivec ind=RV(neighbours(i)+"_change",2).dataind(rv_change_request);
345                                       
346                                        // offset change
347                                        change_request(ind(0))=find_best_exps(negot_offset,neighbours(i),rating_change);
348                                        // rating change
349                                        change_request(ind(1))=rating_change;
350                                }
351
352                                if (negot_offset>=negot_limit) { 
353                                        negot_offset/=2;
354                                        send_requests=true;
355                                }
356                                else {
357                                        final_state=true;
358                                }
359                        }
360                        else {
361                                final_state=true;
362                        }
363                }
364\end{lstlisting}
365P�ijet�e zpr� s ��st� zm� offsetu agent zkoum�zda je sou� zm� hodnocen�o aplikaci navr�en� offsetu a zlep�en�odnocen� souseda, kter�d zm� offsetu o��, v��e� nula. Takov� zm� se p�� podle n�e upravuje \texttt{planned_offset}. V ka�d�p��e agent p�v�a zasl� aktu�� hodnot o��n��zd�begin{lstlisting}[caption={Fragment funkce \texttt{recieve()}}, label=lst:recieveOffChange, firstnumber=last]
366                else if (what=="offset_change_request") {
367                        double final_rating_diff;
368
369                        rv_recieved_changes=*rv;
370                        recieved_changes=value;
371
372                        for (int i=0;i<rv_recieved_changes.length();i++) {
373
374                                ivec ind=RV(rv_recieved_changes.name(i),2).dataind(rv_recieved_changes);
375
376                                final_rating_diff=-planned_rating+count_rating(planned_offset+(int)recieved_changes(ind(0)), recieved_exps, rv_recieved_exps)+recieved_changes(ind(1));
377                                if (final_rating_diff>=0) {
378                                        planned_offset+=(int)recieved_changes(ind(0));
379                                        planned_offset=normalize_offset(planned_offset);
380                                        planned_rating+=final_rating_diff;
381                                }
382                        }
383
384                        new_stable_state=true;
385                }
386\end{lstlisting}
387Pokud p� zpr� s p�tem, kter�ttt{GreenWaveTrafficAgent} neum�pracovat, p��i p�vi. Kdyby se stalo, �e ani ten si se zpr�u neporad�po�le se zpr� jeho p�vai (tedy t�\texttt{bdm::Participant}), kter�kov�p��yvol�arov� o nezpracovateln�pr�.
388\begin{lstlisting}[caption={Fragment funkce \texttt{recieve()}}, label=lst:recieveBase, firstnumber=last]
389                else {
390                        BaseTrafficAgent::receive(msg);
391                }
392        }
393\end{lstlisting}
394
395Funkce \texttt{broadcast()} vys� zpr� do fronty zpr�a to v z�slosti na hodnot� agentov�avov�om��okud nen�r�n�am \texttt{requests}, sestav�dpov�pro ka�d� z agent�den� v seznamu a ten n�edn�ypr�n�D� pak za ka�dou ze stavov�om��ter�aj�odnotu \texttt{true} sestav���nou zpr� a hodnotu zm� na \texttt{false}.
396
397\begin{lstlisting}[caption=Funkce broadcast(), label=lst:broadcast, firstnumber=429]
398        void broadcast(Setting& set){
399
400                //ask neighbours for exptected arrive times
401                if (need_exps) {
402                        for (int i=0; i<neighbours.length(); i++){
403                                Setting &msg =set.add(Setting::TypeGroup);
404                                UI::save ( neighbours(i), msg, "to");
405                                UI::save (name,msg,"from");
406                                UI::save ( (string)"expected_times_request", msg, "what");
407                        }
408                        need_exps=false;
409                }
410
411                // broadcast expected cars
412                if (!requesters.empty()) {
413                        double a;
414                        expected_cars();
415                        do {
416                                Setting &msg =set.add(Setting::TypeGroup);
417                                UI::save ( requesters.back(), msg, "to");
418                                UI::save ( name, msg, "from");
419                                UI::save ( (string)"new_expected_cars", msg, "what");
420                                UI::save ( &(rv_outputs), msg, "rv");
421                                UI::save ( outputs, msg, "value");
422                                requesters.pop_back();
423                                a=outputs (10);
424                        } while (!requesters.empty());                 
425                }
426
427                // broadcast new stable state (new stable expectations)
428                if (new_stable_state) {
429                        expected_cars();
430                        for (int i=0;i<neighbours.length();i++) {
431                                Setting &msg = set.add(Setting::TypeGroup);
432                                UI::save ( neighbours(i), msg, "to");
433                                UI::save ( name, msg, "from");
434                                UI::save ( (string)"stable_state", msg, "what");
435                                UI::save ( &(rv_outputs), msg, "rv");
436                                UI::save ( outputs, msg, "value");
437                        }
438                        new_stable_state=false;
439                }
440
441                // broadcast requests to change offset(s)
442                if (send_requests) {
443                        for (int i=0;i<neighbours.length();i++) {
444                                Setting &msg = set.add(Setting::TypeGroup);
445                                UI::save ( neighbours(i), msg, "to");
446                                UI::save ( name, msg, "from");
447                                UI::save ( (string)"offset_change_request", msg, "what");
448                                UI::save ( &(rv_change_request), msg, "rv");
449                                UI::save ( change_request, msg, "value");
450                        }
451                        send_requests=false;
452                }
453       
454                // reached final offset.
455                if (final_state) {
456                        final_state=false;
457                }
458        }
459
460\end{lstlisting}
461
462Ve funkci \texttt{act()} se spo�an�odnota \texttt{planned_offset} p�� hodnot�rom��texttt{total_offset} a to a� do chv�, ne� je v n�tolik hodnot, kolik stanovuje limit \texttt{cycle_count}. Kdy� se tohoto limitu dos�e, vyd� se \texttt{total_offset} t�o limitem, �� se z��r��odnotn�ffsetu z posledn� cykl��se pak znormalizuje, aby byl z intervalu $\left<0;T_c\right>$ a ulo��e do vektoru $u_t$, p�avovan�m�u \texttt{global_ut}. T�se tato hodnota dostane k �i k�atky.
463\begin{lstlisting}[caption=Funkce act(), label=lst:act, firstnumber=615]
464        void act(vec &glob_ut){
465                if (negot_cycle==cycle_count) {
466                        vec action;
467                        action.set_size(rv_action._dsize());
468               
469                        ivec index = RV(name+"_offset",1).dataind(rv_action);
470
471                        action(index(0))=normalize_offset(total_offset/cycle_count, false);
472                        action2ds.filldown(action,glob_ut);
473
474                        total_offset=0;
475                        negot_cycle=1;
476                }
477                else {
478                        total_offset+=planned_offset;
479                        negot_cycle++;
480                }
481                last_offset=planned_offset;
482        }
483\end{lstlisting}
484
485O z�s aktu�� hodnot do logovac� souboru se star�texttt{log_write()}. Ukl� se dvouslo�kov�or. Prvn�rvek obsahuje vypo�an�et \texttt{planned_offset}, druh� hodnocen�texttt{planned_rating}.
486
487\begin{lstlisting}[caption=Funkce log_write(), label=lst:logwrite, firstnumber=644]
488        void log_write() const {
489                if (log_level[logoffset]){
490                        vec offset_vec(2);
491                        offset_vec(0)=planned_offset;
492                        offset_vec(1)=planned_rating;
493                        log_level.store(logoffset, offset_vec);                 
494                }
495        } 
496\end{lstlisting}
497Posledn�olan�e� funkce agenta je \texttt{step()}, kter�en posouv�ntern�kazatel �u v agentovi o d�u kroku simulace.
498\begin{lstlisting}[caption=Funkce step(), label=lst:step, firstnumber=635]
499        void step() {
500                actual_time+=step_length;
501        }
502\end{lstlisting}
Note: See TracBrowser for help on using the browser.