diff --git a/contribs/application/pom.xml b/contribs/application/pom.xml index 70a548c2dc7..4035f096a83 100644 --- a/contribs/application/pom.xml +++ b/contribs/application/pom.xml @@ -22,7 +22,7 @@ - 1.11.3 + 1.12.0 diff --git a/contribs/drt/src/main/java/org/matsim/contrib/drt/prebooking/PrebookingStopActivity.java b/contribs/drt/src/main/java/org/matsim/contrib/drt/prebooking/PrebookingStopActivity.java index 3c04ba985a3..e55af9e76a5 100644 --- a/contribs/drt/src/main/java/org/matsim/contrib/drt/prebooking/PrebookingStopActivity.java +++ b/contribs/drt/src/main/java/org/matsim/contrib/drt/prebooking/PrebookingStopActivity.java @@ -206,8 +206,10 @@ protected void simStep(double now) { @Override public void notifyPassengersAreReadyForDeparture(List passengers, double now) { var request = getRequestForPassengers(passengers.stream().map(Identifiable::getId).toList()); - queuePickup(request, now); - expectedPickups.remove(request.getId()); + if(expectedPickups.containsKey(request.getId())) { + queuePickup(request, now); + expectedPickups.remove(request.getId()); + } } private AcceptedDrtRequest getRequestForPassengers(List> passengerIds) { diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/controler/CarrierDriverAgent.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/controler/CarrierDriverAgent.java index 00233bbbf18..c7f030f3457 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/controler/CarrierDriverAgent.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/controler/CarrierDriverAgent.java @@ -97,6 +97,10 @@ void handleAnEvent(Event event){ case LinkEnterEvent linkEnterEvent -> handleEvent(linkEnterEvent); case ActivityEndEvent activityEndEvent -> handleEvent(activityEndEvent); case ActivityStartEvent activityStartEvent -> handleEvent(activityStartEvent); + case VehicleEntersTrafficEvent vehicleEntersTrafficEvent -> handleEvent(vehicleEntersTrafficEvent); + case VehicleLeavesTrafficEvent vehicleLeavesTrafficEvent -> handleEvent(vehicleLeavesTrafficEvent); + case PersonMoneyEvent personMoneyEvent -> handleEvent( personMoneyEvent ); + case PersonScoreEvent personScoreEvent -> handleEvent( personScoreEvent ); case null, default -> createAdditionalEvents(event, null, scheduledTour, driverId, planElementCounter); } } @@ -145,6 +149,33 @@ private void handleEvent( LinkEnterEvent event ){ createAdditionalEvents( event, null, scheduledTour, driverId, planElementCounter ); } + private void handleEvent( PersonScoreEvent event ){ + if( scoringFunction != null ){ + scoringFunction.handleEvent( event ); + } + } + + private void handleEvent( PersonMoneyEvent event ){ + if( scoringFunction != null ){ + scoringFunction.handleEvent( event ); + } + } + + private void handleEvent( VehicleEntersTrafficEvent event ){ + if( scoringFunction != null ){ + scoringFunction.handleEvent( event ); + } + if ((Event) event instanceof VehicleEntersTrafficEvent vehicleEntersTrafficEvent) { + driver2EventHandler.handleEvent(vehicleEntersTrafficEvent); + } + } + + private void handleEvent( VehicleLeavesTrafficEvent event ){ + if( scoringFunction != null ){ + scoringFunction.handleEvent( event ); + } + } + private void handleEvent( ActivityEndEvent event ){ if( currentActivity == null ){ Activity firstActivity = PopulationUtils.createActivityFromLinkId( event.getActType(), event.getLinkId() ); @@ -196,7 +227,6 @@ private void createAdditionalEvents( Event event, Activity activity, ScheduledTo // if( scoringFunction == null ){ // (means "called from LSP". kai, jul'22) - driver2EventHandler.handleAnEvent(event); Id vehicleId = driver2EventHandler.getVehicleOfDriver(driverId); // Reason why this here is needed is that the more informative objects such as ScheduledTour cannot be @@ -271,15 +301,6 @@ public Id getVehicleOfDriver(Id personId){ return driversVehicles.get(personId); } - public void handleAnEvent(Event event){ - if (event instanceof VehicleEntersTrafficEvent vehicleEntersTrafficEvent) { - driver2EventHandler.handleEvent(vehicleEntersTrafficEvent); - } - if (event instanceof VehicleEntersTrafficEvent vehicleEntersTrafficEvent) { - driver2EventHandler.handleEvent(vehicleEntersTrafficEvent); - } - } - } } diff --git a/matsim/src/main/java/org/matsim/core/scoring/PlansScoringImpl.java b/matsim/src/main/java/org/matsim/core/scoring/PlansScoringImpl.java index bc774cc2c1d..a5671b0c673 100644 --- a/matsim/src/main/java/org/matsim/core/scoring/PlansScoringImpl.java +++ b/matsim/src/main/java/org/matsim/core/scoring/PlansScoringImpl.java @@ -52,11 +52,11 @@ final class PlansScoringImpl implements PlansScoring, ScoringListener, Iteration @Inject private OutputDirectoryHierarchy controlerIO; @Inject private ScoringFunctionsForPopulation scoringFunctionsForPopulation; @Inject private ExperiencedPlansService experiencedPlansService; + @Inject private NewScoreAssigner newScoreAssigner; @Override public void notifyScoring(final ScoringEvent event) { scoringFunctionsForPopulation.finishScoringFunctions(); - NewScoreAssignerImpl newScoreAssigner = new NewScoreAssignerImpl(this.scoringConfigGroup, this.controllerConfigGroup); newScoreAssigner.assignNewScores(event.getIteration(), this.scoringFunctionsForPopulation, this.population); } diff --git a/matsim/src/main/java/org/matsim/core/scoring/PlansScoringModule.java b/matsim/src/main/java/org/matsim/core/scoring/PlansScoringModule.java index 1e5f29c1114..2048613ebd5 100644 --- a/matsim/src/main/java/org/matsim/core/scoring/PlansScoringModule.java +++ b/matsim/src/main/java/org/matsim/core/scoring/PlansScoringModule.java @@ -32,5 +32,6 @@ public void install() { bind(ScoringFunctionsForPopulation.class).asEagerSingleton(); bind(PlansScoring.class).to(PlansScoringImpl.class); bind(ExperiencedPlansService.class).to(ExperiencedPlansServiceImpl.class).asEagerSingleton(); + bind(NewScoreAssigner.class).to(NewScoreAssignerImpl.class).asEagerSingleton(); } } diff --git a/matsim/src/test/java/org/matsim/core/scoring/EventsToScoreTest.java b/matsim/src/test/java/org/matsim/core/scoring/EventsToScoreTest.java index d7390a8bf70..8462f81ed19 100644 --- a/matsim/src/test/java/org/matsim/core/scoring/EventsToScoreTest.java +++ b/matsim/src/test/java/org/matsim/core/scoring/EventsToScoreTest.java @@ -23,17 +23,39 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; +import org.matsim.api.core.v01.Coord; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.Scenario; +import org.matsim.api.core.v01.events.PersonDepartureEvent; import org.matsim.api.core.v01.events.PersonMoneyEvent; +import org.matsim.api.core.v01.events.handler.PersonDepartureEventHandler; +import org.matsim.api.core.v01.network.Link; +import org.matsim.api.core.v01.network.Network; +import org.matsim.api.core.v01.network.Node; import org.matsim.api.core.v01.population.Person; import org.matsim.api.core.v01.population.Plan; import org.matsim.api.core.v01.population.Population; import org.matsim.core.api.experimental.events.EventsManager; import org.matsim.core.config.Config; import org.matsim.core.config.ConfigUtils; +import org.matsim.core.config.groups.ReplanningConfigGroup; +import org.matsim.core.config.groups.RoutingConfigGroup; +import org.matsim.core.config.groups.ScoringConfigGroup; +import org.matsim.core.controler.AbstractModule; +import org.matsim.core.controler.Controler; +import org.matsim.core.controler.OutputDirectoryHierarchy; +import org.matsim.core.controler.events.IterationEndsEvent; +import org.matsim.core.controler.events.IterationStartsEvent; +import org.matsim.core.controler.listener.IterationEndsListener; +import org.matsim.core.controler.listener.IterationStartsListener; import org.matsim.core.events.EventsUtils; +import org.matsim.core.mobsim.framework.events.MobsimBeforeCleanupEvent; +import org.matsim.core.mobsim.framework.events.MobsimInitializedEvent; +import org.matsim.core.mobsim.framework.listeners.MobsimBeforeCleanupListener; +import org.matsim.core.mobsim.framework.listeners.MobsimInitializedListener; +import org.matsim.core.mobsim.qsim.AbstractQSimModule; import org.matsim.core.population.PopulationUtils; +import org.matsim.core.replanning.strategies.DefaultPlanStrategiesModule; import org.matsim.core.scenario.MutableScenario; import org.matsim.core.scenario.ScenarioUtils; import org.matsim.core.scoring.functions.CharyparNagelScoringFunctionFactory; @@ -158,6 +180,119 @@ void testMsaAveraging() { } } + @Test + void testMsaAveragingWithController() { + Config config = ConfigUtils.createConfig() ; + config.controller().setOverwriteFileSetting(OutputDirectoryHierarchy.OverwriteFileSetting.overwriteExistingFiles); + + config.controller().setFirstIteration(10); + config.controller().setLastIteration(110); + + config.scoring().setMarginalUtilityOfMoney(1.); + config.scoring().setFractionOfIterationsToStartScoreMSA(0.9); + + ReplanningConfigGroup.StrategySettings strat = new ReplanningConfigGroup.StrategySettings(); + strat.setStrategyName(DefaultPlanStrategiesModule.DefaultSelector.KeepLastSelected); + strat.setWeight(1.); + config.replanning().addStrategySettings(strat); + + config.routing().setNetworkRouteConsistencyCheck(RoutingConfigGroup.NetworkRouteConsistencyCheck.disable); + + Scenario scenario = ScenarioUtils.createScenario(config); + + Network network = scenario.getNetwork(); + Node node0 = network.getFactory().createNode(Id.createNodeId(0), new Coord(0, 0)); + Node node1 = network.getFactory().createNode(Id.createNodeId(1), new Coord(1, 0)); + network.addNode(node0); + network.addNode(node1); + Link link01 = network.getFactory().createLink(Id.createLinkId("0_1"), node0, node1); + network.addLink(link01); + + Population population = scenario.getPopulation(); + Person person = PopulationUtils.getFactory().createPerson(Id.create(1, Person.class)); + population.addPerson(person); + Plan plan = PopulationUtils.createPlan() ; + plan.addActivity(population.getFactory().createActivityFromLinkId("dummy", link01.getId())); + person.addPlan(plan); + + ScoringConfigGroup.ActivityParams dummyAct = new ScoringConfigGroup.ActivityParams("dummy"); + dummyAct.setScoringThisActivityAtAll(false); + config.scoring().addActivityParams(dummyAct); + + Controler controler = new Controler(scenario); + EventsManager events = controler.getEvents(); + controler.addOverridingModule(new AbstractModule() { + @Override + public void install() { + final int[] iteration = new int[1]; + this.addControlerListenerBinding().toInstance(new IterationStartsListener() { + @Override + public void notifyIterationStarts(IterationStartsEvent event) { + iteration[0] = event.getIteration(); + } + }); + this.addMobsimListenerBinding().toInstance(new MobsimInitializedListener() { + @Override + public void notifyMobsimInitialized(MobsimInitializedEvent e) { + events.processEvent(new PersonMoneyEvent(3600.0, person.getId(), iteration[0] -98, "bribe", "contractor" )); + } + }); + } + }); + controler.addControlerListener(new IterationEndsListener() { + @Override + public void notifyIterationEnds(IterationEndsEvent event) { + System.out.println( "score: " + person.getSelectedPlan().getScore() ) ; + + switch(event.getIteration()){ + case 99: + Assertions.assertEquals(1.0, person.getSelectedPlan().getScore(), 0); + break ; + case 100: + // first MSA iteration; plain score should be ok: + Assertions.assertEquals(2.0, person.getSelectedPlan().getScore(), 0); + break ; + case 101: + // second MSA iteration + // (2+3)/2 = 2.5 + Assertions.assertEquals(2.5, person.getSelectedPlan().getScore(), 0); + break ; + case 102: + // 3rd MSA iteration + // (2+3+4)/3 = 3 + Assertions.assertEquals(3.0, person.getSelectedPlan().getScore(), 0); + break ; + case 103: + // (2+3+4+5)/4 = 3.5 + Assertions.assertEquals(3.5, person.getSelectedPlan().getScore(), 0); + break ; + case 104: + Assertions.assertEquals(4.0, person.getSelectedPlan().getScore(), 0); + break ; + case 105: + Assertions.assertEquals(4.5, person.getSelectedPlan().getScore(), 0); + break ; + case 106: + Assertions.assertEquals(5.0, person.getSelectedPlan().getScore(), 0); + break ; + case 107: + Assertions.assertEquals(5.5, person.getSelectedPlan().getScore(), 0); + break ; + case 108: + Assertions.assertEquals(6.0, person.getSelectedPlan().getScore(), 0); + break ; + case 109: + Assertions.assertEquals(6.5, person.getSelectedPlan().getScore(), 0); + break ; + case 110: + Assertions.assertEquals(7.0, person.getSelectedPlan().getScore(), 0); + break ; + } + } + }); + controler.run(); + } + private static class MockScoringFunctionFactory implements ScoringFunctionFactory { @Override diff --git a/pom.xml b/pom.xml index be4f98f1127..f7866d67c0a 100644 --- a/pom.xml +++ b/pom.xml @@ -308,7 +308,7 @@ it.unimi.dsi fastutil - 8.5.13 + 8.5.14