Eclipse SUMO - Simulation of Urban MObility
AGActivities.cpp
Go to the documentation of this file.
1 /****************************************************************************/
2 // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.org/sumo
3 // Copyright (C) 2010-2019 German Aerospace Center (DLR) and others.
4 // activitygen module
5 // Copyright 2010 TUM (Technische Universitaet Muenchen, http://www.tum.de/)
6 // This program and the accompanying materials
7 // are made available under the terms of the Eclipse Public License v2.0
8 // which accompanies this distribution, and is available at
9 // http://www.eclipse.org/legal/epl-v20.html
10 // SPDX-License-Identifier: EPL-2.0
11 /****************************************************************************/
20 // Main class that manages activities taken in account and generates the
21 // inhabitants' trip list.
22 /****************************************************************************/
23 
24 
25 // ===========================================================================
26 // included modules
27 // ===========================================================================
28 #include <config.h>
29 
30 #include "AGActivities.h"
31 #include "AGWorkAndSchool.h"
32 #include "AGFreeTime.h"
33 #include "../city/AGTime.h"
34 #include <sstream>
36 
37 #define REBUILD_ITERATION_LIMIT 2
38 
39 
40 // ===========================================================================
41 // method definitions
42 // ===========================================================================
43 void
44 AGActivities::addTrip(AGTrip t, std::list<AGTrip>* tripSet) {
45  tripSet->push_back(t);
46 }
47 
48 void
49 AGActivities::addTrips(std::list<AGTrip> t, std::list<AGTrip>* tripSet) {
50  std::list<AGTrip>::iterator it;
51  for (it = t.begin(); it != t.end(); ++it) {
52  tripSet->push_back(*it);
53  }
54 }
55 
56 void
58  int numbErr;
62  numbErr = 0;
63  std::list<AGBusLine>::iterator itBL;
64  for (itBL = myCity->busLines.begin(); itBL != myCity->busLines.end(); ++itBL) {
65  if (! generateBusTraffic(*itBL)) {
66  ++numbErr;
67  }
68  }
69  if (numbErr != 0) {
70  std::cerr << "ERROR: " << numbErr << " bus lines couldn't been completely generated ( " << (float)numbErr * 100.0 / (float)myCity->busLines.size() << "% )..." << std::endl;
71  } else {
72  std::cout << "no problem during bus line trip generation..." << std::endl;
73  }
74 
75  std::cout << "after public transportation: " << trips.size() << std::endl;
80  numbErr = 0;
81  std::list<AGHousehold>::iterator itHH;
82  for (itHH = myCity->households.begin(); itHH != myCity->households.end(); ++itHH) {
83  if (! generateTrips(*itHH)) {
84  ++numbErr;
85  }
86  }
87  if (numbErr != 0) {
88  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;
89  } else {
90  std::cout << "no problem during households' trips generation..." << std::endl;
91  }
92 
93  std::cout << "after household activities: " << trips.size() << std::endl;
98  if (! generateInOutTraffic()) {
99  std::cerr << "ERROR while generating in/Out traffic..." << std::endl;
100  } else {
101  std::cout << "no problem during in/out traffic generation..." << std::endl;
102  }
103 
104  std::cout << "after incoming/outgoing traffic: " << trips.size() << std::endl;
109  if (! generateRandomTraffic()) {
110  std::cerr << "ERROR while generating random traffic..." << std::endl;
111  } else {
112  std::cout << "no problem during random traffic generation..." << std::endl;
113  }
114 
115  std::cout << "after random traffic: " << trips.size() << std::endl;
116 }
117 
118 bool
120  int iteration = 0;
121  bool generated = false;
122  std::list<AGTrip> temporaTrips;
123  while (!generated && iteration < REBUILD_ITERATION_LIMIT) {
124  if (!temporaTrips.empty()) {
125  temporaTrips.clear();
126  }
127  // Work and school activities
128  AGWorkAndSchool ws(&hh, &(myCity->statData), &temporaTrips);
129  generated = ws.generateTrips();
130  if (!generated) {
131  hh.regenerate();
132  ++iteration;
133  continue;
134  }
135  addTrips(ws.getPartialActivityTrips(), &temporaTrips);
136 
137  // free time activities
138  AGFreeTime ft(&hh, &(myCity->statData), &temporaTrips, nbrDays);
139  generated = ft.generateTrips();
140  if (!generated) {
141  hh.regenerate();
142  ++iteration;
143  continue;
144  }
145  addTrips(ft.getPartialActivityTrips(), &temporaTrips);
146  //cout << "after this hh: " << temporaTrips.size() << " we have: " << trips.size() << endl;
147  //trips of all activities generated:
148  addTrips(temporaTrips, &trips);
149  }
150  return generated;
151 }
152 
153 bool
155  std::list<AGBus>::iterator itB;
156  std::list<AGPosition>::iterator itS;
160  for (itB = bl.buses.begin(); itB != bl.buses.end(); ++itB) {
161  if (bl.stations.size() < 1) {
162  return false;
163  }
164  AGTrip t(bl.stations.front(), bl.stations.back(), *itB, itB->getDeparture());
165  for (itS = bl.stations.begin(); itS != bl.stations.end(); ++itS) {
166  if (*itS == t.getDep() || *itS == t.getArr()) {
167  continue;
168  }
169  t.addLayOver(*itS);
170  }
171  trips.push_back(t);
172  }
176  //verify that buses return back to the beginning
177  if (bl.revStations.empty()) {
178  return true; //in this case, no return way: everything is ok.
179  }
180  for (itB = bl.revBuses.begin(); itB != bl.revBuses.end(); ++itB) {
181  if (bl.revStations.size() < 1) {
182  return false;
183  }
184  AGTrip t(bl.revStations.front(), bl.revStations.back(), *itB, itB->getDeparture());
185  for (itS = bl.revStations.begin(); itS != bl.revStations.end(); ++itS) {
186  if (*itS == t.getDep() || *itS == t.getArr()) {
187  continue;
188  }
189  t.addLayOver(*itS);
190  }
191  trips.push_back(t);
192  }
193  return true;
194 }
195 
196 bool
203  if (myCity->peopleIncoming.empty()) {
204  return true;
205  }
206  if (myCity->cityGates.empty()) {
207  return false;
208  }
209  int num = 1;
210  std::list<AGAdult>::iterator itA;
211 
212  for (itA = myCity->peopleIncoming.begin(); itA != myCity->peopleIncoming.end(); ++itA) {
214  std::string nom(generateName(num, "carIn"));
215  AGTrip wayTrip(myCity->cityGates[posi], itA->getWorkPosition().getPosition(), nom, itA->getWorkPosition().getOpening());
216  //now we put the estimated time of entrance in the city.
217  wayTrip.setDepTime(wayTrip.estimateDepTime(wayTrip.getTime(), myCity->statData.speedTimePerKm));
218  AGTrip retTrip(itA->getWorkPosition().getPosition(), myCity->cityGates[posi], nom, itA->getWorkPosition().getClosing());
219  trips.push_back(wayTrip);
220  trips.push_back(retTrip);
221  ++num;
222  }
223  return true;
224 }
225 
226 std::string
227 AGActivities::generateName(int i, std::string prefix) {
228  std::ostringstream os;
229  os << i;
230  return prefix + os.str();
231 }
232 
233 bool
235  //total number of trips during the whole simulation
236  int totalTrips = 0, ttOneDayTrips = 0, ttDailyTrips = 0;
237  std::list<AGTrip>::iterator it;
238  for (it = trips.begin(); it != trips.end(); ++it) {
239  if (it->isDaily()) {
240  ++ttDailyTrips;
241  } else {
242  ++ttOneDayTrips;
243  }
244  }
245  totalTrips = ttOneDayTrips + ttDailyTrips * nbrDays;
246  //TESTS
247  std::cout << "Before Random traffic generation (days are still entire):" << std::endl;
248  std::cout << "- Total number of trips: " << totalTrips << std::endl;
249  std::cout << "- Total daily trips: " << ttDailyTrips << std::endl;
250  std::cout << "- Total one-day trips: " << ttOneDayTrips << std::endl;
251  //END OF TESTS
252 
253  //random uniform distribution:
254  int nbrRandUni = (int)((float)totalTrips * myCity->statData.uniformRandomTrafficRate / (1.0f - myCity->statData.uniformRandomTrafficRate));
255  //TESTS
256  std::cout << "added uniform random trips: " << nbrRandUni << std::endl;
257  //END OF TESTS
258  for (int i = 0; i < nbrRandUni; ++i) {
261  AGTime depTime(RandHelper::rand(nbrDays * 86400));
262  AGTrip rdtr(dep, arr, generateName(i, "randUni"), depTime.getTime() % 86400, depTime.getDay() + 1);
263  rdtr.setType("random");
264  trips.push_back(rdtr);
265  }
266 
267  //random proportional distribution:
268  //float proportionalPercentage = 0.05f;
269  //TODO generate a proportionally distributed random traffic
270 
271  return true;
272 }
273 
274 /****************************************************************************/
bool generateTrips(AGHousehold &hh)
void addLayOver(AGPosition by)
Definition: AGTrip.cpp:61
void generateActivityTrips()
std::list< AGBus > buses
Definition: AGBusLine.h:55
std::string generateName(int i, std::string prefix)
Definition: AGTime.h:37
std::list< AGPosition > stations
Definition: AGBusLine.h:53
static double rand(std::mt19937 *rng=0)
Returns a random real number in [0, 1)
Definition: RandHelper.h:60
A location in the 2D plane freely positioned on a street.
Definition: AGPosition.h:56
AGDataAndStatistics & statData
Definition: AGCity.h:81
void setType(std::string type)
Definition: AGTrip.cpp:93
std::list< AGPosition > revStations
Definition: AGBusLine.h:54
#define REBUILD_ITERATION_LIMIT
std::list< AGBusLine > busLines
Definition: AGCity.h:85
void regenerate()
void setDepTime(int time)
Definition: AGTrip.cpp:142
const AGStreet & getRandomStreet()
Definition: AGCity.cpp:420
bool generateInOutTraffic()
std::list< AGBus > revBuses
Definition: AGBusLine.h:56
std::list< AGTrip > trips
Definition: AGActivities.h:56
std::list< AGTrip > & getPartialActivityTrips()
Definition: AGActivity.cpp:139
std::list< AGHousehold > households
Definition: AGCity.h:86
void addTrip(AGTrip t, std::list< AGTrip > *tripSet)
std::list< AGAdult > peopleIncoming
Definition: AGCity.h:88
AGCity * myCity
Definition: AGActivities.h:69
std::vector< AGPosition > cityGates
Definition: AGCity.h:87
void addTrips(std::list< AGTrip > t, std::list< AGTrip > *tripSet)
Definition: AGTrip.h:41
bool generateRandomTraffic()
bool generateBusTraffic(AGBusLine bl)