root/applications/doprava/main_loop.cpp @ 932

Revision 932, 3.2 kB (checked in by ondrak, 14 years ago)

Extended negotiation cycle

Line 
1
2/*!
3\file
4\brief Distributed Traffic light Control Scenario
5\author Vasek Smidl
6
7 */
8
9#include "base/user_info.h"
10#include "base/loggers.h"
11#ifdef _WIN32
12#include "aimsun_bdm/aimsun_ds.h"
13#else
14#include "aimsun_bdm/aimsun_fake.h"
15#endif
16#include "traffic_agent.h"
17#include "traffic_agent_offset.h"
18
19using namespace bdm;
20
21int main ( int argc, char* argv[] ) {
22        const char *fname;
23        int max_cycles=5; //max. number of sending/recieving during negotiation, changed to number from config file, if present (negotiation_cycles)
24
25        if ( argc>1 ) {fname = argv[1]; }
26        else { cout << "Missing configuration file.\n Usage: \n $> estimator config_file.cfg"<<endl; abort(); }
27        UIFile Cfg ( fname );
28
29        // SYSTEM TO CONTROL
30        shared_ptr<AimsunDS> Ds=UI::build<AimsunDS>(Cfg.lookup("system"),UI::compulsory);
31
32        // AGENTS
33        Array<shared_ptr<Participant> > Ags;
34        UI::get ( Ags,Cfg, "agents" );
35
36        // LOGGER
37        shared_ptr<logger> L = UI::build <logger>( Cfg, "logger" );
38        if (!L) {L=new stdlog();} // DEFAULT LOGGER <== poor choice, use better ones
39
40
41
42        Config MsgStore;
43        MsgStore.setAutoConvert(true);
44        Setting& Queue = MsgStore.getRoot().add("queue", Setting::TypeList);
45
46        // REGISTER ACTIVE OBJECTS IN LOGGER
47        Ds->log_register ( *L, "DS" );
48        for ( int i=0; i<Ags.length(); i++ ) {
49                Ags ( i )->log_register ( *L,Ags(i)->_name() ); // estimate
50                Ags ( i )->ds_register(*Ds);            // allows agents to update their datalinks
51        }
52        L->init();
53
54        vec glob_dt(Ds->_drv()._dsize() );
55        vec glob_ut(Ds->_urv()._dsize() );
56
57        // INITIALISATION OF UT
58        glob_ut[ 0] = 80; // cycle time
59        glob_ut[ 1] = 40; // offset 495
60        glob_ut[ 2] = 30; // ut[2]+ut[3]+ut[4] has to sum up to ut[0]
61        glob_ut[ 3] = 30;
62        glob_ut[ 4] = 20;
63    glob_ut[ 8] = 20; // offset 601
64        glob_ut[ 9] = 30; // ut[9]+ut[10]+ut[11] has to sum up to ut[0]
65        glob_ut[10] = 30;
66        glob_ut[11] = 20;
67
68        //LENGTH OF NEGOTIATION
69        UI::get(max_cycles,Cfg,"negotiation_cycles");
70
71        for ( int tK=0; tK < Ds->max_length(); tK++ ) {
72
73                Ds->log_write ( ); // write stuff to
74                Ds->getdata(glob_dt);
75                for ( int i=0; i<Ags.length(); i++ ) {
76                        Ags(i) -> adapt(glob_dt);
77                }
78
79                // NEGOTIATION CYCLE
80                // ends when Queue is empty or after defined number of cycles
81                int cycle=0;
82                do {
83                        //DBG
84                        MsgStore.writeFile("xxx");
85                        // parse message queue
86                        for ( int m=Queue.getLength()-1; m>=0; m-- ) { // go backwards - last mesages are discarded
87                                for ( int i=0; i<Ags.length(); i++ ) {
88                                        Setting& msg=Queue[m];
89                                        string m_to=msg["to"];
90                                        if (m_to==Ags(i)->_name()) {
91                                                Ags(i)->receive(msg);
92                                                Queue.remove(m);
93                                                break;
94                                                // message delivered;
95                                        }
96                                }
97                        }
98                        if (Queue.getLength()>0){bdm_error("undelivered messages - probably unknown neighbours");}
99
100                        for ( int i=0; i<Ags.length(); i++ ) {
101                                Ags(i) -> broadcast(Queue);
102                        }
103
104                        cycle++;
105                } 
106                while ((Queue.getLength()>0) && (cycle<max_cycles));
107
108                for ( int i=0; i<Ags.length(); i++ ) {
109                        Ags(i) -> act(glob_ut);
110                }
111
112                L->step();
113                Ds->write(glob_ut);
114                Ds->step();                                                     // simulator step
115
116                for ( int i=0; i<Ags.length(); i++ ) {
117                        Ags(i) -> log_write();
118                        Ags(i) -> step();
119                }
120               
121        }
122
123        L->finalize();
124
125        return 0;
126}
Note: See TracBrowser for help on using the browser.