From e1dc8c637b5f758066b476bdc96046423e09c5ef Mon Sep 17 00:00:00 2001 From: u229187 Date: Thu, 12 Oct 2023 11:29:02 +0200 Subject: [PATCH 01/33] remove unused PlanMutateTimeAllocation, cleanup comments --- .../algorithms/PlanMutateTimeAllocation.java | 142 ------------------ .../PlanMutateTimeAllocationSimplified.java | 4 +- .../TripPlanMutateTimeAllocation.java | 26 ++-- .../TimeAllocationMutatorModule.java | 20 +-- .../TimeAllocationMutatorModuleTest.java | 31 ++-- 5 files changed, 36 insertions(+), 187 deletions(-) delete mode 100644 matsim/src/main/java/org/matsim/core/population/algorithms/PlanMutateTimeAllocation.java diff --git a/matsim/src/main/java/org/matsim/core/population/algorithms/PlanMutateTimeAllocation.java b/matsim/src/main/java/org/matsim/core/population/algorithms/PlanMutateTimeAllocation.java deleted file mode 100644 index b078ed95700..00000000000 --- a/matsim/src/main/java/org/matsim/core/population/algorithms/PlanMutateTimeAllocation.java +++ /dev/null @@ -1,142 +0,0 @@ -/* *********************************************************************** * - * project: org.matsim.* - * PlanMutateTimeAllocation.java - * * - * *********************************************************************** * - * * - * copyright : (C) 2007, 2008 by the members listed in the COPYING, * - * LICENSE and WARRANTY file. * - * email : info at matsim dot org * - * * - * *********************************************************************** * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * See also COPYING, LICENSE and WARRANTY file * - * * - * *********************************************************************** */ - -package org.matsim.core.population.algorithms; - -import java.util.List; -import java.util.Random; - -import org.matsim.api.core.v01.population.Activity; -import org.matsim.api.core.v01.population.Leg; -import org.matsim.api.core.v01.population.Plan; -import org.matsim.api.core.v01.population.PlanElement; -import org.matsim.core.utils.misc.OptionalTime; - -/** - * Mutates the duration of activities randomly within a specified range. - * For the first act, the end-time is mutated. For the last act, duration and end-time are set to UNDEFINED. - * For all other acts, the duration is mutated, and the end-time is updated accordingly. - * If an activity has no duration set (UNDEFINED_TIME), a random time between 0 and 24h will be chosen. - * Departure and arrival times of legs are updated according to the activity durations, but the - * leg travel time is not modified (e.g. updated according to new expected departure time). - * - * @author mrieser - */ -public final class PlanMutateTimeAllocation implements PlanAlgorithm { - - private final double mutationRange; - private final Random random; - - public PlanMutateTimeAllocation(final double mutationRange, final Random random) { - this.mutationRange = mutationRange; - this.random = random; - } - - @Override - public void run(final Plan plan) { - mutatePlan(plan); - } - - private void mutatePlan(final Plan plan) { - - List planElements = plan.getPlanElements(); - int max = planElements.size(); - - double now = 0; - - // apply mutation to all activities except the last home activity - for (int i = 0; i < max; i++) { - - PlanElement pe = planElements.get(i); - - if (pe instanceof Activity) { - Activity act = (Activity) pe; - - // handle first activity - if (i == 0) { - // set start to midnight - act.setStartTime(now); - // mutate the end time of the first activity - act.setEndTime(mutateTime(act.getEndTime())); - // calculate resulting duration - act.setMaximumDuration(act.getEndTime().seconds() - act.getStartTime().seconds()); - // move now pointer - now += act.getEndTime().seconds(); - - // handle middle activities - } else if (i < (max - 1)) { - - // assume that there will be no delay between arrival time and activity start time - act.setStartTime(now); - if (act.getMaximumDuration().isDefined()) { - // mutate the durations of all 'middle' activities - act.setMaximumDuration(mutateTime(act.getMaximumDuration())); - now += act.getMaximumDuration().seconds(); - // set end time accordingly - act.setEndTime(now); - } else { - double newEndTime = mutateTime(act.getEndTime()); - if (newEndTime < now) { - newEndTime = now; - } - act.setEndTime(newEndTime); - now = newEndTime; - } - // handle last activity - } else { - - // assume that there will be no delay between arrival time and activity start time - act.setStartTime(now); - // invalidate duration and end time because the plan will be interpreted 24 hour wrap-around - act.setMaximumDurationUndefined(); - act.setEndTimeUndefined(); - - } - - } else if (pe instanceof Leg) { - - Leg leg = (Leg) pe; - - // assume that there will be no delay between end time of previous activity and departure time - leg.setDepartureTime(now); - // let duration untouched. if defined add it to now - if (leg.getTravelTime().isDefined()) { - now += leg.getTravelTime().seconds(); - } - final double arrTime = now; - // set planned arrival time accordingly - leg.setTravelTime( arrTime - leg.getDepartureTime().seconds()); - - } - } - } - - private double mutateTime(final OptionalTime time) { - if (time.isDefined()) { - double t = time.seconds() + (int)((this.random.nextDouble() * 2.0 - 1.0) * this.mutationRange); - if (t < 0) t = 0; - if (t > 24*3600) t = 24*3600; - return t; - } else { - return this.random.nextInt(24*3600); - } - } - -} diff --git a/matsim/src/main/java/org/matsim/core/population/algorithms/PlanMutateTimeAllocationSimplified.java b/matsim/src/main/java/org/matsim/core/population/algorithms/PlanMutateTimeAllocationSimplified.java index 7e4434a9f94..90d7c20c0e5 100644 --- a/matsim/src/main/java/org/matsim/core/population/algorithms/PlanMutateTimeAllocationSimplified.java +++ b/matsim/src/main/java/org/matsim/core/population/algorithms/PlanMutateTimeAllocationSimplified.java @@ -74,7 +74,7 @@ public void run(final Plan plan) { } if ( affectingDuration ) { if ( act.getMaximumDuration().isDefined()) { - act.setMaximumDuration(mutateTime(act.getMaximumDuration().seconds())); + act.setMaximumDuration(Math.max(1.0,mutateTime(act.getMaximumDuration().seconds()))); } } } @@ -89,7 +89,7 @@ private double mutateTime(final double time) { t = 0; } // note that this also affects duration - + return t; } diff --git a/matsim/src/main/java/org/matsim/core/population/algorithms/TripPlanMutateTimeAllocation.java b/matsim/src/main/java/org/matsim/core/population/algorithms/TripPlanMutateTimeAllocation.java index b9e5ed82d7d..fe69104e662 100644 --- a/matsim/src/main/java/org/matsim/core/population/algorithms/TripPlanMutateTimeAllocation.java +++ b/matsim/src/main/java/org/matsim/core/population/algorithms/TripPlanMutateTimeAllocation.java @@ -69,12 +69,11 @@ public TripPlanMutateTimeAllocation(final double mutationRange, final boolean af this.mutationRange = mutationRange; this.affectingDuration = affectingDuration; this.random = random; -// this.subpopulationAttribute = subpopulationAttribute; this.subpopulationMutationRanges = subpopulationMutationRanges; this.subpopulationAffectingDuration = subpopulationAffectingDuration; this.latestEndTime = latestEndTime; } - + @Override public void run(final Plan plan) { mutatePlan(plan); @@ -89,12 +88,11 @@ private void mutatePlan(final Plan plan) { final String subpopulation = this.getSubpopulation(plan); final boolean affectingDuration = this.isAffectingDuration(subpopulation); final double mutationRange = this.getMutationRange(subpopulation); - + // apply mutation to all activities except the last home activity for (PlanElement pe : plan.getPlanElements()) { - if (pe instanceof Activity) { - Activity act = (Activity)pe; + if (pe instanceof Activity act) { // handle first activity if (isFirst) { @@ -124,7 +122,7 @@ private void mutatePlan(final Plan plan) { } now += act.getMaximumDuration().seconds(); // (may feel a bit disturbing since it was not mutated but it is just using the "old" value which is perfectly ok. kai, jan'14) - + // set end time accordingly act.setEndTime(now); } else { @@ -191,30 +189,30 @@ private double mutateTime(final OptionalTime time, final double mutationRange) { public void setUseActivityDurations(final boolean useActivityDurations) { this.useActivityDurations = useActivityDurations; } - - private final String getSubpopulation(final Plan plan) { + + private String getSubpopulation(final Plan plan) { // if (this.subpopulationAttribute == null) return null; if (plan.getPerson() == null) return null; // return (String) PopulationUtils.getPersonAttribute(plan.getPerson(), this.subpopulationAttribute); return PopulationUtils.getSubpopulation( plan.getPerson() ); } - - private final boolean isAffectingDuration(final String subpopulation) { + + private boolean isAffectingDuration(final String subpopulation) { if (subpopulation != null) { Boolean isAffectingDuration = this.subpopulationAffectingDuration.get(subpopulation); if (isAffectingDuration != null) return isAffectingDuration.booleanValue(); } - + // fallback solution: no subpopulation attribute was found return this.affectingDuration; } - - private final double getMutationRange(final String subpopulation) { + + private double getMutationRange(final String subpopulation) { if (subpopulation != null) { Double mutationRange = this.subpopulationMutationRanges.get(subpopulation); if (mutationRange != null) return mutationRange.doubleValue(); } - + // fallback solution: no subpopulation attribute was found return this.mutationRange; } diff --git a/matsim/src/main/java/org/matsim/core/replanning/strategies/TimeAllocationMutatorModule.java b/matsim/src/main/java/org/matsim/core/replanning/strategies/TimeAllocationMutatorModule.java index 2486e8dbf77..19caba527b7 100644 --- a/matsim/src/main/java/org/matsim/core/replanning/strategies/TimeAllocationMutatorModule.java +++ b/matsim/src/main/java/org/matsim/core/replanning/strategies/TimeAllocationMutatorModule.java @@ -42,14 +42,15 @@ import java.util.Collection; import java.util.HashMap; import java.util.Map; +import java.util.Objects; /** - * Wraps the {@link org.matsim.core.population.algorithms.PlanMutateTimeAllocation}- + * Wraps the {@link org.matsim.core.population.algorithms.TripPlanMutateTimeAllocation}- * PlanAlgorithm into a {@link PlanStrategyModule} so it can be used for plans * replanning. Supports multiple threads. * * @author mrieser - * @see org.matsim.core.population.algorithms.PlanMutateTimeAllocation + * @see org.matsim.core.population.algorithms.TripPlanMutateTimeAllocation */ class TimeAllocationMutatorModule extends AbstractMultithreadedModule{ @@ -59,7 +60,6 @@ class TimeAllocationMutatorModule extends AbstractMultithreadedModule{ private final double mutationRange; private final boolean affectingDuration; -// private final String subpopulationAttribute; private final Map subpopulationMutationRanges; private final Map subpopulationAffectingDuration; private final PlansConfigGroup.ActivityDurationInterpretation activityDurationInterpretation; @@ -74,7 +74,6 @@ class TimeAllocationMutatorModule extends AbstractMultithreadedModule{ this.affectingDuration = affectingDuration; this.mutationRange = mutationRange; this.activityDurationInterpretation = (config.plans().getActivityDurationInterpretation()); -// this.subpopulationAttribute = null; this.subpopulationMutationRanges = null; this.subpopulationAffectingDuration = null; log.warn("deprecated constructor was used - individual time allocation mutator settings for subpopulations is not supported!"); @@ -93,9 +92,7 @@ class TimeAllocationMutatorModule extends AbstractMultithreadedModule{ // in case we have subpopulations and individual settings for them if ( -// plansConfigGroup.getSubpopulationAttributeName() != null && - timeAllocationMutatorConfigGroup.isUseIndividualSettingsForSubpopulations() && population != null) { -// this.subpopulationAttribute = plansConfigGroup.getSubpopulationAttributeName(); + timeAllocationMutatorConfigGroup.isUseIndividualSettingsForSubpopulations() && population != null) { this.subpopulationMutationRanges = new HashMap<>(); this.subpopulationAffectingDuration = new HashMap<>(); @@ -108,7 +105,6 @@ class TimeAllocationMutatorModule extends AbstractMultithreadedModule{ log.info("Found individual time mutator settings for subpopulation: " + subpopulation); } } else { -// this.subpopulationAttribute = null; this.subpopulationMutationRanges = null; this.subpopulationAffectingDuration = null; } @@ -117,13 +113,11 @@ class TimeAllocationMutatorModule extends AbstractMultithreadedModule{ @Override public PlanAlgorithm getPlanAlgoInstance() { PlanAlgorithm pmta; - switch (this.activityDurationInterpretation) { - case minOfDurationAndEndTime: + if (Objects.requireNonNull(this.activityDurationInterpretation) == PlansConfigGroup.ActivityDurationInterpretation.minOfDurationAndEndTime) { pmta = new TripPlanMutateTimeAllocation(this.mutationRange, this.affectingDuration, MatsimRandom.getLocalInstance(), this.subpopulationMutationRanges, this.subpopulationAffectingDuration); - break; - default: - if(this.affectingDuration) { + } else { + if (this.affectingDuration) { if (!ACTIVITY_DURATION_WARNING_SHOWN) { log.warn("Please be aware that durations of activities now can mutate freely and possibly become negative." + "This might be a problem if you have \n" + diff --git a/matsim/src/test/java/org/matsim/core/replanning/strategies/TimeAllocationMutatorModuleTest.java b/matsim/src/test/java/org/matsim/core/replanning/strategies/TimeAllocationMutatorModuleTest.java index 54ff79db0e3..a59d061f3eb 100644 --- a/matsim/src/test/java/org/matsim/core/replanning/strategies/TimeAllocationMutatorModuleTest.java +++ b/matsim/src/test/java/org/matsim/core/replanning/strategies/TimeAllocationMutatorModuleTest.java @@ -44,7 +44,6 @@ import org.matsim.core.population.PersonUtils; import org.matsim.core.population.PopulationUtils; import org.matsim.core.population.algorithms.PlanAlgorithm; -import org.matsim.core.population.algorithms.PlanMutateTimeAllocation; import org.matsim.core.population.algorithms.PlanMutateTimeAllocationSimplified; import org.matsim.core.population.algorithms.TripPlanMutateTimeAllocation; import org.matsim.core.router.TripRouter; @@ -55,7 +54,7 @@ /** * Tests the functionality of {@link TimeAllocationMutatorModule}, mainly that the - * correct mutation range is handed over to the underlying {@link PlanMutateTimeAllocation}. + * correct mutation range is handed over to the underlying {@link TripPlanMutateTimeAllocation}. * * @author mrieser */ @@ -135,19 +134,19 @@ private static void runMutationRangeTest( final PlanAlgorithm tripPlanMutateTime // setup network Network network = NetworkUtils.createNetwork(); network.setCapacityPeriod(Time.parseTime("01:00:00")); - Node node1 = NetworkUtils.createAndAddNode(network, Id.create("1", Node.class), new Coord((double) 0, (double) 0)); - Node node2 = NetworkUtils.createAndAddNode(network, Id.create("2", Node.class), new Coord((double) 100, (double) 0)); - Node node3 = NetworkUtils.createAndAddNode(network, Id.create("3", Node.class), new Coord((double) 200, (double) 0)); - Node node4 = NetworkUtils.createAndAddNode(network, Id.create("4", Node.class), new Coord((double) 300, (double) 0)); + Node node1 = NetworkUtils.createAndAddNode(network, Id.create("1", Node.class), new Coord(0, 0)); + Node node2 = NetworkUtils.createAndAddNode(network, Id.create("2", Node.class), new Coord(100, 0)); + Node node3 = NetworkUtils.createAndAddNode(network, Id.create("3", Node.class), new Coord(200, 0)); + Node node4 = NetworkUtils.createAndAddNode(network, Id.create("4", Node.class), new Coord(300, 0)); final Node fromNode = node1; final Node toNode = node2; - Link link1 = NetworkUtils.createAndAddLink(network,Id.create("0", Link.class), fromNode, toNode, (double) 100, (double) 5, (double) 100, (double) 1 ); + Link link1 = NetworkUtils.createAndAddLink(network,Id.create("0", Link.class), fromNode, toNode, 100, 5, 100, 1); final Node fromNode1 = node2; final Node toNode1 = node3; - NetworkUtils.createAndAddLink(network,Id.create("1", Link.class), fromNode1, toNode1, (double) 100, (double) 5, (double) 100, (double) 1 ); + NetworkUtils.createAndAddLink(network,Id.create("1", Link.class), fromNode1, toNode1, 100, 5, 100, 1); final Node fromNode2 = node3; final Node toNode2 = node4; - NetworkUtils.createAndAddLink(network,Id.create("2", Link.class), fromNode2, toNode2, (double) 100, (double) 5, (double) 100, (double) 1 ); + NetworkUtils.createAndAddLink(network,Id.create("2", Link.class), fromNode2, toNode2, 100, 5, 100, 1); // setup person Plan plan; @@ -216,19 +215,19 @@ private void runSimplifiedMutationRangeTest(final PlanAlgorithm tripPlanMutateTi // setup network Network network = NetworkUtils.createNetwork(); network.setCapacityPeriod(Time.parseTime("01:00:00")); - Node node1 = NetworkUtils.createAndAddNode(network, Id.create("1", Node.class), new Coord((double) 0, (double) 0)); - Node node2 = NetworkUtils.createAndAddNode(network, Id.create("2", Node.class), new Coord((double) 100, (double) 0)); - Node node3 = NetworkUtils.createAndAddNode(network, Id.create("3", Node.class), new Coord((double) 200, (double) 0)); - Node node4 = NetworkUtils.createAndAddNode(network, Id.create("4", Node.class), new Coord((double) 300, (double) 0)); + Node node1 = NetworkUtils.createAndAddNode(network, Id.create("1", Node.class), new Coord(0, 0)); + Node node2 = NetworkUtils.createAndAddNode(network, Id.create("2", Node.class), new Coord(100, 0)); + Node node3 = NetworkUtils.createAndAddNode(network, Id.create("3", Node.class), new Coord(200, 0)); + Node node4 = NetworkUtils.createAndAddNode(network, Id.create("4", Node.class), new Coord(300, 0)); final Node fromNode = node1; final Node toNode = node2; - Link link1 = NetworkUtils.createAndAddLink(network,Id.create("0", Link.class), fromNode, toNode, (double) 100, (double) 5, (double) 100, (double) 1 ); + Link link1 = NetworkUtils.createAndAddLink(network,Id.create("0", Link.class), fromNode, toNode, 100, 5, 100, 1); final Node fromNode1 = node2; final Node toNode1 = node3; - NetworkUtils.createAndAddLink(network,Id.create("1", Link.class), fromNode1, toNode1, (double) 100, (double) 5, (double) 100, (double) 1 ); + NetworkUtils.createAndAddLink(network,Id.create("1", Link.class), fromNode1, toNode1, 100, 5, 100, 1); final Node fromNode2 = node3; final Node toNode2 = node4; - NetworkUtils.createAndAddLink(network,Id.create("2", Link.class), fromNode2, toNode2, (double) 100, (double) 5, (double) 100, (double) 1 ); + NetworkUtils.createAndAddLink(network,Id.create("2", Link.class), fromNode2, toNode2, 100, 5, 100, 1); // setup person Plan plan; From 0c7f6dd72c1cbd7e38564365d391c22c9b032684 Mon Sep 17 00:00:00 2001 From: u229187 Date: Thu, 12 Oct 2023 11:49:35 +0200 Subject: [PATCH 02/33] remove setting to adjust duration of stage activities, this is discouraged --- .../PlanMutateTimeAllocationSimplified.java | 15 ++------------- .../algorithms/TripPlanMutateTimeAllocation.java | 2 -- .../strategies/TimeAllocationMutatorModule.java | 4 +--- .../TimeAllocationMutatorModuleTest.java | 4 ++-- 4 files changed, 5 insertions(+), 20 deletions(-) diff --git a/matsim/src/main/java/org/matsim/core/population/algorithms/PlanMutateTimeAllocationSimplified.java b/matsim/src/main/java/org/matsim/core/population/algorithms/PlanMutateTimeAllocationSimplified.java index 90d7c20c0e5..bc98010b74c 100644 --- a/matsim/src/main/java/org/matsim/core/population/algorithms/PlanMutateTimeAllocationSimplified.java +++ b/matsim/src/main/java/org/matsim/core/population/algorithms/PlanMutateTimeAllocationSimplified.java @@ -38,28 +38,17 @@ */ public final class PlanMutateTimeAllocationSimplified implements PlanAlgorithm { - private final StageActivityHandling stageActivityHandling; private final double mutationRange; private final Random random; private final boolean affectingDuration; - /** - * Initializes an instance mutating all activities in a plan - * @param mutationRange - * @param affectingDuration - * @param random - */ - public PlanMutateTimeAllocationSimplified(final double mutationRange, boolean affectingDuration, final Random random) { - this( StageActivityHandling.StagesAsNormalActivities , mutationRange , affectingDuration, random ); - } /** * Initializes an instance mutating all non-stage activities in a plan * @param mutationRange * @param affectingDuration * @param random */ - public PlanMutateTimeAllocationSimplified(final StageActivityHandling stageActivityHandling, final double mutationRange, boolean affectingDuration, final Random random) { - this.stageActivityHandling = stageActivityHandling; + public PlanMutateTimeAllocationSimplified(final double mutationRange, boolean affectingDuration, final Random random) { this.mutationRange = mutationRange; this.affectingDuration = affectingDuration; this.random = random; @@ -67,7 +56,7 @@ public PlanMutateTimeAllocationSimplified(final StageActivityHandling stageActiv @Override public void run(final Plan plan) { - for ( Activity act : TripStructureUtils.getActivities( plan , stageActivityHandling ) ) { + for ( Activity act : TripStructureUtils.getActivities( plan , StageActivityHandling.ExcludeStageActivities ) ) { // this is deliberately simplistic. Cleanup up of the time information should be done somewhere else. if (act.getEndTime().isDefined()) { act.setEndTime(mutateTime(act.getEndTime().seconds())); diff --git a/matsim/src/main/java/org/matsim/core/population/algorithms/TripPlanMutateTimeAllocation.java b/matsim/src/main/java/org/matsim/core/population/algorithms/TripPlanMutateTimeAllocation.java index fe69104e662..05940f1c8bd 100644 --- a/matsim/src/main/java/org/matsim/core/population/algorithms/TripPlanMutateTimeAllocation.java +++ b/matsim/src/main/java/org/matsim/core/population/algorithms/TripPlanMutateTimeAllocation.java @@ -191,9 +191,7 @@ public void setUseActivityDurations(final boolean useActivityDurations) { } private String getSubpopulation(final Plan plan) { -// if (this.subpopulationAttribute == null) return null; if (plan.getPerson() == null) return null; -// return (String) PopulationUtils.getPersonAttribute(plan.getPerson(), this.subpopulationAttribute); return PopulationUtils.getSubpopulation( plan.getPerson() ); } diff --git a/matsim/src/main/java/org/matsim/core/replanning/strategies/TimeAllocationMutatorModule.java b/matsim/src/main/java/org/matsim/core/replanning/strategies/TimeAllocationMutatorModule.java index 19caba527b7..9e56b9117d4 100644 --- a/matsim/src/main/java/org/matsim/core/replanning/strategies/TimeAllocationMutatorModule.java +++ b/matsim/src/main/java/org/matsim/core/replanning/strategies/TimeAllocationMutatorModule.java @@ -127,9 +127,7 @@ public PlanAlgorithm getPlanAlgoInstance() { ACTIVITY_DURATION_WARNING_SHOWN = true; } } - pmta = new PlanMutateTimeAllocationSimplified( - // TODO: is StageActivityHandling.ExcludeStageActivities right here? - StageActivityHandling.ExcludeStageActivities, this.mutationRange, this.affectingDuration, MatsimRandom.getLocalInstance()); + pmta = new PlanMutateTimeAllocationSimplified(this.mutationRange, this.affectingDuration, MatsimRandom.getLocalInstance()); } return pmta; } diff --git a/matsim/src/test/java/org/matsim/core/replanning/strategies/TimeAllocationMutatorModuleTest.java b/matsim/src/test/java/org/matsim/core/replanning/strategies/TimeAllocationMutatorModuleTest.java index a59d061f3eb..a93fa7f5506 100644 --- a/matsim/src/test/java/org/matsim/core/replanning/strategies/TimeAllocationMutatorModuleTest.java +++ b/matsim/src/test/java/org/matsim/core/replanning/strategies/TimeAllocationMutatorModuleTest.java @@ -79,8 +79,8 @@ public class TimeAllocationMutatorModuleTest { @Test public void testSimplifiedMutation() { boolean affectingDuration = true ; - runSimplifiedMutationRangeTest(new PlanMutateTimeAllocationSimplified(StageActivityHandling.ExcludeStageActivities, 750, affectingDuration, MatsimRandom.getLocalInstance()), 750); - runSimplifiedMutationRangeTest(new PlanMutateTimeAllocationSimplified(StageActivityHandling.ExcludeStageActivities, 7200, affectingDuration, MatsimRandom.getLocalInstance()), 7200); + runSimplifiedMutationRangeTest(new PlanMutateTimeAllocationSimplified( 750, affectingDuration, MatsimRandom.getLocalInstance()), 750); + runSimplifiedMutationRangeTest(new PlanMutateTimeAllocationSimplified( 7200, affectingDuration, MatsimRandom.getLocalInstance()), 7200); } @Test public void testSubpopulations() { From 310d8a770590f849c12dd402fe772bd89d47f466 Mon Sep 17 00:00:00 2001 From: u229187 Date: Thu, 12 Oct 2023 15:45:30 +0200 Subject: [PATCH 03/33] remove unused TripTimeAllocationMutator --- .../modules/TripTimeAllocationMutator.java | 89 ------------------- 1 file changed, 89 deletions(-) delete mode 100644 matsim/src/main/java/org/matsim/core/replanning/modules/TripTimeAllocationMutator.java diff --git a/matsim/src/main/java/org/matsim/core/replanning/modules/TripTimeAllocationMutator.java b/matsim/src/main/java/org/matsim/core/replanning/modules/TripTimeAllocationMutator.java deleted file mode 100644 index a30266f7821..00000000000 --- a/matsim/src/main/java/org/matsim/core/replanning/modules/TripTimeAllocationMutator.java +++ /dev/null @@ -1,89 +0,0 @@ -/* *********************************************************************** * - * project: org.matsim.* - * TransitTimeAllocationMutator.java - * * - * *********************************************************************** * - * * - * copyright : (C) 2009 by the members listed in the COPYING, * - * LICENSE and WARRANTY file. * - * email : info at matsim dot org * - * * - * *********************************************************************** * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * See also COPYING, LICENSE and WARRANTY file * - * * - * *********************************************************************** */ - -package org.matsim.core.replanning.modules; - -import com.google.inject.Inject; -import org.matsim.core.config.Config; -import org.matsim.core.config.groups.PlansConfigGroup; -import org.matsim.core.config.groups.PlansConfigGroup.ActivityDurationInterpretation; -import org.matsim.core.gbl.MatsimRandom; -import org.matsim.core.population.algorithms.PlanAlgorithm; -import org.matsim.core.population.algorithms.TripPlanMutateTimeAllocation; -import org.matsim.core.router.TripRouter; - -import jakarta.inject.Provider; - -/** - * Copy/Paste of TimeAllocationMutator, that calls TransitPlanMutateTimeAllocation instead - * of PlanMutateTimeAllocation. - * - * @author mrieser - */ -public class TripTimeAllocationMutator extends AbstractMultithreadedModule { - - private final Provider tripRouterProvider; - - public final static String CONFIG_GROUP = "TimeAllocationMutator"; - public final static String CONFIG_MUTATION_RANGE = "mutationRange"; - - private double mutationRange = 1800.0; - private boolean useActivityDurations = true; - private final boolean affectingDuration; - - /** - * Creates a new TimeAllocationMutator with a mutation range as defined in - * the configuration (module "TimeAllocationMutator", param "mutationRange"). - */ - public TripTimeAllocationMutator(Config config, Provider tripRouterProvider) { - super(config.global()); - this.tripRouterProvider = tripRouterProvider; - this.mutationRange = config.timeAllocationMutator().getMutationRange() ; - this.affectingDuration = config.timeAllocationMutator().isAffectingDuration() ; - PlansConfigGroup.ActivityDurationInterpretation actDurInterpr = ( config.plans().getActivityDurationInterpretation() ) ; - if ( actDurInterpr == PlansConfigGroup.ActivityDurationInterpretation.minOfDurationAndEndTime ) { - useActivityDurations = true ; - } else if ( actDurInterpr == PlansConfigGroup.ActivityDurationInterpretation.endTimeOnly ) { - useActivityDurations = false ; - } else if ( actDurInterpr == PlansConfigGroup.ActivityDurationInterpretation.tryEndTimeThenDuration ) { - throw new UnsupportedOperationException( "need to clarify the correct setting here. Probably not a big deal, but not done yet. kai, aug'10") ; - } else { - throw new IllegalStateException( "beahvior not defined for this configuration setting") ; - } - } - - public TripTimeAllocationMutator(Config config, Provider tripRouterProvider, final double mutationRange, boolean affectingDuration) { - super(config.global()); - this.tripRouterProvider = tripRouterProvider; - this.mutationRange = mutationRange; - this.affectingDuration = affectingDuration; - } - - @Override - public PlanAlgorithm getPlanAlgoInstance() { - TripPlanMutateTimeAllocation pmta = - new TripPlanMutateTimeAllocation( - this.mutationRange, - affectingDuration, MatsimRandom.getLocalInstance()); - pmta.setUseActivityDurations(this.useActivityDurations); - return pmta; - } - -} From 62d1c209f7badff368eb3304f76d4c72288fd824 Mon Sep 17 00:00:00 2001 From: u229187 Date: Fri, 13 Oct 2023 09:57:05 +0200 Subject: [PATCH 04/33] remove support for Subpopulation (was never configurable) --- .../TimeAllocationMutatorConfigGroup.java | 158 +++++------------- .../PlanMutateTimeAllocationSimplified.java | 72 ++++++-- .../strategies/TimeAllocationMutator.java | 5 +- .../TimeAllocationMutatorModule.java | 69 +------- .../TimeAllocationMutatorReRoute.java | 3 +- ...eterministicMultithreadedReplanningIT.java | 10 +- .../TimeAllocationMutatorModuleTest.java | 139 +-------------- .../TripPlanMutateTimeAllocationTest.java | 51 +++--- 8 files changed, 143 insertions(+), 364 deletions(-) diff --git a/matsim/src/main/java/org/matsim/core/config/groups/TimeAllocationMutatorConfigGroup.java b/matsim/src/main/java/org/matsim/core/config/groups/TimeAllocationMutatorConfigGroup.java index 822763c7683..7e4b9caa3af 100644 --- a/matsim/src/main/java/org/matsim/core/config/groups/TimeAllocationMutatorConfigGroup.java +++ b/matsim/src/main/java/org/matsim/core/config/groups/TimeAllocationMutatorConfigGroup.java @@ -25,11 +25,13 @@ import org.matsim.core.config.ConfigGroup; import org.matsim.core.config.ReflectiveConfigGroup; +import org.matsim.core.utils.misc.Time; public final class TimeAllocationMutatorConfigGroup extends ReflectiveConfigGroup { public static final String GROUP_NAME = "TimeAllocationMutator"; - + + public TimeAllocationMutatorConfigGroup() { super(GROUP_NAME); } @@ -39,15 +41,49 @@ public Map getComments() { Map comments = super.getComments(); comments.put(MUTATION_RANGE, "Default:1800.0; Defines how many seconds a time mutation can maximally shift a time."); comments.put(MUTATION_AFFECTS_DURATION, "Default:true; Defines whether time mutation changes an activity's duration."); - comments.put(USE_INDIVIDUAL_SETTINGS_FOR_SUBPOPULATIONS, "false; Use individual settings for each subpopulation. " - + "If enabled but no settings are found, regular settings are uses as fallback."); + comments.put(LATEST_ACTIVITY_END_TIME,"Latest Activity End Time. Default = 24:00:00"); + comments.put(MUTATION_RANGE_STEP,"Mutation Range Step, default = 1 second"); + comments.put(MUTATE_AROUND_INITIAL_END_TIME_ONLY,"Mutates times only around the initially defined end times."); return comments; } - + // --- + private static final String LATEST_ACTIVITY_END_TIME = "latestActivityEndTime"; + private static final String MUTATE_AROUND_INITIAL_END_TIME_ONLY = "mutateAroundInitialEndTimeOnly"; + private static final String MUTATION_RANGE_STEP = "mutationRangeStep"; private static final String MUTATION_RANGE = "mutationRange"; private double mutationRange = 1800.0; + private double latestActivityEndTime = 24*3600.0; + private boolean mutateAroundInitialEndTimeOnly = false; + private double mutationRangeStep = 1.0; + + @StringGetter(MUTATION_RANGE_STEP) + public double getMutationRangeStep() { + return mutationRangeStep; + } + @StringSetter(MUTATION_RANGE_STEP) + public void setMutationRangeStep(double mutationRangeStep) { + this.mutationRangeStep = mutationRangeStep; + } + @StringGetter(LATEST_ACTIVITY_END_TIME) + public double getLatestActivityEndTime() { + return latestActivityEndTime; + } + @StringSetter(LATEST_ACTIVITY_END_TIME) + public void setLatestActivityEndTime(String latestActivityEndTime) { + this.latestActivityEndTime = Time.parseTime(latestActivityEndTime); + } + + @StringGetter(MUTATE_AROUND_INITIAL_END_TIME_ONLY) + public boolean isMutateAroundInitialEndTimeOnly() { + return mutateAroundInitialEndTimeOnly; + } + @StringSetter(MUTATE_AROUND_INITIAL_END_TIME_ONLY) + public void setMutateAroundInitialEndTimeOnly(boolean mutateAroundInitialEndTimeOnly) { + this.mutateAroundInitialEndTimeOnly = mutateAroundInitialEndTimeOnly; + } + @StringGetter(MUTATION_RANGE) public double getMutationRange() { return this.mutationRange; @@ -56,9 +92,9 @@ public double getMutationRange() { public void setMutationRange(final double val) { this.mutationRange = val; } - + // --- - + private static final String MUTATION_AFFECTS_DURATION = "mutationAffectsDuration"; private boolean affectingDuration = true; @StringGetter(MUTATION_AFFECTS_DURATION) @@ -69,114 +105,6 @@ public boolean isAffectingDuration() { public void setAffectingDuration(boolean affectingDuration) { this.affectingDuration = affectingDuration; } - - // --- - - private static final String USE_INDIVIDUAL_SETTINGS_FOR_SUBPOPULATIONS = "useIndividualSettingsForSubpopulations"; - private boolean useIndividualSettingsForSubpopulations = false; -// @StringGetter(USE_INDIVIDUAL_SETTINGS_FOR_SUBPOPULATIONS) // I am disabling the xml usage for the time being, see comment below. kai, may'19 - public boolean isUseIndividualSettingsForSubpopulations() { - // yyyy is it really so plausible to have this? If we continue in this direction, we will eventually have the PTV behaviorally homogeneous - // groups. I would find it more natural to have behavior that depends continuously on person type, and then use Java in order to define that - // behaviour. Rather than to overload the config mechanism. kai, may'19 - return this.useIndividualSettingsForSubpopulations; - } -// @StringSetter(USE_INDIVIDUAL_SETTINGS_FOR_SUBPOPULATIONS) // I am disabling the xml usage for the time being, see comments. kai, may'19 - public void setUseIndividualSettingsForSubpopulations(boolean useIndividualSettingsForSubpopulations) { - // yyyy see comment under isUseIndividualSettingsForSubpopulations. kai, may'10 - this.useIndividualSettingsForSubpopulations = useIndividualSettingsForSubpopulations; - } - + // --- - - public TimeAllocationMutatorSubpopulationSettings getTimeAllocationMutatorSubpopulationSettings(String subpopulation) { - - if (subpopulation == null) return null; - - Collection configGroups = this.getParameterSets(TimeAllocationMutatorSubpopulationSettings.SET_NAME); - for (ConfigGroup group : configGroups) { - if (group instanceof TimeAllocationMutatorSubpopulationSettings) { - TimeAllocationMutatorSubpopulationSettings subpopulationSettings = (TimeAllocationMutatorSubpopulationSettings) group; - if (subpopulation.equals(subpopulationSettings.subpopulation)) return subpopulationSettings; - } - } - - return null; - } - - @Override - public ConfigGroup createParameterSet(final String type) { - switch (type) { - case TimeAllocationMutatorSubpopulationSettings.SET_NAME: - return new TimeAllocationMutatorSubpopulationSettings(); - default: - throw new IllegalArgumentException("unknown set type '" + type + "'"); - } - } - - @Override - public void addParameterSet(final ConfigGroup set) { - switch (set.getName()) { - case TimeAllocationMutatorSubpopulationSettings.SET_NAME: - super.addParameterSet(set); - break; - default: - throw new IllegalArgumentException( set.getName() ); - } - } - - public static class TimeAllocationMutatorSubpopulationSettings extends ReflectiveConfigGroup { - - public static final String SET_NAME = "subpopulationSettings"; - private static final String MUTATION_RANGE = "mutationRange"; - private static final String MUTATION_AFFECTS_DURATION = "mutationAffectsDuration"; - private static final String SUBPOPULATION = "subpopulation"; - - private double mutationRange = 1800.0; - private boolean affectingDuration = true; - private String subpopulation = null; - - public TimeAllocationMutatorSubpopulationSettings() { - super(SET_NAME); - } - - @Override - public final Map getComments() { - Map comments = super.getComments(); - comments.put(MUTATION_RANGE, "Default:1800.0; Defines how many seconds a time mutation can maximally shift a time."); - comments.put(MUTATION_AFFECTS_DURATION, "Default:true; Defines whether time mutation changes an activity's duration."); - comments.put(SUBPOPULATION, "Subpopulation to which the values from this parameter set are applied."); - return comments; - } - - @StringGetter(MUTATION_RANGE) - public double getMutationRange() { - return this.mutationRange; - } - - @StringSetter(MUTATION_RANGE) - public void setMutationRange(final double val) { - this.mutationRange = val; - } - - @StringGetter(MUTATION_AFFECTS_DURATION) - public boolean isAffectingDuration() { - return affectingDuration; - } - - @StringSetter(MUTATION_AFFECTS_DURATION) - public void setAffectingDuration(boolean affectingDuration) { - this.affectingDuration = affectingDuration; - } - - @StringSetter(SUBPOPULATION) - public void setSubpopulation(final String subpopulation) { - this.subpopulation = subpopulation; - } - - @StringGetter(SUBPOPULATION) - public String getSubpopulation() { - return this.subpopulation; - } - } } diff --git a/matsim/src/main/java/org/matsim/core/population/algorithms/PlanMutateTimeAllocationSimplified.java b/matsim/src/main/java/org/matsim/core/population/algorithms/PlanMutateTimeAllocationSimplified.java index bc98010b74c..405aba45d2c 100644 --- a/matsim/src/main/java/org/matsim/core/population/algorithms/PlanMutateTimeAllocationSimplified.java +++ b/matsim/src/main/java/org/matsim/core/population/algorithms/PlanMutateTimeAllocationSimplified.java @@ -20,10 +20,14 @@ package org.matsim.core.population.algorithms; +import java.util.Map; import java.util.Random; import org.matsim.api.core.v01.population.Activity; +import org.matsim.api.core.v01.population.Leg; import org.matsim.api.core.v01.population.Plan; +import org.matsim.api.core.v01.population.PlanElement; +import org.matsim.core.population.PopulationUtils; import org.matsim.core.router.TripStructureUtils; import org.matsim.core.router.TripStructureUtils.StageActivityHandling; @@ -38,48 +42,84 @@ */ public final class PlanMutateTimeAllocationSimplified implements PlanAlgorithm { + + public static final String INITIAL_END_TIME_ATTRIBUTE = "initialEndTime"; private final double mutationRange; private final Random random; private final boolean affectingDuration; + private final double latestActivityEndTime; + private final boolean mutateAroundInitialEndTimeOnly; + private final double mutationRangeStep; + - /** - * Initializes an instance mutating all non-stage activities in a plan - * @param mutationRange - * @param affectingDuration - * @param random - */ - public PlanMutateTimeAllocationSimplified(final double mutationRange, boolean affectingDuration, final Random random) { + public PlanMutateTimeAllocationSimplified(final double mutationRange, boolean affectingDuration, final Random random, double latestActivityEndTime, boolean mutateAroundInitialEndTimeOnly, double mutationRangeStep) { this.mutationRange = mutationRange; this.affectingDuration = affectingDuration; this.random = random; + this.latestActivityEndTime = latestActivityEndTime; + this.mutateAroundInitialEndTimeOnly = mutateAroundInitialEndTimeOnly; + this.mutationRangeStep = Math.max(1.0,mutationRangeStep); + } @Override public void run(final Plan plan) { for ( Activity act : TripStructureUtils.getActivities( plan , StageActivityHandling.ExcludeStageActivities ) ) { - // this is deliberately simplistic. Cleanup up of the time information should be done somewhere else. if (act.getEndTime().isDefined()) { - act.setEndTime(mutateTime(act.getEndTime().seconds())); + double endTime = act.getEndTime().seconds(); + if (mutateAroundInitialEndTimeOnly){ + Object initialEndtime = act.getAttributes().getAttribute(INITIAL_END_TIME_ATTRIBUTE); + if (initialEndtime!=null) { + endTime = (double) initialEndtime; + } else { + act.getAttributes().putAttribute(INITIAL_END_TIME_ATTRIBUTE,endTime); + } + } + double newEndTime = Math.min(mutateTime(endTime, mutationRange),this.latestActivityEndTime); + double shift = endTime -newEndTime; + act.setEndTime(newEndTime); + if (act.getStartTime().isDefined()){ + act.setStartTime(act.getStartTime().seconds()-shift); + } } - if ( affectingDuration ) { + else if ( affectingDuration ) { if ( act.getMaximumDuration().isDefined()) { - act.setMaximumDuration(Math.max(1.0,mutateTime(act.getMaximumDuration().seconds()))); + act.setMaximumDuration(mutateTime(act.getMaximumDuration().seconds(), mutationRange)); } } } - // the legs are not doing anything. kai, jun'12 + setLegDepartureTimes(plan); + } - private double mutateTime(final double time) { - double t = time; - t = t + (int)((this.random.nextDouble() * 2.0 - 1.0) * this.mutationRange); + private void setLegDepartureTimes(Plan plan) { + Activity previousActivity = null; + for (PlanElement planElement : plan.getPlanElements()){ + if (planElement instanceof Activity activity){ + previousActivity = activity; + } else if (planElement instanceof Leg leg){ + if (previousActivity.getEndTime().isDefined()){ + leg.setDepartureTime(previousActivity.getEndTime().seconds()); + } else { + // previous activity has only a duration. + // Estimates about departure time would be very vague, thus they are not set. + leg.setDepartureTimeUndefined(); + } + } + } + } + private double mutateTime(final double time, double mutationRange) { + double t = time; + int mutationRangeBins = (int) Math.ceil( mutationRange/mutationRangeStep); + t = t - mutationRange + (2*this.random.nextInt(mutationRangeBins)*mutationRangeStep) ; if (t < 0) { t = 0; } // note that this also affects duration - return t; } + + } diff --git a/matsim/src/main/java/org/matsim/core/replanning/strategies/TimeAllocationMutator.java b/matsim/src/main/java/org/matsim/core/replanning/strategies/TimeAllocationMutator.java index 0d7ab5c75c6..c1fbe50e538 100644 --- a/matsim/src/main/java/org/matsim/core/replanning/strategies/TimeAllocationMutator.java +++ b/matsim/src/main/java/org/matsim/core/replanning/strategies/TimeAllocationMutator.java @@ -35,14 +35,11 @@ public class TimeAllocationMutator implements Provider { @Inject private GlobalConfigGroup globalConfigGroup; @Inject private TimeAllocationMutatorConfigGroup timeAllocationMutatorConfigGroup; @Inject private PlansConfigGroup plansConfigGroup; - @Inject private Provider tripRouterProvider; - @Inject private Population population; @Override public PlanStrategy get() { PlanStrategyImpl strategy = new PlanStrategyImpl(new RandomPlanSelector()); - TimeAllocationMutatorModule tam = new TimeAllocationMutatorModule(this.tripRouterProvider, - this.plansConfigGroup, this.timeAllocationMutatorConfigGroup, this.globalConfigGroup, population); + TimeAllocationMutatorModule tam = new TimeAllocationMutatorModule( this.timeAllocationMutatorConfigGroup, this.globalConfigGroup); strategy.addStrategyModule(tam); return strategy; } diff --git a/matsim/src/main/java/org/matsim/core/replanning/strategies/TimeAllocationMutatorModule.java b/matsim/src/main/java/org/matsim/core/replanning/strategies/TimeAllocationMutatorModule.java index 9e56b9117d4..70cae3d1e8e 100644 --- a/matsim/src/main/java/org/matsim/core/replanning/strategies/TimeAllocationMutatorModule.java +++ b/matsim/src/main/java/org/matsim/core/replanning/strategies/TimeAllocationMutatorModule.java @@ -29,7 +29,6 @@ import org.matsim.core.config.groups.GlobalConfigGroup; import org.matsim.core.config.groups.PlansConfigGroup; import org.matsim.core.config.groups.TimeAllocationMutatorConfigGroup; -import org.matsim.core.config.groups.TimeAllocationMutatorConfigGroup.TimeAllocationMutatorSubpopulationSettings; import org.matsim.core.gbl.MatsimRandom; import org.matsim.core.population.algorithms.PlanAlgorithm; import org.matsim.core.population.algorithms.PlanMutateTimeAllocationSimplified; @@ -54,81 +53,27 @@ */ class TimeAllocationMutatorModule extends AbstractMultithreadedModule{ - private static boolean ACTIVITY_DURATION_WARNING_SHOWN = false; private static final Logger log = LogManager.getLogger( TimeAllocationMutatorModule.class ); - private final double mutationRange; private final boolean affectingDuration; - private final Map subpopulationMutationRanges; - private final Map subpopulationAffectingDuration; - private final PlansConfigGroup.ActivityDurationInterpretation activityDurationInterpretation; + private final TimeAllocationMutatorConfigGroup timeAllocationMutatorConfigGroup; - /** - * Creates a new TimeAllocationMutator with a mutation range as defined in - * the configuration (module "TimeAllocationMutator", param "mutationRange"). - */ - @Deprecated - TimeAllocationMutatorModule( Config config, Provider tripRouterProvider, final double mutationRange, boolean affectingDuration ) { - super(config.global()); - this.affectingDuration = affectingDuration; - this.mutationRange = mutationRange; - this.activityDurationInterpretation = (config.plans().getActivityDurationInterpretation()); - this.subpopulationMutationRanges = null; - this.subpopulationAffectingDuration = null; - log.warn("deprecated constructor was used - individual time allocation mutator settings for subpopulations is not supported!"); - } - TimeAllocationMutatorModule( Provider tripRouterProvider, PlansConfigGroup plansConfigGroup, TimeAllocationMutatorConfigGroup timeAllocationMutatorConfigGroup, GlobalConfigGroup globalConfigGroup ) { - this(tripRouterProvider, plansConfigGroup, timeAllocationMutatorConfigGroup, globalConfigGroup, null); - } - - TimeAllocationMutatorModule( Provider tripRouterProvider, PlansConfigGroup plansConfigGroup, TimeAllocationMutatorConfigGroup timeAllocationMutatorConfigGroup, GlobalConfigGroup globalConfigGroup, - final Population population ) { + TimeAllocationMutatorModule( TimeAllocationMutatorConfigGroup timeAllocationMutatorConfigGroup, GlobalConfigGroup globalConfigGroup) { super(globalConfigGroup); - this.activityDurationInterpretation = plansConfigGroup.getActivityDurationInterpretation(); this.mutationRange = timeAllocationMutatorConfigGroup.getMutationRange(); this.affectingDuration = timeAllocationMutatorConfigGroup.isAffectingDuration(); + this.timeAllocationMutatorConfigGroup = timeAllocationMutatorConfigGroup; - // in case we have subpopulations and individual settings for them - if ( - timeAllocationMutatorConfigGroup.isUseIndividualSettingsForSubpopulations() && population != null) { - this.subpopulationMutationRanges = new HashMap<>(); - this.subpopulationAffectingDuration = new HashMap<>(); - - Collection settings = timeAllocationMutatorConfigGroup.getParameterSets(TimeAllocationMutatorSubpopulationSettings.SET_NAME); - for (ConfigGroup group : settings) { - TimeAllocationMutatorSubpopulationSettings subpopulationSettings = (TimeAllocationMutatorSubpopulationSettings) group; - String subpopulation = subpopulationSettings.getSubpopulation(); - this.subpopulationMutationRanges.put(subpopulation, subpopulationSettings.getMutationRange()); - this.subpopulationAffectingDuration.put(subpopulation, subpopulationSettings.isAffectingDuration()); - log.info("Found individual time mutator settings for subpopulation: " + subpopulation); - } - } else { - this.subpopulationMutationRanges = null; - this.subpopulationAffectingDuration = null; - } } @Override public PlanAlgorithm getPlanAlgoInstance() { - PlanAlgorithm pmta; - if (Objects.requireNonNull(this.activityDurationInterpretation) == PlansConfigGroup.ActivityDurationInterpretation.minOfDurationAndEndTime) { - pmta = new TripPlanMutateTimeAllocation(this.mutationRange, this.affectingDuration, MatsimRandom.getLocalInstance(), - this.subpopulationMutationRanges, this.subpopulationAffectingDuration); - } else { - if (this.affectingDuration) { - if (!ACTIVITY_DURATION_WARNING_SHOWN) { - log.warn("Please be aware that durations of activities now can mutate freely and possibly become negative." + - "This might be a problem if you have \n" + - "a) short activities that are only provided with duration and not with endtime AND\n" + - "b) agents with only one or two initial plans.\n" + - "This can have impact on scoring and maybe even on qsim execution. It is recommended to set affectingDuration=false for such set up."); - ACTIVITY_DURATION_WARNING_SHOWN = true; - } - } - pmta = new PlanMutateTimeAllocationSimplified(this.mutationRange, this.affectingDuration, MatsimRandom.getLocalInstance()); - } + PlanAlgorithm pmta = new PlanMutateTimeAllocationSimplified + (this.mutationRange, this.affectingDuration, MatsimRandom.getLocalInstance(), + timeAllocationMutatorConfigGroup.getLatestActivityEndTime(), timeAllocationMutatorConfigGroup.isMutateAroundInitialEndTimeOnly(), + timeAllocationMutatorConfigGroup.getMutationRangeStep()); return pmta; } } diff --git a/matsim/src/main/java/org/matsim/core/replanning/strategies/TimeAllocationMutatorReRoute.java b/matsim/src/main/java/org/matsim/core/replanning/strategies/TimeAllocationMutatorReRoute.java index 009e9e0199c..f430d0d3004 100644 --- a/matsim/src/main/java/org/matsim/core/replanning/strategies/TimeAllocationMutatorReRoute.java +++ b/matsim/src/main/java/org/matsim/core/replanning/strategies/TimeAllocationMutatorReRoute.java @@ -43,13 +43,12 @@ public class TimeAllocationMutatorReRoute implements Provider { @Inject private TimeAllocationMutatorConfigGroup timeAllocationMutatorConfigGroup; @Inject private PlansConfigGroup plansConfigGroup; @Inject private ActivityFacilities activityFacilities; - @Inject private Population population; @Inject private TimeInterpretation timeInterpretation; @Override public PlanStrategy get() { final PlanStrategyImpl strategy = new PlanStrategyImpl(new RandomPlanSelector()); - strategy.addStrategyModule(new TimeAllocationMutatorModule(this.tripRouterProvider, this.plansConfigGroup, this.timeAllocationMutatorConfigGroup, this.globalConfigGroup, this.population) ); + strategy.addStrategyModule(new TimeAllocationMutatorModule(this.timeAllocationMutatorConfigGroup, this.globalConfigGroup) ); strategy.addStrategyModule(new ReRoute(this.activityFacilities, this.tripRouterProvider, this.globalConfigGroup, this.timeInterpretation)); return strategy; } diff --git a/matsim/src/test/java/org/matsim/core/replanning/strategies/DeterministicMultithreadedReplanningIT.java b/matsim/src/test/java/org/matsim/core/replanning/strategies/DeterministicMultithreadedReplanningIT.java index 809249f84d7..ab1c2e72e72 100644 --- a/matsim/src/test/java/org/matsim/core/replanning/strategies/DeterministicMultithreadedReplanningIT.java +++ b/matsim/src/test/java/org/matsim/core/replanning/strategies/DeterministicMultithreadedReplanningIT.java @@ -78,7 +78,7 @@ public void testTimeAllocationMutator() { config.controler().setOutputDirectory(testUtils.getOutputDirectory() + "/run1/"); TestControler controler = new TestControler(config, strategyManager); PlanStrategyImpl strategy = new PlanStrategyImpl(new RandomPlanSelector()); - strategy.addStrategyModule(new TimeAllocationMutatorModule(TripRouterFactoryBuilderWithDefaults.createDefaultTripRouterFactoryImpl(controler.getScenario() ), config.plans(), config.timeAllocationMutator(), config.global()) ); + strategy.addStrategyModule(new TimeAllocationMutatorModule( config.timeAllocationMutator(), config.global()) ); strategyManager.addStrategy( strategy, null, 1.0 ); controler.run(); } @@ -88,7 +88,7 @@ public void testTimeAllocationMutator() { config.controler().setOutputDirectory(testUtils.getOutputDirectory() + "/run2/"); TestControler controler = new TestControler(config, strategyManager); PlanStrategyImpl strategy = new PlanStrategyImpl(new RandomPlanSelector()); - strategy.addStrategyModule(new TimeAllocationMutatorModule(TripRouterFactoryBuilderWithDefaults.createDefaultTripRouterFactoryImpl(controler.getScenario() ), config.plans(), config.timeAllocationMutator(), config.global()) ); + strategy.addStrategyModule(new TimeAllocationMutatorModule(config.timeAllocationMutator(), config.global()) ); strategyManager.addStrategy( strategy, null, 1.0 ); controler.run(); } @@ -129,7 +129,7 @@ public void testReRouteTimeAllocationMutator() { config.controler().setOutputDirectory(testUtils.getOutputDirectory() + "/run1/"); TestControler controler = new TestControler(config, strategyManager); strategy.addStrategyModule(new ReRoute(controler.getScenario(), TripRouterFactoryBuilderWithDefaults.createDefaultTripRouterFactoryImpl(controler.getScenario()), TimeInterpretation.create(config))); // finish strategy configuration - strategy.addStrategyModule(new TimeAllocationMutatorModule(TripRouterFactoryBuilderWithDefaults.createDefaultTripRouterFactoryImpl(controler.getScenario() ), config.plans(), config.timeAllocationMutator(), config.global()) ); + strategy.addStrategyModule(new TimeAllocationMutatorModule( config.timeAllocationMutator(), config.global()) ); controler.run(); } { @@ -142,7 +142,7 @@ public void testReRouteTimeAllocationMutator() { config.controler().setOutputDirectory(testUtils.getOutputDirectory() + "/run2/"); TestControler controler2 = new TestControler(config, strategyManager2); strategy2.addStrategyModule(new ReRoute(controler2.getScenario(), TripRouterFactoryBuilderWithDefaults.createDefaultTripRouterFactoryImpl(controler2.getScenario()), TimeInterpretation.create(config))); // finish strategy configuration - strategy2.addStrategyModule(new TimeAllocationMutatorModule(TripRouterFactoryBuilderWithDefaults.createDefaultTripRouterFactoryImpl(controler2.getScenario() ), config.plans(), config.timeAllocationMutator(), config.global()) ); + strategy2.addStrategyModule(new TimeAllocationMutatorModule(config.timeAllocationMutator(), config.global()) ); controler2.run(); } @@ -275,7 +275,7 @@ public void testReRoute() { private static class TestControler { Controler controler ; - private StrategyManager manager; + private final StrategyManager manager; public TestControler(final Config config, final StrategyManager manager) { this( ScenarioUtils.loadScenario( config ) , manager ); diff --git a/matsim/src/test/java/org/matsim/core/replanning/strategies/TimeAllocationMutatorModuleTest.java b/matsim/src/test/java/org/matsim/core/replanning/strategies/TimeAllocationMutatorModuleTest.java index a93fa7f5506..a447d5b2a90 100644 --- a/matsim/src/test/java/org/matsim/core/replanning/strategies/TimeAllocationMutatorModuleTest.java +++ b/matsim/src/test/java/org/matsim/core/replanning/strategies/TimeAllocationMutatorModuleTest.java @@ -38,23 +38,20 @@ import org.matsim.api.core.v01.population.Plan; import org.matsim.core.config.Config; import org.matsim.core.config.ConfigUtils; -import org.matsim.core.config.groups.TimeAllocationMutatorConfigGroup.TimeAllocationMutatorSubpopulationSettings; import org.matsim.core.gbl.MatsimRandom; import org.matsim.core.network.NetworkUtils; import org.matsim.core.population.PersonUtils; import org.matsim.core.population.PopulationUtils; import org.matsim.core.population.algorithms.PlanAlgorithm; import org.matsim.core.population.algorithms.PlanMutateTimeAllocationSimplified; -import org.matsim.core.population.algorithms.TripPlanMutateTimeAllocation; import org.matsim.core.router.TripRouter; -import org.matsim.core.router.TripStructureUtils.StageActivityHandling; import org.matsim.core.scenario.ScenarioUtils; import org.matsim.core.utils.misc.Time; import org.matsim.testcases.MatsimTestUtils; /** * Tests the functionality of {@link TimeAllocationMutatorModule}, mainly that the - * correct mutation range is handed over to the underlying {@link TripPlanMutateTimeAllocation}. + * correct mutation range is handed over to the underlying {@link PlanMutateTimeAllocationSimplified}. * * @author mrieser */ @@ -64,141 +61,11 @@ public class TimeAllocationMutatorModuleTest { public MatsimTestUtils utils = new MatsimTestUtils(); - /** - * Tests that the mutation range given in the constructor is respected. - * - * @author mrieser - */ - @Test public void testMutationRangeParam() { - boolean affectingDuration = true ; - - runMutationRangeTest(new TripPlanMutateTimeAllocation(750, affectingDuration, MatsimRandom.getLocalInstance()), 750); - runMutationRangeTest(new TripPlanMutateTimeAllocation(7200, affectingDuration, MatsimRandom.getLocalInstance()), 7200); - } - @Test public void testSimplifiedMutation() { boolean affectingDuration = true ; - runSimplifiedMutationRangeTest(new PlanMutateTimeAllocationSimplified( 750, affectingDuration, MatsimRandom.getLocalInstance()), 750); - runSimplifiedMutationRangeTest(new PlanMutateTimeAllocationSimplified( 7200, affectingDuration, MatsimRandom.getLocalInstance()), 7200); - } - - @Test public void testSubpopulations() { - - String cbSubpopulation = "cb"; - String freightSubpopulation = "freight"; - - Config config = ConfigUtils.createConfig(); -// config.plans().setSubpopulationAttributeName("subpopulation"); - config.timeAllocationMutator().setUseIndividualSettingsForSubpopulations(true); - config.timeAllocationMutator().setMutationRange(1800.0); - - TimeAllocationMutatorSubpopulationSettings cbSettings = (TimeAllocationMutatorSubpopulationSettings) config.timeAllocationMutator().createParameterSet(TimeAllocationMutatorSubpopulationSettings.SET_NAME); - cbSettings.setSubpopulation(cbSubpopulation); - cbSettings.setAffectingDuration(false); - cbSettings.setMutationRange(100.0); - config.timeAllocationMutator().addParameterSet(cbSettings); - - TimeAllocationMutatorSubpopulationSettings freightSettings = (TimeAllocationMutatorSubpopulationSettings) config.timeAllocationMutator().createParameterSet(TimeAllocationMutatorSubpopulationSettings.SET_NAME); - freightSettings.setSubpopulation(freightSubpopulation); - freightSettings.setAffectingDuration(true); - freightSettings.setMutationRange(7200.0); - config.timeAllocationMutator().addParameterSet(freightSettings); - - Provider tripRouterProvider = null; - - TimeAllocationMutatorModule mutator = new TimeAllocationMutatorModule(tripRouterProvider, config.plans(), config.timeAllocationMutator(), config.global()); - - Scenario scenario = ScenarioUtils.createScenario(config); - - TimeAllocationMutatorModule cbMutator = new TimeAllocationMutatorModule(tripRouterProvider, config.plans(), config.timeAllocationMutator(), config.global(), scenario.getPopulation()); -// assertEquals(false, cbMutator.affectingDuration); -// assertEquals(100.0, cbMutator.mutationRange); -// -// TimeAllocationMutator freightMutator = new TimeAllocationMutator(tripRouterProvider, config.plans(), config.timeAllocationMutator(), config.global(), scenario.getPopulation()); -// assertEquals(true, freightMutator.affectingDuration); -// assertEquals(7200.0, freightMutator.mutationRange); - } - - /** - * Internal helper method to run the real test, but with different setups. - * Basically, it creates one plan and calls the given TimeAllocationMutator - * several times with this plans, each time measuring how much the activity - * durations have changed and thus ensuring, the differences are within the - * expected range. - * - * @param tripPlanMutateTimeAllocation A preset TimeAllocationMutator to be used for the tests. - * @param expectedMutationRange The expected range for mutation. - */ - private static void runMutationRangeTest( final PlanAlgorithm tripPlanMutateTimeAllocation, final int expectedMutationRange ) { - // setup network - Network network = NetworkUtils.createNetwork(); - network.setCapacityPeriod(Time.parseTime("01:00:00")); - Node node1 = NetworkUtils.createAndAddNode(network, Id.create("1", Node.class), new Coord(0, 0)); - Node node2 = NetworkUtils.createAndAddNode(network, Id.create("2", Node.class), new Coord(100, 0)); - Node node3 = NetworkUtils.createAndAddNode(network, Id.create("3", Node.class), new Coord(200, 0)); - Node node4 = NetworkUtils.createAndAddNode(network, Id.create("4", Node.class), new Coord(300, 0)); - final Node fromNode = node1; - final Node toNode = node2; - Link link1 = NetworkUtils.createAndAddLink(network,Id.create("0", Link.class), fromNode, toNode, 100, 5, 100, 1); - final Node fromNode1 = node2; - final Node toNode1 = node3; - NetworkUtils.createAndAddLink(network,Id.create("1", Link.class), fromNode1, toNode1, 100, 5, 100, 1); - final Node fromNode2 = node3; - final Node toNode2 = node4; - NetworkUtils.createAndAddLink(network,Id.create("2", Link.class), fromNode2, toNode2, 100, 5, 100, 1); - - // setup person - Plan plan; - Activity act1, act2; - try { - /* The chosen times for the activity durations are such that it is likely - * for the random mutation to reach midnight (either at 00:00:00 or at 24:00:00). - */ - Person person = PopulationUtils.getFactory().createPerson(Id.create("1", Person.class)); - plan = PersonUtils.createAndAddPlan(person, true); - act1 = PopulationUtils.createAndAddActivityFromLinkId(plan, "h", link1.getId()); - act1.setEndTime(4*3600); - PopulationUtils.createAndAddLeg( plan, TransportMode.car ); - act2 = PopulationUtils.createAndAddActivityFromLinkId(plan, "w", link1.getId()); - act2.setMaximumDuration(14*3600); - PopulationUtils.createAndAddLeg( plan, TransportMode.car ); - PopulationUtils.createAndAddActivityFromLinkId(plan, "h", link1.getId()); - } catch (Exception e) { - throw new RuntimeException(e); - } - - // run test - double act1Dur = act1.getEndTime().seconds(); - double minDiff1 = Double.POSITIVE_INFINITY; - double maxDiff1 = Double.NEGATIVE_INFINITY; - double act2Dur = act2.getMaximumDuration().seconds(); - double minDiff2 = Double.POSITIVE_INFINITY; - double maxDiff2 = Double.NEGATIVE_INFINITY; - for (int i = 0; i < 150; i++) { - tripPlanMutateTimeAllocation.run(plan); - // test duration of act1 - double diff = act1Dur - act1.getMaximumDuration().seconds(); - if (diff > maxDiff1) maxDiff1 = diff; - if (diff < minDiff1) minDiff1 = diff; - act1Dur = act1.getMaximumDuration().seconds(); - assertTrue("activity duration cannot be smaller than 0, is " + act1Dur, act1Dur >= 0.0); - // test duration of act2 - diff = act2Dur - act2.getMaximumDuration().seconds(); - if (diff > maxDiff2) maxDiff2 = diff; - if (diff < minDiff2) minDiff2 = diff; - act2Dur = act2.getMaximumDuration().seconds(); - assertTrue("activity duration cannot be smaller than 0, is " + act2Dur, act2Dur >= 0.0); - } - assertTrue("mutation range differences wrong (act1).", minDiff1 <= maxDiff1); - assertTrue("mutation range differences wrong (act2).", minDiff2 <= maxDiff2); - - /* The following asserts are dependent on random numbers. - * But I would still expect that we get up to at least 95% of the limit... */ - assertValueInRange("mutation range out of range (maxDiff1).", maxDiff1, expectedMutationRange*0.95, expectedMutationRange); - assertValueInRange("mutation range out of range (minDiff1).", minDiff1, -expectedMutationRange, -expectedMutationRange*0.95); - assertValueInRange("mutation range out of range (maxDiff2).", maxDiff1, expectedMutationRange*0.95, expectedMutationRange); - assertValueInRange("mutation range out of range (minDiff2).", minDiff2, -expectedMutationRange, -expectedMutationRange*0.95); + runSimplifiedMutationRangeTest(new PlanMutateTimeAllocationSimplified( 750, affectingDuration, MatsimRandom.getLocalInstance(),24*3600,false,1), 750); + runSimplifiedMutationRangeTest(new PlanMutateTimeAllocationSimplified( 7200, affectingDuration, MatsimRandom.getLocalInstance(),24*3600,false,1), 7200); } /** diff --git a/matsim/src/test/java/org/matsim/population/algorithms/TripPlanMutateTimeAllocationTest.java b/matsim/src/test/java/org/matsim/population/algorithms/TripPlanMutateTimeAllocationTest.java index 4961b6887c0..9e60c754881 100644 --- a/matsim/src/test/java/org/matsim/population/algorithms/TripPlanMutateTimeAllocationTest.java +++ b/matsim/src/test/java/org/matsim/population/algorithms/TripPlanMutateTimeAllocationTest.java @@ -19,8 +19,6 @@ package org.matsim.population.algorithms; -import java.util.Random; - import org.junit.Assert; import org.junit.Test; import org.matsim.api.core.v01.Coord; @@ -32,9 +30,11 @@ import org.matsim.api.core.v01.population.PlanElement; import org.matsim.core.population.PersonUtils; import org.matsim.core.population.PopulationUtils; -import org.matsim.core.population.algorithms.TripPlanMutateTimeAllocation; +import org.matsim.core.population.algorithms.PlanMutateTimeAllocationSimplified; import org.matsim.pt.PtConstants; +import java.util.Random; + /** * @author mrieser */ @@ -43,33 +43,33 @@ public class TripPlanMutateTimeAllocationTest { @Test public void testRun() { // setup population with one person - Person person = (Person) PopulationUtils.getFactory().createPerson(Id.create(1, Person.class)); + Person person = PopulationUtils.getFactory().createPerson(Id.create(1, Person.class)); Plan plan = PersonUtils.createAndAddPlan(person, true); - Activity act = PopulationUtils.createAndAddActivityFromCoord(plan, "home", new Coord((double) 0, (double) 0)); + Activity act = PopulationUtils.createAndAddActivityFromCoord(plan, "home", new Coord(0, 0)); act.setEndTime(8.0 * 3600); PopulationUtils.createAndAddLeg( plan, TransportMode.transit_walk ); - Activity ptAct1 = PopulationUtils.createAndAddActivityFromCoord(plan, PtConstants.TRANSIT_ACTIVITY_TYPE, new Coord((double) 0, (double) 100)); + Activity ptAct1 = PopulationUtils.createAndAddActivityFromCoord(plan, PtConstants.TRANSIT_ACTIVITY_TYPE, new Coord(0, 100)); ptAct1.setMaximumDuration(0); PopulationUtils.createAndAddLeg( plan, TransportMode.pt ); - Activity ptAct2 = PopulationUtils.createAndAddActivityFromCoord(plan, PtConstants.TRANSIT_ACTIVITY_TYPE, new Coord((double) 0, (double) 100)); + Activity ptAct2 = PopulationUtils.createAndAddActivityFromCoord(plan, PtConstants.TRANSIT_ACTIVITY_TYPE, new Coord(0, 100)); ptAct2.setMaximumDuration(0); PopulationUtils.createAndAddLeg( plan, TransportMode.transit_walk ); - act = PopulationUtils.createAndAddActivityFromCoord(plan, "work", new Coord((double) 0, (double) 500)); + act = PopulationUtils.createAndAddActivityFromCoord(plan, "work", new Coord(0, 500)); act.setEndTime(16*3600); PopulationUtils.createAndAddLeg( plan, TransportMode.transit_walk ); - Activity ptAct3 = PopulationUtils.createAndAddActivityFromCoord(plan, PtConstants.TRANSIT_ACTIVITY_TYPE, new Coord((double) 0, (double) 100)); + Activity ptAct3 = PopulationUtils.createAndAddActivityFromCoord(plan, PtConstants.TRANSIT_ACTIVITY_TYPE, new Coord(0, 100)); ptAct3.setMaximumDuration(0); PopulationUtils.createAndAddLeg( plan, TransportMode.pt ); - Activity ptAct4 = PopulationUtils.createAndAddActivityFromCoord(plan, PtConstants.TRANSIT_ACTIVITY_TYPE, new Coord((double) 0, (double) 100)); + Activity ptAct4 = PopulationUtils.createAndAddActivityFromCoord(plan, PtConstants.TRANSIT_ACTIVITY_TYPE, new Coord(0, 100)); ptAct4.setMaximumDuration(0); PopulationUtils.createAndAddLeg( plan, TransportMode.transit_walk ); - PopulationUtils.createAndAddActivityFromCoord(plan, "work", new Coord((double) 0, (double) 500)); + PopulationUtils.createAndAddActivityFromCoord(plan, "work", new Coord(0, 500)); boolean affectingDuration = true ; - TripPlanMutateTimeAllocation mutator = - new TripPlanMutateTimeAllocation( + PlanMutateTimeAllocationSimplified mutator = + new PlanMutateTimeAllocationSimplified( 3600., - affectingDuration, new Random(2011)); + affectingDuration, new Random(2011),24*3600,false,1); mutator.run(plan); Assert.assertEquals(0.0, ptAct1.getMaximumDuration().seconds(), 1e-8); @@ -81,37 +81,40 @@ public void testRun() { @Test public void testRunLatestEndTime() { // setup population with one person - Person person = (Person) PopulationUtils.getFactory().createPerson(Id.create(1, Person.class)); + Person person = PopulationUtils.getFactory().createPerson(Id.create(1, Person.class)); Plan plan = PersonUtils.createAndAddPlan(person, true); - Activity act = PopulationUtils.createAndAddActivityFromCoord(plan, "home", new Coord((double) 0, (double) 0)); + Activity act = PopulationUtils.createAndAddActivityFromCoord(plan, "home", new Coord(0, 0)); act.setEndTime(8.0 * 3600); PopulationUtils.createAndAddLeg(plan, TransportMode.transit_walk); Activity ptAct1 = PopulationUtils.createAndAddActivityFromCoord(plan, PtConstants.TRANSIT_ACTIVITY_TYPE, - new Coord((double) 0, (double) 100)); + new Coord(0, 100)); ptAct1.setMaximumDuration(0); PopulationUtils.createAndAddLeg(plan, TransportMode.pt); Activity ptAct2 = PopulationUtils.createAndAddActivityFromCoord(plan, PtConstants.TRANSIT_ACTIVITY_TYPE, - new Coord((double) 0, (double) 100)); + new Coord(0, 100)); ptAct2.setMaximumDuration(0); PopulationUtils.createAndAddLeg(plan, TransportMode.transit_walk); - act = PopulationUtils.createAndAddActivityFromCoord(plan, "work", new Coord((double) 0, (double) 500)); + act = PopulationUtils.createAndAddActivityFromCoord(plan, "work", new Coord(0, 500)); act.setEndTime(38 * 3600); PopulationUtils.createAndAddLeg(plan, TransportMode.transit_walk); Activity ptAct3 = PopulationUtils.createAndAddActivityFromCoord(plan, PtConstants.TRANSIT_ACTIVITY_TYPE, - new Coord((double) 0, (double) 100)); + new Coord(0, 100)); ptAct3.setMaximumDuration(0); PopulationUtils.createAndAddLeg(plan, TransportMode.pt); Activity ptAct4 = PopulationUtils.createAndAddActivityFromCoord(plan, PtConstants.TRANSIT_ACTIVITY_TYPE, - new Coord((double) 0, (double) 100)); + new Coord(0, 100)); ptAct4.setMaximumDuration(0); PopulationUtils.createAndAddLeg(plan, TransportMode.transit_walk); - PopulationUtils.createAndAddActivityFromCoord(plan, "work", new Coord((double) 0, (double) 500)); + PopulationUtils.createAndAddActivityFromCoord(plan, "work", new Coord(0, 500)); boolean affectingDuration = true; final double latestEndTime = 30. * 3600; - TripPlanMutateTimeAllocation mutator = new TripPlanMutateTimeAllocation(3600., affectingDuration, - new Random(2011), null, null, latestEndTime); + PlanMutateTimeAllocationSimplified mutator = + new PlanMutateTimeAllocationSimplified( + 3600., + affectingDuration, new Random(2011),latestEndTime,false,1); + mutator.run(plan); Assert.assertEquals(0.0, ptAct1.getMaximumDuration().seconds(), 1e-8); From 8e71d4ae78ba9a9d5c8d92bbd95ba8b603b42238 Mon Sep 17 00:00:00 2001 From: u229187 Date: Fri, 13 Oct 2023 10:02:45 +0200 Subject: [PATCH 05/33] rename PlanMutateTimeAllocationSimplified to MutateActivityTimeAllocation --- ...d.java => MutateActivityTimeAllocation.java} | 17 ++++------------- .../strategies/TimeAllocationMutatorModule.java | 17 ++--------------- .../TimeAllocationMutatorModuleTest.java | 15 ++++----------- .../TripPlanMutateTimeAllocationTest.java | 10 +++++----- 4 files changed, 15 insertions(+), 44 deletions(-) rename matsim/src/main/java/org/matsim/core/population/algorithms/{PlanMutateTimeAllocationSimplified.java => MutateActivityTimeAllocation.java} (84%) diff --git a/matsim/src/main/java/org/matsim/core/population/algorithms/PlanMutateTimeAllocationSimplified.java b/matsim/src/main/java/org/matsim/core/population/algorithms/MutateActivityTimeAllocation.java similarity index 84% rename from matsim/src/main/java/org/matsim/core/population/algorithms/PlanMutateTimeAllocationSimplified.java rename to matsim/src/main/java/org/matsim/core/population/algorithms/MutateActivityTimeAllocation.java index 405aba45d2c..09dce347ef4 100644 --- a/matsim/src/main/java/org/matsim/core/population/algorithms/PlanMutateTimeAllocationSimplified.java +++ b/matsim/src/main/java/org/matsim/core/population/algorithms/MutateActivityTimeAllocation.java @@ -20,27 +20,21 @@ package org.matsim.core.population.algorithms; -import java.util.Map; import java.util.Random; import org.matsim.api.core.v01.population.Activity; import org.matsim.api.core.v01.population.Leg; import org.matsim.api.core.v01.population.Plan; import org.matsim.api.core.v01.population.PlanElement; -import org.matsim.core.population.PopulationUtils; import org.matsim.core.router.TripStructureUtils; import org.matsim.core.router.TripStructureUtils.StageActivityHandling; /** * Mutates the duration of activities randomly within a specified range. - *
- * Other than the "full" version, this version just mutates activity end time and activity duration if they are defined, - * without thinking any further. If this produces invalid plans, they will eventually be removed through the selection - * process. kai, jun'12 * - * @author knagel + * @author knagel, jbischoff */ -public final class PlanMutateTimeAllocationSimplified implements PlanAlgorithm { +public final class MutateActivityTimeAllocation implements PlanAlgorithm { public static final String INITIAL_END_TIME_ATTRIBUTE = "initialEndTime"; @@ -52,7 +46,7 @@ public final class PlanMutateTimeAllocationSimplified implements PlanAlgorithm { private final double mutationRangeStep; - public PlanMutateTimeAllocationSimplified(final double mutationRange, boolean affectingDuration, final Random random, double latestActivityEndTime, boolean mutateAroundInitialEndTimeOnly, double mutationRangeStep) { + public MutateActivityTimeAllocation(final double mutationRange, boolean affectingDuration, final Random random, double latestActivityEndTime, boolean mutateAroundInitialEndTimeOnly, double mutationRangeStep) { this.mutationRange = mutationRange; this.affectingDuration = affectingDuration; this.random = random; @@ -76,11 +70,8 @@ public void run(final Plan plan) { } } double newEndTime = Math.min(mutateTime(endTime, mutationRange),this.latestActivityEndTime); - double shift = endTime -newEndTime; act.setEndTime(newEndTime); - if (act.getStartTime().isDefined()){ - act.setStartTime(act.getStartTime().seconds()-shift); - } + act.setStartTimeUndefined(); } else if ( affectingDuration ) { if ( act.getMaximumDuration().isDefined()) { diff --git a/matsim/src/main/java/org/matsim/core/replanning/strategies/TimeAllocationMutatorModule.java b/matsim/src/main/java/org/matsim/core/replanning/strategies/TimeAllocationMutatorModule.java index 70cae3d1e8e..485089a53ee 100644 --- a/matsim/src/main/java/org/matsim/core/replanning/strategies/TimeAllocationMutatorModule.java +++ b/matsim/src/main/java/org/matsim/core/replanning/strategies/TimeAllocationMutatorModule.java @@ -22,26 +22,13 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.matsim.api.core.v01.population.Population; import org.matsim.api.core.v01.replanning.PlanStrategyModule; -import org.matsim.core.config.Config; -import org.matsim.core.config.ConfigGroup; import org.matsim.core.config.groups.GlobalConfigGroup; -import org.matsim.core.config.groups.PlansConfigGroup; import org.matsim.core.config.groups.TimeAllocationMutatorConfigGroup; import org.matsim.core.gbl.MatsimRandom; import org.matsim.core.population.algorithms.PlanAlgorithm; -import org.matsim.core.population.algorithms.PlanMutateTimeAllocationSimplified; -import org.matsim.core.population.algorithms.TripPlanMutateTimeAllocation; +import org.matsim.core.population.algorithms.MutateActivityTimeAllocation; import org.matsim.core.replanning.modules.AbstractMultithreadedModule; -import org.matsim.core.router.TripRouter; -import org.matsim.core.router.TripStructureUtils.StageActivityHandling; - -import jakarta.inject.Provider; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; /** * Wraps the {@link org.matsim.core.population.algorithms.TripPlanMutateTimeAllocation}- @@ -70,7 +57,7 @@ class TimeAllocationMutatorModule extends AbstractMultithreadedModule{ @Override public PlanAlgorithm getPlanAlgoInstance() { - PlanAlgorithm pmta = new PlanMutateTimeAllocationSimplified + PlanAlgorithm pmta = new MutateActivityTimeAllocation (this.mutationRange, this.affectingDuration, MatsimRandom.getLocalInstance(), timeAllocationMutatorConfigGroup.getLatestActivityEndTime(), timeAllocationMutatorConfigGroup.isMutateAroundInitialEndTimeOnly(), timeAllocationMutatorConfigGroup.getMutationRangeStep()); diff --git a/matsim/src/test/java/org/matsim/core/replanning/strategies/TimeAllocationMutatorModuleTest.java b/matsim/src/test/java/org/matsim/core/replanning/strategies/TimeAllocationMutatorModuleTest.java index a447d5b2a90..0f908843e27 100644 --- a/matsim/src/test/java/org/matsim/core/replanning/strategies/TimeAllocationMutatorModuleTest.java +++ b/matsim/src/test/java/org/matsim/core/replanning/strategies/TimeAllocationMutatorModuleTest.java @@ -22,13 +22,10 @@ import static org.junit.Assert.assertTrue; -import jakarta.inject.Provider; - import org.junit.Rule; import org.junit.Test; 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.TransportMode; import org.matsim.api.core.v01.network.Link; import org.matsim.api.core.v01.network.Network; @@ -36,22 +33,18 @@ import org.matsim.api.core.v01.population.Activity; import org.matsim.api.core.v01.population.Person; import org.matsim.api.core.v01.population.Plan; -import org.matsim.core.config.Config; -import org.matsim.core.config.ConfigUtils; import org.matsim.core.gbl.MatsimRandom; import org.matsim.core.network.NetworkUtils; import org.matsim.core.population.PersonUtils; import org.matsim.core.population.PopulationUtils; import org.matsim.core.population.algorithms.PlanAlgorithm; -import org.matsim.core.population.algorithms.PlanMutateTimeAllocationSimplified; -import org.matsim.core.router.TripRouter; -import org.matsim.core.scenario.ScenarioUtils; +import org.matsim.core.population.algorithms.MutateActivityTimeAllocation; import org.matsim.core.utils.misc.Time; import org.matsim.testcases.MatsimTestUtils; /** * Tests the functionality of {@link TimeAllocationMutatorModule}, mainly that the - * correct mutation range is handed over to the underlying {@link PlanMutateTimeAllocationSimplified}. + * correct mutation range is handed over to the underlying {@link MutateActivityTimeAllocation}. * * @author mrieser */ @@ -64,8 +57,8 @@ public class TimeAllocationMutatorModuleTest { @Test public void testSimplifiedMutation() { boolean affectingDuration = true ; - runSimplifiedMutationRangeTest(new PlanMutateTimeAllocationSimplified( 750, affectingDuration, MatsimRandom.getLocalInstance(),24*3600,false,1), 750); - runSimplifiedMutationRangeTest(new PlanMutateTimeAllocationSimplified( 7200, affectingDuration, MatsimRandom.getLocalInstance(),24*3600,false,1), 7200); + runSimplifiedMutationRangeTest(new MutateActivityTimeAllocation( 750, affectingDuration, MatsimRandom.getLocalInstance(),24*3600,false,1), 750); + runSimplifiedMutationRangeTest(new MutateActivityTimeAllocation( 7200, affectingDuration, MatsimRandom.getLocalInstance(),24*3600,false,1), 7200); } /** diff --git a/matsim/src/test/java/org/matsim/population/algorithms/TripPlanMutateTimeAllocationTest.java b/matsim/src/test/java/org/matsim/population/algorithms/TripPlanMutateTimeAllocationTest.java index 9e60c754881..a7f0f07b22c 100644 --- a/matsim/src/test/java/org/matsim/population/algorithms/TripPlanMutateTimeAllocationTest.java +++ b/matsim/src/test/java/org/matsim/population/algorithms/TripPlanMutateTimeAllocationTest.java @@ -30,7 +30,7 @@ import org.matsim.api.core.v01.population.PlanElement; import org.matsim.core.population.PersonUtils; import org.matsim.core.population.PopulationUtils; -import org.matsim.core.population.algorithms.PlanMutateTimeAllocationSimplified; +import org.matsim.core.population.algorithms.MutateActivityTimeAllocation; import org.matsim.pt.PtConstants; import java.util.Random; @@ -66,8 +66,8 @@ public void testRun() { PopulationUtils.createAndAddActivityFromCoord(plan, "work", new Coord(0, 500)); boolean affectingDuration = true ; - PlanMutateTimeAllocationSimplified mutator = - new PlanMutateTimeAllocationSimplified( + MutateActivityTimeAllocation mutator = + new MutateActivityTimeAllocation( 3600., affectingDuration, new Random(2011),24*3600,false,1); mutator.run(plan); @@ -110,8 +110,8 @@ public void testRunLatestEndTime() { boolean affectingDuration = true; final double latestEndTime = 30. * 3600; - PlanMutateTimeAllocationSimplified mutator = - new PlanMutateTimeAllocationSimplified( + MutateActivityTimeAllocation mutator = + new MutateActivityTimeAllocation( 3600., affectingDuration, new Random(2011),latestEndTime,false,1); From fb982e55294034d1afe44084b7b0322bcd9d17a0 Mon Sep 17 00:00:00 2001 From: u229187 Date: Fri, 13 Oct 2023 11:48:29 +0200 Subject: [PATCH 06/33] try to set leg start time in any case. --- .../MutateActivityTimeAllocation.java | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/matsim/src/main/java/org/matsim/core/population/algorithms/MutateActivityTimeAllocation.java b/matsim/src/main/java/org/matsim/core/population/algorithms/MutateActivityTimeAllocation.java index 09dce347ef4..e658570f8ea 100644 --- a/matsim/src/main/java/org/matsim/core/population/algorithms/MutateActivityTimeAllocation.java +++ b/matsim/src/main/java/org/matsim/core/population/algorithms/MutateActivityTimeAllocation.java @@ -84,17 +84,23 @@ else if ( affectingDuration ) { } private void setLegDepartureTimes(Plan plan) { - Activity previousActivity = null; + //setting leg departure times can only be an estimate and might be useful for certain dynamic modes. + //In general, it is best to trigger a reroute after mutating time. + double now = 0; for (PlanElement planElement : plan.getPlanElements()){ if (planElement instanceof Activity activity){ - previousActivity = activity; + if (activity.getEndTime().isDefined()){ + now = activity.getEndTime().seconds(); + } + else if (activity.getMaximumDuration().isDefined()){ + now = now + activity.getMaximumDuration().seconds(); + } } else if (planElement instanceof Leg leg){ - if (previousActivity.getEndTime().isDefined()){ - leg.setDepartureTime(previousActivity.getEndTime().seconds()); - } else { - // previous activity has only a duration. - // Estimates about departure time would be very vague, thus they are not set. - leg.setDepartureTimeUndefined(); + if (leg.getDepartureTime().isDefined()) { + leg.setDepartureTime(now); + if (leg.getTravelTime().isDefined()) { + now = now + leg.getTravelTime().seconds(); + } } } } From ca212b6473dade24dde021c042d2175ee72edb5e Mon Sep 17 00:00:00 2001 From: u229187 Date: Fri, 13 Oct 2023 11:48:59 +0200 Subject: [PATCH 07/33] fix minor outputs in tests after modification of timeMutator --- .../DecongestionPricingTestIT.java | 1120 ++++++++--------- .../contrib/pseudosimulation/RunPSimTest.java | 7 +- .../matsim/contrib/shared_mobility/RunIT.java | 12 +- 3 files changed, 569 insertions(+), 570 deletions(-) diff --git a/contribs/decongestion/src/test/java/org/matsim/contrib/decongestion/DecongestionPricingTestIT.java b/contribs/decongestion/src/test/java/org/matsim/contrib/decongestion/DecongestionPricingTestIT.java index ac6697e3694..25084c5bba0 100644 --- a/contribs/decongestion/src/test/java/org/matsim/contrib/decongestion/DecongestionPricingTestIT.java +++ b/contribs/decongestion/src/test/java/org/matsim/contrib/decongestion/DecongestionPricingTestIT.java @@ -1,560 +1,560 @@ -/* *********************************************************************** * - * project: org.matsim.* - * * - * *********************************************************************** * - * * - * copyright : (C) 2013 by the members listed in the COPYING, * - * LICENSE and WARRANTY file. * - * email : info at matsim dot org * - * * - * *********************************************************************** * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * See also COPYING, LICENSE and WARRANTY file * - * * - * *********************************************************************** */ - -/** - * - */ -package org.matsim.contrib.decongestion; - -import org.junit.Assert; -import org.junit.Rule; -import org.junit.Test; -import org.matsim.analysis.ScoreStatsControlerListener.ScoreItem; -import org.matsim.api.core.v01.Id; -import org.matsim.api.core.v01.Scenario; -import org.matsim.contrib.decongestion.DecongestionConfigGroup.DecongestionApproach; -import org.matsim.contrib.decongestion.data.DecongestionInfo; -import org.matsim.contrib.decongestion.handler.DelayAnalysis; -import org.matsim.contrib.decongestion.handler.IntervalBasedTolling; -import org.matsim.contrib.decongestion.handler.IntervalBasedTollingAll; -import org.matsim.contrib.decongestion.handler.PersonVehicleTracker; -import org.matsim.contrib.decongestion.routing.TollTimeDistanceTravelDisutilityFactory; -import org.matsim.contrib.decongestion.tollSetting.DecongestionTollSetting; -import org.matsim.contrib.decongestion.tollSetting.DecongestionTollingBangBang; -import org.matsim.contrib.decongestion.tollSetting.DecongestionTollingPID; -import org.matsim.core.config.Config; -import org.matsim.core.config.ConfigUtils; -import org.matsim.core.controler.AbstractModule; -import org.matsim.core.controler.Controler; -import org.matsim.core.controler.OutputDirectoryHierarchy; -import org.matsim.core.scenario.ScenarioUtils; -import org.matsim.testcases.MatsimTestUtils; - -/** - * - * - * @author ikaddoura - * - */ -public class DecongestionPricingTestIT { - - @Rule - public MatsimTestUtils testUtils = new MatsimTestUtils(); - - /** - * Kp = 0.0123 - * - */ - @Test - public final void test0a() { - - System.out.println(testUtils.getPackageInputDirectory()); - - final String configFile = testUtils.getPackageInputDirectory() + "/config0.xml"; - - Config config = ConfigUtils.loadConfig(configFile); - - String outputDirectory = testUtils.getOutputDirectory() + "/"; - config.controler().setOutputDirectory(outputDirectory); - - final DecongestionConfigGroup decongestionSettings = new DecongestionConfigGroup(); - decongestionSettings.setWriteOutputIteration(1); - decongestionSettings.setKp(0.0123); - decongestionSettings.setKd(0.0); - decongestionSettings.setKi(0.0); - decongestionSettings.setMsa(false); - decongestionSettings.setTollBlendFactor(1.0); - decongestionSettings.setFractionOfIterationsToEndPriceAdjustment(1.0); - decongestionSettings.setFractionOfIterationsToStartPriceAdjustment(0.0); - config.addModule(decongestionSettings); - - final Scenario scenario = ScenarioUtils.loadScenario(config); - Controler controler = new Controler(scenario); - - DecongestionInfo info = new DecongestionInfo(); - - // congestion toll computation - controler.addOverridingModule(new AbstractModule() { - @Override - public void install() { - - this.bind(DecongestionInfo.class).toInstance(info); - - this.bind(DecongestionTollSetting.class).to(DecongestionTollingPID.class); - this.bind(IntervalBasedTolling.class).to(IntervalBasedTollingAll.class); - - this.bind(IntervalBasedTollingAll.class).asEagerSingleton(); - this.bind(DelayAnalysis.class).asEagerSingleton(); - this.bind(PersonVehicleTracker.class).asEagerSingleton(); - - this.addEventHandlerBinding().to(IntervalBasedTollingAll.class); - this.addEventHandlerBinding().to(DelayAnalysis.class); - this.addEventHandlerBinding().to(PersonVehicleTracker.class); - - this.addControlerListenerBinding().to(DecongestionControlerListener.class); - - } - }); - - // toll-adjusted routing - - final TollTimeDistanceTravelDisutilityFactory travelDisutilityFactory = new TollTimeDistanceTravelDisutilityFactory(); - - controler.addOverridingModule(new AbstractModule(){ - @Override - public void install() { - this.bindCarTravelDisutilityFactory().toInstance( travelDisutilityFactory ); - } - }); - - controler.getConfig().controler().setOverwriteFileSetting(OutputDirectoryHierarchy.OverwriteFileSetting.deleteDirectoryIfExists); - controler.run(); - - double tt0 = controler.getLinkTravelTimes().getLinkTravelTime(scenario.getNetwork().getLinks().get(Id.createLinkId("link12")), 6 * 3600 + 50. * 60, null, null); - double tt1 = controler.getLinkTravelTimes().getLinkTravelTime(scenario.getNetwork().getLinks().get(Id.createLinkId("link12")), 7 * 3600 + 63, null, null); - double tt2 = controler.getLinkTravelTimes().getLinkTravelTime(scenario.getNetwork().getLinks().get(Id.createLinkId("link12")), 7 * 3600 + 15. * 60, null, null); - - Assert.assertEquals("Wrong travel time. The run output seems to have changed.", 100.0, tt0, MatsimTestUtils.EPSILON); - Assert.assertEquals("Wrong travel time. The run output seems to have changed.", 150.5, tt1, MatsimTestUtils.EPSILON); - Assert.assertEquals("Wrong travel time. The run output seems to have changed.", 100.0, tt2, MatsimTestUtils.EPSILON); - - final int index = config.controler().getLastIteration() - config.controler().getFirstIteration(); - double avgScore = controler.getScoreStats().getScoreHistory().get( ScoreItem.executed ).get(index); - Assert.assertEquals("Wrong average executed score. The tolls seem to have changed.", -33.940316666666666, avgScore, MatsimTestUtils.EPSILON); - - System.out.println(info.getlinkInfos().get(Id.createLinkId("link12")).getTime2toll().toString()); - System.out.println(info.getlinkInfos().get(Id.createLinkId("link12")).getTime2avgDelay().toString()); - - Assert.assertEquals("Wrong average delay (capacity is set in a way that one of the two agents has to wait 101 sec. Thus the average is 50.5", 50.5, info.getlinkInfos().get(Id.createLinkId("link12")).getTime2avgDelay().get(84), MatsimTestUtils.EPSILON); - Assert.assertEquals("Wrong toll.", 50.5 * 0.0123, info.getlinkInfos().get(Id.createLinkId("link12")).getTime2toll().get(84), MatsimTestUtils.EPSILON); - - } - - /** - * Kp = 0.0123, other syntax - * - */ - @Test - public final void test0amodified() { - - System.out.println(testUtils.getPackageInputDirectory()); - - final String configFile = testUtils.getPackageInputDirectory() + "/config0.xml"; - - Config config = ConfigUtils.loadConfig(configFile); - - String outputDirectory = testUtils.getOutputDirectory() + "/"; - config.controler().setOutputDirectory(outputDirectory); - - final DecongestionConfigGroup decongestionSettings = new DecongestionConfigGroup(); - decongestionSettings.setWriteOutputIteration(1); - decongestionSettings.setKp(0.0123); - decongestionSettings.setKd(0.0); - decongestionSettings.setKi(0.0); - decongestionSettings.setMsa(false); - decongestionSettings.setTollBlendFactor(1.0); - decongestionSettings.setFractionOfIterationsToEndPriceAdjustment(1.0); - decongestionSettings.setFractionOfIterationsToStartPriceAdjustment(0.0); - config.addModule(decongestionSettings); - - final Scenario scenario = ScenarioUtils.loadScenario(config); - Controler controler = new Controler(scenario); - - // congestion toll computation - controler.addOverridingModule(new DecongestionModule(scenario)); - - // toll-adjusted routing - - final TollTimeDistanceTravelDisutilityFactory travelDisutilityFactory = new TollTimeDistanceTravelDisutilityFactory(); - - controler.addOverridingModule(new AbstractModule(){ - @Override - public void install() { - this.bindCarTravelDisutilityFactory().toInstance( travelDisutilityFactory ); - } - }); - - controler.getConfig().controler().setOverwriteFileSetting(OutputDirectoryHierarchy.OverwriteFileSetting.deleteDirectoryIfExists); - controler.run(); - - double tt0 = controler.getLinkTravelTimes().getLinkTravelTime(scenario.getNetwork().getLinks().get(Id.createLinkId("link12")), 6 * 3600 + 50. * 60, null, null); - double tt1 = controler.getLinkTravelTimes().getLinkTravelTime(scenario.getNetwork().getLinks().get(Id.createLinkId("link12")), 7 * 3600 + 63, null, null); - double tt2 = controler.getLinkTravelTimes().getLinkTravelTime(scenario.getNetwork().getLinks().get(Id.createLinkId("link12")), 7 * 3600 + 15. * 60, null, null); - - Assert.assertEquals("Wrong travel time. The run output seems to have changed.", 100.0, tt0, MatsimTestUtils.EPSILON); - Assert.assertEquals("Wrong travel time. The run output seems to have changed.", 150.5, tt1, MatsimTestUtils.EPSILON); - Assert.assertEquals("Wrong travel time. The run output seems to have changed.", 100.0, tt2, MatsimTestUtils.EPSILON); - - final int index = config.controler().getLastIteration() - config.controler().getFirstIteration(); - double avgScore = controler.getScoreStats().getScoreHistory().get( ScoreItem.executed ).get(index); - Assert.assertEquals("Wrong average executed score. The tolls seem to have changed.", -33.940316666666666, avgScore, MatsimTestUtils.EPSILON); - } - - /** - * Kp = 2 - * - */ - @Test - public final void test0b() { - - System.out.println(testUtils.getPackageInputDirectory()); - - final String configFile = testUtils.getPackageInputDirectory() + "/config0.xml"; - - Config config = ConfigUtils.loadConfig(configFile); - - String outputDirectory = testUtils.getOutputDirectory() + "/"; - config.controler().setOutputDirectory(outputDirectory); - - final DecongestionConfigGroup decongestionSettings = new DecongestionConfigGroup(); - decongestionSettings.setWriteOutputIteration(1); - decongestionSettings.setKp(2.0); - decongestionSettings.setKd(0.0); - decongestionSettings.setKi(0.0); - decongestionSettings.setMsa(false); - decongestionSettings.setTollBlendFactor(1.0); - decongestionSettings.setFractionOfIterationsToEndPriceAdjustment(1.0); - decongestionSettings.setFractionOfIterationsToStartPriceAdjustment(0.0); - config.addModule(decongestionSettings); - - final Scenario scenario = ScenarioUtils.loadScenario(config); - Controler controler = new Controler(scenario); - - DecongestionInfo info = new DecongestionInfo(); - - // congestion toll computation - controler.addOverridingModule(new AbstractModule() { - @Override - public void install() { - - this.bind(DecongestionInfo.class).toInstance(info); - - this.bind(DecongestionTollSetting.class).to(DecongestionTollingPID.class); - this.bind(IntervalBasedTolling.class).to(IntervalBasedTollingAll.class); - - this.bind(IntervalBasedTollingAll.class).asEagerSingleton(); - this.bind(DelayAnalysis.class).asEagerSingleton(); - this.bind(PersonVehicleTracker.class).asEagerSingleton(); - - this.addEventHandlerBinding().to(IntervalBasedTollingAll.class); - this.addEventHandlerBinding().to(DelayAnalysis.class); - this.addEventHandlerBinding().to(PersonVehicleTracker.class); - - this.addControlerListenerBinding().to(DecongestionControlerListener.class); - - } - }); - - // toll-adjusted routing - - final TollTimeDistanceTravelDisutilityFactory travelDisutilityFactory = new TollTimeDistanceTravelDisutilityFactory(); - - controler.addOverridingModule(new AbstractModule(){ - @Override - public void install() { - this.bindCarTravelDisutilityFactory().toInstance( travelDisutilityFactory ); - } - }); - - controler.getConfig().controler().setOverwriteFileSetting(OutputDirectoryHierarchy.OverwriteFileSetting.deleteDirectoryIfExists); - controler.run(); - - double tt0 = controler.getLinkTravelTimes().getLinkTravelTime(scenario.getNetwork().getLinks().get(Id.createLinkId("link12")), 6 * 3600 + 50. * 60, null, null); - double tt1 = controler.getLinkTravelTimes().getLinkTravelTime(scenario.getNetwork().getLinks().get(Id.createLinkId("link12")), 7 * 3600 + 63, null, null); - double tt2 = controler.getLinkTravelTimes().getLinkTravelTime(scenario.getNetwork().getLinks().get(Id.createLinkId("link12")), 7 * 3600 + 15. * 60, null, null); - - Assert.assertEquals("Wrong travel time. The run output seems to have changed.", 100.0, tt0, MatsimTestUtils.EPSILON); - Assert.assertEquals("Wrong travel time. The run output seems to have changed.", 150.5, tt1, MatsimTestUtils.EPSILON); - Assert.assertEquals("Wrong travel time. The run output seems to have changed.", 100.0, tt2, MatsimTestUtils.EPSILON); - - final int index = config.controler().getLastIteration() - config.controler().getFirstIteration(); - double avgScore = controler.getScoreStats().getScoreHistory().get( ScoreItem.executed ).get(index); - Assert.assertEquals("Wrong average executed score. The tolls seem to have changed.", -134.31916666666666, avgScore, MatsimTestUtils.EPSILON); - - System.out.println(info.getlinkInfos().get(Id.createLinkId("link12")).getTime2toll().toString()); - System.out.println(info.getlinkInfos().get(Id.createLinkId("link12")).getTime2avgDelay().toString()); - - Assert.assertEquals("Wrong average delay (capacity is set in a way that one of the two agents has to wait 101 sec. Thus the average is 50.5", 50.5, info.getlinkInfos().get(Id.createLinkId("link12")).getTime2avgDelay().get(84), MatsimTestUtils.EPSILON); - Assert.assertEquals("Wrong toll.", 50.5 * 2, info.getlinkInfos().get(Id.createLinkId("link12")).getTime2toll().get(84), MatsimTestUtils.EPSILON); - } - - /** - * Kp = 2 - * - */ - @Test - public final void test0bmodified() { - - System.out.println(testUtils.getPackageInputDirectory()); - - final String configFile = testUtils.getPackageInputDirectory() + "/config0.xml"; - - Config config = ConfigUtils.loadConfig(configFile); - - String outputDirectory = testUtils.getOutputDirectory() + "/"; - config.controler().setOutputDirectory(outputDirectory); - - final DecongestionConfigGroup decongestionSettings = new DecongestionConfigGroup(); - decongestionSettings.setWriteOutputIteration(1); - decongestionSettings.setKp(2.0); - decongestionSettings.setKd(0.0); - decongestionSettings.setKi(0.0); - decongestionSettings.setMsa(false); - decongestionSettings.setTollBlendFactor(1.0); - decongestionSettings.setFractionOfIterationsToEndPriceAdjustment(1.0); - decongestionSettings.setFractionOfIterationsToStartPriceAdjustment(0.0); - config.addModule(decongestionSettings); - - final Scenario scenario = ScenarioUtils.loadScenario(config); - Controler controler = new Controler(scenario); - - // congestion toll computation - controler.addOverridingModule(new DecongestionModule(scenario)); - - // toll-adjusted routing - - final TollTimeDistanceTravelDisutilityFactory travelDisutilityFactory = new TollTimeDistanceTravelDisutilityFactory(); - - controler.addOverridingModule(new AbstractModule(){ - @Override - public void install() { - this.bindCarTravelDisutilityFactory().toInstance( travelDisutilityFactory ); - } - }); - - controler.getConfig().controler().setOverwriteFileSetting(OutputDirectoryHierarchy.OverwriteFileSetting.deleteDirectoryIfExists); - controler.run(); - - double tt0 = controler.getLinkTravelTimes().getLinkTravelTime(scenario.getNetwork().getLinks().get(Id.createLinkId("link12")), 6 * 3600 + 50. * 60, null, null); - double tt1 = controler.getLinkTravelTimes().getLinkTravelTime(scenario.getNetwork().getLinks().get(Id.createLinkId("link12")), 7 * 3600 + 63, null, null); - double tt2 = controler.getLinkTravelTimes().getLinkTravelTime(scenario.getNetwork().getLinks().get(Id.createLinkId("link12")), 7 * 3600 + 15. * 60, null, null); - - Assert.assertEquals("Wrong travel time. The run output seems to have changed.", 100.0, tt0, MatsimTestUtils.EPSILON); - Assert.assertEquals("Wrong travel time. The run output seems to have changed.", 150.5, tt1, MatsimTestUtils.EPSILON); - Assert.assertEquals("Wrong travel time. The run output seems to have changed.", 100.0, tt2, MatsimTestUtils.EPSILON); - - final int index = config.controler().getLastIteration() - config.controler().getFirstIteration(); - double avgScore = controler.getScoreStats().getScoreHistory().get( ScoreItem.executed ).get(index); - Assert.assertEquals("Wrong average executed score. The tolls seem to have changed.", -134.31916666666666, avgScore, MatsimTestUtils.EPSILON); - } - - /** - * Kp = 0 / no tolling - * - */ - @Test - public final void test0c() { - - System.out.println(testUtils.getPackageInputDirectory()); - - final String configFile = testUtils.getPackageInputDirectory() + "/config0.xml"; - - Config config = ConfigUtils.loadConfig(configFile); - - String outputDirectory = testUtils.getOutputDirectory() + "/"; - config.controler().setOutputDirectory(outputDirectory); - - final DecongestionConfigGroup decongestionSettings = new DecongestionConfigGroup(); - decongestionSettings.setWriteOutputIteration(1); - decongestionSettings.setKp(0.0); - decongestionSettings.setKd(0.0); - decongestionSettings.setKi(0.0); - decongestionSettings.setMsa(false); - decongestionSettings.setTollBlendFactor(1.0); - decongestionSettings.setFractionOfIterationsToEndPriceAdjustment(1.0); - decongestionSettings.setFractionOfIterationsToStartPriceAdjustment(0.0); - config.addModule(decongestionSettings); - - final Scenario scenario = ScenarioUtils.loadScenario(config); - Controler controler = new Controler(scenario); - - DecongestionInfo info = new DecongestionInfo(); - - // congestion toll computation - controler.addOverridingModule(new AbstractModule() { - @Override - public void install() { - - this.bind(DecongestionInfo.class).toInstance(info); - - this.bind(DelayAnalysis.class).asEagerSingleton(); - this.addEventHandlerBinding().to(DelayAnalysis.class); - - this.addControlerListenerBinding().to(DecongestionControlerListener.class); - - } - }); - - // toll-adjusted routing - - final TollTimeDistanceTravelDisutilityFactory travelDisutilityFactory = new TollTimeDistanceTravelDisutilityFactory(); - - controler.addOverridingModule(new AbstractModule(){ - @Override - public void install() { - this.bindCarTravelDisutilityFactory().toInstance( travelDisutilityFactory ); - } - }); - - controler.getConfig().controler().setOverwriteFileSetting(OutputDirectoryHierarchy.OverwriteFileSetting.deleteDirectoryIfExists); - controler.run(); - - double tt0 = controler.getLinkTravelTimes().getLinkTravelTime(scenario.getNetwork().getLinks().get(Id.createLinkId("link12")), 6 * 3600 + 50. * 60, null, null); - double tt1 = controler.getLinkTravelTimes().getLinkTravelTime(scenario.getNetwork().getLinks().get(Id.createLinkId("link12")), 7 * 3600 + 63, null, null); - double tt2 = controler.getLinkTravelTimes().getLinkTravelTime(scenario.getNetwork().getLinks().get(Id.createLinkId("link12")), 7 * 3600 + 15. * 60, null, null); - - Assert.assertEquals("Wrong travel time. The run output seems to have changed.", 100.0, tt0, MatsimTestUtils.EPSILON); - Assert.assertEquals("Wrong travel time. The run output seems to have changed.", 150.5, tt1, MatsimTestUtils.EPSILON); - Assert.assertEquals("Wrong travel time. The run output seems to have changed.", 100.0, tt2, MatsimTestUtils.EPSILON); - - final int index = config.controler().getLastIteration() - config.controler().getFirstIteration(); - double avgScore = controler.getScoreStats().getScoreHistory().get( ScoreItem.executed ).get(index); - Assert.assertEquals("Wrong average executed score. The tolls seem to have changed.", -33.31916666666666, avgScore, MatsimTestUtils.EPSILON); - - System.out.println(info.getlinkInfos().get(Id.createLinkId("link12")).getTime2toll().toString()); - System.out.println(info.getlinkInfos().get(Id.createLinkId("link12")).getTime2avgDelay().toString()); - - Assert.assertEquals("Wrong average delay (capacity is set in a way that one of the two agents has to wait 101 sec. Thus the average is 50.5", 50.5, info.getlinkInfos().get(Id.createLinkId("link12")).getTime2avgDelay().get(84), MatsimTestUtils.EPSILON); - Assert.assertEquals("Wrong toll.", null, info.getlinkInfos().get(Id.createLinkId("link12")).getTime2toll().get(84)); - - } - - /** - * Tests the PID controller - * - */ - @Test - public final void test1() { - - System.out.println(testUtils.getPackageInputDirectory()); - - final String configFile = testUtils.getPackageInputDirectory() + "/config.xml"; - Config config = ConfigUtils.loadConfig(configFile); - - String outputDirectory = testUtils.getOutputDirectory() + "/"; - config.controler().setOutputDirectory(outputDirectory); - - final DecongestionConfigGroup decongestionSettings = new DecongestionConfigGroup(); - decongestionSettings.setWriteOutputIteration(1); - decongestionSettings.setFractionOfIterationsToEndPriceAdjustment(1.0); - decongestionSettings.setFractionOfIterationsToStartPriceAdjustment(0.0); - decongestionSettings.setDecongestionApproach(DecongestionApproach.PID); - config.addModule(decongestionSettings); - - final Scenario scenario = ScenarioUtils.loadScenario(config); - Controler controler = new Controler(scenario); - - DecongestionInfo info = new DecongestionInfo(); - - // decongestion pricing - controler.addOverridingModule(new AbstractModule() { - @Override - public void install() { - - this.bind(DecongestionInfo.class).toInstance(info); - - this.bind(DecongestionTollSetting.class).to(DecongestionTollingPID.class); - this.bind(IntervalBasedTolling.class).to(IntervalBasedTollingAll.class); - - this.bind(IntervalBasedTollingAll.class).asEagerSingleton(); - this.bind(DelayAnalysis.class).asEagerSingleton(); - this.bind(PersonVehicleTracker.class).asEagerSingleton(); - - this.addEventHandlerBinding().to(IntervalBasedTollingAll.class); - this.addEventHandlerBinding().to(DelayAnalysis.class); - this.addEventHandlerBinding().to(PersonVehicleTracker.class); - - this.addControlerListenerBinding().to(DecongestionControlerListener.class); - } - }); - - controler.getConfig().controler().setOverwriteFileSetting(OutputDirectoryHierarchy.OverwriteFileSetting.deleteDirectoryIfExists); - controler.run(); - - final int index = config.controler().getLastIteration() - config.controler().getFirstIteration(); - double avgScore = controler.getScoreStats().getScoreHistory().get( ScoreItem.executed ).get(index) ; - Assert.assertEquals("Wrong average executed score. The run output seems to have changed.", -11749.431349675931, avgScore, MatsimTestUtils.EPSILON); - - System.out.println(info.getlinkInfos().get(Id.createLinkId("link12")).getTime2toll().toString()); - Assert.assertEquals("Wrong toll in time bin 61.", 12.600000000000009, info.getlinkInfos().get(Id.createLinkId("link12")).getTime2toll().get(61), MatsimTestUtils.EPSILON); - Assert.assertEquals("Wrong toll in time bin 73.", 16.665000000000006, info.getlinkInfos().get(Id.createLinkId("link12")).getTime2toll().get(73), MatsimTestUtils.EPSILON); - } - - /** - * Tests the BangBang controller - * - */ - @Test - public final void test2() { - - System.out.println(testUtils.getPackageInputDirectory()); - - final String configFile = testUtils.getPackageInputDirectory() + "/config.xml"; - Config config = ConfigUtils.loadConfig(configFile); - - String outputDirectory = testUtils.getOutputDirectory() + "/"; - config.controler().setOutputDirectory(outputDirectory); - - final DecongestionConfigGroup decongestionSettings = new DecongestionConfigGroup(); - decongestionSettings.setWriteOutputIteration(1); - decongestionSettings.setFractionOfIterationsToEndPriceAdjustment(1.0); - decongestionSettings.setFractionOfIterationsToStartPriceAdjustment(0.0); - config.addModule(decongestionSettings); - - DecongestionInfo info = new DecongestionInfo(); - - final Scenario scenario = ScenarioUtils.loadScenario(config); - Controler controler = new Controler(scenario); - - // decongestion pricing - controler.addOverridingModule(new AbstractModule() { - @Override - public void install() { - - this.bind(DecongestionInfo.class).toInstance(info); - - this.bind(DecongestionTollSetting.class).to(DecongestionTollingBangBang.class); - this.bind(IntervalBasedTolling.class).to(IntervalBasedTollingAll.class); - - this.bind(IntervalBasedTollingAll.class).asEagerSingleton(); - this.bind(DelayAnalysis.class).asEagerSingleton(); - this.bind(PersonVehicleTracker.class).asEagerSingleton(); - - this.addEventHandlerBinding().to(IntervalBasedTollingAll.class); - this.addEventHandlerBinding().to(DelayAnalysis.class); - this.addEventHandlerBinding().to(PersonVehicleTracker.class); - - this.addControlerListenerBinding().to(DecongestionControlerListener.class); - - } - }); - - controler.getConfig().controler().setOverwriteFileSetting(OutputDirectoryHierarchy.OverwriteFileSetting.deleteDirectoryIfExists); - controler.run(); - - final int index = config.controler().getLastIteration() - config.controler().getFirstIteration(); - double avgScore = controler.getScoreStats().getScoreHistory().get( ScoreItem.executed ).get( index ) ; - Assert.assertEquals("Wrong average executed score. The run output seems to have changed.", -54.97929444444, avgScore, MatsimTestUtils.EPSILON); - - System.out.println(info.getlinkInfos().get(Id.createLinkId("link12")).getTime2toll().toString()); - Assert.assertEquals("Wrong toll in time bin 61.", 13., info.getlinkInfos().get(Id.createLinkId("link12")).getTime2toll().get(61), MatsimTestUtils.EPSILON); - Assert.assertEquals("Wrong toll in time bin 73.", 13., info.getlinkInfos().get(Id.createLinkId("link12")).getTime2toll().get(73), MatsimTestUtils.EPSILON); - } - -} +/* *********************************************************************** * + * project: org.matsim.* + * * + * *********************************************************************** * + * * + * copyright : (C) 2013 by the members listed in the COPYING, * + * LICENSE and WARRANTY file. * + * email : info at matsim dot org * + * * + * *********************************************************************** * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * See also COPYING, LICENSE and WARRANTY file * + * * + * *********************************************************************** */ + +/** + * + */ +package org.matsim.contrib.decongestion; + +import org.junit.Assert; +import org.junit.Rule; +import org.junit.Test; +import org.matsim.analysis.ScoreStatsControlerListener.ScoreItem; +import org.matsim.api.core.v01.Id; +import org.matsim.api.core.v01.Scenario; +import org.matsim.contrib.decongestion.DecongestionConfigGroup.DecongestionApproach; +import org.matsim.contrib.decongestion.data.DecongestionInfo; +import org.matsim.contrib.decongestion.handler.DelayAnalysis; +import org.matsim.contrib.decongestion.handler.IntervalBasedTolling; +import org.matsim.contrib.decongestion.handler.IntervalBasedTollingAll; +import org.matsim.contrib.decongestion.handler.PersonVehicleTracker; +import org.matsim.contrib.decongestion.routing.TollTimeDistanceTravelDisutilityFactory; +import org.matsim.contrib.decongestion.tollSetting.DecongestionTollSetting; +import org.matsim.contrib.decongestion.tollSetting.DecongestionTollingBangBang; +import org.matsim.contrib.decongestion.tollSetting.DecongestionTollingPID; +import org.matsim.core.config.Config; +import org.matsim.core.config.ConfigUtils; +import org.matsim.core.controler.AbstractModule; +import org.matsim.core.controler.Controler; +import org.matsim.core.controler.OutputDirectoryHierarchy; +import org.matsim.core.scenario.ScenarioUtils; +import org.matsim.testcases.MatsimTestUtils; + +/** + * + * + * @author ikaddoura + * + */ +public class DecongestionPricingTestIT { + + @Rule + public MatsimTestUtils testUtils = new MatsimTestUtils(); + + /** + * Kp = 0.0123 + * + */ + @Test + public final void test0a() { + + System.out.println(testUtils.getPackageInputDirectory()); + + final String configFile = testUtils.getPackageInputDirectory() + "/config0.xml"; + + Config config = ConfigUtils.loadConfig(configFile); + + String outputDirectory = testUtils.getOutputDirectory() + "/"; + config.controler().setOutputDirectory(outputDirectory); + + final DecongestionConfigGroup decongestionSettings = new DecongestionConfigGroup(); + decongestionSettings.setWriteOutputIteration(1); + decongestionSettings.setKp(0.0123); + decongestionSettings.setKd(0.0); + decongestionSettings.setKi(0.0); + decongestionSettings.setMsa(false); + decongestionSettings.setTollBlendFactor(1.0); + decongestionSettings.setFractionOfIterationsToEndPriceAdjustment(1.0); + decongestionSettings.setFractionOfIterationsToStartPriceAdjustment(0.0); + config.addModule(decongestionSettings); + + final Scenario scenario = ScenarioUtils.loadScenario(config); + Controler controler = new Controler(scenario); + + DecongestionInfo info = new DecongestionInfo(); + + // congestion toll computation + controler.addOverridingModule(new AbstractModule() { + @Override + public void install() { + + this.bind(DecongestionInfo.class).toInstance(info); + + this.bind(DecongestionTollSetting.class).to(DecongestionTollingPID.class); + this.bind(IntervalBasedTolling.class).to(IntervalBasedTollingAll.class); + + this.bind(IntervalBasedTollingAll.class).asEagerSingleton(); + this.bind(DelayAnalysis.class).asEagerSingleton(); + this.bind(PersonVehicleTracker.class).asEagerSingleton(); + + this.addEventHandlerBinding().to(IntervalBasedTollingAll.class); + this.addEventHandlerBinding().to(DelayAnalysis.class); + this.addEventHandlerBinding().to(PersonVehicleTracker.class); + + this.addControlerListenerBinding().to(DecongestionControlerListener.class); + + } + }); + + // toll-adjusted routing + + final TollTimeDistanceTravelDisutilityFactory travelDisutilityFactory = new TollTimeDistanceTravelDisutilityFactory(); + + controler.addOverridingModule(new AbstractModule(){ + @Override + public void install() { + this.bindCarTravelDisutilityFactory().toInstance( travelDisutilityFactory ); + } + }); + + controler.getConfig().controler().setOverwriteFileSetting(OutputDirectoryHierarchy.OverwriteFileSetting.deleteDirectoryIfExists); + controler.run(); + + double tt0 = controler.getLinkTravelTimes().getLinkTravelTime(scenario.getNetwork().getLinks().get(Id.createLinkId("link12")), 6 * 3600 + 50. * 60, null, null); + double tt1 = controler.getLinkTravelTimes().getLinkTravelTime(scenario.getNetwork().getLinks().get(Id.createLinkId("link12")), 7 * 3600 + 63, null, null); + double tt2 = controler.getLinkTravelTimes().getLinkTravelTime(scenario.getNetwork().getLinks().get(Id.createLinkId("link12")), 7 * 3600 + 15. * 60, null, null); + + Assert.assertEquals("Wrong travel time. The run output seems to have changed.", 100.0, tt0, MatsimTestUtils.EPSILON); + Assert.assertEquals("Wrong travel time. The run output seems to have changed.", 150.5, tt1, MatsimTestUtils.EPSILON); + Assert.assertEquals("Wrong travel time. The run output seems to have changed.", 100.0, tt2, MatsimTestUtils.EPSILON); + + final int index = config.controler().getLastIteration() - config.controler().getFirstIteration(); + double avgScore = controler.getScoreStats().getScoreHistory().get( ScoreItem.executed ).get(index); + Assert.assertEquals("Wrong average executed score. The tolls seem to have changed.", -33.940316666666666, avgScore, MatsimTestUtils.EPSILON); + + System.out.println(info.getlinkInfos().get(Id.createLinkId("link12")).getTime2toll().toString()); + System.out.println(info.getlinkInfos().get(Id.createLinkId("link12")).getTime2avgDelay().toString()); + + Assert.assertEquals("Wrong average delay (capacity is set in a way that one of the two agents has to wait 101 sec. Thus the average is 50.5", 50.5, info.getlinkInfos().get(Id.createLinkId("link12")).getTime2avgDelay().get(84), MatsimTestUtils.EPSILON); + Assert.assertEquals("Wrong toll.", 50.5 * 0.0123, info.getlinkInfos().get(Id.createLinkId("link12")).getTime2toll().get(84), MatsimTestUtils.EPSILON); + + } + + /** + * Kp = 0.0123, other syntax + * + */ + @Test + public final void test0amodified() { + + System.out.println(testUtils.getPackageInputDirectory()); + + final String configFile = testUtils.getPackageInputDirectory() + "/config0.xml"; + + Config config = ConfigUtils.loadConfig(configFile); + + String outputDirectory = testUtils.getOutputDirectory() + "/"; + config.controler().setOutputDirectory(outputDirectory); + + final DecongestionConfigGroup decongestionSettings = new DecongestionConfigGroup(); + decongestionSettings.setWriteOutputIteration(1); + decongestionSettings.setKp(0.0123); + decongestionSettings.setKd(0.0); + decongestionSettings.setKi(0.0); + decongestionSettings.setMsa(false); + decongestionSettings.setTollBlendFactor(1.0); + decongestionSettings.setFractionOfIterationsToEndPriceAdjustment(1.0); + decongestionSettings.setFractionOfIterationsToStartPriceAdjustment(0.0); + config.addModule(decongestionSettings); + + final Scenario scenario = ScenarioUtils.loadScenario(config); + Controler controler = new Controler(scenario); + + // congestion toll computation + controler.addOverridingModule(new DecongestionModule(scenario)); + + // toll-adjusted routing + + final TollTimeDistanceTravelDisutilityFactory travelDisutilityFactory = new TollTimeDistanceTravelDisutilityFactory(); + + controler.addOverridingModule(new AbstractModule(){ + @Override + public void install() { + this.bindCarTravelDisutilityFactory().toInstance( travelDisutilityFactory ); + } + }); + + controler.getConfig().controler().setOverwriteFileSetting(OutputDirectoryHierarchy.OverwriteFileSetting.deleteDirectoryIfExists); + controler.run(); + + double tt0 = controler.getLinkTravelTimes().getLinkTravelTime(scenario.getNetwork().getLinks().get(Id.createLinkId("link12")), 6 * 3600 + 50. * 60, null, null); + double tt1 = controler.getLinkTravelTimes().getLinkTravelTime(scenario.getNetwork().getLinks().get(Id.createLinkId("link12")), 7 * 3600 + 63, null, null); + double tt2 = controler.getLinkTravelTimes().getLinkTravelTime(scenario.getNetwork().getLinks().get(Id.createLinkId("link12")), 7 * 3600 + 15. * 60, null, null); + + Assert.assertEquals("Wrong travel time. The run output seems to have changed.", 100.0, tt0, MatsimTestUtils.EPSILON); + Assert.assertEquals("Wrong travel time. The run output seems to have changed.", 150.5, tt1, MatsimTestUtils.EPSILON); + Assert.assertEquals("Wrong travel time. The run output seems to have changed.", 100.0, tt2, MatsimTestUtils.EPSILON); + + final int index = config.controler().getLastIteration() - config.controler().getFirstIteration(); + double avgScore = controler.getScoreStats().getScoreHistory().get( ScoreItem.executed ).get(index); + Assert.assertEquals("Wrong average executed score. The tolls seem to have changed.", -33.940316666666666, avgScore, MatsimTestUtils.EPSILON); + } + + /** + * Kp = 2 + * + */ + @Test + public final void test0b() { + + System.out.println(testUtils.getPackageInputDirectory()); + + final String configFile = testUtils.getPackageInputDirectory() + "/config0.xml"; + + Config config = ConfigUtils.loadConfig(configFile); + + String outputDirectory = testUtils.getOutputDirectory() + "/"; + config.controler().setOutputDirectory(outputDirectory); + + final DecongestionConfigGroup decongestionSettings = new DecongestionConfigGroup(); + decongestionSettings.setWriteOutputIteration(1); + decongestionSettings.setKp(2.0); + decongestionSettings.setKd(0.0); + decongestionSettings.setKi(0.0); + decongestionSettings.setMsa(false); + decongestionSettings.setTollBlendFactor(1.0); + decongestionSettings.setFractionOfIterationsToEndPriceAdjustment(1.0); + decongestionSettings.setFractionOfIterationsToStartPriceAdjustment(0.0); + config.addModule(decongestionSettings); + + final Scenario scenario = ScenarioUtils.loadScenario(config); + Controler controler = new Controler(scenario); + + DecongestionInfo info = new DecongestionInfo(); + + // congestion toll computation + controler.addOverridingModule(new AbstractModule() { + @Override + public void install() { + + this.bind(DecongestionInfo.class).toInstance(info); + + this.bind(DecongestionTollSetting.class).to(DecongestionTollingPID.class); + this.bind(IntervalBasedTolling.class).to(IntervalBasedTollingAll.class); + + this.bind(IntervalBasedTollingAll.class).asEagerSingleton(); + this.bind(DelayAnalysis.class).asEagerSingleton(); + this.bind(PersonVehicleTracker.class).asEagerSingleton(); + + this.addEventHandlerBinding().to(IntervalBasedTollingAll.class); + this.addEventHandlerBinding().to(DelayAnalysis.class); + this.addEventHandlerBinding().to(PersonVehicleTracker.class); + + this.addControlerListenerBinding().to(DecongestionControlerListener.class); + + } + }); + + // toll-adjusted routing + + final TollTimeDistanceTravelDisutilityFactory travelDisutilityFactory = new TollTimeDistanceTravelDisutilityFactory(); + + controler.addOverridingModule(new AbstractModule(){ + @Override + public void install() { + this.bindCarTravelDisutilityFactory().toInstance( travelDisutilityFactory ); + } + }); + + controler.getConfig().controler().setOverwriteFileSetting(OutputDirectoryHierarchy.OverwriteFileSetting.deleteDirectoryIfExists); + controler.run(); + + double tt0 = controler.getLinkTravelTimes().getLinkTravelTime(scenario.getNetwork().getLinks().get(Id.createLinkId("link12")), 6 * 3600 + 50. * 60, null, null); + double tt1 = controler.getLinkTravelTimes().getLinkTravelTime(scenario.getNetwork().getLinks().get(Id.createLinkId("link12")), 7 * 3600 + 63, null, null); + double tt2 = controler.getLinkTravelTimes().getLinkTravelTime(scenario.getNetwork().getLinks().get(Id.createLinkId("link12")), 7 * 3600 + 15. * 60, null, null); + + Assert.assertEquals("Wrong travel time. The run output seems to have changed.", 100.0, tt0, MatsimTestUtils.EPSILON); + Assert.assertEquals("Wrong travel time. The run output seems to have changed.", 150.5, tt1, MatsimTestUtils.EPSILON); + Assert.assertEquals("Wrong travel time. The run output seems to have changed.", 100.0, tt2, MatsimTestUtils.EPSILON); + + final int index = config.controler().getLastIteration() - config.controler().getFirstIteration(); + double avgScore = controler.getScoreStats().getScoreHistory().get( ScoreItem.executed ).get(index); + Assert.assertEquals("Wrong average executed score. The tolls seem to have changed.", -134.31916666666666, avgScore, MatsimTestUtils.EPSILON); + + System.out.println(info.getlinkInfos().get(Id.createLinkId("link12")).getTime2toll().toString()); + System.out.println(info.getlinkInfos().get(Id.createLinkId("link12")).getTime2avgDelay().toString()); + + Assert.assertEquals("Wrong average delay (capacity is set in a way that one of the two agents has to wait 101 sec. Thus the average is 50.5", 50.5, info.getlinkInfos().get(Id.createLinkId("link12")).getTime2avgDelay().get(84), MatsimTestUtils.EPSILON); + Assert.assertEquals("Wrong toll.", 50.5 * 2, info.getlinkInfos().get(Id.createLinkId("link12")).getTime2toll().get(84), MatsimTestUtils.EPSILON); + } + + /** + * Kp = 2 + * + */ + @Test + public final void test0bmodified() { + + System.out.println(testUtils.getPackageInputDirectory()); + + final String configFile = testUtils.getPackageInputDirectory() + "/config0.xml"; + + Config config = ConfigUtils.loadConfig(configFile); + + String outputDirectory = testUtils.getOutputDirectory() + "/"; + config.controler().setOutputDirectory(outputDirectory); + + final DecongestionConfigGroup decongestionSettings = new DecongestionConfigGroup(); + decongestionSettings.setWriteOutputIteration(1); + decongestionSettings.setKp(2.0); + decongestionSettings.setKd(0.0); + decongestionSettings.setKi(0.0); + decongestionSettings.setMsa(false); + decongestionSettings.setTollBlendFactor(1.0); + decongestionSettings.setFractionOfIterationsToEndPriceAdjustment(1.0); + decongestionSettings.setFractionOfIterationsToStartPriceAdjustment(0.0); + config.addModule(decongestionSettings); + + final Scenario scenario = ScenarioUtils.loadScenario(config); + Controler controler = new Controler(scenario); + + // congestion toll computation + controler.addOverridingModule(new DecongestionModule(scenario)); + + // toll-adjusted routing + + final TollTimeDistanceTravelDisutilityFactory travelDisutilityFactory = new TollTimeDistanceTravelDisutilityFactory(); + + controler.addOverridingModule(new AbstractModule(){ + @Override + public void install() { + this.bindCarTravelDisutilityFactory().toInstance( travelDisutilityFactory ); + } + }); + + controler.getConfig().controler().setOverwriteFileSetting(OutputDirectoryHierarchy.OverwriteFileSetting.deleteDirectoryIfExists); + controler.run(); + + double tt0 = controler.getLinkTravelTimes().getLinkTravelTime(scenario.getNetwork().getLinks().get(Id.createLinkId("link12")), 6 * 3600 + 50. * 60, null, null); + double tt1 = controler.getLinkTravelTimes().getLinkTravelTime(scenario.getNetwork().getLinks().get(Id.createLinkId("link12")), 7 * 3600 + 63, null, null); + double tt2 = controler.getLinkTravelTimes().getLinkTravelTime(scenario.getNetwork().getLinks().get(Id.createLinkId("link12")), 7 * 3600 + 15. * 60, null, null); + + Assert.assertEquals("Wrong travel time. The run output seems to have changed.", 100.0, tt0, MatsimTestUtils.EPSILON); + Assert.assertEquals("Wrong travel time. The run output seems to have changed.", 150.5, tt1, MatsimTestUtils.EPSILON); + Assert.assertEquals("Wrong travel time. The run output seems to have changed.", 100.0, tt2, MatsimTestUtils.EPSILON); + + final int index = config.controler().getLastIteration() - config.controler().getFirstIteration(); + double avgScore = controler.getScoreStats().getScoreHistory().get( ScoreItem.executed ).get(index); + Assert.assertEquals("Wrong average executed score. The tolls seem to have changed.", -134.31916666666666, avgScore, MatsimTestUtils.EPSILON); + } + + /** + * Kp = 0 / no tolling + * + */ + @Test + public final void test0c() { + + System.out.println(testUtils.getPackageInputDirectory()); + + final String configFile = testUtils.getPackageInputDirectory() + "/config0.xml"; + + Config config = ConfigUtils.loadConfig(configFile); + + String outputDirectory = testUtils.getOutputDirectory() + "/"; + config.controler().setOutputDirectory(outputDirectory); + + final DecongestionConfigGroup decongestionSettings = new DecongestionConfigGroup(); + decongestionSettings.setWriteOutputIteration(1); + decongestionSettings.setKp(0.0); + decongestionSettings.setKd(0.0); + decongestionSettings.setKi(0.0); + decongestionSettings.setMsa(false); + decongestionSettings.setTollBlendFactor(1.0); + decongestionSettings.setFractionOfIterationsToEndPriceAdjustment(1.0); + decongestionSettings.setFractionOfIterationsToStartPriceAdjustment(0.0); + config.addModule(decongestionSettings); + + final Scenario scenario = ScenarioUtils.loadScenario(config); + Controler controler = new Controler(scenario); + + DecongestionInfo info = new DecongestionInfo(); + + // congestion toll computation + controler.addOverridingModule(new AbstractModule() { + @Override + public void install() { + + this.bind(DecongestionInfo.class).toInstance(info); + + this.bind(DelayAnalysis.class).asEagerSingleton(); + this.addEventHandlerBinding().to(DelayAnalysis.class); + + this.addControlerListenerBinding().to(DecongestionControlerListener.class); + + } + }); + + // toll-adjusted routing + + final TollTimeDistanceTravelDisutilityFactory travelDisutilityFactory = new TollTimeDistanceTravelDisutilityFactory(); + + controler.addOverridingModule(new AbstractModule(){ + @Override + public void install() { + this.bindCarTravelDisutilityFactory().toInstance( travelDisutilityFactory ); + } + }); + + controler.getConfig().controler().setOverwriteFileSetting(OutputDirectoryHierarchy.OverwriteFileSetting.deleteDirectoryIfExists); + controler.run(); + + double tt0 = controler.getLinkTravelTimes().getLinkTravelTime(scenario.getNetwork().getLinks().get(Id.createLinkId("link12")), 6 * 3600 + 50. * 60, null, null); + double tt1 = controler.getLinkTravelTimes().getLinkTravelTime(scenario.getNetwork().getLinks().get(Id.createLinkId("link12")), 7 * 3600 + 63, null, null); + double tt2 = controler.getLinkTravelTimes().getLinkTravelTime(scenario.getNetwork().getLinks().get(Id.createLinkId("link12")), 7 * 3600 + 15. * 60, null, null); + + Assert.assertEquals("Wrong travel time. The run output seems to have changed.", 100.0, tt0, MatsimTestUtils.EPSILON); + Assert.assertEquals("Wrong travel time. The run output seems to have changed.", 150.5, tt1, MatsimTestUtils.EPSILON); + Assert.assertEquals("Wrong travel time. The run output seems to have changed.", 100.0, tt2, MatsimTestUtils.EPSILON); + + final int index = config.controler().getLastIteration() - config.controler().getFirstIteration(); + double avgScore = controler.getScoreStats().getScoreHistory().get( ScoreItem.executed ).get(index); + Assert.assertEquals("Wrong average executed score. The tolls seem to have changed.", -33.31916666666666, avgScore, MatsimTestUtils.EPSILON); + + System.out.println(info.getlinkInfos().get(Id.createLinkId("link12")).getTime2toll().toString()); + System.out.println(info.getlinkInfos().get(Id.createLinkId("link12")).getTime2avgDelay().toString()); + + Assert.assertEquals("Wrong average delay (capacity is set in a way that one of the two agents has to wait 101 sec. Thus the average is 50.5", 50.5, info.getlinkInfos().get(Id.createLinkId("link12")).getTime2avgDelay().get(84), MatsimTestUtils.EPSILON); + Assert.assertNull("Wrong toll.", info.getlinkInfos().get(Id.createLinkId("link12")).getTime2toll().get(84)); + + } + + /** + * Tests the PID controller + * + */ + @Test + public final void test1() { + + System.out.println(testUtils.getPackageInputDirectory()); + + final String configFile = testUtils.getPackageInputDirectory() + "/config.xml"; + Config config = ConfigUtils.loadConfig(configFile); + + String outputDirectory = testUtils.getOutputDirectory() + "/"; + config.controler().setOutputDirectory(outputDirectory); + + final DecongestionConfigGroup decongestionSettings = new DecongestionConfigGroup(); + decongestionSettings.setWriteOutputIteration(1); + decongestionSettings.setFractionOfIterationsToEndPriceAdjustment(1.0); + decongestionSettings.setFractionOfIterationsToStartPriceAdjustment(0.0); + decongestionSettings.setDecongestionApproach(DecongestionApproach.PID); + config.addModule(decongestionSettings); + + final Scenario scenario = ScenarioUtils.loadScenario(config); + Controler controler = new Controler(scenario); + + DecongestionInfo info = new DecongestionInfo(); + + // decongestion pricing + controler.addOverridingModule(new AbstractModule() { + @Override + public void install() { + + this.bind(DecongestionInfo.class).toInstance(info); + + this.bind(DecongestionTollSetting.class).to(DecongestionTollingPID.class); + this.bind(IntervalBasedTolling.class).to(IntervalBasedTollingAll.class); + + this.bind(IntervalBasedTollingAll.class).asEagerSingleton(); + this.bind(DelayAnalysis.class).asEagerSingleton(); + this.bind(PersonVehicleTracker.class).asEagerSingleton(); + + this.addEventHandlerBinding().to(IntervalBasedTollingAll.class); + this.addEventHandlerBinding().to(DelayAnalysis.class); + this.addEventHandlerBinding().to(PersonVehicleTracker.class); + + this.addControlerListenerBinding().to(DecongestionControlerListener.class); + } + }); + + controler.getConfig().controler().setOverwriteFileSetting(OutputDirectoryHierarchy.OverwriteFileSetting.deleteDirectoryIfExists); + controler.run(); + + final int index = config.controler().getLastIteration() - config.controler().getFirstIteration(); + double avgScore = controler.getScoreStats().getScoreHistory().get( ScoreItem.executed ).get(index) ; + Assert.assertEquals("Wrong average executed score. The run output seems to have changed.", -12036.177448472225, avgScore, MatsimTestUtils.EPSILON); + + System.out.println(info.getlinkInfos().get(Id.createLinkId("link12")).getTime2toll().toString()); + Assert.assertEquals("Wrong toll in time bin 61.", 9.197000000000003, info.getlinkInfos().get(Id.createLinkId("link12")).getTime2toll().get(61), MatsimTestUtils.EPSILON); + Assert.assertEquals("Wrong toll in time bin 73.", 12.963999999999984, info.getlinkInfos().get(Id.createLinkId("link12")).getTime2toll().get(73), MatsimTestUtils.EPSILON); + } + + /** + * Tests the BangBang controller + * + */ + @Test + public final void test2() { + + System.out.println(testUtils.getPackageInputDirectory()); + + final String configFile = testUtils.getPackageInputDirectory() + "/config.xml"; + Config config = ConfigUtils.loadConfig(configFile); + + String outputDirectory = testUtils.getOutputDirectory() + "/"; + config.controler().setOutputDirectory(outputDirectory); + + final DecongestionConfigGroup decongestionSettings = new DecongestionConfigGroup(); + decongestionSettings.setWriteOutputIteration(1); + decongestionSettings.setFractionOfIterationsToEndPriceAdjustment(1.0); + decongestionSettings.setFractionOfIterationsToStartPriceAdjustment(0.0); + config.addModule(decongestionSettings); + + DecongestionInfo info = new DecongestionInfo(); + + final Scenario scenario = ScenarioUtils.loadScenario(config); + Controler controler = new Controler(scenario); + + // decongestion pricing + controler.addOverridingModule(new AbstractModule() { + @Override + public void install() { + + this.bind(DecongestionInfo.class).toInstance(info); + + this.bind(DecongestionTollSetting.class).to(DecongestionTollingBangBang.class); + this.bind(IntervalBasedTolling.class).to(IntervalBasedTollingAll.class); + + this.bind(IntervalBasedTollingAll.class).asEagerSingleton(); + this.bind(DelayAnalysis.class).asEagerSingleton(); + this.bind(PersonVehicleTracker.class).asEagerSingleton(); + + this.addEventHandlerBinding().to(IntervalBasedTollingAll.class); + this.addEventHandlerBinding().to(DelayAnalysis.class); + this.addEventHandlerBinding().to(PersonVehicleTracker.class); + + this.addControlerListenerBinding().to(DecongestionControlerListener.class); + + } + }); + + controler.getConfig().controler().setOverwriteFileSetting(OutputDirectoryHierarchy.OverwriteFileSetting.deleteDirectoryIfExists); + controler.run(); + + final int index = config.controler().getLastIteration() - config.controler().getFirstIteration(); + double avgScore = controler.getScoreStats().getScoreHistory().get( ScoreItem.executed ).get( index ) ; + Assert.assertEquals("Wrong average executed score. The run output seems to have changed.", -55.215645833333184, avgScore, MatsimTestUtils.EPSILON); + + System.out.println(info.getlinkInfos().get(Id.createLinkId("link12")).getTime2toll().toString()); + Assert.assertEquals("Wrong toll in time bin 61.", 13., info.getlinkInfos().get(Id.createLinkId("link12")).getTime2toll().get(61), MatsimTestUtils.EPSILON); + Assert.assertEquals("Wrong toll in time bin 73.", 13., info.getlinkInfos().get(Id.createLinkId("link12")).getTime2toll().get(73), MatsimTestUtils.EPSILON); + } + +} diff --git a/contribs/pseudosimulation/src/test/java/org/matsim/contrib/pseudosimulation/RunPSimTest.java b/contribs/pseudosimulation/src/test/java/org/matsim/contrib/pseudosimulation/RunPSimTest.java index 994a35e162e..0c5aa25e635 100644 --- a/contribs/pseudosimulation/src/test/java/org/matsim/contrib/pseudosimulation/RunPSimTest.java +++ b/contribs/pseudosimulation/src/test/java/org/matsim/contrib/pseudosimulation/RunPSimTest.java @@ -38,7 +38,7 @@ public class RunPSimTest { @Rule public MatsimTestUtils utils = new MatsimTestUtils(); - private Logger logger = LogManager.getLogger(RunPSimTest.class ); + private final Logger logger = LogManager.getLogger(RunPSimTest.class ); private final Config config = ConfigUtils.loadConfig(IOUtils.extendUrl(ExamplesUtils.getTestScenarioURL("pt-tutorial" ),"0.config.xml" ) ); @@ -109,7 +109,7 @@ public void install() { Population popActual = PopulationUtils.createPopulation( config ); PopulationUtils.readPopulation( popActual, outDir + "/output_plans.xml.gz" ); new PopulationComparison().compare( popExpected, popActual ) ; - Assert.assertEquals("RunPsim score changed.", 138.90474624352407, psimScore, MatsimTestUtils.EPSILON); + Assert.assertEquals("RunPsim score changed.", 138.87261194067847, psimScore, MatsimTestUtils.EPSILON); // Assert.assertEquals("RunPsim score changed.", 134.54001491094124d, psimScore, MatsimTestUtils.EPSILON); // Assert.assertEquals("RunPsim score changed.", 134.52369453719413d, psimScore, MatsimTestUtils.EPSILON); // Assert.assertEquals("RunPsim score changed.", 132.73129073101293d, psimScore, MatsimTestUtils.EPSILON); @@ -137,8 +137,7 @@ public void testB() { double qsimScore = execScoreTracker.executedScore; logger.info("Default controler score was " + qsimScore ); -// Assert.assertEquals("Default controler score changed.", 131.84309487251033d, qsimScore, MatsimTestUtils.EPSILON); - Assert.assertEquals("Default controler score changed.", 131.84350487113088d, qsimScore, MatsimTestUtils.EPSILON); + Assert.assertEquals("Default controler score changed.", 131.8543796128589, qsimScore, MatsimTestUtils.EPSILON); } class ExecScoreTracker implements ShutdownListener { diff --git a/contribs/shared_mobility/src/test/java/org/matsim/contrib/shared_mobility/RunIT.java b/contribs/shared_mobility/src/test/java/org/matsim/contrib/shared_mobility/RunIT.java index a7279182dc9..0b22fd3e5ee 100644 --- a/contribs/shared_mobility/src/test/java/org/matsim/contrib/shared_mobility/RunIT.java +++ b/contribs/shared_mobility/src/test/java/org/matsim/contrib/shared_mobility/RunIT.java @@ -157,18 +157,18 @@ public final void test() throws UncheckedIOException, ConfigurationException, UR OutputData data = countLegs(controller.getControlerIO().getOutputPath() + "/output_events.xml.gz"); - Assert.assertEquals(82689, (long) data.counts.get("car")); - Assert.assertEquals(29890, (long) data.counts.get("walk")); - Assert.assertEquals(30, (long) data.counts.get("bike")); - Assert.assertEquals(19115, (long) data.counts.get("pt")); + Assert.assertEquals(82629, (long) data.counts.get("car")); + Assert.assertEquals(29739, (long) data.counts.get("walk")); + Assert.assertEquals(31, (long) data.counts.get("bike")); + Assert.assertEquals(19029, (long) data.counts.get("pt")); Assert.assertEquals(21, (long) data.pickupCounts.get("wheels")); Assert.assertEquals(2, (long) data.pickupCounts.get("mobility")); - Assert.assertEquals(9, (long) data.pickupCounts.get("velib")); + Assert.assertEquals(10, (long) data.pickupCounts.get("velib")); Assert.assertEquals(21, (long) data.dropoffCounts.get("wheels")); Assert.assertEquals(0, (long) data.dropoffCounts.getOrDefault("mobility", 0L)); - Assert.assertEquals(9, (long) data.dropoffCounts.get("velib")); + Assert.assertEquals(10, (long) data.dropoffCounts.get("velib")); Assert.assertEquals(0, (long) data.failedPickupCounts.getOrDefault("wheels",0L)); Assert.assertEquals(0, (long) data.failedPickupCounts.getOrDefault("mobility",0L)); From 62f50d80dab02b260c36bbe84071a863b77fa375 Mon Sep 17 00:00:00 2001 From: Andreas Neumann Date: Thu, 21 Sep 2023 16:25:27 +0200 Subject: [PATCH 08/33] added plan inheritance stats --- .../dvrp/vrpagent/VrpAgentQueryHelper.java | 30 +++++ .../distributed/plans/PlanGenome.java | 18 +++ .../population/PlanWithCachedJointPlan.java | 18 +++ .../matsim/api/core/v01/population/Plan.java | 12 ++ .../controler/ControlerDefaultsModule.java | 2 + .../org/matsim/core/population/PlanImpl.java | 31 +++++ .../core/population/PopulationUtils.java | 30 +++++ .../replanning/GenericPlanStrategyImpl.java | 7 ++ .../inheritance/PlanInheritanceModule.java | 115 ++++++++++++++++++ .../inheritance/PlanInheritanceRecord.java | 21 ++++ .../PlanInheritanceRecordWriter.java | 74 +++++++++++ 11 files changed, 358 insertions(+) create mode 100644 matsim/src/main/java/org/matsim/core/replanning/inheritance/PlanInheritanceModule.java create mode 100644 matsim/src/main/java/org/matsim/core/replanning/inheritance/PlanInheritanceRecord.java create mode 100644 matsim/src/main/java/org/matsim/core/replanning/inheritance/PlanInheritanceRecordWriter.java diff --git a/contribs/dvrp/src/main/java/org/matsim/contrib/dvrp/vrpagent/VrpAgentQueryHelper.java b/contribs/dvrp/src/main/java/org/matsim/contrib/dvrp/vrpagent/VrpAgentQueryHelper.java index abdcc4521b3..64e15ad5036 100644 --- a/contribs/dvrp/src/main/java/org/matsim/contrib/dvrp/vrpagent/VrpAgentQueryHelper.java +++ b/contribs/dvrp/src/main/java/org/matsim/contrib/dvrp/vrpagent/VrpAgentQueryHelper.java @@ -158,6 +158,36 @@ public String getType() { public void setType(String type) { throw new UnsupportedOperationException(); } + + @Override + public int getIterationCreated() { + throw new UnsupportedOperationException(); + } + + @Override + public void setIterationCreated(int iteration) { + throw new UnsupportedOperationException(); + } + + @Override + public String getPlanId() { + throw new UnsupportedOperationException(); + } + + @Override + public void setPlanId(String planId) { + throw new UnsupportedOperationException(); + } + + @Override + public String getPlanMutator() { + throw new UnsupportedOperationException(); + } + + @Override + public void setPlanMutator(String planMutator) { + throw new UnsupportedOperationException(); + } @Override public void setScore(Double score) { diff --git a/contribs/pseudosimulation/src/main/java/org/matsim/contrib/pseudosimulation/distributed/plans/PlanGenome.java b/contribs/pseudosimulation/src/main/java/org/matsim/contrib/pseudosimulation/distributed/plans/PlanGenome.java index 12cd0a7023f..63f9bf8d8d9 100644 --- a/contribs/pseudosimulation/src/main/java/org/matsim/contrib/pseudosimulation/distributed/plans/PlanGenome.java +++ b/contribs/pseudosimulation/src/main/java/org/matsim/contrib/pseudosimulation/distributed/plans/PlanGenome.java @@ -219,6 +219,24 @@ public String getType() { public void setType(final String type) { this.type = type; } + + @Override + public String getPlanId() { return null; } + + @Override + public void setPlanId(String planId) { /* nothing to do here */ } + + @Override + public int getIterationCreated() { return -1; } + + @Override + public void setIterationCreated(int iteration) { /* nothing to do here */ } + + @Override + public String getPlanMutator() { return null; } + + @Override + public void setPlanMutator(String planMutator) { /* nothing to do here */ } @Override public final List getPlanElements() { diff --git a/contribs/socnetsim/src/main/java/org/matsim/contrib/socnetsim/framework/population/PlanWithCachedJointPlan.java b/contribs/socnetsim/src/main/java/org/matsim/contrib/socnetsim/framework/population/PlanWithCachedJointPlan.java index c1def957531..00e96f82d89 100644 --- a/contribs/socnetsim/src/main/java/org/matsim/contrib/socnetsim/framework/population/PlanWithCachedJointPlan.java +++ b/contribs/socnetsim/src/main/java/org/matsim/contrib/socnetsim/framework/population/PlanWithCachedJointPlan.java @@ -172,6 +172,24 @@ public String getType() { public void setType(String type) { this.delegate.setType(type); } + + @Override + public String getPlanId() { return null; } + + @Override + public void setPlanId(String planId) { /* nothing to do here */ } + + @Override + public int getIterationCreated() { return -1; } + + @Override + public void setIterationCreated(int iteration) { /* nothing to do here */ } + + @Override + public String getPlanMutator() { return null; } + + @Override + public void setPlanMutator(String planMutator) { /* nothing to do here */ } @Override public Person getPerson() { diff --git a/matsim/src/main/java/org/matsim/api/core/v01/population/Plan.java b/matsim/src/main/java/org/matsim/api/core/v01/population/Plan.java index e06412da59e..556f1e80d8a 100644 --- a/matsim/src/main/java/org/matsim/api/core/v01/population/Plan.java +++ b/matsim/src/main/java/org/matsim/api/core/v01/population/Plan.java @@ -49,6 +49,18 @@ public interface Plan extends MatsimPopulationObject, Customizable, BasicPlan, A public abstract String getType(); public abstract void setType(final String type); + + public abstract void setPlanId(final String planId); + + public abstract String getPlanId(); + + public abstract int getIterationCreated(); + + public abstract void setIterationCreated(int iteration); + + public abstract String getPlanMutator(); + + public abstract void setPlanMutator(String planMutator); public abstract Person getPerson(); diff --git a/matsim/src/main/java/org/matsim/core/controler/ControlerDefaultsModule.java b/matsim/src/main/java/org/matsim/core/controler/ControlerDefaultsModule.java index bd64b584d38..fc5c43da358 100755 --- a/matsim/src/main/java/org/matsim/core/controler/ControlerDefaultsModule.java +++ b/matsim/src/main/java/org/matsim/core/controler/ControlerDefaultsModule.java @@ -37,6 +37,7 @@ import org.matsim.core.population.VspPlansCleanerModule; import org.matsim.core.replanning.StrategyManagerModule; import org.matsim.core.replanning.annealing.ReplanningAnnealer; +import org.matsim.core.replanning.inheritance.PlanInheritanceModule; import org.matsim.core.router.TripRouterModule; import org.matsim.core.router.costcalculators.TravelDisutilityModule; import org.matsim.core.scoring.functions.CharyparNagelScoringFunctionModule; @@ -76,6 +77,7 @@ public void install() { install(new VspPlansCleanerModule()); install(new SnapshotWritersModule()); install(new DependencyGraphModule()); + install(new PlanInheritanceModule()); // Comment by Tarek Chouaki. // To make sure the cache files used under ChartUtils are located in tmp folder in the output directory diff --git a/matsim/src/main/java/org/matsim/core/population/PlanImpl.java b/matsim/src/main/java/org/matsim/core/population/PlanImpl.java index 9c8957cd480..08047673bfd 100644 --- a/matsim/src/main/java/org/matsim/core/population/PlanImpl.java +++ b/matsim/src/main/java/org/matsim/core/population/PlanImpl.java @@ -32,6 +32,7 @@ import org.matsim.api.core.v01.population.Person; import org.matsim.api.core.v01.population.Plan; import org.matsim.api.core.v01.population.PlanElement; +import org.matsim.core.replanning.inheritance.PlanInheritanceModule; import org.matsim.core.scenario.CustomizableUtils; import org.matsim.utils.objectattributes.attributable.Attributes; import org.matsim.utils.objectattributes.attributable.AttributesImpl; @@ -121,6 +122,36 @@ public String getType() { public void setType(final String type) { this.type = type; } + + @Override + public String getPlanId() { + return (String) this.getAttributes().getAttribute(PlanInheritanceModule.PLAN_ID); + } + + @Override + public void setPlanId(String planId) { + this.getAttributes().putAttribute(PlanInheritanceModule.PLAN_ID, planId); + } + + @Override + public int getIterationCreated() { + return (int) this.getAttributes().getAttribute(PlanInheritanceModule.ITERATION_CREATED); + } + + @Override + public void setIterationCreated(int iteration) { + this.getAttributes().putAttribute(PlanInheritanceModule.ITERATION_CREATED, iteration); + } + + @Override + public String getPlanMutator() { + return (String) this.getAttributes().getAttribute(PlanInheritanceModule.PLAN_MUTATOR); + } + + @Override + public void setPlanMutator(String planMutator) { + this.getAttributes().putAttribute(PlanInheritanceModule.PLAN_MUTATOR, planMutator); + } @Override public final List getPlanElements() { diff --git a/matsim/src/main/java/org/matsim/core/population/PopulationUtils.java b/matsim/src/main/java/org/matsim/core/population/PopulationUtils.java index 7f187b285a4..ed49e66ed22 100644 --- a/matsim/src/main/java/org/matsim/core/population/PopulationUtils.java +++ b/matsim/src/main/java/org/matsim/core/population/PopulationUtils.java @@ -381,6 +381,36 @@ public String getType() { public void setType(String type) { throw new UnsupportedOperationException(); } + + @Override + public String getPlanId() { + return this.delegate.getPlanId(); + } + + @Override + public void setPlanId(String planId) { + throw new UnsupportedOperationException(); + } + + @Override + public int getIterationCreated() { + return this.delegate.getIterationCreated(); + } + + @Override + public void setIterationCreated(int iteration) { + throw new UnsupportedOperationException(); + } + + @Override + public String getPlanMutator() { + return this.delegate.getPlanMutator(); + } + + @Override + public void setPlanMutator(String planMutator) { + throw new UnsupportedOperationException(); + } @Override public void addLeg(Leg leg) { diff --git a/matsim/src/main/java/org/matsim/core/replanning/GenericPlanStrategyImpl.java b/matsim/src/main/java/org/matsim/core/replanning/GenericPlanStrategyImpl.java index db83e5d4749..341e32d1ca6 100644 --- a/matsim/src/main/java/org/matsim/core/replanning/GenericPlanStrategyImpl.java +++ b/matsim/src/main/java/org/matsim/core/replanning/GenericPlanStrategyImpl.java @@ -22,6 +22,7 @@ import org.apache.logging.log4j.Logger; import org.matsim.api.core.v01.population.BasicPlan; import org.matsim.api.core.v01.population.HasPlansAndId; +import org.matsim.api.core.v01.population.Plan; import org.matsim.core.replanning.modules.GenericPlanStrategyModule; import org.matsim.core.replanning.selectors.PlanSelector; import org.matsim.core.replanning.selectors.RandomUnscoredPlanSelector; @@ -92,6 +93,12 @@ public void run(final HasPlansAndId person) { // set the working plan to a copy of the selected plan: plan = person.createCopyOfSelectedPlanAndMakeSelected(); + if (plan instanceof Plan) { + // add plan inheritance flags + ((Plan) plan).setIterationCreated(this.replanningContext.getIteration()); + ((Plan) plan).setPlanMutator(this.toString()); + } + // add new plan to container that contains the plans that are handled by this PlanStrategy: this.plans.add(plan); diff --git a/matsim/src/main/java/org/matsim/core/replanning/inheritance/PlanInheritanceModule.java b/matsim/src/main/java/org/matsim/core/replanning/inheritance/PlanInheritanceModule.java new file mode 100644 index 00000000000..3c22bed37e3 --- /dev/null +++ b/matsim/src/main/java/org/matsim/core/replanning/inheritance/PlanInheritanceModule.java @@ -0,0 +1,115 @@ +package org.matsim.core.replanning.inheritance; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +import org.matsim.api.core.v01.population.Person; +import org.matsim.api.core.v01.population.Plan; +import org.matsim.core.config.groups.ControlerConfigGroup.CompressionType; +import org.matsim.core.controler.AbstractModule; +import org.matsim.core.controler.events.BeforeMobsimEvent; +import org.matsim.core.controler.events.ShutdownEvent; +import org.matsim.core.controler.events.StartupEvent; +import org.matsim.core.controler.listener.BeforeMobsimListener; +import org.matsim.core.controler.listener.ShutdownListener; +import org.matsim.core.controler.listener.StartupListener; +import org.matsim.core.population.PersonUtils; + +import com.google.inject.Singleton; + +@Singleton +public class PlanInheritanceModule extends AbstractModule implements StartupListener, BeforeMobsimListener, ShutdownListener { + + + public static final String PLAN_ID = "planId"; + public static final String ITERATION_CREATED = "iterationCreated"; + public static final String PLAN_MUTATOR = "planMutator"; + + public static final String INITIAL_PLAN = "initialPlan"; + + public static final String FILENAME_PLAN_INHERITANCE_RECORDS = "planInheritanceRecords"; + + long numberOfPlanInheritanceRecordsCreated = 0; + Map planId2planInheritanceRecords = new ConcurrentHashMap<>(); + + PlanInheritanceRecordWriter planInheritanceRecordWriter; + + @Override + public void notifyStartup(StartupEvent event) { + CompressionType compressionType = event.getServices().getConfig().controler().getCompressionType(); + this.planInheritanceRecordWriter = new PlanInheritanceRecordWriter(event.getServices().getControlerIO().getOutputFilename(FILENAME_PLAN_INHERITANCE_RECORDS + ".csv", compressionType)); + } + + @Override + public void notifyBeforeMobsim(BeforeMobsimEvent event) { + + Set activePlanIds = new HashSet<>(); + + for (Person person : event.getServices().getScenario().getPopulation().getPersons().values()) { + for (Plan plan : person.getPlans()) { + + if (plan.getPlanMutator() == null) { + // initial plan - set initial plan defaults + plan.setPlanMutator(INITIAL_PLAN); + plan.setIterationCreated(event.getIteration()); + } + + if (plan.getIterationCreated() == event.getIteration()) { + // it's a new plan created in this iteration - create a new record + + PlanInheritanceRecord planInheritanceRecord = new PlanInheritanceRecord(); + planInheritanceRecord.agentId = person.getId().toString(); + planInheritanceRecord.planId = Long.toString(++this.numberOfPlanInheritanceRecordsCreated, 36); + planInheritanceRecord.ancestorId = plan.getPlanId(); + plan.setPlanId(planInheritanceRecord.planId); + planInheritanceRecord.iterationCreated = plan.getIterationCreated(); + planInheritanceRecord.mutatedBy = plan.getPlanMutator(); + + this.planId2planInheritanceRecords.put(planInheritanceRecord.planId, planInheritanceRecord); + } + + if (PersonUtils.isSelected(plan)) { + this.planId2planInheritanceRecords.get(plan.getPlanId()).iterationsSelected.add(event.getIteration()); + } + + activePlanIds.add(plan.getPlanId()); + } + } + + List deletedPlans = new ArrayList<>(); + for (String planId : this.planId2planInheritanceRecords.keySet()) { + if (!activePlanIds.contains(planId)) { + deletedPlans.add(planId); + } + } + + for (String deletedPlanId : deletedPlans) { + PlanInheritanceRecord deletedPlanInheritanceRecord = this.planId2planInheritanceRecords.remove(deletedPlanId); + deletedPlanInheritanceRecord.iterationRemoved = event.getIteration(); + this.planInheritanceRecordWriter.write(deletedPlanInheritanceRecord); + } + + this.planInheritanceRecordWriter.flush(); + } + + @Override + public void notifyShutdown(ShutdownEvent event) { + for (PlanInheritanceRecord planInheritanceRecord : this.planId2planInheritanceRecords.values()) { + this.planInheritanceRecordWriter.write(planInheritanceRecord); + } + + this.planInheritanceRecordWriter.flush(); + this.planInheritanceRecordWriter.close(); + + this.planId2planInheritanceRecords.clear(); + } + + @Override + public void install() { + addControlerListenerBinding().to(PlanInheritanceModule.class); + } +} diff --git a/matsim/src/main/java/org/matsim/core/replanning/inheritance/PlanInheritanceRecord.java b/matsim/src/main/java/org/matsim/core/replanning/inheritance/PlanInheritanceRecord.java new file mode 100644 index 00000000000..cd315d924a3 --- /dev/null +++ b/matsim/src/main/java/org/matsim/core/replanning/inheritance/PlanInheritanceRecord.java @@ -0,0 +1,21 @@ +package org.matsim.core.replanning.inheritance; + +import java.util.ArrayList; +import java.util.List; + +public class PlanInheritanceRecord { + + String agentId; + String planId; + String ancestorId; + String mutatedBy; + int iterationCreated; + int iterationRemoved; + + /** + * Collection of iterations this plan had been the selected plan. + * Initialize this with one since each plan is selected at least once. + */ + List iterationsSelected = new ArrayList<>(1); + +} diff --git a/matsim/src/main/java/org/matsim/core/replanning/inheritance/PlanInheritanceRecordWriter.java b/matsim/src/main/java/org/matsim/core/replanning/inheritance/PlanInheritanceRecordWriter.java new file mode 100644 index 00000000000..2d4acde2cc5 --- /dev/null +++ b/matsim/src/main/java/org/matsim/core/replanning/inheritance/PlanInheritanceRecordWriter.java @@ -0,0 +1,74 @@ +package org.matsim.core.replanning.inheritance; + +import java.io.BufferedWriter; +import java.io.IOException; + +import org.matsim.core.utils.io.IOUtils; + +public class PlanInheritanceRecordWriter { + + public final String AGENT_ID = "agentId"; + public final String PLAN_ID = "planId"; + public final String ANCESTOR_ID = "ancestorId"; + public final String MUTATED_BY = "mutatedBy"; + public final String ITERATION_CREATED = "iterationCreated"; + public final String ITERATION_REMOVED = "iterationRemoved"; + public final String ITERATIONS_SELECTED = "iterationsSelected"; + + private final Character DELIMITER = '\t'; + private final BufferedWriter writer; + + public PlanInheritanceRecordWriter(String filename) { + this.writer = IOUtils.getBufferedWriter(filename); + + StringBuffer header = new StringBuffer(); + header.append(AGENT_ID); header.append(DELIMITER); + header.append(PLAN_ID); header.append(DELIMITER); + header.append(ANCESTOR_ID); header.append(DELIMITER); + header.append(MUTATED_BY); header.append(DELIMITER); + header.append(ITERATION_CREATED); header.append(DELIMITER); + header.append(ITERATION_REMOVED); header.append(DELIMITER); + header.append(ITERATIONS_SELECTED); + + try { + this.writer.write(header.toString()); + this.writer.newLine(); + } catch (IOException e) { + throw new RuntimeException("Could not initialize the plan inheritance writer!", e); + } + } + + public void write(PlanInheritanceRecord planInheritanceRecord) { + StringBuffer line = new StringBuffer(); + line.append(planInheritanceRecord.agentId); line.append(DELIMITER); + line.append(planInheritanceRecord.planId); line.append(DELIMITER); + line.append(planInheritanceRecord.ancestorId); line.append(DELIMITER); + line.append(planInheritanceRecord.mutatedBy); line.append(DELIMITER); + line.append(planInheritanceRecord.iterationCreated); line.append(DELIMITER); + line.append(planInheritanceRecord.iterationRemoved); line.append(DELIMITER); + line.append(planInheritanceRecord.iterationsSelected); + + try { + this.writer.write(line.toString()); + this.writer.newLine(); + } catch (IOException e) { + throw new RuntimeException("Could not initialize the plan inheritance writer!", e); + } + } + + public void flush() { + try { + this.writer.flush(); + } catch (IOException e) { + throw new RuntimeException("Failed to flush plan inheritance writer!", e); + } + } + + public void close() { + try { + this.writer.close(); + } catch (IOException e) { + throw new RuntimeException("Failed to close plan inheritance writer!", e); + } + } +} From 5af1b11298dcc44baad764b21bafbf9c037bce7f Mon Sep 17 00:00:00 2001 From: Andreas Neumann Date: Fri, 22 Sep 2023 08:05:25 +0200 Subject: [PATCH 09/33] added strat distribution stats --- .../inheritance/PlanInheritanceModule.java | 111 +++++++++++++++++- 1 file changed, 110 insertions(+), 1 deletion(-) diff --git a/matsim/src/main/java/org/matsim/core/replanning/inheritance/PlanInheritanceModule.java b/matsim/src/main/java/org/matsim/core/replanning/inheritance/PlanInheritanceModule.java index 3c22bed37e3..55a34591e6b 100644 --- a/matsim/src/main/java/org/matsim/core/replanning/inheritance/PlanInheritanceModule.java +++ b/matsim/src/main/java/org/matsim/core/replanning/inheritance/PlanInheritanceModule.java @@ -1,15 +1,22 @@ package org.matsim.core.replanning.inheritance; +import java.io.BufferedWriter; +import java.io.IOException; import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicLong; import org.matsim.api.core.v01.population.Person; import org.matsim.api.core.v01.population.Plan; import org.matsim.core.config.groups.ControlerConfigGroup.CompressionType; +import org.matsim.core.config.groups.StrategyConfigGroup.StrategySettings; import org.matsim.core.controler.AbstractModule; import org.matsim.core.controler.events.BeforeMobsimEvent; import org.matsim.core.controler.events.ShutdownEvent; @@ -18,6 +25,9 @@ import org.matsim.core.controler.listener.ShutdownListener; import org.matsim.core.controler.listener.StartupListener; import org.matsim.core.population.PersonUtils; +import org.matsim.core.replanning.GenericPlanStrategy; +import org.matsim.core.replanning.StrategyManager; +import org.matsim.core.utils.io.IOUtils; import com.google.inject.Singleton; @@ -37,17 +47,76 @@ public class PlanInheritanceModule extends AbstractModule implements StartupList Map planId2planInheritanceRecords = new ConcurrentHashMap<>(); PlanInheritanceRecordWriter planInheritanceRecordWriter; + private ArrayList strategies; + + private final Character DELIMITER = '\t'; + private BufferedWriter selectedPlanStrategyShareWriter; + private BufferedWriter planStrategyShareWriter; @Override public void notifyStartup(StartupEvent event) { CompressionType compressionType = event.getServices().getConfig().controler().getCompressionType(); - this.planInheritanceRecordWriter = new PlanInheritanceRecordWriter(event.getServices().getControlerIO().getOutputFilename(FILENAME_PLAN_INHERITANCE_RECORDS + ".csv", compressionType)); + this.planInheritanceRecordWriter = new PlanInheritanceRecordWriter(event.getServices().getControlerIO().getOutputFilename(FILENAME_PLAN_INHERITANCE_RECORDS + ".csv", compressionType)); + this.strategies = this.getActiveStrategies(event.getServices().getConfig().strategy().getStrategySettings(), event.getServices().getStrategyManager()); + this.selectedPlanStrategyShareWriter = this.initializeDistributionWriter(this.strategies, event.getServices().getControlerIO().getOutputFilename(FILENAME_PLAN_INHERITANCE_RECORDS + "_shares_selected.csv")); + this.planStrategyShareWriter = this.initializeDistributionWriter(this.strategies, event.getServices().getControlerIO().getOutputFilename(FILENAME_PLAN_INHERITANCE_RECORDS + "_shares.csv")); + } + + /** + * Retrieve all active plan strategies with their correct name in alphabetical order + */ + private ArrayList getActiveStrategies(Collection strategySettings, StrategyManager strategyManager) { + Set activeSubpopulations = new HashSet<>(); + for (StrategySettings strategySetting : strategySettings) { + activeSubpopulations.add(strategySetting.getSubpopulation()); + } + + Set planStrategiesNames = new HashSet<>(); + for (String subpopulation : activeSubpopulations) { + for (GenericPlanStrategy planStrategy : strategyManager.getStrategies(subpopulation)) { + planStrategiesNames.add(planStrategy.toString()); + } + } + + ArrayList strategies = new ArrayList<>(planStrategiesNames.size() + 1); + strategies.addAll(planStrategiesNames); + Collections.sort(strategies); + strategies.add(0, INITIAL_PLAN); + + return strategies; + } + + /** + * Initialize the writer with the active strategies + */ + private BufferedWriter initializeDistributionWriter(ArrayList strategies, String filename) { + + BufferedWriter planStrategyShareWriter = IOUtils.getBufferedWriter(filename); + + StringBuffer header = new StringBuffer(); + header.append("iteration"); header.append(DELIMITER); + for (int i = 0; i < strategies.size(); i++) { + if (i > 0) { + header.append(DELIMITER); + } + header.append(strategies.get(i)); + } + + try { + planStrategyShareWriter.write(header.toString()); + planStrategyShareWriter.newLine(); + } catch (IOException e) { + throw new RuntimeException("Could not initialize the plan strategy share writer!", e); + } + + return planStrategyShareWriter; } @Override public void notifyBeforeMobsim(BeforeMobsimEvent event) { Set activePlanIds = new HashSet<>(); + Set selectedPlanIds = new HashSet<>(); for (Person person : event.getServices().getScenario().getPopulation().getPersons().values()) { for (Plan plan : person.getPlans()) { @@ -74,6 +143,7 @@ public void notifyBeforeMobsim(BeforeMobsimEvent event) { if (PersonUtils.isSelected(plan)) { this.planId2planInheritanceRecords.get(plan.getPlanId()).iterationsSelected.add(event.getIteration()); + selectedPlanIds.add(plan.getPlanId()); } activePlanIds.add(plan.getPlanId()); @@ -94,6 +164,36 @@ public void notifyBeforeMobsim(BeforeMobsimEvent event) { } this.planInheritanceRecordWriter.flush(); + + this.calculateAndWriteDistribution(event.getIteration(), this.strategies, this.planId2planInheritanceRecords, selectedPlanIds, this.selectedPlanStrategyShareWriter); + this.calculateAndWriteDistribution(event.getIteration(), this.strategies, this.planId2planInheritanceRecords, this.planId2planInheritanceRecords.keySet(), this.planStrategyShareWriter); + } + + private void calculateAndWriteDistribution(int currentIteration, ArrayList strategies, Map planId2planInheritanceRecords, Set planIds, BufferedWriter writer) { + Map strategy2count = new HashMap<>(); + for (String strategyName : strategies) { + strategy2count.put(strategyName, new AtomicLong(0)); + } + for (String planId : planIds) { + String mutatedBy = planId2planInheritanceRecords.get(planId).mutatedBy; + strategy2count.get(mutatedBy).incrementAndGet(); + } + long sum = strategy2count.values().stream().mapToLong(count -> count.get()).sum(); + StringBuffer line = new StringBuffer(); + line.append(currentIteration); + line.append(DELIMITER); + for (int i = 0; i < strategies.size(); i++) { + if (i > 0) { + line.append(DELIMITER); + } + line.append(String.valueOf(strategy2count.get(strategies.get(i)).doubleValue() / sum)); + } + try { + writer.write(line.toString()); + writer.newLine(); + } catch (IOException e) { + throw new RuntimeException("Could not initialize the plan strategy share writer!", e); + } } @Override @@ -105,6 +205,15 @@ public void notifyShutdown(ShutdownEvent event) { this.planInheritanceRecordWriter.flush(); this.planInheritanceRecordWriter.close(); + try { + this.selectedPlanStrategyShareWriter.flush(); + this.selectedPlanStrategyShareWriter.close(); + this.planStrategyShareWriter.flush(); + this.planStrategyShareWriter.close(); + } catch (IOException e) { + new RuntimeException(e); + } + this.planId2planInheritanceRecords.clear(); } From f302b4b9a403d0f5e0c8af5c960b006a827305fa Mon Sep 17 00:00:00 2001 From: Andreas Neumann Date: Wed, 27 Sep 2023 09:26:52 +0200 Subject: [PATCH 10/33] some javadoc --- .../inheritance/PlanInheritanceModule.java | 45 ++++++++++++++++- .../inheritance/PlanInheritanceRecord.java | 48 +++++++++++++++++++ .../PlanInheritanceRecordWriter.java | 25 ++++++++++ 3 files changed, 117 insertions(+), 1 deletion(-) diff --git a/matsim/src/main/java/org/matsim/core/replanning/inheritance/PlanInheritanceModule.java b/matsim/src/main/java/org/matsim/core/replanning/inheritance/PlanInheritanceModule.java index 55a34591e6b..c16514a4ecc 100644 --- a/matsim/src/main/java/org/matsim/core/replanning/inheritance/PlanInheritanceModule.java +++ b/matsim/src/main/java/org/matsim/core/replanning/inheritance/PlanInheritanceModule.java @@ -1,5 +1,25 @@ package org.matsim.core.replanning.inheritance; +/* *********************************************************************** * + * project: org.matsim.* + * ParallelPopulationReaderMatsimV6.java + * * + * *********************************************************************** * + * * + * copyright : (C) 2023 by the members listed in the COPYING, * + * LICENSE and WARRANTY file. * + * email : info at matsim dot org * + * * + * *********************************************************************** * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * See also COPYING, LICENSE and WARRANTY file * + * * + * *********************************************************************** */ + import java.io.BufferedWriter; import java.io.IOException; import java.util.ArrayList; @@ -31,9 +51,16 @@ import com.google.inject.Singleton; +/** + * The core plan inheritance module responsible for + *
  • Initialization of initially read plans and default writers + *
  • Book-keeping, i.e. setting additional plan attributes not stored in the plan itself + *
  • Calculation default stats like the distribution of mutators among (selected) plans + * + * @author neuma + */ @Singleton public class PlanInheritanceModule extends AbstractModule implements StartupListener, BeforeMobsimListener, ShutdownListener { - public static final String PLAN_ID = "planId"; public static final String ITERATION_CREATED = "iterationCreated"; @@ -55,11 +82,21 @@ public class PlanInheritanceModule extends AbstractModule implements StartupList @Override public void notifyStartup(StartupEvent event) { + // initialize all default writers CompressionType compressionType = event.getServices().getConfig().controler().getCompressionType(); this.planInheritanceRecordWriter = new PlanInheritanceRecordWriter(event.getServices().getControlerIO().getOutputFilename(FILENAME_PLAN_INHERITANCE_RECORDS + ".csv", compressionType)); this.strategies = this.getActiveStrategies(event.getServices().getConfig().strategy().getStrategySettings(), event.getServices().getStrategyManager()); this.selectedPlanStrategyShareWriter = this.initializeDistributionWriter(this.strategies, event.getServices().getControlerIO().getOutputFilename(FILENAME_PLAN_INHERITANCE_RECORDS + "_shares_selected.csv")); this.planStrategyShareWriter = this.initializeDistributionWriter(this.strategies, event.getServices().getControlerIO().getOutputFilename(FILENAME_PLAN_INHERITANCE_RECORDS + "_shares.csv")); + + // reset all plan attributes that might be present from a previously performed matsim run + for (Person person : event.getServices().getScenario().getPopulation().getPersons().values()) { + for (Plan plan : person.getPlans()) { + plan.setPlanId(null); + plan.setPlanMutator(null); + plan.setIterationCreated(0); + } + } } /** @@ -114,6 +151,7 @@ private BufferedWriter initializeDistributionWriter(ArrayList strategies @Override public void notifyBeforeMobsim(BeforeMobsimEvent event) { + // check the plans of the population and all currently stored plan records - do the actual book-keeping Set activePlanIds = new HashSet<>(); Set selectedPlanIds = new HashSet<>(); @@ -169,6 +207,9 @@ public void notifyBeforeMobsim(BeforeMobsimEvent event) { this.calculateAndWriteDistribution(event.getIteration(), this.strategies, this.planId2planInheritanceRecords, this.planId2planInheritanceRecords.keySet(), this.planStrategyShareWriter); } + /** + * Updates the default plan stats - namely the distribution of plan mutators based on the given plan ids. + */ private void calculateAndWriteDistribution(int currentIteration, ArrayList strategies, Map planId2planInheritanceRecords, Set planIds, BufferedWriter writer) { Map strategy2count = new HashMap<>(); for (String strategyName : strategies) { @@ -198,6 +239,8 @@ private void calculateAndWriteDistribution(int currentIteration, ArrayList Date: Fri, 13 Oct 2023 12:06:06 +0200 Subject: [PATCH 11/33] adjust output files due to different randomness in new time allocation mutator --- .../testSignalSystems/10.events.xml.gz | Bin 414623 -> 438798 bytes .../testSignalSystems/10.plans.xml.gz | Bin 259840 -> 231832 bytes .../10.events.xml.gz | Bin 414724 -> 438798 bytes .../10.plans.xml.gz | Bin 219518 -> 230132 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/contribs/signals/src/test/resources/test/input/org/matsim/contrib/signals/integration/SignalSystemsIT/testSignalSystems/10.events.xml.gz b/contribs/signals/src/test/resources/test/input/org/matsim/contrib/signals/integration/SignalSystemsIT/testSignalSystems/10.events.xml.gz index c7ef25fe7c6d126a3164ad9a17734f4ca153236b..3493cb13c844247a2b43769d69a6f5b9ad0e5864 100644 GIT binary patch literal 438798 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

    hGM_UBSNDb3qdtY1qSu)Sx)e!AS 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