SUMO - Simulation of Urban MObility

AGActivities.cpp

Go to the documentation of this file.
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 /****************************************************************************/
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Friends Defines