1 package tutorial.programming.demandGenerationWithFacilities;
3 import org.apache.log4j.Logger;
16 import java.io.BufferedReader;
17 import java.io.FileReader;
18 import java.io.IOException;
28 private static final String pusTripsFile =
"examples/tutorial/programming/demandGenerationWithFacilities/travelsurvey_trips.txt";
29 private static final String pusPersonsFile =
"examples/tutorial/programming/demandGenerationWithFacilities/travelsurvey_persons.txt";
32 private Random random =
new Random(3838494);
34 private List<Id> pusWorkers =
new Vector<>();
35 private List<Id> pusNonWorkers =
new Vector<>();
37 private QuadTree<ActivityFacility> shopFacilitiesTree;
38 private QuadTree<ActivityFacility> leisureFacilitiesTree;
39 private QuadTree<ActivityFacility> educationFacilitiesTree;
41 private final static Logger log = Logger.getLogger(CreateDemand.class);
45 this.scenario = scenario;
47 this.personHomeAndWorkLocations = personHomeAndWorkLocations;
49 this.createPUSPersons();
50 this.createPUSPlans();
51 this.assignPUSPlansToMATSimPopulation();
58 this.shopFacilitiesTree = CreatePopulation.createActivitiesTree(
"shop", this.scenario);
59 this.leisureFacilitiesTree = CreatePopulation.createActivitiesTree(
"leisure", this.scenario);
60 this.educationFacilitiesTree = CreatePopulation.createActivitiesTree(
"education", this.scenario);
63 private void createPUSPersons() {
74 BufferedReader bufferedReader =
new BufferedReader(
new FileReader(pusPersonsFile));
75 bufferedReader.readLine();
77 int index_personId = 0;
80 while ((line = bufferedReader.readLine()) != null) {
81 String parts[] = line.split(
"\t");
85 System.out.println(Arrays.asList(parts));
86 System.out.println(parts[index_personId]);
97 bufferedReader.close();
99 catch (IOException e) {
107 private void createPUSPlans() {
118 BufferedReader bufferedReader =
new BufferedReader(
new FileReader(pusTripsFile));
119 bufferedReader.readLine();
121 int index_personId = 0;
122 int index_xCoordOrigin = 2;
123 int index_yCoordOrigin = 3;
124 int index_xCoordDestination = 4;
125 int index_yCoordDestination = 5;
126 int index_activityDuration = 6;
128 int index_activityType = 8;
130 Id<Person> previousPerson = null;
131 boolean worker =
false;
134 while ((line = bufferedReader.readLine()) != null) {
135 String parts[] = line.split(
"\t");
137 Id<Person> personId = Id.create(parts[index_personId],
Person.class);
145 if (!personId.equals(previousPerson)) {
146 Coord coordOrigin =
new Coord(Double.parseDouble(parts[index_xCoordOrigin]), Double.parseDouble(parts[index_yCoordOrigin]));
154 if (previousPerson != null) {
156 this.pusWorkers.add(previousPerson);
159 this.pusNonWorkers.add(previousPerson);
168 String mode = parts[index_mode];
174 Coord coordDestination =
new Coord(Double.parseDouble(parts[index_xCoordDestination]), Double.parseDouble(parts[index_yCoordDestination]));
176 String activityType = parts[index_activityType].trim();
177 if (activityType.startsWith(
"w")) worker =
true;
182 Double duration = Double.parseDouble(parts[index_activityDuration]);
185 previousPerson = personId;
187 log.info(
"Number of workers: " + this.pusWorkers.size());
188 log.info(
"Number of non-workers: " + this.pusNonWorkers.size());
189 bufferedReader.close();
191 catch (IOException e) {
195 populationWriter.
write(
"./output/PUSplans.xml.gz");
201 private void assignPUSPlansToMATSimPopulation() {
207 Collections.shuffle(this.pusWorkers, this.random);
210 person.addPlan(plan);
213 Collections.shuffle(this.pusNonWorkers, this.random);
216 person.addPlan(plan);
221 private Plan adaptAndCopyPlan(
Person person,
Plan plan,
boolean worker) {
230 String firstType =
"";
233 Activity activity = (Activity)pe;
236 if (activity.
getType().startsWith(
"h")) {
238 }
else if (activity.
getType().startsWith(
"w")) {
241 facility = this.getRandomLocation(activity, previousActivity.
getCoord());
243 if (facility == null) {
248 time = 8.0 * 3600.0 + this.randomizeTimes();
249 int suffix = (int)(time / 3600.0);
250 activity.
setType(
"h" + suffix);
251 firstType = activity.
getType();
258 double activityDuration = 8 * 3600;
260 time += activityDuration + this.randomizeTimes();
261 String dur = String.valueOf((
int)(activityDuration / 3600.0));
262 if (dur.equals(
"0")) dur =
"0.5";
268 activity.
setCoord(facility.getCoord());
271 previousActivity = activity;
283 double xCoordCenter = coordPreviousActivity.
getX();
284 double yCoordCenter = coordPreviousActivity.
getY();
285 ArrayList<ActivityFacility> facilities =
new ArrayList<>();
287 if (activity.
getType().startsWith(
"s")) {
288 double radius = 8000.0;
289 while (facilities.size() == 0) {
290 facilities = (ArrayList<ActivityFacility>) this.shopFacilitiesTree.getDisk(xCoordCenter, yCoordCenter, radius);
294 else if (activity.
getType().startsWith(
"l")) {
295 double radius = 8000.0;
296 while (facilities.size() == 0) {
297 facilities = (ArrayList<ActivityFacility>) this.leisureFacilitiesTree.getDisk(xCoordCenter, yCoordCenter, radius);
302 double radius = 8000.0;
303 while (facilities.size() == 0) {
304 facilities = (ArrayList<ActivityFacility>) this.educationFacilitiesTree.getDisk(xCoordCenter, yCoordCenter, radius);
308 int randomIndex = (int)(random.nextFloat() * (facilities.size()));
309 return facilities.get(randomIndex);
312 private double randomizeTimes() {
313 final double sigma = 1.0;
314 return random.nextGaussian() * sigma * 3600.0;
abstract List< PlanElement > getPlanElements()
abstract boolean addPlan(T p)
void write(final String filename)
static void copyFromTo(final Plan in, Plan out)
abstract T getSelectedPlan()
abstract void addLeg(final Leg leg)
Leg createLeg(String legMode)
void setDepartureTime(final double seconds)
static final String EMPLOYED
void setLinkId(final Id< Link > id)
abstract void setSelectedPlan(T selectedPlan)
static Plan createPlan(Person person)
Map< Id< Person >,?extends Person > getPersons()
abstract void addActivity(final Activity act)
void setType(final String type)
Population getPopulation()
Person createPerson(Id< Person > id)
static Config createConfig(final String filename)
Activity createActivityFromCoord(String actType, Coord coord)
Object getAttribute(final String objectId, final String attribute)
PopulationFactory getFactory()
void addPerson(final Person p)
void setCoord(Coord coord)
void setFacilityId(final Id< ActivityFacility > id)
static Scenario createScenario(final Config config)
void setEndTime(final double seconds)