Line data Source code
1 : /****************************************************************************/
2 : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3 : // Copyright (C) 2001-2024 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 are made available under the
7 : // terms of the Eclipse Public License 2.0 which is available at
8 : // https://www.eclipse.org/legal/epl-2.0/
9 : // This Source Code may also be made available under the following Secondary
10 : // Licenses when the conditions for such availability set forth in the Eclipse
11 : // Public License 2.0 are satisfied: GNU General Public License, version 2
12 : // or later which is available at
13 : // https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
14 : // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
15 : /****************************************************************************/
16 : /// @file AGActivity.cpp
17 : /// @author Piotr Woznica
18 : /// @author Daniel Krajzewicz
19 : /// @author Walter Bamberger
20 : /// @date July 2010
21 : ///
22 : // Parent object for all activities. Derived classes generate trips for each
23 : // household.
24 : /****************************************************************************/
25 : #include <config.h>
26 :
27 : #include <utils/common/RandHelper.h>
28 : #include <activitygen/city/AGHousehold.h>
29 : #include <activitygen/city/AGTime.h>
30 : #include "AGActivity.h"
31 :
32 :
33 : // ===========================================================================
34 : // method definitions
35 : // ===========================================================================
36 : bool
37 0 : AGActivity::isGenerated() {
38 0 : return genDone;
39 : }
40 :
41 :
42 : bool
43 0 : AGActivity::generateTrips() {
44 0 : return true;
45 : }
46 :
47 : int
48 4272 : AGActivity::possibleTranspMean(AGPosition destination) {
49 : int FOOT = 1;
50 : int BUS = 2;
51 : int CAR = 4;
52 :
53 : int transp = 0;
54 :
55 4272 : if (destination.distanceTo(myHousehold->getPosition()) <= myStatData->maxFootDistance) {
56 : transp = FOOT;
57 282 : if (myHousehold->getCarNbr() != 0) {
58 : transp += CAR;
59 : }
60 282 : if (destination.minDistanceTo(myStatData->busStations) <= myStatData->maxFootDistance
61 555 : && myHousehold->getPosition().minDistanceTo(myStatData->busStations) <= myStatData->maxFootDistance) {
62 270 : transp += BUS;
63 : }
64 3990 : } else if (myHousehold->getCarNbr() == 0) {
65 945 : double d1 = destination.distanceTo(myHousehold->getPosition());
66 945 : double d2 = destination.minDistanceTo(myStatData->busStations) + myHousehold->getPosition().minDistanceTo(myStatData->busStations);
67 :
68 945 : if (d1 > d2) {
69 : transp = BUS;
70 : } else {
71 : transp = FOOT;
72 : }
73 3045 : } else if (myHousehold->getCarNbr() != 0) { //all other cases
74 3045 : if (destination.minDistanceTo(myStatData->busStations) > myStatData->maxFootDistance
75 5781 : || myHousehold->getPosition().minDistanceTo(myStatData->busStations) > myStatData->maxFootDistance) {
76 : transp = CAR;
77 : } else {
78 : transp = CAR + BUS;
79 : }
80 : }
81 4272 : return transp;
82 : }
83 :
84 : int
85 570 : AGActivity::availableTranspMeans(AGPosition from, AGPosition to) {
86 : int FOOT = 1;
87 : int BUS = 2;
88 :
89 : int available = 0;
90 :
91 570 : if (from.distanceTo(to) <= myStatData->maxFootDistance) {
92 : available += FOOT;
93 : }
94 570 : if (from.minDistanceTo(myStatData->busStations) <= myStatData->maxFootDistance
95 570 : && to.minDistanceTo(myStatData->busStations) <= myStatData->maxFootDistance) {
96 481 : available += BUS;
97 : }
98 570 : return available;
99 : }
100 :
101 :
102 : int
103 1052 : AGActivity::timeToDrive(AGPosition from, AGPosition to) {
104 1052 : double dist = from.distanceTo(to);
105 1052 : return (int)(timePerKm * dist / 1000.0);
106 : }
107 :
108 :
109 : int
110 726 : AGActivity::depHour(AGPosition from, AGPosition to, int arrival) {
111 : // ?? departure.addDays(1); // in case of negative time: arrival < timeToDrive
112 : //departure.setDay(0); // days are set to 0 because we want the time in the current day
113 726 : return (arrival - timeToDrive(from, to));
114 : }
115 :
116 :
117 : int
118 326 : AGActivity::arrHour(AGPosition from, AGPosition to, int departure) {
119 326 : return (departure + timeToDrive(from, to));
120 : }
121 :
122 :
123 : int
124 652 : AGActivity::randomTimeBetween(int begin, int end) {
125 652 : if (0 > begin || begin > end) {
126 : return -1;
127 : }
128 652 : if (begin == end) {
129 : return begin;
130 : }
131 652 : int tAlea = RandHelper::rand(end - begin);
132 652 : return (begin + tAlea);
133 : }
134 :
135 :
136 : std::list<AGTrip>&
137 3011 : AGActivity::getPartialActivityTrips() {
138 3011 : return myPartialActivityTrips;
139 : }
140 :
141 :
142 : /****************************************************************************/
|