Eclipse SUMO - Simulation of Urban MObility
AGActivityGen.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 /****************************************************************************/
19 // Main class that handles City, Activities and Trips
20 /****************************************************************************/
21 
22 
23 // ===========================================================================
24 // included modules
25 // ===========================================================================
26 #include <config.h>
27 
28 #include <iostream>
29 #include <utils/xml/XMLSubSys.h>
32 #include <sstream>
33 #include "AGActivityGen.h"
34 #include "AGActivityGenHandler.h"
35 #include "city/AGPosition.h"
37 #include "AGActivityTripWriter.h"
38 #include "city/AGTime.h"
39 
40 
41 // ===========================================================================
42 // method definitions
43 // ===========================================================================
44 void
46  AGActivityGenHandler handler(city, net);
47  PROGRESS_BEGIN_MESSAGE("Reading input");
48  if (!XMLSubSys::runParser(handler, inputFile)) {
50  throw ProcessError();
51  } else {
53  }
54 
55  PROGRESS_BEGIN_MESSAGE("Consolidating statistics");
56  city.statData.consolidateStat(); //some maps are still not
58 
59  PROGRESS_BEGIN_MESSAGE("Building street representation");
62 
63  PROGRESS_BEGIN_MESSAGE("Generating work positions");
66 
67  PROGRESS_BEGIN_MESSAGE("Building bus lines");
70 
71 
72  PROGRESS_BEGIN_MESSAGE("Generating population");
75 
76  PROGRESS_BEGIN_MESSAGE("Allocating schools");
79 
80  PROGRESS_BEGIN_MESSAGE("Allocating work places");
83 
84  PROGRESS_BEGIN_MESSAGE("Allocating car places");
87 }
88 
89 bool
91  if (trip.getDay() > durationInDays + 1) {
92  return false;
93  }
94  if (trip.getDay() == 1) { //first day
95  if (trip.getTime() < beginTime) {
96  return false;
97  }
98  if (durationInDays == 0 && trip.getTime() > endTime) {
99  return false;
100  }
101  }
102  if (trip.getDay() == durationInDays + 1) { //last day
103  if (trip.getTime() > endTime) {
104  return false;
105  }
106  if (durationInDays == 0 && trip.getTime() < beginTime) {
107  return false;
108  }
109  }
110  return true;
111 }
112 
113 void
115  if (trip.getType() != "default") {
116  return;
117  }
118  //buses are on time and random are already spread
119  int variation = (int)RandHelper::randNorm(0, city.statData.departureVariation);
120  AGTime depTime(trip.getDay(), 0, 0, trip.getTime());
121  depTime += variation;
122  if (depTime.getDay() > 0) {
123  trip.setDay(depTime.getDay());
124  trip.setDepTime(depTime.getSecondsInCurrentDay());
125  } else {
126  trip.setDay(1);
127  trip.setDepTime(0);
128  }
129 }
130 
131 
132 void
133 AGActivityGen::generateOutputFile(std::list<AGTrip>& trips) {
135  if (trips.size() != 0) {
136  std::list<AGTrip>::iterator it;
137  //variables for TESTS:
138  int firstTrip = trips.front().getTime() + trips.front().getDay() * 86400;
139  int lastTrip = trips.front().getTime() + trips.front().getDay() * 86400;
140  std::map<int, int> histogram;
141  for (int i = 0; i < 100; ++i) {
142  histogram[i] = 0;
143  }
144  //END var TESTS
145  for (it = trips.begin(); it != trips.end(); ++it) {
146  atw.addTrip(*it);
147  //TEST
148  if (it->getTime() + 86400 * it->getDay() > lastTrip) {
149  lastTrip = it->getTime() + 86400 * it->getDay();
150  }
151  if (it->getTime() + 86400 * it->getDay() < firstTrip) {
152  firstTrip = it->getTime() + 86400 * it->getDay();
153  }
154  //++histogram[((it->getDay()-1)*86400 + it->getTime())/3600];
155  ++histogram[(it->getTime()) / 3600];
156  //END TEST
157  }
158  //PRINT TEST
159  AGTime first(firstTrip);
160  AGTime last(lastTrip);
161  std::cout << "first real trip: " << first.getDay() << ", " << first.getHour() << ":" << first.getMinute() << ":" << first.getSecond() << std::endl;
162  std::cout << "last real trip: " << last.getDay() << ", " << last.getHour() << ":" << last.getMinute() << ":" << last.getSecond() << std::endl;
163  for (int i = 0; i < 100; ++i) {
164  if (histogram[i] > 0) {
165  std::cout << "histogram[ hour " << i << " ] = " << histogram[i] << std::endl;
166  }
167  }
168  } else {
169  std::cout << "No real trips were generated" << std::endl;
170  }
171 }
172 
173 void
174 AGActivityGen::makeActivityTrips(int days, int beginSec, int endSec) {
175  durationInDays = days;
176  beginTime = beginSec;
177  endTime = endSec;
181  AGActivities acts(&city, durationInDays + 1);
182  acts.generateActivityTrips();
183 
187  //list<Trip>* trips = &(acts.trips);
188  std::list<AGTrip> expTrips;
189  std::map<std::string, int> carUsed;
190  std::list<AGTrip>::iterator it;
191  //multiplication of days
192  for (it = acts.trips.begin(); it != acts.trips.end(); ++it) {
193  if (it->isDaily()) {
194  for (int currday = 1; currday < durationInDays + 2; ++currday) {
195  AGTrip tr(it->getDep(), it->getArr(), it->getVehicleName(), it->getTime(), currday);
196  tr.setType(it->getType());
197  if (carUsed.find(tr.getVehicleName()) != carUsed.end()) {
198  ++carUsed.find(tr.getVehicleName())->second;
199  } else {
200  carUsed[tr.getVehicleName()] = 1;
201  }
202  std::ostringstream os;
203  os << tr.getVehicleName() << ":" << carUsed.find(tr.getVehicleName())->second;
204  tr.setVehicleName(os.str());
205  tr.addLayOverWithoutDestination(*it); //intermediate destinations are taken in account too
206  varDepTime(tr); //slight variation on each "default" car
207  if (timeTripValidation(tr)) {
208  expTrips.push_back(tr);
209  }
210  //else
211  //std::cout << "trop tard 1 pour " << tr.getVehicleName() << " " << tr.getTime() << " day: " << tr.getDay() << std::endl;
212  }
213  } else {
214  AGTrip tr(it->getDep(), it->getArr(), it->getVehicleName(), it->getTime(), it->getDay());
215  tr.setType(it->getType());
216  if (carUsed.find(tr.getVehicleName()) != carUsed.end()) {
217  ++carUsed.find(tr.getVehicleName())->second;
218  } else {
219  carUsed[tr.getVehicleName()] = 1;
220  }
221  std::ostringstream os;
222  os << tr.getVehicleName() << ":" << carUsed.find(tr.getVehicleName())->second;
223  tr.setVehicleName(os.str());
224  tr.addLayOverWithoutDestination(*it); //intermediate destinations are taken in account too
225  varDepTime(tr); //slight variation on each "default" car
226  if (timeTripValidation(tr)) {
227  expTrips.push_back(tr);
228  }
229  //else
230  //std::cout << "trop tard 2 pour " << tr.getVehicleName() << " " << tr.getTime() << " day: " << tr.getDay() << std::endl;
231  }
232  }
233 
234  std::cout << "total trips generated: " << acts.trips.size() << std::endl;
235  std::cout << "total trips finally taken: " << expTrips.size() << std::endl;
236 
240  expTrips.sort(); //natural order of trips
241  std::cout << "...sorted by departure time.\n" << std::endl;
242 
246  generateOutputFile(expTrips);
247 }
248 
249 /****************************************************************************/
AGTime::getSecondsInCurrentDay
int getSecondsInCurrentDay()
Definition: AGTime.cpp:118
AGActivityGen::durationInDays
int durationInDays
Definition: AGActivityGen.h:96
AGCity::workAllocation
void workAllocation()
Definition: AGCity.cpp:284
XMLSubSys::runParser
static bool runParser(GenericSAXHandler &handler, const std::string &file, const bool isNet=false)
Runs the given handler on the given file; returns if everything's ok.
Definition: XMLSubSys.cpp:112
AGTrip::addLayOverWithoutDestination
void addLayOverWithoutDestination(AGTrip &trip)
Definition: AGTrip.cpp:74
AGDataAndStatistics::consolidateStat
void consolidateStat()
Definition: AGDataAndStatistics.cpp:99
AGTrip
Definition: AGTrip.h:40
AGActivityGenHandler.h
PROGRESS_FAILED_MESSAGE
#define PROGRESS_FAILED_MESSAGE()
Definition: MsgHandler.h:282
MsgHandler.h
AGTrip::setDay
void setDay(int day)
Definition: AGTrip.cpp:181
AGCity::schoolAllocation
void schoolAllocation()
Definition: AGCity.cpp:263
AGCity::generateWorkPositions
void generateWorkPositions()
Definition: AGCity.cpp:97
AGActivityGen::varDepTime
void varDepTime(AGTrip &trip) const
Definition: AGActivityGen.cpp:114
AGActivities::trips
std::list< AGTrip > trips
Definition: AGActivities.h:55
AGTrip::getType
const std::string & getType() const
Definition: AGTrip.cpp:87
AGActivities
Definition: AGActivities.h:40
RandHelper::randNorm
static double randNorm(double mean, double variance, std::mt19937 *rng=0)
Access to a random number from a normal distribution.
Definition: RandHelper.h:135
AGDataAndStatistics::departureVariation
double departureVariation
Definition: AGDataAndStatistics.h:64
AGTrip::getDay
int getDay() const
Definition: AGTrip.cpp:176
AGTime
Definition: AGTime.h:36
AGActivityTripWriter.h
AGActivityGen::outputFile
OutputDevice & outputFile
The generated routes.
Definition: AGActivityGen.h:89
AGActivityGen::net
RONet * net
Definition: AGActivityGen.h:91
AGActivityGen::makeActivityTrips
void makeActivityTrips(int days=1, int beginTime=0, int endTime=0)
build activities and trips of the population and generate routes
Definition: AGActivityGen.cpp:174
AGActivityGenHandler
Definition: AGActivityGenHandler.h:46
AGTrip::setType
void setType(std::string type)
Definition: AGTrip.cpp:92
AGTime::getMinute
int getMinute()
Definition: AGTime.cpp:108
ProcessError
Definition: UtilExceptions.h:39
AGCity::generatePopulation
void generatePopulation()
Definition: AGCity.cpp:161
AGTime::getHour
int getHour()
Definition: AGTime.cpp:103
AGTime.h
AGActivityGen::generateOutputFile
void generateOutputFile(std::list< AGTrip > &trips)
generate the output file (trips or routes) using a trip list
Definition: AGActivityGen.cpp:133
AGActivityGen.h
AGActivityTripWriter::addTrip
void addTrip(const AGTrip &trip)
Definition: AGActivityTripWriter.cpp:55
AGActivities.h
AGActivities::generateActivityTrips
void generateActivityTrips()
Definition: AGActivities.cpp:56
AGCity::carAllocation
void carAllocation()
Definition: AGCity.cpp:350
AGActivityGen::endTime
int endTime
Definition: AGActivityGen.h:96
AGActivityTripWriter
Definition: AGActivityTripWriter.h:40
AGActivityGen::city
AGCity city
Definition: AGActivityGen.h:94
AGActivityGen::inputFile
std::string inputFile
Definition: AGActivityGen.h:87
AGPosition.h
AGActivityGen::timeTripValidation
bool timeTripValidation(const AGTrip &trip) const
validation: compatibility of the given trip
Definition: AGActivityGen.cpp:90
PROGRESS_BEGIN_MESSAGE
#define PROGRESS_BEGIN_MESSAGE(msg)
Definition: MsgHandler.h:278
AGActivityGen::beginTime
int beginTime
Definition: AGActivityGen.h:96
PROGRESS_DONE_MESSAGE
#define PROGRESS_DONE_MESSAGE()
Definition: MsgHandler.h:279
AGTime::getSecond
int getSecond()
Definition: AGTime.cpp:113
AGTrip::setDepTime
void setDepTime(int time)
Definition: AGTrip.cpp:141
config.h
AGCity::completeStreets
void completeStreets()
Definition: AGCity.cpp:50
AGTrip::getTime
int getTime() const
Definition: AGTrip.cpp:107
RandHelper.h
AGTrip::setVehicleName
void setVehicleName(std::string name)
Definition: AGTrip.cpp:156
AGTrip::getVehicleName
const std::string & getVehicleName() const
Definition: AGTrip.cpp:151
AGCity::completeBusLines
void completeBusLines()
Definition: AGCity.cpp:152
AGTime::getDay
int getDay()
Definition: AGTime.cpp:98
AGActivityGen::importInfoCity
void importInfoCity()
build the internal city
Definition: AGActivityGen.cpp:45
AGCity::statData
AGDataAndStatistics & statData
Definition: AGCity.h:80
XMLSubSys.h