- Timestamp:
- 07/27/10 06:50:13 (15 years ago)
- Location:
- applications/doprava/texty/delka_cyklu/05_AlgorithmDescription
- Files:
-
- 2 modified
Legend:
- Unmodified
- Added
- Removed
-
applications/doprava/texty/delka_cyklu/05_AlgorithmDescription/AlgorithmDescription.tex
r1147 r1150 57 57 UI::get(inputs,set,"inputs",UI::compulsory); 58 58 \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.59 zapíše na adresu proměnné \texttt{inputs} hodnotu v objektu \texttt{set} třídy \texttt{Setting}, 60 označenou jako \texttt{\"inputs\"}. Objekt \texttt{set} reprezentuje načtený konfigurační soubor. 61 61 \texttt{UI::compulsory} značí, že daná hodnota musí být zadána. 62 62 63 63 64 64 65 \subsubsection{Třída datalink}65 \subsubsection{Třída Datalink} 66 66 Tato třída definuje spojení mezi dvěma vektory, mezi kterými zprostředkovává spojení 67 67 pomocí metody \texttt{filldown}. … … 70 70 Následující kód popisuje vytvoření dvou vektorů \texttt{from} a \texttt{to}, 71 71 popsaný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 vektor72 údajů z \texttt{from} do \texttt{to} pomocí třídy \texttt{Datalink}. Výsledkem je, že vektor 73 73 \texttt{to} bude obsahovat hodnoty 1 a 2. 74 74 … … 102 102 103 103 \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.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é zpracování dat z AIMSUNu. 106 106 Také je zde implementován odhad čekací doby automobilu do průjezdu křižovatkou, 107 107 což je údaj používaný v hodnotící délky cyklu funkci agenta. … … 109 109 \subsection{Fronta} 110 110 Agent 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řesahuje111 Jedná se o největší počet automobilů v příslušném jízdním pruhu, jejichž rychlost nepřesahuje 112 112 urč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 neshoduje113 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 114 114 se vzorkovací periodou. Uvažujme jízdní pruh s poměrem délky zelené 0,5. 115 115 Pokud bude například délka cyklu 180 sekund, a budeme li předpokládat, že začátek jedné periody se bude shodovat s časem, … … 118 118 119 119 \subsection{Odhad fronty}\label{ss:odhad_fronty} 120 K odhadu fronty je použito metody tzv. exponenci onálního zapomínání. Metoda vychází z povoucího průměru120 K odhadu fronty je použito metody tzv. exponenciálního zapomínání. Metoda vychází z plovoucího průměru 121 121 Který je vhodný pro odhad nekonstantní hodnoty. Označíme si veličinu $\overline{q_i}$ jako plovoucí průměr 122 fronty v kro ce $i$, kam budeme ukládat posledních $n$ měření. Označme si velikost fronty naměřenou v $i$-tém krocejako$q_i$.123 V kro ce $i+1$ je hodnota hodnota plovoucího průměru přepřičytením poslední naměřené hodnoty rovna122 fronty 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$. 123 V kroku $i+1$ je hodnota hodnota plovoucího průměru před přičtením poslední naměřené hodnoty rovna 124 124 $$ 125 125 \overline{q_i} = \frac{1}{n} \sum_{j=0}^{n-1} q_{i-j} . … … 135 135 \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}). 136 136 $$ 137 $\frac{1}{n} (q_{i+1} - \overline{q_i}$ je vlastně přír ustek 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}$, 138 138 a faktor $1/n$ můžeme chápat jako jeho váhu $w$. Po dosazení dostáváme jednoduchý tvar 139 139 $$ 140 140 \overline{q_{i+1}} = \overline{q_i} + w \Delta q_{i+1}. 141 141 $$ 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 kro ceuložena i první hodnota,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 kroku uložena i první hodnota, 143 143 má však zanedbatelnou váhu $\left(\frac{n-1}{n}\right)^i$. Jedná se o jaksi zjednodušenou verzi Kalmanova filtru. 144 144 Grafy \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 peri dicky se měnící od 40145 Graf \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 146 146 do 120 sekund. 147 147 … … 161 161 162 162 163 V reálném případě je potřeba vypočítat délku fronty podle záznamů z detektorů. 164 Prostý 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ý. 165 V 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. 166 Podrobnější pojednání o tomto problému lze najít například v \cite{pecherkova}. 167 \\ 168 \\ 169 Protož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 171 prostř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 172 a není agentovy dostupný přímo. Bude tedy nutné rozšířit komunikaci agentů, popsanou v \ref{ss:komunikace}, o tento údaj. 173 174 163 175 \subsection{Odhad čekací doby}\label{ss:odhad_cekaci_doby} 164 176 Jednou 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.177 odhad čekací doby vozidel stojících v, nebo přijíždějících do příslušného jízdního pruhu. 166 178 Tento odhad se používá při výběru a ohodnocení délky cyklu. 167 179 \\ … … 170 182 Do proměnné \texttt{q} se uloží aktuální hodnota fronty. 171 183 Simulace 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í184 se zvětší fronta o hustotu provozu (počt aut za sekundu), odhadovanou z údajů z detektorů, a pokud se čas nachází 173 185 ve průjezdné fázi, zmenší se o konstantu, nazývanou saturovaný tok, která udává maximální počet aut, které projedou 174 186 kř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 … … 176 188 \\ 177 189 \\ 178 Odhad probíhá ve dvou fázích, realizovaných cykly typu \texttt{for}. V první běží čas do ne větší části \texttt{T},179 soudělné s \texttt{tc}, v d uhé po zbytek \texttt{T}. níže uvádím popis všech proměnných.190 Odhad probíhá ve dvou fázích, realizovaných cykly typu \texttt{for}. V první běží čas do největší části \texttt{T}, 191 soudělné s \texttt{tc}, v druhé po zbytek \texttt{T}. níže uvádím popis všech proměnných. 180 192 \begin{description} 181 193 \item[tc] délka cyklu, pro kterou je odhad prováděn (parametr funkce) … … 231 243 232 244 233 234 245 \section{Hlavní smyčka} 235 246 Hlavní smyčka programu se stará o synchronizaci všech potřebných parametrů a provádění iterací. … … 240 251 Délka kroku simulace je pevně nastavena na 90 sekund shodně s periodou sběru dat z AIMSUNu. 241 252 V 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 parame ntr jejich metody \texttt{adapt}. Následně se zprostředkuje komunikace mezi253 každému z agentů jako parametr jejich metody \texttt{adapt}. Následně se zprostředkuje komunikace mezi 243 254 agenty tak, že se naplní fronta zpráv voláním metody \texttt{broadcast} jednotlivých agentů. Z této fronty 244 255 se postupně odebírají zprávy, které se předávají agentům parametrem jejich metody \texttt{receive} … … 247 258 248 259 \section{Třída agenta} 249 Třída \texttt{TrafficAgentCycleTime} je odvozena od obecného návrhu ag nta \texttt{BaseTrafficAgent}.260 Třída \texttt{TrafficAgentCycleTime} je odvozena od obecného návrhu agenta \texttt{BaseTrafficAgent}. 250 261 Jsou v ní implementovány metody pro načtení dat, komunikaci a nastavení délky cyklu za účelem řízení 251 262 jedné konkrétní křižovatky. 252 263 253 264 \subsection{Stručný popis algoritmu} 254 Cíl algoritmu je zlepšit dopravní situaci nastavením délky cyklu řadiče na t ekouvou255 hodnotu, při níž bude celková čekací doba všech vozidel mini nmální.265 Cíl algoritmu je zlepšit dopravní situaci nastavením délky cyklu řadiče na takovou 266 hodnotu, při níž bude celková čekací doba všech vozidel minimální. 256 267 Nejprve agent odhadne délku cyklu, která je ideální pro něj, poté vyšle zprávu, zda je tato hodnota 257 268 vyšší nebo nižší než aktuální. Pokud je nadpoloviční většina agentů pro změnu stejným směrem, … … 268 279 \subsubsection{Metoda findIdealTc}\label{sss:ideal_tc} 269 280 Pro 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 mini nmální do maximální hodnoty, určené atributy281 Ta zjišťuje čekací doby pro všechny možnosti rozsahu od minimální do maximální hodnoty, určené atributy 271 282 \texttt{minTc} a \texttt{maxTc}. Vrátí takovou délku cyklu, pro kterou je čekací doba nejmenší. 272 283 \\ … … 277 288 278 289 \subsection{Přepsané metody předka} 279 Hlavní smyčka prog aramu automaticky volá v každém cyklu metody určené290 Hlavní smyčka programu automaticky volá v každém cyklu metody určené 280 291 k načtení dat, komunikaci a nastavení dalšího řízení. 281 292 … … 283 294 284 295 \subsubsection{Metoda validate} 285 K předání požadovaných hodnot parametrů v průběhu vsimulace slouží vektor \texttt{actions}.296 K předání požadovaných hodnot parametrů v průběhu simulace slouží vektor \texttt{actions}. 286 297 Vý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} hodn tu \texttt{Tc}. Tím298 která se volá na začátku simulace, přidáme do \texttt{rv\_actions} hodnotu \texttt{Tc}. Tím 288 299 vlastně 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í. V praxi je tento postup realizován kódem300 přidáme do \texttt{rv\_actions} také označení těchto fází. V praxi je tento postup realizován kódem 290 301 \begin{lstlisting} 291 302 rv_action = RV("Tc",1); … … 301 312 \subsubsection{Metoda adapt} 302 313 Na 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 vekt rou 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 i stancím třídy \texttt{LaneHandler} a poté se volá jejich metoda314 V parametru se jí předá adresa vektoru výstupních údajů simulace \texttt{glob\_dt}, k jejichž zpracování je metoda určena. 315 Zde se předávají údaje z detektorů a délky front instancím třídy \texttt{LaneHandler} a poté se volá jejich metoda 305 316 \texttt{countAvgs}, která počítá filtrované hodnoty způsobem popsaným v sekci \ref{ss:odhad_fronty}. 306 317 307 318 308 \subsubsection{Metoda receive a broadcast} 319 \subsubsection{Metoda receive a broadcast} \label{ss:komunikace} 309 320 Po načtení a zpracování dat začíná komunikace. Ta je realizována metodami 310 321 \texttt{broadcas} a \texttt{receive}, které se volají střídavě. Přesněji řečeno, … … 321 332 Každý agent má v atributu \texttt{name} uloženo jméno křižovatky, kterou ovládá. 322 333 Toto 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 fron y a předá se334 Pokud je jméno agenta stejné jako parametr zprávy \texttt{to}, vyjme se zpráva z fronty a předá se 324 335 metodě \texttt{receive}.V momentě, kdy je fronta prázdná, zavolají se metody \texttt{broadcast} všech agentů. 325 Metoda broadcastopět plní frontu zprávami, které chce agent vyslat. Po jejím ukončení se opět volá \texttt{receive}.336 Metoda \texttt{broadcast} opět plní frontu zprávami, které chce agent vyslat. Po jejím ukončení se opět volá \texttt{receive}. 326 337 Střídavé volání těchto dvou metod probíhá, dokud \texttt{broadcast} produkuje nějaké zprávy. 327 338 \\ … … 358 369 359 370 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} 372 Pokud se agenti dohodly na změně délky cyklu, probíhá její přenastavení v metodě \texttt{act}. 362 373 Nejprve se projde pole \texttt{received\_profit\_sum} a vybere se z něj maximum. 363 374 Poté se podle indexu maximálního zisku určí ideální délka fronty. -
applications/doprava/texty/delka_cyklu/05_AlgorithmDescription/AlgorithmDescription.tex.backup
r1147 r1150 57 57 UI::get(inputs,set,"inputs",UI::compulsory); 58 58 \end{lstlisting} 59 zapíše na adresu proměnné inputs hodnotu v oběktu \texttt{set} třídy \texttt{Setting},59 zapíše na adresu proměnné \texttt{inputs} hodnotu v objektu \texttt{set} třídy \texttt{Setting}, 60 60 označenou jako \texttt{\"inputs\"}. Oběkt \texttt{set} reprezentuje načtený konfigurační soubor. 61 61 \texttt{UI::compulsory} značí, že daná hodnota musí být zadána. … … 159 159 \end{center} 160 160 \end{figure} 161 162 163 V reálném případě je potřeba vypočítat délku fronty podle záznamů z detektorů. 164 Prostý výpočet délky fronty například jako rozdíl počtu vozidel, která odjela a která přiela však není možný. 165 V 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. 166 Podrobnější pojednání o tomto problému lze najít například v \cite{pecherkova}. 167 \\ 168 \\ 169 Protož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 171 prostř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 172 a není agentovy dostupný přímo. Bude tedy nutné rozšířit komunikaci agentů, popsanou v \ref{ss:komunikace}, o tento údaj. 161 173 162 174 … … 191 203 \item[tc\_last] zbytek odhadovací periody 192 204 \item[gt\_last] délka zelené ve zbytku odhadovací periody 193 \item[delta] korekční parametr vyjadřuje zkrácení průjezdnosti vlivem pomalých rozjezdů a podpbně205 \item[delta] korekční parametr vyjadřuje zkrácení doby průjezdnosti vlivem pomalých rozjezdů a podpbně 194 206 \end{description} 195 207 Odhad je implementován v metodě \texttt{getWT}: … … 230 242 231 243 232 \subsection{Odhad parametru $\delta$}233 Delta vyjadřuje korekční parametr doby průjezdnosti křižovatky.234 Jak jsme již ukázali v kapitole \ref{ss:odhad_cekaci_doby}, počet vozidel, které projedou křižovatkou235 za jeden cyklus řadiče je236 $$237 (r_g T_c - \delta) s_s.238 $$239 To znamená že pokud je fronta větší, než $(r_g T_c - \delta) s_s$, mměla by se její velikost za dobu $T_c$240 změnit o241 $$242 \Delta q_{T_c} = n_{Tc} - (r_g T_c - \delta) s_s,243 $$244 245 kde $n_{Tc}$ je počet vozidel, přijíždějících na křižovatku za dobu $T_c$.246 Tento údaj je vlastně výstup z detektorů, který je nám však dostupný pouze247 jednou za simulační cyklus, trvající 90 sekund. Protože pracujeme s filtrovanými hodnotami front,248 nedojde k velké chybě, pokud výraz přepočítáme na 90 sekund do podoby249 $$250 \Delta q_{90} = n_{90} - \frac{90}{T_c}(r_g T_c - \delta) s_s = n_{90} - 90 r_g s_s - \frac{90 s_s}{T_c} \delta,251 $$252 z čehož si parametr $\delta$ vyjádříme jako253 $$254 \delta = \frac{T_c}{90 s_s} \left( n_{90} - \Delta q_{90} \right) - r_g.255 $$256 Jak údaje o projíždejících vozidlech za simulační cyklus $n_{90}$, tak parametry $\delta$, jsou filtrovány257 způsobem, použitým na odhad délky fronty a popsaným v kapitole \ref{ss:odhad_fronty}.258 244 259 245 \section{Hlavní smyčka} … … 331 317 332 318 333 \subsubsection{Metoda receive a broadcast} 319 \subsubsection{Metoda receive a broadcast} \label{ss:komunikace} 334 320 Po načtení a zpracování dat začíná komunikace. Ta je realizována metodami 335 321 \texttt{broadcas} a \texttt{receive}, které se volají střídavě. Přesněji řečeno, … … 359 345 Zisk se počítá jako rozdíl čekací doby při navrhované a stávající délce cyklu pomocí metody popsané v \ref{ss:odhad_cekaci_doby}. 360 346 Odeslání těchto zpráv je realizováno kódem 361 \newpage362 347 \begin{lstlisting} 363 348 int broadcast_width = (max_tc - min_tc) + 1; … … 384 369 385 370 386 \subsubsection{Metoda act} 371 \subsubsection{Metoda act}\label{sss:metoda_act} 387 372 Pokud se agenti dohodly na změně délky cyklu, probíhá její přenastavení v metodě act. 388 373 Nejprve se projde pole \texttt{received\_profit\_sum} a vybere se z něj maximum.