Changeset 927 for applications
- Timestamp:
- 05/06/10 17:42:05 (15 years ago)
- Location:
- applications/doprava
- Files:
-
- 7 modified
Legend:
- Unmodified
- Added
- Removed
-
applications/doprava/Zlicingw.cfg
r921 r927 2 2 { // agent 1 3 3 class = "GreenWaveTrafficAgent"; 4 name = "495"; 5 sg = ( 6 { name = "VA"; 7 detectors = ( 8 { name = "DVA1"; distance = 10;}, 9 {name = "DVA"; distance = 20; } 4 name = "495"; 5 lanes = ( 6 { sg="VA"; inputs = ("495_DVA1","495_DVB"); outputs= ("601_DVA"); alpha= [1.0 ]; queue="495_Q1";}, 7 { sg="VB"; inputs = ("495_DVA1","495_DVB"); outputs= ("601_DVA"); alpha= [1.0 ]; queue="495_Q2";} 10 8 ); 11 }, 12 { name = "VB"; 13 detectors = (); 14 input = {}; 15 output = {}; 16 }); 17 input = ( // remote detectors 18 { 19 name = "601_DVAa"; 20 distance = 100; 21 to_sg = ("VC","VD"); 22 }, 23 { 24 name = "601_DVA"; 25 distance = 100; 26 to_sg = ("VC","VD"); 27 } 28 ); 29 output = ( // 30 { 31 detectors = ("495_DVC"); 32 to = "601"; 33 } 34 ); 35 9 neighbours = ("601"); 36 10 offset = 40; //s 37 11 moje_special=14; … … 39 13 { //agent 2 40 14 class = "GreenWaveTrafficAgent"; 41 name = "601"; 42 sg = ( 43 { name = "VA"; 44 detectors = ( 45 { name = "DVA"; distance = 10; }, 46 {name = "DVAa"; distance = 20; } 47 ); 48 }, 49 { name = "VB"; 50 detectors = (); 51 } 52 ); 53 54 offset = 60; //s 55 input = (); 56 output = ({to="495"; detectors=("601_DVAa","601_DVA");}); 15 name = "601"; 16 neighbours = ("495"); 57 17 } 58 18 ); -
applications/doprava/aimsun_bdm/aimsun_ds.cpp
r902 r927 56 56 "601_DVA 601_DVAa 601_DVB 601_DVBa 601_DVB1 601_DVC 601_DVD 601_DVD1 601_DSE 601_DVE 601_DSE1 601_DVE1 " 57 57 "601_S6 601_S6a 601_S7 601_S8 601_S9 601_S9a " 58 "495_Q1 495_Q2 " 58 59 "}", 59 60 " 1, 1, 1, 1, 1, 1, " … … 63 64 " 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2," 64 65 " 2, 2, 2, 2, 2, 2" 66 " 1, 1" 65 67 ); 66 68 /* Remember the size of the data vector. */ -
applications/doprava/aimsun_bdm/aimsun_fake.cpp
r851 r927 16 16 "601_DVA 601_DVAa 601_DVB 601_DVBa 601_DVB1 601_DVC 601_DVD 601_DVD1 601_DSE 601_DVE 601_DSE1 601_DVE1 " 17 17 "601_S6 601_S6a 601_S7 601_S8 601_S9 601_S9a " 18 "495_Q1 495_Q2 " 18 19 "}", 19 20 " 1, 1, 1, 1, 1, 1, " … … 23 24 " 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2," 24 25 " 2, 2, 2, 2, 2, 2" 26 " 1, 1" 25 27 ); 26 28 /* Remember the size of the data vector. */ -
applications/doprava/main_loop.cpp
r921 r927 69 69 Ags(i) -> adapt(glob_dt); 70 70 } 71 72 // NEGOTIATION CYCLE 71 73 for ( int i=0; i<Ags.length(); i++ ) { 72 74 Ags(i) -> broadcast(Queue); -
applications/doprava/traffic_agent.cpp
r842 r927 1 1 #include "traffic_agent.h" 2 2 3 void SignalGroup::from_setting(const libconfig::Setting& set)3 void LaneHandler::connect_data(BaseTrafficAgent& agent0) 4 4 { 5 UI::get(name,set, "name", UI::compulsory); 6 UI::get(detectors, set, "detectors", UI::optional); 7 // 8 // TODO make some analysis of the detectors 5 agent = &agent0; 6 agentin2input.set_connection(rv_inputs, agent->rv_inputs); 7 ivec queue_index_tmp = agent->rv_queues.dataind(rv_queue); 8 if (queue_index_tmp.length()==1){ 9 queue_index=queue_index_tmp(0); 10 } else { 11 bdm_error("queue " + lane.queue + " not found"); 12 } 13 } 9 14 15 double LaneHandler::expected_output(double green_time){ 16 agentin2input.filldown(agent->inputs, inputs); 17 queue = agent->queues(queue_index); 18 19 double exp_output=0.0; 20 ///////// 21 22 23 //////// 24 return exp_output; 10 25 } 26 11 27 12 28 void BaseTrafficAgent::from_setting(const Setting& set) … … 15 31 16 32 // load from file 17 UI::get(sg,set,"sg", UI::compulsory); 18 UI::get(requests,set,"output",UI::compulsory); 19 Array<DetectorIn> det_in; 20 UI::get(det_in, set, "input",UI::compulsory); 21 22 // process sg == create handles 23 sgh.set_length(sg.length()); 24 for(int i=0;i<sg.length();i++){ 25 sgh(i).connect_sg(sg(i),name); 33 if (set.exists("lanes")){ 34 Setting &Slanes=set["lanes"]; 35 lanes.set_length(Slanes.getLength()); 36 for(int l=0; l<lanes.length(); l++){ 37 lanes(l).from_setting(Slanes[l]); 38 } 26 39 } 27 28 // process output == handles 29 request_handler.set_length(requests.length()); 30 for(int i=0;i<requests.length();i++){ 31 request_handler(i).connect_request(requests(i),name); 32 output_rv.add(request_handler(i).rv); 33 } 34 35 // process DetIn - create input 36 for (int i=0; i<det_in.length(); i++){ 37 input_rv.add(RV(det_in(i).name,2)); 38 } 39 input_data.set_size(input_rv._dsize()); 40 //UI::get(lanes,set,"lanes", UI::compulsory); 41 UI::get(neighbours, set, "neighbours", UI::optional); 40 42 } -
applications/doprava/traffic_agent.h
r842 r927 13 13 using namespace bdm; 14 14 15 class BaseTrafficAgent; 16 15 17 //! detector of traffic variables 16 class Detector{ 17 public: 18 string name; //! detector name 19 int distance; //! distance from stop-line 18 class Lane{ 19 public: 20 Array<string> inputs; 21 Array<string> outputs; 22 vec alpha; //size of outputs 23 string queue; 24 string sg; 20 25 21 26 //! function loading info from Setting 22 27 void from_setting(const Setting &set){ 23 UI::get(name,set,"name",UI::compulsory); 24 UI::get(distance,set,"distance",UI::compulsory); 28 UI::get(inputs,set,"inputs",UI::compulsory); 29 UI::get(outputs,set,"outputs",UI::compulsory); 30 UI::get(alpha,set,"alpha",UI::compulsory); 31 UI::get(queue,set,"queue",UI::compulsory); 32 UI::get(sg,set,"sg",UI::compulsory); 25 33 26 34 } 27 35 }; 28 36 29 //! detector fo incomming flow30 class DetectorIn : public Detector{31 public:32 Array<string> to_sg; // to signal plans33 void from_setting(const Setting &set){34 Detector::from_setting(set);35 UI::get(to_sg, set, "to_sg", UI::compulsory);36 }37 };38 39 //! structure for output detectors40 class RequestOut {41 public:42 string to; // agent43 Array<string> detectors; //detectors44 void from_setting(const Setting &set){45 UI::get(detectors,set,"detectors",UI::compulsory);46 UI::get(to, set, "to", UI::compulsory);47 }48 };49 50 51 //! class with physical information about a signal group52 class SignalGroup {53 public:54 string name; //! names of the group55 Array<Detector> detectors; //! (possible) detectors56 57 //! function that loads information from Setting58 void from_setting(const Setting &set);59 };60 61 37 //! class that operates on a signal group 62 class SignalGroupHandler {38 class LaneHandler { 63 39 protected: 64 //! pointer to physical signal group 65 SignalGroup *sg; 40 //! pointer to physical lane 41 const Lane &lane; 42 //! agent pointer 43 BaseTrafficAgent *agent; 66 44 67 45 public: 68 46 //! actual data from the relevant signal group 69 vec det_data; 47 vec inputs; 48 //! 49 double queue; 50 //! 70 51 //! description of det_data 71 RV rv_det_data; 52 RV rv_inputs; 53 //! description of det_data 54 RV rv_outputs; 55 //! description of det_data 56 RV rv_queue; 72 57 //! link from global measured data 73 datalink ds2data; 74 public: 75 void connect_sg(SignalGroup &sg0, const string &agent_name){ 76 sg=&sg0; 77 for (int i=0;i<sg->detectors.length();i++){ 78 rv_det_data.add(RV(agent_name +"_"+ sg->detectors(i).name, 2)); //TODO intensity occupancy 79 } 80 81 } 58 datalink agentin2input; 59 //! 60 datalink output2agentout; 61 //! 62 int queue_index; 63 public: 64 LaneHandler(const Lane &lane0): lane(lane0){ 65 for (int i=0;i<lane0.inputs.length();i++){ 66 rv_inputs.add(RV(lane.inputs(i), 2)); 67 } 68 for (int i=0;i<lane0.outputs.length();i++){ 69 rv_outputs.add(RV(lane.outputs(i), 2)); 70 } 71 rv_queue.add(RV(lane.queue, 1)); 72 } 73 74 void connect_data(BaseTrafficAgent &agent0); 82 75 83 76 //! arbitrary function that computes the need of the signal group for green light in common units (number of waiting cars?) 84 double expected_load(){ 85 if (det_data.length()>0){ 86 return det_data(0); // whatever 87 } else { 88 return 1.0; // mean value 89 } 90 } 91 }; 92 93 class RequestHandler{ 94 protected: 95 RequestOut *rq; 96 public: 97 RV rv; 98 public: 99 void connect_request(RequestOut &rq0, const string &agent_name){ 100 rq=&rq0; 101 for (int i=0;i<rq->detectors.length();i++){ 102 rv.add(RV(rq->detectors(i), 2)); //TODO intensity occupancy 103 } 104 } 77 double expected_output(double green_time); 105 78 }; 106 79 … … 110 83 */ 111 84 class BaseTrafficAgent : public Participant { 112 protected: 85 LOG_LEVEL(BaseTrafficAgent,logdata); 86 public: 113 87 //! Signal Groups 114 Array< SignalGroup> sg;115 116 Array< SignalGroupHandler> sgh;88 Array<Lane> lanes; 89 90 Array<LaneHandler*> lanehs; 117 91 118 92 //!data from messages 119 vec input _data;93 vec inputs; 120 94 121 95 //! decription of msg_data 122 RV input_rv;96 RV rv_inputs; 123 97 124 98 //! data to broadcast 125 vec output _data;99 vec outputs; 126 100 127 101 //! description of broadcast dataind 128 RV output_rv; 102 RV rv_outputs; 103 104 vec queues; 105 106 //! description of queues 107 RV rv_queues; 129 108 130 109 //! datalink from DS to output variables 131 datalink ds2output; 132 133 //! output recepient 134 Array<RequestOut> requests; 135 Array<RequestHandler> request_handler; 110 datalink ds2inputs; 111 112 //! datalink from DS to output variables 113 datalink ds2queues; 136 114 137 115 //! action description 138 116 RV action_rv; 139 117 140 118 datalink_part action2ds; 141 119 120 Array<string> neighbours; 121 122 Array<RV> rv_neighbours_out; 123 124 Array<datalink> output2neighbour; 125 142 126 public: 143 127 void validate(){ 128 lanehs.set_length(lanes.length()); 129 for (int l=0; l<lanes.length(); l++){ 130 lanehs(l) = new LaneHandler(lanes(l)); 131 132 rv_inputs.add(lanehs(l)->rv_inputs); 133 rv_outputs.add(lanehs(l)->rv_outputs); 134 rv_queues.add(lanehs(l)->rv_queue); 135 } 136 inputs.set_size(rv_inputs._dsize()); 137 outputs.set_size(rv_outputs._dsize()); 138 queues.set_size(rv_queues._dsize()); 139 140 for (int l=0; l<lanes.length(); l++){ 141 lanehs(l)->connect_data(*this); 142 } 143 144 //for -- rv_outputs -- 145 // TODO vybrat rv pro sousedy 146 rv_neighbours_out.set_length(neighbours.length()); 147 output2neighbour.set_length(neighbours.length()); 148 149 for (int i=0; i<neighbours.length(); i++){ 150 for (int r=0; r<rv_outputs.length(); r++){ 151 int str_pos = rv_outputs.name(r).compare(neighbours(i)); 152 if (str_pos>neighbours(i).length()){ 153 rv_neighbours_out(i).add(rv_outputs.subselect(vec_1(r))); 154 } 155 } 156 // connect datasource 157 output2neighbour(i).set_connection(rv_neighbours_out(i), rv_outputs); 158 } 159 160 // lanehs knows RVS 144 161 // write internal checks if all was loaded OK 145 162 146 // set action variable == this is a feature of the agent!147 action_rv = RV(name+"_Tc", 1); // <======= example148 163 } 149 164 void receive(const Setting &msg){ … … 151 166 UI::get(what, msg, "what", UI::compulsory); 152 167 153 if (what==" data"){ //168 if (what=="new_stable_state"){ // 154 169 // field data 155 170 // extract decription of teh received datavector 156 171 shared_ptr<RV> rv=UI::build<RV>(msg,"rv",UI::compulsory); 157 172 // find if it is needed 158 ivec ind=rv->dataind( input_rv); // position of rv in in_rv;173 ivec ind=rv->dataind(rv_inputs); // position of rv in in_rv; 159 174 if (ind.length()>0){ //data are interesting 160 175 vec dt; 161 176 UI::get(dt, msg, "value",UI::compulsory); // get data 162 set_subvector(input _data, ind, dt); //check size?177 set_subvector(inputs, ind, dt); //check size? 163 178 } 164 179 } else { 165 bdm_warning("Unknown message of type "+what);180 Participant::receive(msg); 166 181 } 167 182 } 168 183 void log_register(logger &L, const string &prefix){ 169 184 root::log_register ( L, prefix ); 170 logrec->ids.set_size(sg.length()+2); 171 int i; 172 for (i=0;i <sg.length(); i++) { 173 logrec->ids(i)=logrec->L.add_vector(sgh(i).rv_det_data, ""); 174 } 175 logrec->ids(i)=logrec->L.add_vector(input_rv,"in_"); i++; 176 logrec->ids(i)=logrec->L.add_vector(output_rv,"out_"); 185 if ( log_level[logdata]){ 186 L.add_vector ( log_level, logdata, RV ( 1 ), prefix ); 187 } 177 188 } 178 189 void log_write() const { 179 int i; 180 for (i=0;i <sg.length(); i++) { 181 logrec->L.log_vector(logrec->ids(i), sgh(i).det_data); 182 } 183 logrec->L.log_vector(logrec->ids(i),input_data); i++; 184 logrec->L.log_vector(logrec->ids(i),output_data); i++; 190 if (log_level[logdata]){ 191 log_level.store(logdata, inputs); 192 } 185 193 } 186 194 187 195 void broadcast(Setting& set){ 188 196 // broadcast data to all neighbours 189 for (int i=0; i< request_handler.length(); i++){197 for (int i=0; i<neighbours.length(); i++){ 190 198 Setting &msg =set.add(Setting::TypeGroup); 191 RequestHandler &R=request_handler(i);192 199 200 // if... 193 201 // copy from create message 194 202 // create msg with fields {to=..., what=data, rv=..., value = ...} 195 UI::save ( requests(i).to, msg, "to"); 196 UI::save ( (string)"data", msg, "what"); 197 UI::save ( &R.rv, msg, "rv"); 198 UI::save(output_data, msg, "value"); 199 } 203 UI::save ( neighbours(i), msg, "to"); 204 UI::save ( (string)"new_stable_state", msg, "what"); 205 UI::save ( &(rv_neighbours_out(i)), msg, "rv"); 206 UI::save( output2neighbour(i).pushdown(outputs), msg, "value"); 207 } 208 200 209 } 201 210 void adapt(const vec &glob_dt){ 202 211 // copy data from global vector to sSGHandlers 203 for (int i=0; i<sgh.length();i++){ 204 sgh(i).ds2data.filldown(glob_dt, sgh(i).det_data); 205 } 212 ds2inputs.filldown(glob_dt, inputs); 206 213 //copy data fro neighbours 207 ds2 output.filldown(glob_dt, output_data);214 ds2queues.filldown(glob_dt, queues); 208 215 // copy sg_length ... and others... 209 216 } 210 217 void act(vec &glob_ut){ 211 vec needs(sgh.length());212 for (int i=0; i<sgh.length();i++){213 needs(i) = sgh(i).expected_load();214 }215 218 vec action; // trivial stuff 216 219 action2ds.filldown(action,glob_ut); … … 219 222 void ds_register(const DS &ds){ 220 223 //register ds2output 221 ds2output.set_connection(output_rv, ds._drv()); 222 output_data.set_size(output_rv._dsize()); 223 for (int i=0; i<sgh.length(); i++){ 224 sgh(i).ds2data.set_connection(sgh(i).rv_det_data, ds._drv()); 225 } 224 ds2inputs.set_connection(rv_inputs, ds._drv()); 225 ds2queues.set_connection(rv_queues, ds._drv()); 226 inputs.set_size(rv_inputs._dsize()); 226 227 action2ds.set_connection( ds._urv(), action_rv); 227 228 } -
applications/doprava/traffic_agent_offset.h
r921 r927 1 1 class GreenWaveTrafficAgent : public BaseTrafficAgent { 2 /*public: 3 void GreeWaveTrafficAgent();*/ 2 protected: 3 double stable_state_loss; 4 5 double best_offset; 6 public: 7 void validate() { 8 BaseTrafficAgent::validate(); 9 action_rv = RV(name+"_offset", 1); // <======= example 10 } 11 void GreeWaveTrafficAgent(); 4 12 }; 5 13 UIREGISTER(GreenWaveTrafficAgent);