Eclipse SUMO - Simulation of Urban MObility
AGFreeTime.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 // Generates trips related to after-work activities
21 // like visiting the family or party.
22 /****************************************************************************/
23 
24 
25 // ===========================================================================
26 // included modules
27 // ===========================================================================
28 #include <config.h>
29 
30 #include <cmath>
32 #include <utils/common/StdDefs.h>
35 #include "AGFreeTime.h"
36 
37 
38 // ===========================================================================
39 // static member definitions
40 // ===========================================================================
41 const int AGFreeTime::DAY = 1;
42 const int AGFreeTime::EVENING = 2;
43 const int AGFreeTime::NIGHT = 4;
44 
45 const int AGFreeTime::TB_DAY = AGTime(0, 8, 0).getTime();
46 const int AGFreeTime::TE_DAY = AGTime(0, 18, 0).getTime();
47 const int AGFreeTime::TB_EVENING = AGTime(0, 19, 0).getTime();
48 const int AGFreeTime::TE_EVENING = AGTime(0, 23, 59).getTime();
49 const int AGFreeTime::TB_NIGHT = AGTime(0, 23, 0).getTime();
50 const int AGFreeTime::TE_NIGHT = AGTime(1, 5, 0).getTime();
51 
52 
53 // ===========================================================================
54 // method definitions
55 // ===========================================================================
56 int
58  if (myHousehold->getAdults().front().decide(freqOut)) {
59  int num_poss = 0; //(possibleType % 2) + (possibleType / 4) + ((possibleType / 2) % 2);
60  if (possibleType & DAY) {
61  ++num_poss;
62  }
63  if (possibleType & EVENING) {
64  ++num_poss;
65  }
66  if (possibleType & NIGHT) {
67  ++num_poss;
68  }
69 
70  if (num_poss == 0) {
71  return 0;
72  }
73  double alea = RandHelper::rand(); //(float)(rand() % 1000) / 1000.0;
74  int decision = (int)floor(alea * (double)num_poss);
75 
76  if (possibleType & DAY) {
77  if (decision == 0) {
78  return DAY;
79  } else {
80  --decision;
81  }
82  }
83  if (possibleType & EVENING) {
84  if (decision == 0) {
85  return EVENING;
86  } else {
87  --decision;
88  }
89  }
90  if (possibleType & NIGHT) {
91  if (decision == 0) {
92  return NIGHT;
93  }
94  }
95  }
96  return 0;
97 }
98 
99 int
101  int val = 0;
102  if (myHousehold->getAdults().front().getAge() >= myStatData->limitAgeRetirement && tReady == 0) {
103  val += DAY + EVENING;
104  } else {
106  val += NIGHT;
107  }
108 
109  std::list<AGAdult>::const_iterator itA;
110  bool noBodyWorks = true;
111  for (itA = myHousehold->getAdults().begin(); itA != myHousehold->getAdults().end(); ++itA) {
112  if (itA->isWorking()) {
113  noBodyWorks = false;
114  }
115  }
116  if (noBodyWorks) {
117  val += DAY;
118  }
119 
120  if (tReady < AGTime(0, 22, 0).getTime()) {
121  val += EVENING;
122  }
123  }
124  return val;
125 }
126 
127 bool
129  int backHome = whenBackHomeThisDay(day);
130  if (myHousehold->getCars().empty()) {
131  return true;
132  }
134  int depTime = randomTimeBetween(MAX2(backHome, TB_DAY), (TB_DAY + TE_DAY) / 2);
135  int arrTime = this->arrHour(myHousehold->getPosition(), destination, depTime);
136  int retTime = randomTimeBetween(arrTime, TE_DAY);
137  if (depTime < 0 || retTime < 0) {
138  return true; // not enough time during the day
139  }
140  AGTrip depTrip(myHousehold->getPosition(), destination, myHousehold->getCars().front().getName(), depTime, day);
141  AGTrip retTrip(destination, myHousehold->getPosition(), myHousehold->getCars().front().getName(), retTime, day);
142 
143  myPartialActivityTrips.push_back(depTrip);
144  myPartialActivityTrips.push_back(retTrip);
145  return true;
146 }
147 
148 bool
150  int backHome = whenBackHomeThisDay(day);
151  if (myHousehold->getCars().empty()) {
152  return true;
153  }
155  int depTime = randomTimeBetween(MAX2(backHome, TB_EVENING), TE_EVENING);
156  int arrTime = this->arrHour(myHousehold->getPosition(), destination, depTime);
157  int retTime = randomTimeBetween(arrTime, TE_EVENING);
158  if (depTime < 0 || retTime < 0) {
159  return true; // not enough time during the day
160  }
161  AGTrip depTrip(myHousehold->getPosition(), destination, myHousehold->getCars().front().getName(), depTime, day);
162  AGTrip retTrip(destination, myHousehold->getPosition(), myHousehold->getCars().front().getName(), retTime, day);
163 
164  myPartialActivityTrips.push_back(depTrip);
165  myPartialActivityTrips.push_back(retTrip);
166  return true;
167 }
168 
169 bool
171  int backHome = whenBackHomeThisDay(day);
172  int ActivitiesNextDay = whenBeginActivityNextDay(day); // is equal to 2 days if there is nothing the next day
173  int nextDay = 0;
174  if (myHousehold->getCars().empty()) {
175  return true;
176  }
178 
179  int depTime = randomTimeBetween(MAX2(backHome, TB_NIGHT), TE_NIGHT);
180  int arrTime = this->arrHour(myHousehold->getPosition(), destination, depTime);
181  //we have to go back home before the beginning of next day activities.
182  int lastRetTime = this->depHour(destination, myHousehold->getPosition(), MIN2(TE_NIGHT, ActivitiesNextDay));
183  int retTime = randomTimeBetween(arrTime, lastRetTime);
184  if (depTime < 0 || retTime < 0) {
185  return true; // not enough time during the day
186  }
187 
188  AGTime departureTime(depTime);
189  nextDay = departureTime.getDay();
190  departureTime.setDay(0);
191  AGTrip depTrip(myHousehold->getPosition(), destination, myHousehold->getCars().front().getName(), departureTime.getTime(), day + nextDay);
192 
193  AGTime returnTime(depTime);
194  nextDay = returnTime.getDay();
195  returnTime.setDay(0);
196  AGTrip retTrip(destination, myHousehold->getPosition(), myHousehold->getCars().front().getName(), returnTime.getTime(), day + nextDay);
197 
198  myPartialActivityTrips.push_back(depTrip);
199  myPartialActivityTrips.push_back(retTrip);
200  return true;
201 }
202 
203 bool
205  tReady = whenBackHome();
207  int type;
208 
209  for (int day = 1; day <= nbrDays; ++day) {
210  type = decideTypeOfTrip();
211  if (type == 0) {
212  continue;
213  } else if (type == DAY) {
214  if (!typeFromHomeDay(day)) {
215  return false;
216  }
217  } else if (type == EVENING) {
218  if (!typeFromHomeEvening(day)) {
219  return false;
220  }
221  } else if (type == NIGHT) {
222  if (!typeFromHomeNight(day)) {
223  return false;
224  }
225  }
226  }
227  genDone = true;
228  return genDone;
229 }
230 
231 int
233  int timeBack = 0;
234  for (std::list<AGTrip>::iterator itT = myPreviousTrips->begin(); itT != myPreviousTrips->end(); ++itT) {
235  if (timeBack < itT->getArrTime(this->timePerKm) && itT->isDaily()) {
236  timeBack = itT->getArrTime(this->timePerKm);
237  }
238  }
239  return timeBack;
240 }
241 
242 int
244  int timeBack = 0;
245  for (std::list<AGTrip>::iterator itT = myPreviousTrips->begin(); itT != myPreviousTrips->end(); ++itT) {
246  if (timeBack < itT->getArrTime(this->timePerKm) && (itT->getDay() == day || itT->isDaily())) {
247  timeBack = itT->getArrTime(this->timePerKm);
248  }
249  }
250  return timeBack;
251 }
252 
253 int
255  AGTime timeBack(1, 0, 0);
256  for (std::list<AGTrip>::iterator itT = myPreviousTrips->begin(); itT != myPreviousTrips->end(); ++itT) {
257  if (timeBack.getTime() > itT->getTime() && (itT->getDay() == (day + 1) || itT->isDaily())) {
258  timeBack.setTime(itT->getTime());
259  }
260  }
261  timeBack.addDays(1); // this the beginning of activities of the next day
262  return timeBack.getTime();
263 }
264 
265 /****************************************************************************/
AGHousehold::getAdultNbr
int getAdultNbr()
Definition: AGHousehold.cpp:95
MIN2
T MIN2(T a, T b)
Definition: StdDefs.h:74
AGTime::addDays
void addDays(int days)
addition of days to the current moment
Definition: AGTime.cpp:166
AGFreeTime::possibleType
int possibleType
Definition: AGFreeTime.h:108
AGActivity::myPreviousTrips
std::list< AGTrip > * myPreviousTrips
Definition: AGActivity.h:112
AGActivity::arrHour
int arrHour(AGPosition from, AGPosition to, int departure)
Definition: AGActivity.cpp:120
AGTrip
Definition: AGTrip.h:41
AGFreeTime::NIGHT
static const int NIGHT
Definition: AGFreeTime.h:112
AGFreeTime::whenBackHome
int whenBackHome()
Definition: AGFreeTime.cpp:232
AGFreeTime::TB_EVENING
static const int TB_EVENING
Definition: AGFreeTime.h:116
AGFreeTime::TB_NIGHT
static const int TB_NIGHT
Definition: AGFreeTime.h:118
AGDataAndStatistics::limitAgeRetirement
int limitAgeRetirement
Definition: AGDataAndStatistics.h:55
AGHousehold::getPosition
AGPosition getPosition()
Definition: AGHousehold.cpp:189
AGTime::getTime
int getTime()
: returns the number of seconds from the beginning of the first day of simulation this includes
Definition: AGTime.cpp:124
AGFreeTime::freqOut
double freqOut
Definition: AGFreeTime.h:94
AGFreeTime::TB_DAY
static const int TB_DAY
Definition: AGFreeTime.h:114
AGTime
Definition: AGTime.h:37
AGFreeTime::TE_EVENING
static const int TE_EVENING
Definition: AGFreeTime.h:117
AGHousehold::getPeopleNbr
int getPeopleNbr()
Definition: AGHousehold.cpp:90
MAX2
T MAX2(T a, T b)
Definition: StdDefs.h:80
AGActivity::myHousehold
AGHousehold * myHousehold
Definition: AGActivity.h:108
AGFreeTime::possibleTypeOfTrip
int possibleTypeOfTrip()
Definition: AGFreeTime.cpp:100
RandHelper::rand
static double rand(std::mt19937 *rng=0)
Returns a random real number in [0, 1)
Definition: RandHelper.h:60
AGHousehold::getTheCity
AGCity * getTheCity()
Definition: AGHousehold.cpp:194
AGFreeTime::typeFromHomeEvening
bool typeFromHomeEvening(int day)
Definition: AGFreeTime.cpp:149
AGFreeTime::decideTypeOfTrip
int decideTypeOfTrip()
Definition: AGFreeTime.cpp:57
AGFreeTime::TE_NIGHT
static const int TE_NIGHT
Definition: AGFreeTime.h:119
AGFreeTime::whenBeginActivityNextDay
int whenBeginActivityNextDay(int day)
Definition: AGFreeTime.cpp:254
AGFreeTime::DAY
static const int DAY
Definition: AGFreeTime.h:110
AGTime.h
AGCity::getRandomStreet
const AGStreet & getRandomStreet()
Definition: AGCity.cpp:420
AGFreeTime::typeFromHomeNight
bool typeFromHomeNight(int day)
Definition: AGFreeTime.cpp:170
AGFreeTime::whenBackHomeThisDay
int whenBackHomeThisDay(int day)
Definition: AGFreeTime.cpp:243
AGFreeTime::TE_DAY
static const int TE_DAY
Definition: AGFreeTime.h:115
AGActivity::randomTimeBetween
int randomTimeBetween(int begin, int end)
Definition: AGActivity.cpp:126
AGFreeTime::typeFromHomeDay
bool typeFromHomeDay(int day)
Definition: AGFreeTime.cpp:128
AGPosition
A location in the 2D plane freely positioned on a street.
Definition: AGPosition.h:56
AGFreeTime::nbrDays
int nbrDays
Definition: AGFreeTime.h:99
AGTime::setDay
void setDay(int d)
Definition: AGTime.cpp:129
AGFreeTime.h
config.h
RandHelper.h
StdDefs.h
AGActivity::depHour
int depHour(AGPosition from, AGPosition to, int arrival)
Definition: AGActivity.cpp:112
AGHousehold::getAdults
const std::list< AGAdult > & getAdults() const
Definition: AGHousehold.cpp:100
AGFreeTime::EVENING
static const int EVENING
Definition: AGFreeTime.h:111
AGActivity::myStatData
AGDataAndStatistics * myStatData
Definition: AGActivity.h:110
AGCity.h
AGHousehold::getCars
const std::list< AGCar > & getCars() const
Definition: AGHousehold.cpp:110
AGActivity::myPartialActivityTrips
std::list< AGTrip > myPartialActivityTrips
Definition: AGActivity.h:113
AGActivity::timePerKm
double timePerKm
Definition: AGActivity.h:116
AGTime::getDay
int getDay()
Definition: AGTime.cpp:99
AGFreeTime::generateTrips
bool generateTrips()
Definition: AGFreeTime.cpp:204
AGFreeTime::tReady
int tReady
Definition: AGFreeTime.h:104
AGActivity::genDone
bool genDone
Definition: AGActivity.h:115
AGTime::setTime
void setTime(int sec)
: sets the time from the beginning of the first day of simulation in seconds
Definition: AGTime.cpp:161