root/applications/doprava/BaseTrafficAgentCt.h @ 1422

Revision 1422, 6.7 kB (checked in by jabu, 12 years ago)

BaseTrafficAgentCt? - zaklad agenta pro rizeni delky cyklu
Master, Observer - rizeni centralnim agentem Master, Observer jen posila data

Line 
1#pragma once
2#include "traffic_agent.h"
3#include "QueueData.h"
4
5/**
6* Zakladni trida agenta pro nastavovani delky cyklu
7*/
8class BaseTrafficAgentCt : public BaseTrafficAgent {
9protected:
10        Array<QueueData> queueData;
11        int looper;
12        mat A, B, Q, R, I0;
13        static const int T = 90;
14        double L;
15        int nOfBroadcast;
16       
17        vec computedQueues;
18        // intendsities of inputs
19        vec inputs_i;
20
21        double Tc_sum; // suma Tc*w
22        double Tc_w_sum; // suma vah
23        double Tc_computed; // vypoctena hodnota pro Tc
24        double Tc_avg; // prumer s exponencialnim zapominanim
25        double Tc_w; // vaha pro prumer s exponencialnim zapominanim
26        static int const Tc_min = 40;
27        static int const Tc_max = 200;
28
29        // pomocne logovaci soubory
30        ofstream Tc_log;
31        ofstream Q_log;
32public:
33        // FUNKCE VOLANE V main_loop NA ZACATKU
34       
35        void from_setting(const Setting& set) {
36                BaseTrafficAgent::from_setting(set);
37                UI::get(L, set, "lost_time", UI::compulsory);
38        }
39
40        void validate (){
41                BaseTrafficAgent::validate();
42               
43                queueData.set_length(queues.length());
44                looper = 0;
45                Tc_avg = 80;
46                Tc_w = 0.2;                             
47                rv_action = RV("Tc",1);
48                rv_action.add( RV( stage_names, ones_i(stage_names.length()) ) );
49
50               
51               
52                for ( int i=0; i<lanehs.length(); i ++ ) {
53                        unsigned int index = find_index( green_names, name + "_" + lanehs(i)->getSG() );
54                        lanehs(i)->green_time_ratio = green_times( index );
55                }       
56               
57                // logovaci soubory
58                stringstream Tc_log_name;
59                Tc_log_name << name << "_tc_log.dat";
60                Tc_log.open(Tc_log_name.str().c_str());
61
62                stringstream Q_log_name;
63                Q_log_name << name << "_q_log.dat";
64                Q_log.open(Q_log_name.str().c_str());
65        }
66
67        // FUNKCE VOLANE V main_loop V KAZDEM CYKLU
68
69        void initQueueData() {
70                for ( int i=0; i < queues.length(); i ++ ) {
71                        queueData(i).id = rv_queues.name(i);
72                        queueData(i).idInput = lanehs(i)->rv_inputs.name(0);
73                        if ( queues(i) > 0 )
74                                queueData(i).queue = queues(i);
75                        queueData(i).green = lanehs(i)->green_time_ratio;
76                       
77                        queueData(i).outputs.set_length( lanehs(i)->rv_outputs.length() );
78                        for ( int j = 0; j < lanehs(i)->rv_outputs.length(); j ++ ) {
79                                queueData(i).outputs(j) = lanehs(i)->rv_outputs.name(j);
80                        }
81                        queueData(i).alphas.set_length( lanehs(i)->getLane().alpha.length() );
82                        for ( int j = 0; j < lanehs(i)->getLane().alpha.length(); j ++ ) {
83                                queueData(i).alphas(j) = lanehs(i)->getLane().alpha(j);
84                        }
85                }
86                for ( int i=0; i < queueData.length(); i ++ ) {
87                        for ( int j = 0; j < rv_inputs.length(); j ++ ) {
88                                if ( queueData(i).idInput == rv_inputs.name(j) && inputs(2*j) > 0 ) {
89                                        queueData(i).input = inputs(2*j);
90                                }
91                        }
92                }
93        }
94
95        void adapt (const vec &glob_dt) {
96                BaseTrafficAgent::adapt(glob_dt);
97               
98
99                // compute inputs intensities
100                inputs_i = zeros( queues.length() );
101                for ( int i = 0; i < lanehs.length(); i++ ) {
102                        inputs_i(i) = lanehs(i)->inputs(0);
103                }
104
105                Tc_sum = 0;
106                Tc_w_sum = 0;
107                nOfBroadcast = 0;
108               
109                for ( int i=0; i<queues.length(); i ++ ) {
110                        // nevim jestli sedej indexy
111                        lanehs(i)->inputs( 0 ) = inputs( 2*find_index(rv_inputs, lanehs(i)->rv_inputs.name(0) ) );
112                        lanehs(i)->inputs( 1 ) = inputs( 2*find_index(rv_inputs, lanehs(i)->rv_inputs.name(0) ) + 1 );
113                        lanehs(i)->queue = queues( find_index( rv_queues, lanehs(i)->getQueueName() ) );
114                        lanehs(i)->countAvgs();
115                        Q_log << lanehs(i)->queue << " "; 
116                }
117
118                Q_log << endl;
119                computedQueues = getComputedQueues();   
120
121                initQueueData();
122        }
123
124        void act (vec &glob_ut){                       
125                looper ++;
126        }
127
128
129// POMOCNE FCE
130        // saturovany tok pruhu i
131        double s_flow(int i) {
132                double min_flow = 0.5;
133                double max_flow = 0.5;
134                double input = 0;
135                if ( 2*i < inputs.length() )
136                        input = inputs(2*i);
137               
138                vec q = getComputedQueues();
139                double flow = q(i);
140                if ( input > 0 )
141                        flow += input;
142                flow = flow/T;
143                if ( flow > max_flow )
144                        return max_flow;
145                if ( flow < min_flow )
146                        return min_flow;
147                else
148                        return flow;
149        }
150
151        void setCycleTime( int Tc, vec &glob_ut ) {
152                Tc_avg += Tc_w * (Tc - Tc_avg);         
153                Tc_log << Tc << "\t" << Tc_avg << endl;
154                if ( looper % 5 == 0) {
155                        Tc = (int)round(Tc_avg);
156                        cout << endl << endl << "Nastavuji Tc = "<< Tc << endl << endl;
157                        vec action;
158                        action.set_size(rv_action._dsize());
159                        action(find_index(rv_action, "Tc")) = Tc;       
160                        int st;
161                        int stage_time_sum = 0;  // soucet delky fazi
162                        action(find_index(rv_action, "Tc")) = Tc;               
163                        for ( int i =0; i < stage_names.length(); i ++) {                       
164                                if ( (i+1) < stage_names.length() ) {
165                                        st = (int)round(((double)(stage_times(i)*(double)Tc))/80.0);
166                                        stage_time_sum += st;
167                                        action(find_index(rv_action, stage_names(i))) = st;
168                                }
169                                else { // dopocitani posledni faze - oprava zaokrouhlovaci chyby
170                                        action(find_index(rv_action, stage_names(i))) = Tc - stage_time_sum;
171                                }
172                        }
173                        action2ds.filldown(action,glob_ut);
174                }
175        }
176
177        vec getComputedQueues() {
178                vec q = zeros( queues.length() );
179                for ( int i = 0; i < lanehs.length(); i++ ) {
180                        q(i) = lanehs(i)->queue_avg;
181                }
182                return q;
183        }
184
185        int findQueueDataById( string id ) {
186                for ( int i = 0; i < queueData.length(); i ++ ) {
187                        if ( queueData(i).id == id )
188                                return i;
189                }
190                return -1;
191        }
192
193        void sendQueueData( Setting &set, QueueData data) {
194                for ( int i = 0; i < neighbours.length(); i ++  ) {     
195                        Setting & msg = set.add(Setting::TypeGroup);
196                        UI::save( neighbours(i), msg, "to" );
197                        UI::save (name,msg,"from");
198                        string msgCode = data.getMessageCode();
199                        UI::save( msgCode, msg, "what" );
200                        vec value = data.getVec();
201                        UI::save( value, msg, "value" );
202                }
203        }
204
205        template <class T> void sendToAll( Setting &set, string msgCode, T value) {
206                for ( int i = 0; i < neighbours.length(); i ++  ) {     
207                        Setting & msg = set.add(Setting::TypeGroup);
208                        UI::save( neighbours(i), msg, "to" );
209                        UI::save (name,msg,"from");
210                        UI::save( msgCode, msg, "what" );
211                        UI::save( value, msg, "value" );
212                }
213        }
214
215        void printVector ( RV rv_vector, vec vector, string description ) {
216                cout << endl << description << " " << name << endl;
217                int k = 0;
218                for ( int i = 0; i < rv_vector.length(); i ++ ) {
219                        cout << rv_vector.name(i) << " : ";
220                        for ( int j = 0; j < rv_vector.size(i); j ++ ) {                               
221                                cout << vector(k) << " ";
222                                k ++;
223                        }
224                        cout << endl;
225                }
226                cout << endl;
227        }
228
229        unsigned int find_index ( RV rv_vector, string index_string ) {
230                for ( int i = 0; i < rv_vector.length(); i ++) {
231                        if ( rv_vector.name(i) == index_string )
232                                return i;
233                }
234                return -1;
235        }
236
237        unsigned int find_index ( Array <string> arr, string index_string ) {
238                for ( int i = 0; i < arr.length(); i ++) {
239                        if ( arr(i) == index_string )
240                                return i;
241                }
242                return -1;
243        }
244
245        /**
246        * Destructor
247        */
248        ~BaseTrafficAgentCt() {
249                Tc_log.close();
250                Q_log.close();
251        }
252};
Note: See TracBrowser for help on using the browser.