| 1 | \chapter{Algoritmus �� |
|---|
| 2 | �olem t� pr� bylo navrhnout algoritmus vyjedn�n�ezi jednotliv�i�ovatkami tak, aby koordinovanou zm�u sv�fset�vo�zelenou vlnu a~tedy aby k�atkou projelo co nejv� vozidel bez zbyte�ho zastavov�. V~t� kapitole bude takov�goritmus p�aven a~n�edn�ude pops� jeho implementace do ji� funguj�ho simula�ho prost� |
|---|
| 3 | |
|---|
| 4 | Zelen�lna spo��~synchronizovan�nastaven�ign�� pl� tak, aby vozidlo jedouc��ou cestovn�ychlost���u k�atkami ���ln�gnaliza�mi za��astihlo na v�ech semaforech sign�volno. V~p��evn�gn�� pl� by tedy mohlo jen sta� vypo�at hodnoty offset�u��ch tento stav pro vybran� nebo sm� j�y. Pokud v�ak se v�ak v~oblasti k~hlavn� proudu p�uje velk�no�stv�ozidel z~vedlej�� ulic, za�u tyto automobily tvo�a optimalizovan�tahu fronty. Je tedy nutn��sobit sign��l� tak, aby tato fronta opustila k�atku je�t���dem vozidel vyu��j�ch zelenou vlnu. |
|---|
| 5 | |
|---|
| 6 | \section{Pou�it�na�� |
|---|
| 7 | |
|---|
| 8 | Pro popis algoritmu, kter�~toto p�soben�na��nejprve zavedeme ozna���er�li�. Jak ji� bylo zm�no, d�a cyklu se zna�$T_\mathrm{c}$. Pr�ou rychlost vozidel (na voln�ilnici) budeme zna� $v_\mathrm{P}$. Za�ek zelen�~$i$-t�ign��kupin�e $t_\mathrm{zz}^{(i)}$, d�a t� zelen�t_\mathrm{dz}^{(i)}$. Index $i$ se bude vynech�t, je-li sign��kupina jednozna� ur��~kontextu. Pomoc�d_{i,j}$ ozna�e vzd�nost mezi k�atkami $i$ a~$j$ v~metrech, op�s~mo�nost�ndexy vynechat. Kone� symbolem $\rho_i$ zastupuje hustotu provozu (po� vozidel za sekundu) b�m $i$-t� intervalu. |
|---|
| 9 | |
|---|
| 10 | D� zavad� pojem \emph{d�a virtu��ronty}, ozn. $Q_\mathrm{V}^{(i)}$. Ta m�ab�ladn�z�rn�dnot. Pokud je jej�elikost kladn�zna�(p�kl�nou) d�u fronty v~�ov�okam�iku ur��indexem $i$. V~p���e je z�rn�p�avuje, op�p�kl�n�et vozidel, kter�~m��vo�fronty projedou mezi �y $(i-1)$ a~$i$ bez zastaven� |
|---|
| 11 | |
|---|
| 12 | \section{N�h algoritmu} |
|---|
| 13 | \label{sec:navrh} |
|---|
| 14 | |
|---|
| 15 | Navr�en�trategie ��e skl� z~agent�e�ou p�eni k~jednotliv��ovatk� Ka�d�t m�vl�t offset sign�� pl� u~sv� �e k�atky, od n�� naopak z�� � z~detektor�isuj� aktu��tav provozu. Soused� agenti nav�mezi sebou mohou komunikovat. Toho vyu��j����k~tomu, aby zjistili nastaven�ffsetu na vedlej�� k�atk�, respektive aby v�li kdy mohou od soused�k�t p�d vozidel. Z~obdr�en�formac�ak agent usoud�jestli by zm� sousedova offsetu nemohla p�t zlep�en�ituace a~pokud ano, pokus�e tuto zm� vyjednat. |
|---|
| 16 | |
|---|
| 17 | Jedn�z~nosn�vk�rhu je funkce, kter�hodnot�onkr��astaven�ffsetu a~umo�n�ak porovnat r�jeho hodnoty a~vybrat tu mo�n�ejlep��Za tuto m� kvality byl zvolen odhad po� automobil�er�rojedou k�atkou bez zastaven� |
|---|
| 18 | Do v� jsou zahrnuta jen vozidla ze sm� od jin�zen�i�ovatek. |
|---|
| 19 | |
|---|
| 20 | Pro v� hodnocen�v~programu naz� \texttt{rating}) je t�zn�pro ka�d�n�ruh na vjezdech do k�atky d�u fronty a~o��n�asy p�d�idel od sousedn��atky. D�a fronty se �pozd�, p�dy pak agent z�� p�od souseda. Ten je po��odle vztahu |
|---|
| 21 | \begin{equation} |
|---|
| 22 | t_\mathrm{z} = t_{\mathrm{zz}} + \frac{d}{v_\mathrm{P}} + \mathit{offset} |
|---|
| 23 | \label{eq:tz} |
|---|
| 24 | \end{equation} |
|---|
| 25 | a~\begin{equation} |
|---|
| 26 | t_\mathrm{k} = t_\mathrm{z} + t_{\mathrm{dz}} \;, |
|---|
| 27 | \label{eq:tk} |
|---|
| 28 | \end{equation} |
|---|
| 29 | kde $t_\mathrm{z}$ je � za�ku p�du aut a~$t_\mathrm{k}$ � konce. D� pak $t_{\mathrm{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_{\mathrm{dz}}$ d�a sv�n�elen�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�je zelenou ve sm� p��t�c�j�u k~sousedovi ��j�mu o~odhady. |
|---|
| 30 | |
|---|
| 31 | \begin{figure}% |
|---|
| 32 | \centering |
|---|
| 33 | \includegraphics[width=\columnwidth]{expand}% |
|---|
| 34 | \caption{Periodick�rodlou�en�ntervalu sv�n�elen�Mod�ou ozna�y intervaly, kdy p�d� vozidla, zelen�nterval, kdy dle sign�� pl� sv� zelen�se zapo��m offsetu). Horn�br�k p�avuje stav p�rodlou�en� doln�o n�}% |
|---|
| 35 | \label{fig:expand}% |
|---|
| 36 | \end{figure} |
|---|
| 37 | |
|---|
| 38 | Hodnocen�e pak po�� po jednotliv�zdn� pruz�. Pro ka�d�utn�rov� periodick�rodlou�en�asu sv�n�elen�dpov�j� sign��kupiny tak, aby v~ka�d�okam�iku intervalu od �u $0$ po � posledn� p�v�n� p�du vozidel bylo jasn�jak� bude v~tomto j�n�pruhu signalizov� Tento interval je d� zna� $T$. Princip periodick� prodlou�en�e p�aven na obr�u \ref{fig:expand}. |
|---|
| 39 | |
|---|
| 40 | Interval $T$ pot�ozd�me 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 \emph{v��ody}, T� se rozum�ody, ve kter� m� signalizovan� nebo ve kter���i kon�p�d vozidel od souseda. Ka�d�rval $T_i$ lze t�p�m rozd�t na ��uhy, podle toho jestli v~n�p�d� nebo nep�d� vozidla a~jestli sv� nebo nesv� zelen��kneme, �e $T_i$ je |
|---|
| 41 | \begin{itemize}%[(i)] |
|---|
| 42 | \item typu 1 $\iff$ v~jeho pr� p�d� auta do fronty a~sv� zelen� \item typu 2 $\iff$ v~jeho pr� p�d� auta do fronty a~nesv� zelen� \item typu 3 $\iff$ v~jeho pr� nep�d� auta do fronty a~sv� zelen� \item typu 4 $\iff$ v~jeho pr� nep�d� auta do fronty a~nesv� zelen�\end{itemize} |
|---|
| 43 | |
|---|
| 44 | Pomoc�ohoto d�n�ak po�� d�u virtu��ronty na konci interval�i$ n�eduj�m zp�m: |
|---|
| 45 | \begin{equation} |
|---|
| 46 | Q_\mathrm{V}^{(i)} = Q_\mathrm{V}^{(i-1)} + u(T_i)\,, |
|---|
| 47 | \label{eq:qk} |
|---|
| 48 | \end{equation} |
|---|
| 49 | |
|---|
| 50 | kde $Q_\mathrm{V}^{(i)}$ je d�a virtu��ronty na konci $i$-t� intervalu. Funkce $\mathrm{u}(T_i)$ je definov� takto: \mbox{$\mathrm{u}:\left<a;b\right> \rightarrow \mathbb{R}$} |
|---|
| 51 | \begin{equation} |
|---|
| 52 | \mathrm{u}(T_i)= |
|---|
| 53 | \begin{cases} |
|---|
| 54 | |T_i|\cdot (c_o-\rho_i) &\text{pokud } T_i \text{ je typu 1} \\ |
|---|
| 55 | |T_i|\cdot \rho_i &\text{pokud } T_i \text{ je typu 2} \\ |
|---|
| 56 | -|T_i|\cdot c_o &\text{pokud } T_i \text{ je typu 3} \\ |
|---|
| 57 | 0 &\text{pokud } T_i \text{ je typu 4} |
|---|
| 58 | \end{cases} |
|---|
| 59 | \;. |
|---|
| 60 | \label{eq:uti} |
|---|
| 61 | \end{equation} |
|---|
| 62 | |
|---|
| 63 | kde $|T_i|$ je d�a intervalu $T_i$, $\rho_i$ hustota p�d�c� vozidel b�m intervalu $T_i$ a~$c_o$ je empiricky zji�t� konstanta -- po� vozidel, kter�a sekundu opust��atku (tedy vlastn�ustota odj��c� vozidel). |
|---|
| 64 | |
|---|
| 65 | Definice funkce $\mathrm{u}(T_i)$, zapsan�ztahem (\ref{eq:uti}), nen�pln�Je�t�e nutn�oplnit omezen�\begin{equation} |
|---|
| 66 | \left( \forall i~\in \left\{ 1, \dotsc , k~\right\} \right) \left( T_i \text{ je interval typu 3} \right) : \quad |
|---|
| 67 | -\mathrm{u}(T_i) < Q_{\mathrm{V}}^{(i-1)} |
|---|
| 68 | \label{eq:uti-omez} |
|---|
| 69 | \end{equation} |
|---|
| 70 | |
|---|
| 71 | Tato podm�a � �e pokud z~fronty pouze odj�� vozidla, nesm�e st� aby voln�apacita po vypr�n� fronty byla zapo�� do hodnocen�V~tuto chv� toti� nep�d� ���ozidla, kter�y k�atkou projela bez zastavov�. |
|---|
| 72 | |
|---|
| 73 | Pokud vyjde v~n�k�okam�iku $Q_\mathrm{V}^{(i)}$ z�rn�p�avuje (odhadovan�et aut, kter�ohou v~tomto intervalu k�atkou projet bez zastaven�~tato hodnota se tedy ode� od hodnocen�an��atky (a~t�se hodnocen�v� |
|---|
| 74 | |
|---|
| 75 | Vyvst� ot�a, jak zjistit aktu���y front na jednotliv�zdn� pruz� 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 pomoc�GS API. Podrobn��nformace o~modelov� d�y fronty p�avuje nap�d \cite{pecherkova}. VGS API fronty po���zp�m, �e projde cel�lu�n�n�ruh a~v~n�do fronty zapo��a vozidla, kter�edou ni���e� stanovenou hrani� rychlost� |
|---|
| 76 | |
|---|
| 77 | P�motn�vyjedn�n�ak maj�genti dv�ole: jedna z~nich je zvan�emph{pasivn� druh�e \emph{aktivn� Pasivn�gent m�evn�astaven�et a~pouze 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 pak vypl�le aktivn� agenta. Ten stejn�ako pasivn�gent pracuje se ��stmi o~�y p�d�v�v�ak aktivn�� sv�fset a~pokou��e vyjednat zm� u~soused� |
|---|
| 78 | Vyjedn�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� |
|---|
| 79 | |
|---|
| 80 | Hled� 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�chto mo�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. |
|---|
| 81 | |
|---|
| 82 | Kdy� 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�dobn�sobem jako p�ed� vlastn� nejlep�� offsetu zkus�dhadnout zm� \texttt{ratingu} p�sunu sousedova offsetu o~$\pm4$ a~nejlep��e t��nost�e za�le jako ��st o~posun offsetu sousedovi spolu se zm�u \texttt{ratingu}, kterou by p�la. |
|---|
| 83 | |
|---|
| 84 | Ka�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 znamenaly z�rn�et, jsou zam�uty a~offset z��a p��odnot�V~ka�d�p��sou pak rozesl� informace o~nov�stabiln�stavu a~s~nimi op�o��n��dy. |
|---|
| 85 | |
|---|
| 86 | Pot�e je�t�as�n��st�pakuje, jen s~posunem o~$\pm2$ a~$\pm1$ sekundu. |
|---|
| 87 | |
|---|
| 88 | T�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�b�out i~n�lik cykl�tohoto d� se vypo�an�et nepos� ihned po nalezen�ale agent v�dy v~p� cyklech napo��ptim��ffset, z~t�to p� hodnot spo��r�a~teprve ten se n�edn���i ke zpracov�. T�je tak�n�na reaktivnost agenta a~zamez�e tak p�n�hnan�kc�na chvilkov�m� popt�y, kter�jn�en�o�n�yhov� |
|---|
| 89 | |
|---|
| 90 | \section{Pou�it�nihovny} |
|---|
| 91 | Pro 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��dnot 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. |
|---|
| 92 | |
|---|
| 93 | \subsection{IT++} |
|---|
| 94 | \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� |
|---|
| 95 | |
|---|
| 96 | Pro 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. |
|---|
| 97 | |
|---|
| 98 | Vektor m� nadefinovat jedn�z~t�to zp� |
|---|
| 99 | \lstset{language=C++, showstringspaces=false} |
|---|
| 100 | \begin{lstlisting} |
|---|
| 101 | vec my_vector; |
|---|
| 102 | vec my_vector(10); |
|---|
| 103 | \end{lstlisting} |
|---|
| 104 | p�� prvn�~nich pro vektor nealokuje pam� To je pak nutn�d�t funkc�texttt{setsize()}. N�edn�e mo�n�lo�it do vektoru jednotliv�rvky a~to nap�d jedn�z~n�eduj�ch p��begin{lstlisting} |
|---|
| 105 | vec a = "0 0.7 5 9.3"; // tedy a = [0 0.7 5 9.3] |
|---|
| 106 | ivec b = "0:5"; // tedy b = [0 1 2 3 4 5] |
|---|
| 107 | vec c = "3:2.5:13"; // tedy c = [3 5.5 8 10.5 13] |
|---|
| 108 | ivec d = "1:3:5,0:2:4"; // tedy d = [1 3 5 0 2 4] |
|---|
| 109 | vec e("1.2,3.4,5.6"); // tedy e = [1.2 3.4 5.6] |
|---|
| 110 | \end{lstlisting} |
|---|
| 111 | Nav�lze i-t� prvku vektoru \texttt{a} p�povat pomoc�lstinline!a(i)! nebo \lstinline[]!a[i]!. |
|---|
| 112 | |
|---|
| 113 | D� p�en�per�r� s~vektory p�prov�t b��atematick�perace, jako jsou: |
|---|
| 114 | \begin{lstlisting} |
|---|
| 115 | a+b // sou� vektor�5 // p�n��a 5 ke v�em prvk�ktoru |
|---|
| 116 | a*b // skal��ou� vektor�9 // vyn�ben��ech prvk�toru �lem 9 |
|---|
| 117 | \end{lstlisting} |
|---|
| 118 | a~tak podobn� |
|---|
| 119 | |
|---|
| 120 | Pr� s~maticemi funguje podle obdobn�avidel. |
|---|
| 121 | |
|---|
| 122 | D� 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� |
|---|
| 123 | \begin{lstlisting} |
|---|
| 124 | Array<vec> pole_vektoru(2); |
|---|
| 125 | my_vec_array(0) = "2 4 5 0 3";; |
|---|
| 126 | my_vec_array(1) = "0.1 0.2 0.3 0.4 0.3 0.2 0.1"; |
|---|
| 127 | \end{lstlisting} |
|---|
| 128 | Pomoc�lstinline!pole_vektoru(i)! lze u~takto definovan� pole intuitivn��povat k~jeho prvk�av�je mo�n�rov�t operace jako jsou posuny prvk�b�podmno�iny prvk�o t�prost�ho prvku a~mnoh�al�� |
|---|
| 129 | |
|---|
| 130 | \subsection{BDM} |
|---|
| 131 | Knihovna \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}. BDM nav�definujeme t�\texttt{Participant}, kter�e z�adem rozhodovac� proces�d kter�e pak odvozuje agent pro ��opravy. |
|---|
| 132 | |
|---|
| 133 | T�\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. |
|---|
| 134 | |
|---|
| 135 | �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�lo�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}. |
|---|
| 136 | |
|---|
| 137 | \begin{figure}% |
|---|
| 138 | \centering |
|---|
| 139 | \includegraphics[width=7cm]{rv}% |
|---|
| 140 | \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]}% |
|---|
| 141 | \label{fig:rv}% |
|---|
| 142 | \end{figure} |
|---|
| 143 | |
|---|
| 144 | Pro 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�. |
|---|
| 145 | |
|---|
| 146 | Kone� \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�v~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. |
|---|
| 147 | |
|---|
| 148 | \subsection{Libconfig} |
|---|
| 149 | Konfigura� 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. |
|---|
| 150 | |
|---|
| 151 | Podporovan��soubor�dstavuje hierarchickou strukturu. \emph{Konfigurace} se skl� ze skupiny \emph{nastaven� kter��uje \emph{jm�m} \emph{hodnoty}. Hodnotou m��ph{skal�, \emph{pole}, \emph{skupina} nebo \emph{seznam}. Skupiny nastaven�ze do sebe d� vno�, �� knihovna nab� velmi flexibiln�~p� st� p�dn�ob pro ukl�n�onfigura�ch soubor� |
|---|
| 152 | \section{Struktura programu} |
|---|
| 153 | |
|---|
| 154 | Fungov� simula�ho prost�tak, jak bylo navr�eno v~�IA, je zn�rn� na obr�u (\ref{fig:struktura}). Skl� se ze t�avn� blok�krosimul�ru Aimsun, emul�r�i�ELS3 a~z~tzv. Aimsun agenta a ze t�I zprost�v�j�mi komunikaci mezi bloky. |
|---|
| 155 | |
|---|
| 156 | Aimsun agent p�avuje ��rvek cel� syst�. P�texttt{vgs\_api} spou�t�imsun a~stejn�sobem od Aimsunu pr����odnoty sledovan�pravn� veli�. D� prost�ctv�\texttt{eh\_api} z�� � z~���ovatek. Na z�ad��ech shrom��ch � pak sestavuje pokyny pro zm� v~sign�� pl�ch a~op�pomoc�texttt{ea\_api} tyto pokyny zas� �� |
|---|
| 157 | |
|---|
| 158 | Na 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}. |
|---|
| 159 | |
|---|
| 160 | \begin{figure}% |
|---|
| 161 | \centering |
|---|
| 162 | \includegraphics[width=\columnwidth]{aimsun-agents}% |
|---|
| 163 | \caption{Komunikace jednotliv�mponent simula�ho prost�% |
|---|
| 164 | \label{fig:struktura}% |
|---|
| 165 | \end{figure} |
|---|
| 166 | |
|---|
| 167 | \section{VGS API} |
|---|
| 168 | Velmi 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�. |
|---|
| 169 | |
|---|
| 170 | %Jedn�z nejd�t�� � p�mulaci re�� zat�n�opravn�� 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. |
|---|
| 171 | |
|---|
| 172 | P�j��etodou je v� 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� pravd�dobnosti vjezd�i�� nej�t� pou��n�e rovnom��i Poissonovo rozd�n� |
|---|
| 173 | |
|---|
| 174 | %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� |
|---|
| 175 | |
|---|
| 176 | Vedle pr� se vstupn�aty pro simulaci se VGS API star�ak�~zpracov� dat v��. Aimsun sice zvl� export v��ulac�o textov�ubor�bsahuje i~n�roje pro jejich vizualizaci, neumo�� v�ak p�n�er��t�rocesy 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, st�, 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��. |
|---|
| 177 | |
|---|
| 178 | %Druh�e�it��m VGS API je shroma��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. |
|---|
| 179 | |
|---|
| 180 | Implementac�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. |
|---|
| 181 | |
|---|
| 182 | %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 |
|---|
| 183 | |
|---|
| 184 | \section{Program main_loop.exe} |
|---|
| 185 | \label{sec:main_loop} |
|---|
| 186 | |
|---|
| 187 | Simulace je obsluhov� z~programu \emph{main\_loop.exe}. Ten se star�~na�n�onfigurace, spu�t� simul�ru Aimsun a~p�avuje komunika�ho prost�ka mezi jednotliv�enty. |
|---|
| 188 | |
|---|
| 189 | Konfigura� soubor obsahuje n�lik prvk�znam (\texttt{list}) \texttt{agents} se skl� z~popisu jednotliv�ent�edev��je definov� t� jej�instance agenta p�avuje, a~unik��m� agenta (\texttt{name}). Dal��rom��~konfigura�m souboru z���a pou�it��pro konstrukci agenta, ka�d��m��sv�pecifick�o�adavky. Skupina (\texttt{group}) \texttt{logger} ur�e, jak n�v napov�, t�pou�itou pro logov� � b�m simulace. Skupina \texttt{system} obsahuje parametry pro simul�r a~konfigura� soubor uzav�j�statn��ite� prom��espadaj� do v�eden�tegori� |
|---|
| 190 | |
|---|
| 191 | Komunikaci mezi agenty program zaji��uje obsluhou fronty zpr� Zpr� jsou ve form� knihovny \texttt{libconfig}, obsahuj�v�lo�ky povinn�~libovoln�t slo�ek voliteln�ezbytn�aji jsou �ec \texttt{to}, obsahuj� p�ce zpr�, a~�ec \texttt{what}, kter���t zpr�. Dal��oz��n�orm� zpr�je pak na pot�h pou�it�ent� |
|---|
| 192 | Program se d�ozd�t na samostatn�loky tak, jak je zobrazeno na obr�u \ref{fig:mainloop}. Z~tohoto n�esu bude vych�t n�eduj� popis. |
|---|
| 193 | |
|---|
| 194 | \begin{figure}[t]% |
|---|
| 195 | \centering |
|---|
| 196 | \includegraphics[width=8.5cm]{mainloop3}% |
|---|
| 197 | \caption{Strukuta fungov� programu \texttt{main_loop.exe}, podrobn� popsan�~podkapitole \ref{sec:main_loop}}% |
|---|
| 198 | \label{fig:mainloop}% |
|---|
| 199 | \end{figure} |
|---|
| 200 | |
|---|
| 201 | B�m \emph{inicializace} je na�n konfigura� soubor, jeho� jm� se p��ako jedin�metr p�ou�t� \texttt{main_loop.exe}. 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. |
|---|
| 202 | |
|---|
| 203 | N�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. |
|---|
| 204 | |
|---|
| 205 | Pot�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�er�e budou v~pr� simulace logovat. |
|---|
| 206 | |
|---|
| 207 | Pokra�e se �dn�for cyklem. �st \texttt{z�� dat} v~sob�ahrnuje ulo�en�ogovan�dnot ze simul�ru a~pak p���ulo�en�ektoru $d_t$ do prom��texttt{glob_dt} a~jeho odesl� agent� zpracov� funkc�texttt{adapt()}. |
|---|
| 208 | |
|---|
| 209 | V~n�eduj� f� p�z�a �vyjedn�c�yklus, kter�ab�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 proch� od konce a~adresovan�nt�ou p�� p��n�pr�. To se d� zavol�m funkce \texttt{recieve()} se zpr�u jako parametrem. V~p���e adres�nen�alezen a~zpr� nelze doru�, je ozn�no varov�, ale pokra�e se v~�nosti. |
|---|
| 210 | |
|---|
| 211 | Po vypr�n� fronty nast� � pro \emph{vys�n�pr�. To spo��e spu�t� funkce \texttt{broadcast()} u~v�ech agent�e�j�yn��itost vlo�it do fronty zpr�libovoln�t sd�n�ro ostatn�genty; nemus�v�em vys�t ��� |
|---|
| 212 | |
|---|
| 213 | Dal��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 tak�~p��kdy prob�e stanoven�m��o� vyjedn�c� cykl�staven�om��texttt{max_cycles}. Po� cykl�v�ak m�b�taven tak, aby k~jeho dosa�en�edoch�lo; pokud se tak stane, m�o b�n�m probl� v~programu. |
|---|
| 214 | |
|---|
| 215 | Posledn�� 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�lka kroku je pevn�astavena na 90~s~-- to z~toho d�, �e v~Praze jsou � z~detektor�r� pr� v~tomto intervalu. |
|---|
| 216 | |
|---|
| 217 | Tato smy� se opakuje dokud nen�osa�en v~konfigura�m souboru nastaven�simulace. \emph{Zakon��spo��i� jen v~zaps� log souboru. |
|---|
| 218 | |
|---|
| 219 | \section{Implementace navr�en� algoritmu} |
|---|
| 220 | |
|---|
| 221 | Algoritmus popsan�pitole \ref{sec:navrh} je implementov�pomoc�gent�e�ou instancemi t�\texttt{GreenWaveTrafficAgent}, kter�e definov� v~souborech \texttt{traffic_agent_offset.cpp} a~\texttt{traffic_agent_offset.h}. O~mo�nost z�� zdrojov�ubor�ormuje p�a \ref{app:src}. |
|---|
| 222 | |
|---|
| 223 | T�je odvozena od p� jm�m \texttt{BaseTrafficAgent}. Ten slou��rakticky jen jako 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� kter�stavuje 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}), tzn. pokud je v~potomkovi redefinujeme, je zaru�o vol� t�to nov�nkc� |
|---|
| 224 | |
|---|
| 225 | \subsection{Ve� funkce} |
|---|
| 226 | |
|---|
| 227 | Ve� (\texttt{public}) funkce ve t�\texttt{GreenWaveTrafficAgent} p�uj�unkce definovan�~p�ch a~p�avuj�ozhran�ro komunikaci s~hlavn�programem a~t�i~ostatn� agenty. |
|---|
| 228 | |
|---|
| 229 | Prvn�o vytvo�instance agenta prob�e zavol� funkce \texttt{from_setting()}. V~t�e nejprve vol�tejnojmenn�unkce p�, kter�a��~konfigurace z�adn�arametry, jmenovit� |
|---|
| 230 | \begin{description} |
|---|
| 231 | \item[lanes] Informace o~j�n� pruz�. |
|---|
| 232 | \item[neighbours] Jm� agent�ousedn� k�atek. |
|---|
| 233 | \item[green_names] Jm� jednotliv�gn�� skupin. |
|---|
| 234 | \item[green_starts] �s, ve kter�lu�n�ign��kupiny rozsv�j�elenou. |
|---|
| 235 | \item[green_times] D�a trv� sv�n�elen�an�ign��kupiny, uv�na jako pom�$\text{doba sv�n�\text{d�a cyklu}$. |
|---|
| 236 | \end{description} |
|---|
| 237 | a~n�er�al��kter�ro tuto pr� nejsou d�t� |
|---|
| 238 | |
|---|
| 239 | Popis jednotliv�zdn� pruh�zaslou��odrobn��ozebr�. Ten toti� pro agenta p�avuje st�jn�� informac�~topologii j����atky. Do konfigura�ho souboru se uv�j��echny takov��n�ruhy, kter�on�n�kou stop �ou dan��atky. Ka�d�n�ruh pak m��eduj� parametry: \texttt{sg}, co� je sign��kupina do kter�at�texttt{inputs} je seznam detektor�vjezdu do tohoto pruhu, \texttt{outputs} je seznam detektor�sousedn� k�atk�, ke kter�e vozidlo z~tohoto pruhu dojet. Pokud se vozidla mohou dostat do m�, kde ���ktor nen�je zde za ka�d�v��uveden �fale�n�ektor \texttt{DUMMY_DET}. D� konfigurace obsahuje \texttt{input_distances}, pole vzd�nost�stupn� detektor�stop �y, podobn�texttt{output_distances} je pole vzd�nost��� detektor��fale�n�ehraje roli), \texttt{alpha} je pole pom� odbo��~jednotliv�tupn�detektor�texttt{queue} jm� fronty, kter�e na dan�pruhu tvo�kone� \texttt{beta} je koeficient, kter�n�b��a fronty b�m v�, kter�gent prov�. |
|---|
| 240 | |
|---|
| 241 | Agent po z�� informac�~j�n� pruz� vytvo�o ka�d�ch instance t�texttt{Lane} a~\texttt{LaneHandler}, kter��avuj�ezivrstvu mezi agentem a~fyzick�dn�pruhem se skute�mi detektory. |
|---|
| 242 | |
|---|
| 243 | D� se ve funkci \texttt{from_setting()} nastavuj�odnoty konstant a~v� hodnoty n�er�om��onkr��de |
|---|
| 244 | o~\begin{description} |
|---|
| 245 | \item[car_leaving_time] �s v~sekund�, ze kter�o auto opust�rontu ($c_0$). |
|---|
| 246 | \item[VP] Pr��ychlost j�y automobilu mezi k�atkami na voln�ilnici ($v_\mathrm{P}$). |
|---|
| 247 | \item[actual_time] Uchov� aktu��as simulace (v~sekund�). |
|---|
| 248 | \item[negot_cycle] Po� ji� prob��jedn�c� cykl�posledn� pr�v�. |
|---|
| 249 | \item[cycle_count] Hranice po� cykl� jej� dosa�en�ast� pr�v� z�an�fset�\item[total_offset] Hodnota sou� dosud vyjednan�fset�posledn� pr�v�. |
|---|
| 250 | \item[negot_start] Krok, kter�za���ed� ide�� offsetu u~souseda. |
|---|
| 251 | \item[negot_limit] Krok, kter�kon�p�ed� ide�� offsetu u~souseda. |
|---|
| 252 | \item[find_best_start] Krok, kter�� hled� nejlep�� vlastn� offsetu. |
|---|
| 253 | \item[find_best_limit] Krok, kter��hled� nejlep�� vlastn� offsetu. |
|---|
| 254 | \item[passive] Indikuje zda agent zast� pasivn�ebo aktivn�oli. |
|---|
| 255 | \end{description} |
|---|
| 256 | |
|---|
| 257 | Hodnoty konstant lze z~v�ch hodnot p�t uveden�prom��~konfigura�m souboru. |
|---|
| 258 | |
|---|
| 259 | V~z�ru je pak z~konfigurace na�n v� offset, role agenta a~p�ven vektor v�� hodnot \texttt{outputs} spolu s~jeho popisem \texttt{rv_outputs}. Na �m konci je je�t�apnuto logov� hodnot offset� pozd��yhodnocen� |
|---|
| 260 | |
|---|
| 261 | \lstset{language=[Visual]C++,showstringspaces=false,numbers=left, numberstyle=\tiny, numbersep=0pt, tabsize=2, breaklines, breakautoindent=false, captionpos=b} |
|---|
| 262 | %\begin{lstlisting}[caption=Funkce from_setting(), label=lst:from, firstnumber=587] |
|---|
| 263 | % void from_setting(const Setting &set) { |
|---|
| 264 | % BaseTrafficAgent::from_setting(set); |
|---|
| 265 | % |
|---|
| 266 | % RV rv_exp; |
|---|
| 267 | % |
|---|
| 268 | % car_leaving=2; |
|---|
| 269 | % VP=45; |
|---|
| 270 | % actual_time=0; |
|---|
| 271 | % |
|---|
| 272 | % negoT_{\mathrm{c}}ycle=1; |
|---|
| 273 | % cycle_count=5; |
|---|
| 274 | % total_offset=0; |
|---|
| 275 | % |
|---|
| 276 | % negot_offset=4; |
|---|
| 277 | % negot_limit=1; |
|---|
| 278 | % |
|---|
| 279 | % passive=0; |
|---|
| 280 | % |
|---|
| 281 | % UI::get(last_offset, set, "offset", UI::compulsory); |
|---|
| 282 | % UI::get(passive, set, "passive", UI::optional); |
|---|
| 283 | % |
|---|
| 284 | % for (int i=0;i<lanes.length();i++) { |
|---|
| 285 | % for (int j=0;j<lanes(i).outputs.length();j++) { |
|---|
| 286 | % if (lanes(i).outputs(j)!="DUMMY_DET") { |
|---|
| 287 | % rv_exp=RV(lanes(i).outputs(j)+"-"+name+"_"+to_string(i),3); |
|---|
| 288 | % rv_outputs.add(rv_exp); |
|---|
| 289 | % } |
|---|
| 290 | % } |
|---|
| 291 | % } |
|---|
| 292 | % outputs.set_size(rv_outputs._dsize()); |
|---|
| 293 | % |
|---|
| 294 | % log_level[logoffset]=true; |
|---|
| 295 | % } |
|---|
| 296 | %\end{lstlisting} |
|---|
| 297 | |
|---|
| 298 | Dal��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~hodnoty stavov�om��ou vr�ny do sv�choz� hodnot. |
|---|
| 299 | |
|---|
| 300 | %\begin{lstlisting}[caption=Funkce adapt(), label=lst:adapt, firstnumber=415] |
|---|
| 301 | % void adapt(const vec &glob_dt) { |
|---|
| 302 | % BaseTrafficAgent::adapt(glob_dt); |
|---|
| 303 | % |
|---|
| 304 | % for (int i=0;i<lanehs.length();i++) { |
|---|
| 305 | % lanehs(i)->queue=queues(lanehs(i)->queue_index); |
|---|
| 306 | % } |
|---|
| 307 | % |
|---|
| 308 | % planned_offset=last_offset; |
|---|
| 309 | % |
|---|
| 310 | % //set state variables to default values |
|---|
| 311 | % final_state=false; |
|---|
| 312 | % new_stable_state=false; |
|---|
| 313 | % send_requests=false; |
|---|
| 314 | % need_exps=true; |
|---|
| 315 | % negot_offset=4; |
|---|
| 316 | % } |
|---|
| 317 | %\end{lstlisting} |
|---|
| 318 | |
|---|
| 319 | Funkce \texttt{recieve()} zpracov� p��pr� od ostatn� agent� za�ku je p��pr� rozd�na do jednotliv�om�� |
|---|
| 320 | %\begin{lstlisting}[caption={Fragment funkce \texttt{recieve()}, inicializace}, label=lst:recieveInit, firstnumber=491] |
|---|
| 321 | % void receive(const Setting &msg){ |
|---|
| 322 | % string what; |
|---|
| 323 | % string to; |
|---|
| 324 | % string from; |
|---|
| 325 | % vec value; |
|---|
| 326 | % RV *rv; |
|---|
| 327 | % |
|---|
| 328 | % UI::get(what, msg, "what", UI::compulsory); |
|---|
| 329 | % UI::get(to, msg, "to", UI::compulsory); |
|---|
| 330 | % UI::get(from, msg, "from"); |
|---|
| 331 | % UI::get(rv, msg, "rv"); |
|---|
| 332 | % UI::get(value, msg, "value"); |
|---|
| 333 | %\end{lstlisting} |
|---|
| 334 | |
|---|
| 335 | D� 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}. |
|---|
| 336 | |
|---|
| 337 | %\begin{lstlisting}[caption={Fragment funkce \texttt{recieve()}}, label=lst:recieveExpReq, firstnumber=last] |
|---|
| 338 | % if (what=="expected_times_request"){ |
|---|
| 339 | % requesters.push_back(from); |
|---|
| 340 | % } |
|---|
| 341 | % |
|---|
| 342 | %\end{lstlisting} |
|---|
| 343 | |
|---|
| 344 | Pokud 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��texttt{new_stable_state} nastavena na \texttt{true}, co� ur�e dal��innost agent ve f� vys�n�pr� |
|---|
| 345 | |
|---|
| 346 | %\begin{lstlisting}[caption={Fragment funkce \texttt{recieve()}}, label=lst:recieveNewExp, firstnumber=last] |
|---|
| 347 | % else if (what=="new_expected_cars") { |
|---|
| 348 | % rv_recieved_exps=*rv; |
|---|
| 349 | % recieved_exps=value; |
|---|
| 350 | % |
|---|
| 351 | % if (!passive) { |
|---|
| 352 | % planned_offset=find_best_offset(planned_offset,8); |
|---|
| 353 | % planned_offset=normalize_offset(planned_offset); |
|---|
| 354 | % } |
|---|
| 355 | % |
|---|
| 356 | % planned_rating=count_rating(planned_offset, recieved_exps, rv_recieved_exps); |
|---|
| 357 | % |
|---|
| 358 | % // we have new stable state to broadcast |
|---|
| 359 | % new_stable_state=true; |
|---|
| 360 | % } |
|---|
| 361 | %\end{lstlisting} |
|---|
| 362 | Obdr�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��omoc�unkce \texttt{find_best_exps()}, 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 byla prom��texttt{negot_offset} ji� ni���e� ne� \texttt{negot_limit}, p��e agent do kone�ho stavu, nebo� ji� nem�al��rostor k~vyjedn�n�e sousedy. |
|---|
| 363 | |
|---|
| 364 | %\begin{lstlisting}[caption={Fragment funkce \texttt{recieve()}}, label=lst:recieveStable, firstnumber=last] |
|---|
| 365 | % else if (what=="stable_state") { |
|---|
| 366 | % rv_recieved_exps=*rv; |
|---|
| 367 | % recieved_exps=value; |
|---|
| 368 | % |
|---|
| 369 | % planned_rating=count_rating(planned_offset, recieved_exps, rv_recieved_exps); |
|---|
| 370 | % |
|---|
| 371 | % if (!passive) { |
|---|
| 372 | % for (int i=0;i<neighbours.length();i++) { |
|---|
| 373 | % rv_change_request.add(RV(neighbours(i)+"_change",2)); |
|---|
| 374 | % change_request.set_size(rv_change_request._dsize()); |
|---|
| 375 | % ivec ind=RV(neighbours(i)+"_change",2).dataind(rv_change_request); |
|---|
| 376 | % |
|---|
| 377 | % // offset change |
|---|
| 378 | % change_request(ind(0))=find_best_exps(negot_offset,neighbours(i),rating_change); |
|---|
| 379 | % // rating change |
|---|
| 380 | % change_request(ind(1))=rating_change; |
|---|
| 381 | % } |
|---|
| 382 | % |
|---|
| 383 | % if (negot_offset>=negot_limit) { |
|---|
| 384 | % negot_offset/=2; |
|---|
| 385 | % send_requests=true; |
|---|
| 386 | % } |
|---|
| 387 | % else { |
|---|
| 388 | % final_state=true; |
|---|
| 389 | % } |
|---|
| 390 | % } |
|---|
| 391 | % else { |
|---|
| 392 | % final_state=true; |
|---|
| 393 | % } |
|---|
| 394 | % } |
|---|
| 395 | %\end{lstlisting} |
|---|
| 396 | P�ijet�pr� se ��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�m� 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] |
|---|
| 397 | % else if (what=="offseT_{\mathrm{c}}hange_request") { |
|---|
| 398 | % double final_rating_diff; |
|---|
| 399 | % |
|---|
| 400 | % rv_recieved_changes=*rv; |
|---|
| 401 | % recieved_changes=value; |
|---|
| 402 | % |
|---|
| 403 | % for (int i=0;i<rv_recieved_changes.length();i++) { |
|---|
| 404 | % |
|---|
| 405 | % ivec ind=RV(rv_recieved_changes.name(i),2).dataind(rv_recieved_changes); |
|---|
| 406 | % |
|---|
| 407 | % final_rating_diff=-planned_rating+count_rating(planned_offset+(int)recieved_changes(ind(0)), recieved_exps, rv_recieved_exps)+recieved_changes(ind(1)); |
|---|
| 408 | % if (final_rating_diff>=0) { |
|---|
| 409 | % planned_offset+=(int)recieved_changes(ind(0)); |
|---|
| 410 | % planned_offset=normalize_offset(planned_offset); |
|---|
| 411 | % planned_rating+=final_rating_diff; |
|---|
| 412 | % } |
|---|
| 413 | % } |
|---|
| 414 | % |
|---|
| 415 | % new_stable_state=true; |
|---|
| 416 | % } |
|---|
| 417 | %\end{lstlisting} |
|---|
| 418 | |
|---|
| 419 | Kdy� p� zpr� s~p�tem, kter�ttt{GreenWaveTrafficAgent} neum�pracovat, p��i p�vi. Pokud by se stalo, �e ani ten si se zpr�u neporad�po�le zpr� sv� p�vi (tedy t�\texttt{bdm::Participant}), kter�kov�p��yvol�arov� o~nezpracovateln�pr�. |
|---|
| 420 | %\begin{lstlisting}[caption={Fragment funkce \texttt{recieve()}}, label=lst:recieveBase, firstnumber=last] |
|---|
| 421 | % else { |
|---|
| 422 | % BaseTrafficAgent::receive(msg); |
|---|
| 423 | % } |
|---|
| 424 | % } |
|---|
| 425 | %\end{lstlisting} |
|---|
| 426 | |
|---|
| 427 | Funkce \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~tento seznam n�edn�ypr�n�D� pak za ka�dou ze stavov�om��ter�e rovnaj�texttt{true} sestav���nou zpr� a~hodnotu zm� na \texttt{false}. |
|---|
| 428 | |
|---|
| 429 | %\begin{lstlisting}[caption=Funkce broadcast(), label=lst:broadcast, firstnumber=429] |
|---|
| 430 | % void broadcast(Setting& set){ |
|---|
| 431 | % |
|---|
| 432 | % //ask neighbours for exptected arrive times |
|---|
| 433 | % if (need_exps) { |
|---|
| 434 | % for (int i=0; i<neighbours.length(); i++){ |
|---|
| 435 | % Setting &msg =set.add(Setting::TypeGroup); |
|---|
| 436 | % UI::save ( neighbours(i), msg, "to"); |
|---|
| 437 | % UI::save (name,msg,"from"); |
|---|
| 438 | % UI::save ( (string)"expected_times_request", msg, "what"); |
|---|
| 439 | % } |
|---|
| 440 | % need_exps=false; |
|---|
| 441 | % } |
|---|
| 442 | % |
|---|
| 443 | % // broadcast expected cars |
|---|
| 444 | % if (!requesters.empty()) { |
|---|
| 445 | % double a; |
|---|
| 446 | % expected_cars(); |
|---|
| 447 | % do { |
|---|
| 448 | % Setting &msg =set.add(Setting::TypeGroup); |
|---|
| 449 | % UI::save ( requesters.back(), msg, "to"); |
|---|
| 450 | % UI::save ( name, msg, "from"); |
|---|
| 451 | % UI::save ( (string)"new_expected_cars", msg, "what"); |
|---|
| 452 | % UI::save ( &(rv_outputs), msg, "rv"); |
|---|
| 453 | % UI::save ( outputs, msg, "value"); |
|---|
| 454 | % requesters.pop_back(); |
|---|
| 455 | % a=outputs (10); |
|---|
| 456 | % } while (!requesters.empty()); |
|---|
| 457 | % } |
|---|
| 458 | % |
|---|
| 459 | % // broadcast new stable state (new stable expectations) |
|---|
| 460 | % if (new_stable_state) { |
|---|
| 461 | % expected_cars(); |
|---|
| 462 | % for (int i=0;i<neighbours.length();i++) { |
|---|
| 463 | % Setting &msg = set.add(Setting::TypeGroup); |
|---|
| 464 | % UI::save ( neighbours(i), msg, "to"); |
|---|
| 465 | % UI::save ( name, msg, "from"); |
|---|
| 466 | % UI::save ( (string)"stable_state", msg, "what"); |
|---|
| 467 | % UI::save ( &(rv_outputs), msg, "rv"); |
|---|
| 468 | % UI::save ( outputs, msg, "value"); |
|---|
| 469 | % } |
|---|
| 470 | % new_stable_state=false; |
|---|
| 471 | % } |
|---|
| 472 | % |
|---|
| 473 | % // broadcast requests to change offset(s) |
|---|
| 474 | % if (send_requests) { |
|---|
| 475 | % for (int i=0;i<neighbours.length();i++) { |
|---|
| 476 | % Setting &msg = set.add(Setting::TypeGroup); |
|---|
| 477 | % UI::save ( neighbours(i), msg, "to"); |
|---|
| 478 | % UI::save ( name, msg, "from"); |
|---|
| 479 | % UI::save ( (string)"offseT_{\mathrm{c}}hange_request", msg, "what"); |
|---|
| 480 | % UI::save ( &(rv_change_request), msg, "rv"); |
|---|
| 481 | % UI::save ( change_request, msg, "value"); |
|---|
| 482 | % } |
|---|
| 483 | % send_requests=false; |
|---|
| 484 | % } |
|---|
| 485 | % |
|---|
| 486 | % // reached final offset. |
|---|
| 487 | % if (final_state) { |
|---|
| 488 | % final_state=false; |
|---|
| 489 | % } |
|---|
| 490 | % } |
|---|
| 491 | % |
|---|
| 492 | %\end{lstlisting} |
|---|
| 493 | |
|---|
| 494 | Ve 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_{\mathrm{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. |
|---|
| 495 | %\begin{lstlisting}[caption=Funkce act(), label=lst:act, firstnumber=615] |
|---|
| 496 | % void act(vec &glob_ut){ |
|---|
| 497 | % if (negoT_{\mathrm{c}}ycle==cycle_count) { |
|---|
| 498 | % vec action; |
|---|
| 499 | % action.set_size(rv_action._dsize()); |
|---|
| 500 | % |
|---|
| 501 | % ivec index = RV(name+"_offset",1).dataind(rv_action); |
|---|
| 502 | % |
|---|
| 503 | % action(index(0))=normalize_offset(total_offset/cycle_count, false); |
|---|
| 504 | % action2ds.filldown(action,glob_ut); |
|---|
| 505 | % |
|---|
| 506 | % total_offset=0; |
|---|
| 507 | % negoT_{\mathrm{c}}ycle=1; |
|---|
| 508 | % } |
|---|
| 509 | % else { |
|---|
| 510 | % total_offset+=planned_offset; |
|---|
| 511 | % negoT_{\mathrm{c}}ycle++; |
|---|
| 512 | % } |
|---|
| 513 | % last_offset=planned_offset; |
|---|
| 514 | % } |
|---|
| 515 | %\end{lstlisting} |
|---|
| 516 | |
|---|
| 517 | O~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}. |
|---|
| 518 | |
|---|
| 519 | %\begin{lstlisting}[caption=Funkce log_write(), label=lst:logwrite, firstnumber=644] |
|---|
| 520 | % void log_write() const { |
|---|
| 521 | % if (log_level[logoffset]){ |
|---|
| 522 | % vec offset_vec(2); |
|---|
| 523 | % offset_vec(0)=planned_offset; |
|---|
| 524 | % offset_vec(1)=planned_rating; |
|---|
| 525 | % log_level.store(logoffset, offset_vec); |
|---|
| 526 | % } |
|---|
| 527 | % } |
|---|
| 528 | %\end{lstlisting} |
|---|
| 529 | Posledn�olan�e� funkce agenta je \texttt{step()}, kter�en posouv�ntern�kazatel �u v~agentovi o~d�u kroku simulace. |
|---|
| 530 | %\begin{lstlisting}[caption=Funkce step(), label=lst:step, firstnumber=635] |
|---|
| 531 | % void step() { |
|---|
| 532 | % actual_time+=step_length; |
|---|
| 533 | % } |
|---|
| 534 | %\end{lstlisting} |
|---|
| 535 | |
|---|
| 536 | \subsection{Chr�n�unkce} |
|---|
| 537 | |
|---|
| 538 | Chr�n�\texttt{protected}) funkce zaji��uj��inu v� v~agentovi, staraj�e o~sestaven���n�s�jezd�idel k~soused�led� optim�� offsetu, po�� hodnocen�~tak podobn� |
|---|
| 539 | |
|---|
| 540 | Funkce \texttt{expected_cars()} sestavuje � o~p�dech vozidel pro v�echny sousedy. Odhady jsou zalo�eny na aktu��odnot�ffsetu ulo�en�~prom��texttt{planned_offset} a~jsou na z�r ulo�eny do vektoru \texttt{outputs}, ur�� k~odesl�. |
|---|
| 541 | |
|---|
| 542 | V� prob� podle rovnic (\ref{eq:tz}) a~(\ref{eq:tk}). Po� vozidel je z��jako sou� odhadu po� vozidel, kter�rojedou j�n�pruhem za dobu sv�n�elen�~p��n� pom� odbo��\alpha_i$, kde $i$ je �lo v�� sm�. V� po� vozidel, kter��n�pruhem projedou je z��itost�unkce \texttt{expected_output()} ze t�\texttt{LaneHandler}. V~sou�nosti tato funkce vrac�o� vozidel, kter�rojela v~minul�cyklu. |
|---|
| 543 | |
|---|
| 544 | Pro nalezen�ejlep�� nastaven�lastn� offsetu slou��ekurentn�unkce \texttt{int find_best_offset(cont int center, int interval)}. Ta hled�e t�dnot offset�mathtt{center}+\mathtt{interval}$, $\mathtt{center}$ a~$\mathtt{center}-\mathtt{interval}$ tu s~nejlep��hodnocen� Nalezen�odnota se pak pou�ije jako prvn�arametr pro dal��ol� sebe sama; jako nov�rval se vezme polovina p�oz�. Toto vol� prob�, dokud \texttt{interval} nedos�e hranice \texttt{find_best_limit}. Pak je funkce ukon�a a~je vr�n nalezen�et. |
|---|
| 545 | |
|---|
| 546 | Funkce zkoumaj� efekty zm�offsetu u~souseda m�rototyp \texttt{int find_best_exps (int offset_change, string neighbour, double \&rating_change)}. V�m je nalezen�m� offsetu. Parametr \texttt{offset_change} zna� o~kolik sekund bude agent zkou�et posunout soused�fset, \texttt{neighbour} je jm� zkouman� souseda a~do prom��texttt{rating_change} bude ulo�ena p�kl�n�m� hodnocen�kterou nalezen� offset p�e oproti sou�n� stavu. Funkce si nejprve p�v�odnoty o��n��zd�, jak by pravd�dobn�ypadaly p�� sousedova offsetu v~kladn�a~v~z�rn�smyslu o~hodnotu \texttt{offset_change}. N�edn�ak vypo��odnocen�~t�to a~bez t�to zm� Zm� s~nejlep��hodnocen�je n�atovou hodnotou funkce. |
|---|
| 547 | |
|---|
| 548 | Po�� hodnocen�rob� ve funkci \texttt{double count_rating(const int offset, const vec recieved_exps, const RV rv_recieved_exps)} v~n�lika vno�h cyklech. Vn��rob� p��echny (vjezdov�j�n�ruhy k�atky. Pro ka�d� n�eduje ve vno�smy� hled� o��n��zd�vektoru p��t \texttt{recieved_exps}. Pokud o~nich nejsou pro zkouman� informace, nebude se zapo��t do hodnocen� |
|---|
| 549 | |
|---|
| 550 | V~p��alezen��k�edpoklad�u tyto ulo�eny do vektor�xttt{t_cars_begin} (za�ky p�d�texttt{t_cars_end} (konce p�d�\texttt{cars_density} (hustoty vozidel) pro dal���. Ten za��ji�t�m �u rozsv�n� zhasnut�elen�~sign��kupin���n�an� j�n� pruhu, se zapo��m offsetu p�� funkci v~parametru \texttt{offset}. Interval sv�n�elen�e pak funkc�texttt{expand_greens()} s~periodou $T_{\mathrm{c}}$ zopakov�tak, aby pokryl cel�v�, pro kter� k~dispozici informace o~p�dech vozidel. Ilustraci k t� funkci p�avuje obr�k \ref{fig:expand}. |
|---|
| 551 | |
|---|
| 552 | Ze znalosti o��n��zd�tavu semafor�em nich pak vych� po�� p�vku k~hodnocen�Ten prob� v~\texttt{do} -- \texttt{while} cyklu. Pro jeho ��e definov� prom��texttt{t_act}, p�avuj� ukazatel na pr� zpracov�n��ik ve zkouman�intervalu. Jej�odnota za��a 0 a~pokud dos�e hodnoty prom��texttt{t_limit}, zp� ukon��my�. Do prom��texttt{t_limit} je ulo�en � posledn� zhasnut�elen�z�an��e zm�n�unkce \texttt{expand_greens()}. \texttt{t_act} se tedy b�m v� posouv�o v��dech intervalu a~v~ka�d�takov�bod�e ov�je, jak� typu (dle definice z~kapitoly \ref{sec:navrh}) je n�eduj� interval. Podle toho se zjist���n��a virtu��ronty $Q_\mathrm{V}^{(i)}$ a~pokud je tato z�rn�ode� se od hodnocen�texttt{rating}. |
|---|
| 553 | |
|---|
| 554 | Po t�co funkce projde v�echny j�n�ruhy, vr� v�ou hodnotu ulo�enou v~prom��texttt{rating} jako�to hodnocen�astaven�~dan�setem a~dan�edpoklady o~p�dech vozidel. |
|---|
| 555 | |
|---|
| 556 | \texttt{GreenWaveTrafficAgent} pak je�t�bsahuje n�lik pomocn�nkc�snad�c� a~zp�d�c� v�. Jde nap�d o~p� libovoln�rom��a typ \texttt{string}, nalezen�ndexu minim�� prvku ve vektoru �hled� indexu (po�v~konfigura�m souboru) zadan�ign��kupiny. |
|---|
| 557 | |
|---|
| 558 | Za zm�u stoj�unkce \texttt{int normalize_offset(int offset, bool zero=true)}. Ta prov� posun zadan� \texttt{offsetu} tak, aby zapadl do ��n� intervalu. P�nech� druh� parametru jde o~interval $\left<-\frac{T_{\mathrm{c}}}{2};\frac{T_{\mathrm{c}}}{2}\right>$, pokud m�ruh�metr hodnotu \texttt{false}, pak $\left<0;T_{\mathrm{c}}\right>$. Druh�orma normalizace se prov� p�asl� offsetu �i k�atky, ten toti� hodnotu v~dan�intervalu o��. Prvn�orma je d�t�ro pr�v� offset�kud by nebyla pou�ita (nebo pokud by se pou��la druh� nebyl by ve v��pr� zahrnut fakt, �e hodnota $x$ a~$x+T_{\mathrm{c}}$ je v~p��astaven�ffsetu toto�n� |
|---|