|
23 | 23 | import org.junit.jupiter.api.Assertions;
|
24 | 24 | import org.junit.jupiter.api.Test;
|
25 | 25 | import org.junit.jupiter.api.extension.RegisterExtension;
|
| 26 | +import org.matsim.api.core.v01.Coord; |
26 | 27 | import org.matsim.api.core.v01.Id;
|
27 | 28 | import org.matsim.api.core.v01.Scenario;
|
| 29 | +import org.matsim.api.core.v01.events.PersonDepartureEvent; |
28 | 30 | import org.matsim.api.core.v01.events.PersonMoneyEvent;
|
| 31 | +import org.matsim.api.core.v01.events.handler.PersonDepartureEventHandler; |
| 32 | +import org.matsim.api.core.v01.network.Link; |
| 33 | +import org.matsim.api.core.v01.network.Network; |
| 34 | +import org.matsim.api.core.v01.network.Node; |
29 | 35 | import org.matsim.api.core.v01.population.Person;
|
30 | 36 | import org.matsim.api.core.v01.population.Plan;
|
31 | 37 | import org.matsim.api.core.v01.population.Population;
|
32 | 38 | import org.matsim.core.api.experimental.events.EventsManager;
|
33 | 39 | import org.matsim.core.config.Config;
|
34 | 40 | import org.matsim.core.config.ConfigUtils;
|
| 41 | +import org.matsim.core.config.groups.ReplanningConfigGroup; |
| 42 | +import org.matsim.core.config.groups.RoutingConfigGroup; |
| 43 | +import org.matsim.core.config.groups.ScoringConfigGroup; |
| 44 | +import org.matsim.core.controler.AbstractModule; |
| 45 | +import org.matsim.core.controler.Controler; |
| 46 | +import org.matsim.core.controler.OutputDirectoryHierarchy; |
| 47 | +import org.matsim.core.controler.events.IterationEndsEvent; |
| 48 | +import org.matsim.core.controler.events.IterationStartsEvent; |
| 49 | +import org.matsim.core.controler.listener.IterationEndsListener; |
| 50 | +import org.matsim.core.controler.listener.IterationStartsListener; |
35 | 51 | import org.matsim.core.events.EventsUtils;
|
| 52 | +import org.matsim.core.mobsim.framework.events.MobsimBeforeCleanupEvent; |
| 53 | +import org.matsim.core.mobsim.framework.events.MobsimInitializedEvent; |
| 54 | +import org.matsim.core.mobsim.framework.listeners.MobsimBeforeCleanupListener; |
| 55 | +import org.matsim.core.mobsim.framework.listeners.MobsimInitializedListener; |
| 56 | +import org.matsim.core.mobsim.qsim.AbstractQSimModule; |
36 | 57 | import org.matsim.core.population.PopulationUtils;
|
| 58 | +import org.matsim.core.replanning.strategies.DefaultPlanStrategiesModule; |
37 | 59 | import org.matsim.core.scenario.MutableScenario;
|
38 | 60 | import org.matsim.core.scenario.ScenarioUtils;
|
39 | 61 | import org.matsim.core.scoring.functions.CharyparNagelScoringFunctionFactory;
|
@@ -158,6 +180,119 @@ void testMsaAveraging() {
|
158 | 180 | }
|
159 | 181 | }
|
160 | 182 |
|
| 183 | + @Test |
| 184 | + void testMsaAveragingWithController() { |
| 185 | + Config config = ConfigUtils.createConfig() ; |
| 186 | + config.controller().setOverwriteFileSetting(OutputDirectoryHierarchy.OverwriteFileSetting.overwriteExistingFiles); |
| 187 | + |
| 188 | + config.controller().setFirstIteration(10); |
| 189 | + config.controller().setLastIteration(110); |
| 190 | + |
| 191 | + config.scoring().setMarginalUtilityOfMoney(1.); |
| 192 | + config.scoring().setFractionOfIterationsToStartScoreMSA(0.9); |
| 193 | + |
| 194 | + ReplanningConfigGroup.StrategySettings strat = new ReplanningConfigGroup.StrategySettings(); |
| 195 | + strat.setStrategyName(DefaultPlanStrategiesModule.DefaultSelector.KeepLastSelected); |
| 196 | + strat.setWeight(1.); |
| 197 | + config.replanning().addStrategySettings(strat); |
| 198 | + |
| 199 | + config.routing().setNetworkRouteConsistencyCheck(RoutingConfigGroup.NetworkRouteConsistencyCheck.disable); |
| 200 | + |
| 201 | + Scenario scenario = ScenarioUtils.createScenario(config); |
| 202 | + |
| 203 | + Network network = scenario.getNetwork(); |
| 204 | + Node node0 = network.getFactory().createNode(Id.createNodeId(0), new Coord(0, 0)); |
| 205 | + Node node1 = network.getFactory().createNode(Id.createNodeId(1), new Coord(1, 0)); |
| 206 | + network.addNode(node0); |
| 207 | + network.addNode(node1); |
| 208 | + Link link01 = network.getFactory().createLink(Id.createLinkId("0_1"), node0, node1); |
| 209 | + network.addLink(link01); |
| 210 | + |
| 211 | + Population population = scenario.getPopulation(); |
| 212 | + Person person = PopulationUtils.getFactory().createPerson(Id.create(1, Person.class)); |
| 213 | + population.addPerson(person); |
| 214 | + Plan plan = PopulationUtils.createPlan() ; |
| 215 | + plan.addActivity(population.getFactory().createActivityFromLinkId("dummy", link01.getId())); |
| 216 | + person.addPlan(plan); |
| 217 | + |
| 218 | + ScoringConfigGroup.ActivityParams dummyAct = new ScoringConfigGroup.ActivityParams("dummy"); |
| 219 | + dummyAct.setScoringThisActivityAtAll(false); |
| 220 | + config.scoring().addActivityParams(dummyAct); |
| 221 | + |
| 222 | + Controler controler = new Controler(scenario); |
| 223 | + EventsManager events = controler.getEvents(); |
| 224 | + controler.addOverridingModule(new AbstractModule() { |
| 225 | + @Override |
| 226 | + public void install() { |
| 227 | + final int[] iteration = new int[1]; |
| 228 | + this.addControlerListenerBinding().toInstance(new IterationStartsListener() { |
| 229 | + @Override |
| 230 | + public void notifyIterationStarts(IterationStartsEvent event) { |
| 231 | + iteration[0] = event.getIteration(); |
| 232 | + } |
| 233 | + }); |
| 234 | + this.addMobsimListenerBinding().toInstance(new MobsimInitializedListener() { |
| 235 | + @Override |
| 236 | + public void notifyMobsimInitialized(MobsimInitializedEvent e) { |
| 237 | + events.processEvent(new PersonMoneyEvent(3600.0, person.getId(), iteration[0] -98, "bribe", "contractor" )); |
| 238 | + } |
| 239 | + }); |
| 240 | + } |
| 241 | + }); |
| 242 | + controler.addControlerListener(new IterationEndsListener() { |
| 243 | + @Override |
| 244 | + public void notifyIterationEnds(IterationEndsEvent event) { |
| 245 | + System.out.println( "score: " + person.getSelectedPlan().getScore() ) ; |
| 246 | + |
| 247 | + switch(event.getIteration()){ |
| 248 | + case 99: |
| 249 | + Assertions.assertEquals(1.0, person.getSelectedPlan().getScore(), 0); |
| 250 | + break ; |
| 251 | + case 100: |
| 252 | + // first MSA iteration; plain score should be ok: |
| 253 | + Assertions.assertEquals(2.0, person.getSelectedPlan().getScore(), 0); |
| 254 | + break ; |
| 255 | + case 101: |
| 256 | + // second MSA iteration |
| 257 | + // (2+3)/2 = 2.5 |
| 258 | + Assertions.assertEquals(2.5, person.getSelectedPlan().getScore(), 0); |
| 259 | + break ; |
| 260 | + case 102: |
| 261 | + // 3rd MSA iteration |
| 262 | + // (2+3+4)/3 = 3 |
| 263 | + Assertions.assertEquals(3.0, person.getSelectedPlan().getScore(), 0); |
| 264 | + break ; |
| 265 | + case 103: |
| 266 | + // (2+3+4+5)/4 = 3.5 |
| 267 | + Assertions.assertEquals(3.5, person.getSelectedPlan().getScore(), 0); |
| 268 | + break ; |
| 269 | + case 104: |
| 270 | + Assertions.assertEquals(4.0, person.getSelectedPlan().getScore(), 0); |
| 271 | + break ; |
| 272 | + case 105: |
| 273 | + Assertions.assertEquals(4.5, person.getSelectedPlan().getScore(), 0); |
| 274 | + break ; |
| 275 | + case 106: |
| 276 | + Assertions.assertEquals(5.0, person.getSelectedPlan().getScore(), 0); |
| 277 | + break ; |
| 278 | + case 107: |
| 279 | + Assertions.assertEquals(5.5, person.getSelectedPlan().getScore(), 0); |
| 280 | + break ; |
| 281 | + case 108: |
| 282 | + Assertions.assertEquals(6.0, person.getSelectedPlan().getScore(), 0); |
| 283 | + break ; |
| 284 | + case 109: |
| 285 | + Assertions.assertEquals(6.5, person.getSelectedPlan().getScore(), 0); |
| 286 | + break ; |
| 287 | + case 110: |
| 288 | + Assertions.assertEquals(7.0, person.getSelectedPlan().getScore(), 0); |
| 289 | + break ; |
| 290 | + } |
| 291 | + } |
| 292 | + }); |
| 293 | + controler.run(); |
| 294 | + } |
| 295 | + |
161 | 296 | private static class MockScoringFunctionFactory implements ScoringFunctionFactory {
|
162 | 297 |
|
163 | 298 | @Override
|
|
0 commit comments