1 package tutorial.programming.demandGenerationWithFacilities;
4 import java.io.BufferedReader;
5 import java.io.FileReader;
6 import java.io.IOException;
7 import java.util.ArrayList;
9 import java.util.Random;
10 import java.util.TreeMap;
12 import org.apache.log4j.Logger;
25 class CreatePopulation {
27 private Scenario scenario;
30 private static final String censusFile =
"examples/tutorial/programming/demandGenerationWithFacilities/census.txt";
31 private static final String municipalitiesFile =
"examples/tutorial/programming/demandGenerationWithFacilities/swiss_municipalities.txt";
33 private QuadTree<ActivityFacility> homeFacilitiesTree;
34 private QuadTree<ActivityFacility> workFacilitiesTree;
36 private TreeMap<String, Coord> municipalityCentroids =
new TreeMap<>();
37 private Random random =
new Random(3838494);
39 private ObjectAttributes personHomeAndWorkLocations =
new ObjectAttributes();
40 private final static Logger log = Logger.getLogger(CreatePopulation.class);
44 public void run(Scenario scenario1) {
45 this.scenario = scenario1;
47 this.populationCreation();
54 this.homeFacilitiesTree = CreatePopulation.createActivitiesTree(
"home", this.scenario);
55 this.workFacilitiesTree = CreatePopulation.createActivitiesTree(
"work", this.scenario);
57 this.readMunicipalities();
60 private void populationCreation() {
64 Population population = this.scenario.getPopulation();
65 PopulationFactory populationFactory = population.getFactory();
72 ( BufferedReader bufferedReader =
new BufferedReader(
new FileReader(CreatePopulation.censusFile)) )
74 String line = bufferedReader.readLine();
76 int index_personId = 4;
78 int index_workLocation = 8;
79 int index_xHomeCoord = 10;
80 int index_yHomeCoord = 11;
82 while ((line = bufferedReader.readLine()) != null) {
83 String parts[] = line.split(
"\t");
88 Person person = populationFactory.createPerson(Id.create(parts[index_personId], Person.class));
90 person.getCustomAttributes().put(PersonUtils.AGE, Integer.parseInt(parts[index_age]));
92 boolean employed =
true;
93 if (parts[index_workLocation].equals(
"-1")) employed =
false;
94 final Boolean employed1 = employed;
95 person.getCustomAttributes().put(PersonUtils.EMPLOYED, employed1);
97 population.addPerson(person);
104 Coord homeCoord =
new Coord(Double.parseDouble(parts[index_xHomeCoord]), Double.parseDouble(parts[index_yHomeCoord]));
105 ActivityFacility homeFacility = this.homeFacilitiesTree.getClosest(homeCoord.getX(), homeCoord.getY());
106 if (homeFacility == null) {
109 personHomeAndWorkLocations.putAttribute(person.getId().toString(),
"home", homeFacility);
116 String municipalityId = parts[index_workLocation];
117 ActivityFacility workFacility = this.getWorkFacility(municipalityId);
118 personHomeAndWorkLocations.putAttribute(person.getId().toString(),
"work", workFacility);
121 bufferedReader.close();
124 catch (IOException e) {
129 private void readMunicipalities() {
131 BufferedReader bufferedReader =
new BufferedReader(
new FileReader(CreatePopulation.municipalitiesFile));
132 String line = bufferedReader.readLine();
134 while ((line = bufferedReader.readLine()) != null) {
135 String parts[] = line.split(
"\t");
137 String
id = parts[0];
141 Coord coord =
new Coord(Double.parseDouble(parts[1]), Double.parseDouble(parts[2]));
142 this.municipalityCentroids.put(
id, coord);;
144 bufferedReader.close();
146 }
catch (IOException e) {
151 private ActivityFacility getWorkFacility(String municipalityId) {
152 Coord coord = this.municipalityCentroids.get(municipalityId);
153 ArrayList<ActivityFacility> list =
154 (ArrayList<ActivityFacility>) this.workFacilitiesTree.getDisk(coord.getX(), coord.getY(), 8000);
158 int randomIndex = (int)(random.nextFloat() * (list.size() - 1));
159 return list.get(randomIndex);
162 public Scenario getScenario() {
166 public ObjectAttributes getPersonHomeAndWorkLocations() {
167 return personHomeAndWorkLocations;
170 static QuadTree<ActivityFacility> createActivitiesTree(String activityType, Scenario scenario) {
171 QuadTree<ActivityFacility> facQuadTree = CreatePopulation.builFacQuadTree(activityType, scenario.getActivityFacilities().getFacilitiesForActivityType(activityType));
175 private static QuadTree<ActivityFacility> builFacQuadTree(String type, Map<Id<ActivityFacility>, ? extends ActivityFacility> facilities_of_type) {
176 log.info(
" building " + type +
" facility quad tree");
177 double minx = Double.POSITIVE_INFINITY;
178 double miny = Double.POSITIVE_INFINITY;
179 double maxx = Double.NEGATIVE_INFINITY;
180 double maxy = Double.NEGATIVE_INFINITY;
182 for (
final ActivityFacility f : facilities_of_type.values()) {
183 if (f.getCoord().getX() < minx) { minx = f.getCoord().getX(); }
184 if (f.getCoord().getY() < miny) { miny = f.getCoord().getY(); }
185 if (f.getCoord().getX() > maxx) { maxx = f.getCoord().getX(); }
186 if (f.getCoord().getY() > maxy) { maxy = f.getCoord().getY(); }
192 System.out.println(
" xrange(" + minx +
"," + maxx +
"); yrange(" + miny +
"," + maxy +
")");
193 QuadTree<ActivityFacility> quadtree =
new QuadTree<ActivityFacility>(minx, miny, maxx, maxy);
194 for (
final ActivityFacility f : facilities_of_type.values()) {
195 quadtree.put(f.getCoord().getX(),f.getCoord().getY(),f);
197 log.info(
"Quadtree size: " + quadtree.size());