|
SUMO - Simulation of Urban MObility
|
00001 /****************************************************************************/ 00007 // Main class that manages activities taken in account and generates the 00008 // inhabitants' trip list. 00009 /****************************************************************************/ 00010 // SUMO, Simulation of Urban MObility; see http://sumo.sourceforge.net/ 00011 // Copyright (C) 2001-2011 DLR (http://www.dlr.de/) and contributors 00012 // activitygen module 00013 // Copyright 2010 TUM (Technische Universitaet Muenchen, http://www.tum.de/) 00014 /****************************************************************************/ 00015 // 00016 // This program is free software; you can redistribute it and/or modify 00017 // it under the terms of the GNU General Public License as published by 00018 // the Free Software Foundation; either version 2 of the License, or 00019 // (at your option) any later version. 00020 // 00021 /****************************************************************************/ 00022 00023 00024 // =========================================================================== 00025 // included modules 00026 // =========================================================================== 00027 #ifdef _MSC_VER 00028 #include <windows_config.h> 00029 #else 00030 #include <config.h> 00031 #endif 00032 00033 #include "AGActivities.h" 00034 #include "AGWorkAndSchool.h" 00035 #include "AGFreeTime.h" 00036 #include "../city/AGTime.h" 00037 #include <sstream> 00038 #include <utils/common/RandHelper.h> 00039 00040 #define REBUILD_ITERATION_LIMIT 2 00041 00042 00043 // =========================================================================== 00044 // method definitions 00045 // =========================================================================== 00046 void 00047 AGActivities::addTrip(AGTrip t, std::list<AGTrip> *tripSet) { 00048 tripSet->push_back(t); 00049 } 00050 00051 void 00052 AGActivities::addTrips(std::list<AGTrip> t, std::list<AGTrip> *tripSet) { 00053 std::list<AGTrip>::iterator it; 00054 for (it=t.begin() ; it!=t.end() ; ++it) { 00055 tripSet->push_back(*it); 00056 } 00057 } 00058 00059 void 00060 AGActivities::generateActivityTrips() { 00061 int numbErr; 00065 numbErr = 0; 00066 std::list<AGBusLine>::iterator itBL; 00067 for (itBL=myCity->busLines.begin() ; itBL!=myCity->busLines.end() ; ++itBL) { 00068 if (! generateBusTraffic(*itBL)) { 00069 ++numbErr; 00070 } 00071 } 00072 if (numbErr != 0) { 00073 std::cerr << "ERROR: " << numbErr << " bus lines couldn't been completely generated ( " << (float)numbErr*100.0/(float)myCity->busLines.size() << "% )..." << std::endl; 00074 } else { 00075 std::cout << "no problem during bus line trip generation..." << std::endl; 00076 } 00077 00078 std::cout << "after public transportation: " << trips.size() << std::endl; 00083 numbErr = 0; 00084 std::list<AGHousehold>::iterator itHH; 00085 for (itHH=myCity->households.begin() ; itHH!=myCity->households.end() ; ++itHH) { 00086 if (! generateTrips(*itHH)) { 00087 ++numbErr; 00088 } 00089 } 00090 if (numbErr != 0) { 00091 std::cout << "WARNING: " << numbErr << " ( " << (float)numbErr*100.0/(float)myCity->households.size() << "% ) households' trips haven't been generated: would probably need more iterations for rebuilding..." << std::endl; 00092 } else { 00093 std::cout << "no problem during households' trips generation..." << std::endl; 00094 } 00095 00096 std::cout << "after household activities: " << trips.size() << std::endl; 00101 if (! generateInOutTraffic()) { 00102 std::cerr << "ERROR while generating in/Out traffic..." << std::endl; 00103 } else { 00104 std::cout << "no problem during in/out traffic generation..." << std::endl; 00105 } 00106 00107 std::cout << "after incoming/outgoing traffic: " << trips.size() << std::endl; 00112 if (! generateRandomTraffic()) { 00113 std::cerr << "ERROR while generating random traffic..." << std::endl; 00114 } else { 00115 std::cout << "no problem during random traffic generation..." << std::endl; 00116 } 00117 00118 std::cout << "after random traffic: " << trips.size() << std::endl; 00119 } 00120 00121 bool 00122 AGActivities::generateTrips(AGHousehold& hh) { 00123 int iteration = 0; 00124 bool generated = false; 00125 std::list<AGTrip> temporaTrips; 00126 while (!generated && iteration < REBUILD_ITERATION_LIMIT) { 00127 if (!temporaTrips.empty()) { 00128 temporaTrips.clear(); 00129 } 00130 // Work and school activities 00131 AGWorkAndSchool ws(&hh, &(myCity->statData), &temporaTrips); 00132 generated = ws.generateTrips(); 00133 if (!generated) { 00134 hh.regenerate(); 00135 ++iteration; 00136 continue; 00137 } 00138 addTrips(ws.partialActivityTrips, &temporaTrips); 00139 00140 // free time activities 00141 AGFreeTime ft(&hh, &(myCity->statData), &temporaTrips, nbrDays); 00142 generated = ft.generateTrips(); 00143 if (!generated) { 00144 hh.regenerate(); 00145 ++iteration; 00146 continue; 00147 } 00148 addTrips(ft.partialActivityTrips, &temporaTrips); 00149 //cout << "after this hh: " << temporaTrips.size() << " we have: " << trips.size() << endl; 00150 //trips of all activities generated: 00151 addTrips(temporaTrips, &trips); 00152 } 00153 return generated; 00154 } 00155 00156 bool 00157 AGActivities::generateBusTraffic(AGBusLine bl) { 00158 std::list<AGBus>::iterator itB; 00159 std::list<AGPosition>::iterator itS; 00163 for (itB=bl.buses.begin() ; itB!=bl.buses.end() ; ++itB) { 00164 if (bl.stations.size() < 1) { 00165 return false; 00166 } 00167 AGTrip t(bl.stations.front(), bl.stations.back(), *itB, itB->getDeparture()); 00168 for (itS=bl.stations.begin() ; itS!=bl.stations.end() ; ++itS) { 00169 if (*itS == t.getDep() || *itS == t.getArr()) { 00170 continue; 00171 } 00172 t.addLayOver(*itS); 00173 } 00174 trips.push_back(t); 00175 } 00179 //verify that buses return back to the beginning 00180 if (bl.revStations.empty()) { 00181 return true; //in this case, no return way: everything is ok. 00182 } 00183 for (itB=bl.revBuses.begin() ; itB!=bl.revBuses.end() ; ++itB) { 00184 if (bl.revStations.size() < 1) { 00185 return false; 00186 } 00187 AGTrip t(bl.revStations.front(), bl.revStations.back(), *itB, itB->getDeparture()); 00188 for (itS=bl.revStations.begin() ; itS!=bl.revStations.end() ; ++itS) { 00189 if (*itS == t.getDep() || *itS == t.getArr()) { 00190 continue; 00191 } 00192 t.addLayOver(*itS); 00193 } 00194 trips.push_back(t); 00195 } 00196 return true; 00197 } 00198 00199 bool 00200 AGActivities::generateInOutTraffic() { 00206 if (myCity->peopleIncoming.empty()) { 00207 return true; 00208 } 00209 if (myCity->cityGates.empty()) { 00210 return false; 00211 } 00212 int num = 1; 00213 std::list<AGAdult>::iterator itA; 00214 00215 for (itA=myCity->peopleIncoming.begin() ; itA!=myCity->peopleIncoming.end() ; ++itA) { 00216 int posi = myCity->statData.getRandomCityGateByIncoming(); 00217 std::string nom(generateName(num, "carIn")); 00218 AGTrip wayTrip(myCity->cityGates[posi], itA->getWorkPosition().getPosition(), nom, itA->getWorkPosition().getOpening()); 00219 //now we put the estimated time of entrance in the city. 00220 wayTrip.setDepTime(wayTrip.estimateDepTime(wayTrip.getTime(), myCity->statData.speedTimePerKm)); 00221 AGTrip retTrip(itA->getWorkPosition().getPosition(), myCity->cityGates[posi], nom, itA->getWorkPosition().getClosing()); 00222 trips.push_back(wayTrip); 00223 trips.push_back(retTrip); 00224 ++num; 00225 } 00226 return true; 00227 } 00228 00229 std::string 00230 AGActivities::generateName(int i, std::string prefix) { 00231 std::ostringstream os; 00232 os << i; 00233 return prefix + os.str(); 00234 } 00235 00236 bool 00237 AGActivities::generateRandomTraffic() { 00238 //total number of trips during the whole simulation 00239 int totalTrips = 0, ttOneDayTrips = 0, ttDailyTrips = 0; 00240 std::list<AGTrip>::iterator it; 00241 for (it = trips.begin() ; it != trips.end() ; ++it) { 00242 if (it->isDaily()) { 00243 ++ttDailyTrips; 00244 } else { 00245 ++ttOneDayTrips; 00246 } 00247 } 00248 totalTrips = ttOneDayTrips + ttDailyTrips * nbrDays; 00249 //TESTS 00250 std::cout << "Before Random traffic generation (days are still entire):" << std::endl; 00251 std::cout << "- Total number of trips: " << totalTrips << std::endl; 00252 std::cout << "- Total daily trips: " << ttDailyTrips << std::endl; 00253 std::cout << "- Total one-day trips: " << ttOneDayTrips << std::endl; 00254 //END OF TESTS 00255 00256 //random uniform distribution: 00257 int nbrRandUni = (int)((float)totalTrips * myCity->statData.uniformRandomTrafficRate / (1.0f - myCity->statData.uniformRandomTrafficRate)); 00258 //TESTS 00259 std::cout << "added uniform random trips: " << nbrRandUni << std::endl; 00260 //END OF TESTS 00261 for (int i=0 ; i<nbrRandUni ; ++i) { 00262 AGPosition dep(myCity->getRandomStreet()); 00263 AGPosition arr(myCity->getRandomStreet()); 00264 AGTime depTime(RandHelper::rand(nbrDays*86400)); 00265 AGTrip rdtr(dep, arr, generateName(i, "randUni"), depTime.getTime()%86400, depTime.getDay()+1); 00266 rdtr.setType("random"); 00267 trips.push_back(rdtr); 00268 } 00269 00270 //random proportional distribution: 00271 float proportionalPercentage = 0.05f; 00272 //TODO generate a proportionally distributed random traffic 00273 00274 return true; 00275 } 00276 00277 /****************************************************************************/