220 | | queue_diff_sum += queue - last_queue; |
221 | | //queue_variance_sum += abs(queue - last_queue); |
| 191 | queue_avg_last = queue_avg; |
| 192 | |
| 193 | // KALMAN |
| 194 | //cout << endl << "pridani fronty\t" << queue_avg << "\t" << ql << endl; |
| 195 | queue_avg += queue_w*( ql - queue_avg ); |
| 196 | /*cout << getQueueName() << " inputs"; |
| 197 | int k = 0; |
| 198 | for ( int i = 0; i < rv_inputs.length(); i ++ ) { |
| 199 | cout <<"\t"<< rv_inputs.name(i) << ": "; |
| 200 | for ( int j = 0; j < rv_inputs.size(i); j ++ ) { |
| 201 | cout << inputs(k) << " "; |
| 202 | k ++; |
| 203 | } |
| 204 | cout << endl;*/ |
| 205 | } |
| 206 | if ( inputs(0) >= 0 ) { |
| 207 | cars_in_avg += cars_in_w*( inputs(0) - cars_in_avg ); |
223 | | sum_queue_length += ql; |
224 | | n_of_queues_in_length ++; |
225 | | // KALMAN |
226 | | cout << endl << "pridani fronty\t" << queue_avg << "\t" << ql << endl; |
227 | | queue_avg += queue_w*( ql - queue_avg ); |
228 | | queue_d += queue_dd; |
229 | | queue_w = queue_d/(queue_d+1); |
230 | | queue_d = (1-queue_w)*queue_d; |
231 | | |
232 | | double Ro = getActualRo(); |
233 | | Ro_avg += Ro_w*( Ro - Ro_avg ); |
234 | | Ro_d += Ro_dd; |
235 | | Ro_w = Ro_d/(Ro_d+1); |
236 | | Ro_d = (1-Ro_w)*Ro_d; |
237 | | } |
238 | | } |
239 | | |
240 | | void resetQueue () { |
241 | | last_Tc = Tc; |
242 | | //last_variance = getQueueVariance(); |
243 | | last_n_of_queues_in_length = n_of_queues_in_length; |
244 | | last_sum_queue_length = sum_queue_length; |
245 | | n_of_queues_in_length = 0; |
246 | | sum_queue_length = 0; |
247 | | queue_variance_sum = 0; |
248 | | queue_diff_sum = 0; |
249 | | // kalman |
250 | | last_queue_avg = getAverageQueueLength(); |
251 | | } |
| 209 | } |
| 210 | if ( cars_in_avg > 0 && queue_avg_last > saturated_stream*last_Tc*green_time_ratio ) { |
| 211 | //double delta_d = queue_avg - queue_avg_last + last_Tc * saturated_stream - cars_in_avg*(double)last_Tc/90; |
| 212 | double delta_d = ( last_Tc/(90*saturated_stream)) * (cars_in_avg - queue_avg + queue_avg_last) - green_time_ratio; |
| 213 | delta += delta_w * ( delta_d - delta ); |
| 214 | if ( delta < 0 ) |
| 215 | delta = 0; |
| 216 | } |
| 217 | |
| 218 | cout << getQueueName() << " cars in: " << inputs(0) << " " << cars_in_avg << |
| 219 | " q_avd: " << queue_avg << |
| 220 | " delta: " << delta << |
| 221 | endl; |
| 222 | } |
| 223 | |
| 224 | |
| 225 | |
294 | | double getWT ( double Tc ) { |
295 | | double T = 36000; // celkovy cas 10h |
296 | | double Ro = getRo(); |
297 | | double Gr = green_time_ratio; |
298 | | double ss = saturated_stream; |
299 | | double WT = 0; |
300 | | double q = 0; // zacina s nulovou frontou ? |
301 | | double ti = 0; |
302 | | double sumq = q; |
303 | | while ( ti < T ) { |
304 | | // ve fronte stoji vic aut nez je schopno odjet za zelenou |
305 | | if ( q > 0.5*ss*Tc ) { |
306 | | WT += 0.5*ss*(Tc*Gr - delta)*(Tc*Gr - delta); |
307 | | } |
308 | | else { |
309 | | |
310 | | WT += 0.5*q*(Tc*Gr - delta); |
311 | | } |
312 | | |
313 | | if ( (Tc*Gr - delta)*ss < q ) |
314 | | q -= (Tc*Gr - delta)*ss; |
315 | | else |
316 | | q = 0; |
317 | | |
318 | | WT += q * Tc; // zbytek fronty ceka cely cyklus |
319 | | // cekani vozidel, ktera prijela za pocitany cyklus |
320 | | if ( q > 0 ) { |
321 | | //pokud je fronta > 0, auta cekaji prumerne polovinu delky cyklu |
322 | | WT += Ro*Tc*0.5*Tc; |
323 | | } |
324 | | else { |
325 | | // pokud je fronta = 0 cekaji pouze auta, ktera prijela na cervenou (p=(1-Gr)) 0.5Tc(1-Gr) |
326 | | WT += Ro*(1-Gr)*Tc*0.5*(1-Gr)*Tc; |
327 | | } |
328 | | // fronta se zvetsi o Ro*Tc |
329 | | q += Ro*Tc; |
330 | | sumq += Ro*Tc; |
331 | | ti += Tc; |
332 | | } |
333 | | |
334 | | //return WT; |
335 | | if ( sumq > 0 ) |
336 | | return 100*(WT/(0.5*T*sumq)); |
337 | | else |
338 | | return 0; |
339 | | } |
| 253 | //double getWT_old ( double Tc ) { |
| 254 | // double T = 36000; // celkovy cas 10h |
| 255 | // double Ro = getRo(); |
| 256 | // double Gr = green_time_ratio; |
| 257 | // double ss = saturated_stream; |
| 258 | // double WT = 0; |
| 259 | // double q = 0; // zacina s nulovou frontou ? |
| 260 | // double ti = 0; |
| 261 | // double sumq = q; |
| 262 | // while ( ti < T ) { |
| 263 | // // ve fronte stoji vic aut nez je schopno odjet za zelenou |
| 264 | // if ( q > 0.5*ss*Tc ) { |
| 265 | // WT += 0.5*ss*(Tc*Gr - delta)*(Tc*Gr - delta); |
| 266 | // } |
| 267 | // else { |
| 268 | |
| 269 | // WT += 0.5*q*(Tc*Gr - delta); |
| 270 | // } |
| 271 | |
| 272 | // if ( (Tc*Gr - delta)*ss < q ) |
| 273 | // q -= (Tc*Gr - delta)*ss; |
| 274 | // else |
| 275 | // q = 0; |
| 276 | |
| 277 | // WT += q * Tc; // zbytek fronty ceka cely cyklus |
| 278 | // // cekani vozidel, ktera prijela za pocitany cyklus |
| 279 | // if ( q > 0 ) { |
| 280 | // //pokud je fronta > 0, auta cekaji prumerne polovinu delky cyklu |
| 281 | // WT += Ro*Tc*0.5*Tc; |
| 282 | // } |
| 283 | // else { |
| 284 | // // pokud je fronta = 0 cekaji pouze auta, ktera prijela na cervenou (p=(1-Gr)) 0.5Tc(1-Gr) |
| 285 | // WT += Ro*(1-Gr)*Tc*0.5*(1-Gr)*Tc; |
| 286 | // } |
| 287 | // // fronta se zvetsi o Ro*Tc |
| 288 | // q += Ro*Tc; |
| 289 | // sumq += Ro*Tc; |
| 290 | // ti += Tc; |
| 291 | // } |
| 292 | |
| 293 | // //return WT; |
| 294 | // if ( sumq > 0 ) |
| 295 | // return 100*(WT/(0.5*T*sumq)); |
| 296 | // else |
| 297 | // return 0; |
| 298 | //} |
| 299 | // stredni doba prujezdu n-teho auta ve fronte |
| 300 | double getEcarWT ( const double tc, const int n ) { |
| 301 | double cpg = (tc * green_time_ratio - delta) * saturated_stream; // cars per green time |
| 302 | double wc = floor( n / cpg ); // number of waiting cycles |
| 303 | double ET_last_cycle = ( 1/ (2*tc) ) * ( tc*(1-green_time_ratio) + (n-wc*cpg)/saturated_stream )*( tc*(1-green_time_ratio) + (n-wc*cpg)/saturated_stream ); |
| 304 | double ET = wc*tc + ET_last_cycle; |
| 305 | return ET; |
| 306 | } |
| 307 | |
| 308 | // suma strednich hodnot cekacich casu pres auta ve fronte |
| 309 | double getWT ( const double tc ) { |
| 310 | double sumEWT = 0; |
| 311 | //int n = round(getAverageQueueLength()); |
| 312 | int n = round(cars_in_avg + getAverageQueueLength()); |
| 313 | for ( int i = 0; i <= n; i ++ ) { |
| 314 | sumEWT += getEcarWT( tc, i ); |
| 315 | } |
| 316 | return sumEWT; |
| 317 | } |
| 318 | |