#include "traffic_agent.h" #include class GreenWaveTrafficAgent : public BaseTrafficAgent { protected: double stable_state_loss; double best_offset; RV rv_recieved_exps; vec recieved_exps; list seznam; double car_leaving; //s; how long is 1 car leaving queue bool recieved_exp_request; //counts all expected cars going from each lane void expected_cars(/*const string dest*/) { double start_time; for (int i=0;iexpected_output(green_time(0)); start_time = green_starts(sg_index(lanes(i).sg)) + lanes(i).output_distances(j)/VP + planned_offset; //first car arrive time outputs(indexes(1))=start_time; //last car arrive time outputs(indexes(2))= start_time + green_time(0); //} } } } public: int last_offset; int planned_offset; double actual_rating; //! array of existing signal groups Array sgs; //! relative starts of green for signal groups ivec green_starts; //! avarage speed of cars int VP; void validate() { rv_action = RV(name+"_offset", 1); // <======= example for (int i=0; i=0) { ivec indexes = rv_recieved_exps.dataind(RV(rv_recieved_exps.name(j),3)); t_cars_begin=recieved_exps(indexes(1)); t_cars_end=recieved_exps(indexes(2)); found=true; } } } if (!found) { t_cars_begin=0; t_cars_end=cycle_time; } //counting rating t_green_begin=green_starts(sg_index(lanes(i).sg)) + planned_offset; ivec indexes = rv_inputs.dataind(RV(name+"_"+lanes(i).sg,1)); t_green_end=t_green_begin+inputs(indexes(0)); if (t_green_beginqueue-(t_cars_begin-t_green_begin)/car_leaving; } else if (t_green_begin>t_cars_begin) { virtual_queue=lanehs(i)->queue+(t_green_begin-t_cars_begin)*lanehs(i)->expected_density(); } //TODO lanehs(i)->queue je zatim prazdne => nesmyslne vysledky t_emptiyng=virtual_queue/(1/car_leaving - lanehs(i)->expected_density()); t_mixing=min(t_green_end,t_cars_end)-max(t_green_begin,t_cars_begin); actual_rating+=max((t_mixing-t_emptiyng)*lanehs(i)->expected_density(),0.0); } } void broadcast(Setting& set){ //ask neighbours for exptected arrive times if (true) { for (int i=0; i