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