MATSIM
RunSubpopulationsExample.java
Go to the documentation of this file.
1 /* *********************************************************************** *
2  * project: org.matsim.*
3  * *
4  * *********************************************************************** *
5  * *
6  * copyright : (C) 2013 by the members listed in the COPYING, *
7  * LICENSE and WARRANTY file. *
8  * email : info at matsim dot org *
9  * *
10  * *********************************************************************** *
11  * *
12  * This program is free software; you can redistribute it and/or modify *
13  * it under the terms of the GNU General Public License as published by *
14  * the Free Software Foundation; either version 2 of the License, or *
15  * (at your option) any later version. *
16  * See also COPYING, LICENSE and WARRANTY file *
17  * *
18  * *********************************************************************** */
19 
20 package tutorial.programming.example18MultipleSubpopulations;
21 
22 import org.matsim.api.core.v01.Id;
23 import org.matsim.api.core.v01.Scenario;
31 import org.matsim.core.config.Config;
42 
43 import java.io.File;
44 
67  final static String EQUIL_NETWORK = new File("./examples/equil/network.xml").getAbsolutePath();
68  final static String PLANS = new File("./examples/tutorial/programming/multipleSubpopulations/plans.xml").getAbsolutePath();
69  final static String OBJECT_ATTRIBUTES = new File("./examples/tutorial/programming/multipleSubpopulations/personAtrributes.xml").getAbsolutePath();
70  final static String CONFIG = "./examples/tutorial/programming/multipleSubpopulations/config.xml";
71  final static String OUTPUT = "./output/";
72 
73  private static final String SUBPOP_ATTRIB_NAME = "subpopulation";
74  private static final String SUBPOP1_NAME = "time";
75  private static final String SUBPOP2_NAME = "reroute";
79  public static void main(String[] args) {
80  // preparation of an example scenario:
81  {
83 
84  /* Set up network and plans. */
86  mnr.readFile(EQUIL_NETWORK);
87  createPopulation(sc, SUBPOP1_NAME, 100);
88  createPopulation(sc, SUBPOP2_NAME, 100);
89  new PopulationWriter(sc.getPopulation(), sc.getNetwork()).write(PLANS);
90  new ObjectAttributesXmlWriter(sc.getPopulation().getPersonAttributes()).writeFile(OBJECT_ATTRIBUTES);
91  }
92 
93  // building and running the simulation based on the example scenario:
94  Config config = ConfigUtils.createConfig();
95  ConfigUtils.loadConfig(config, CONFIG);
96  config.plans().setInputFile(PLANS);
97  config.plans().setInputPersonAttributeFile(OBJECT_ATTRIBUTES);
98  config.plans().setSubpopulationAttributeName(SUBPOP_ATTRIB_NAME); /* This is the default anyway. */
99  config.network().setInputFile(EQUIL_NETWORK);
100  config.controler().setOutputDirectory(OUTPUT);
101 
102  /* Strategies set up in the 'strategy' module of the config file are
103  * only applicable to the 'default' population, i.e. those agents without
104  * a subpopulation attribute. For all agents with a subpopulation
105  * attribute, you need to set up the suite of strategies for the
106  * subpopulation(s).
107  */
108 
109  /* Set up the subpopulations. */
110  {
111  /* Set up the 'time' subpopulation to only consider time allocation
112  * as a strategy, 20% of the time, and the balance using ChangeExpBeta. */
113  StrategySettings timeStrategySettings = new StrategySettings(ConfigUtils.createAvailableStrategyId(config));
114  timeStrategySettings.setStrategyName(DefaultPlanStrategiesModule.DefaultStrategy.TimeAllocationMutator.toString());
115  timeStrategySettings.setSubpopulation(SUBPOP1_NAME);
116  timeStrategySettings.setWeight(0.2);
117  config.strategy().addStrategySettings(timeStrategySettings);
118 
119  StrategySettings changeExpBetaStrategySettings = new StrategySettings(ConfigUtils.createAvailableStrategyId(config));
120  changeExpBetaStrategySettings.setStrategyName(DefaultPlanStrategiesModule.DefaultSelector.ChangeExpBeta.toString());
121  changeExpBetaStrategySettings.setSubpopulation(SUBPOP1_NAME);
122  changeExpBetaStrategySettings.setWeight(0.8);
123  config.strategy().addStrategySettings(changeExpBetaStrategySettings);
124  }
125  {
126  /* Set up the `reroute' subpopulation to consider rerouting as a
127  * strategy, 20% of the time, and the balance using ChangeExpBeta. */
128  StrategySettings rerouteStrategySettings = new StrategySettings( ConfigUtils.createAvailableStrategyId(config) ) ;
129  rerouteStrategySettings.setStrategyName(DefaultPlanStrategiesModule.DefaultStrategy.ReRoute.toString());
130  rerouteStrategySettings.setSubpopulation(SUBPOP2_NAME);
131  rerouteStrategySettings.setWeight(0.2);
132  config.strategy().addStrategySettings(rerouteStrategySettings);
133 
134  StrategySettings changeExpBetaStrategySettings = new StrategySettings(ConfigUtils.createAvailableStrategyId(config));
135  changeExpBetaStrategySettings.setStrategyName(DefaultPlanStrategiesModule.DefaultSelector.ChangeExpBeta.toString());
136  changeExpBetaStrategySettings.setSubpopulation(SUBPOP2_NAME);
137  changeExpBetaStrategySettings.setWeight(0.8);
138  config.strategy().addStrategySettings(changeExpBetaStrategySettings);
139  }
140  config.controler().setOverwriteFileSetting( OverwriteFileSetting.deleteDirectoryIfExists );
141 
142  /* Run the model. */
143  Controler controler = new Controler(config);
144 
145  controler.run();
146  }
147 
155  private static void createPopulation(Scenario scenario, String prefix, int number){
156  PopulationFactory pf = scenario.getPopulation().getFactory();
157 
158  for(int i = 0; i < number; i++){
159  Person person = pf.createPerson(Id.create(prefix + "_" + i, Person.class));
160 
161  /* Create basic home-work-home activities on equil network. */
162  Plan plan = pf.createPlan();
163  Activity h1 = pf.createActivityFromCoord("h", scenario.getNetwork().getNodes().get(Id.create("1", Node.class)).getCoord());
164  h1.setEndTime(6*3600);
165  Activity w = pf.createActivityFromCoord("w", scenario.getNetwork().getNodes().get(Id.create("2", Node.class)).getCoord());
166  w.setEndTime(17*3600);
167  Activity h2 = pf.createActivityFromCoord("h", scenario.getNetwork().getNodes().get(Id.create("3", Node.class)).getCoord());
168  h2.setStartTime(18*3600);
169 
170  /* Add the activities to the plan. */
171  plan.addActivity(h1);
172  plan.addLeg(pf.createLeg( TransportMode.car ));
173  plan.addActivity(w);
174  plan.addLeg(pf.createLeg( TransportMode.car ));
175  plan.addActivity(h2);
176 
177  person.addPlan(plan);
178  scenario.getPopulation().addPerson(person);
179 
180  /* Set the subpopulation attribute. */
181  scenario.getPopulation().getPersonAttributes().putAttribute(person.getId().toString(), SUBPOP_ATTRIB_NAME, prefix);
182  }
183  }
184 
185 }
PlansConfigGroup plans
Definition: Config.java:95
static void createPopulation(Scenario scenario, String prefix, int number)
Object putAttribute(final String objectId, final String attribute, final Object value)
Map< Id< Node >,?extends Node > getNodes()
abstract void addLeg(final Leg leg)
StrategyConfigGroup strategy
Definition: Config.java:98
abstract void addActivity(final Activity act)
void addStrategySettings(final StrategySettings stratSets)
ControlerConfigGroup controler
Definition: Config.java:87
static Config createConfig(final String filename)
static Id< StrategySettings > createAvailableStrategyId(Config config)
final void readFile(final String filename)
Activity createActivityFromCoord(String actType, Coord coord)
static Config loadConfig(final String filename, ConfigGroup...customModules)
NetworkConfigGroup network
Definition: Config.java:92
static Scenario createScenario(final Config config)
void setEndTime(final double seconds)