21 package org.matsim.core.population.algorithms;
23 import java.util.Random;
49 public MutateActivityTimeAllocation(
final double mutationRange,
boolean affectingDuration,
final Random random,
double latestActivityEndTime,
boolean mutateAroundInitialEndTimeOnly,
double mutationRangeStep) {
55 this.mutationRangeStep = Math.max(1.0,mutationRangeStep);
62 if (act.getEndTime().isDefined()) {
63 double endTime = act.getEndTime().seconds();
64 if (mutateAroundInitialEndTimeOnly){
65 Object initialEndtime = act.getAttributes().getAttribute(INITIAL_END_TIME_ATTRIBUTE);
66 if (initialEndtime!=null) {
67 endTime = (double) initialEndtime;
69 act.getAttributes().putAttribute(INITIAL_END_TIME_ATTRIBUTE,endTime);
72 double newEndTime = Math.min(
mutateTime(endTime, mutationRange),this.latestActivityEndTime);
73 act.setEndTime(newEndTime);
74 act.setStartTimeUndefined();
76 else if ( affectingDuration ) {
77 if ( act.getMaximumDuration().isDefined()) {
91 if (planElement instanceof
Activity activity){
92 if (activity.getEndTime().isDefined()){
93 now = activity.getEndTime().seconds();
95 else if (activity.getMaximumDuration().isDefined()){
96 now = now + activity.getMaximumDuration().seconds();
98 }
else if (planElement instanceof
Leg leg){
99 if (leg.getDepartureTime().isDefined()) {
100 leg.setDepartureTime(now);
101 if (leg.getTravelTime().isDefined()) {
102 now = now + leg.getTravelTime().seconds();
109 private double mutateTime(
final double time,
double mutationRange) {
111 int mutationRangeBins = (int) Math.ceil( mutationRange/mutationRangeStep);
112 t = t - mutationRange + (2*this.random.nextInt(mutationRangeBins)*
mutationRangeStep) ;
void run(final Plan plan)
static final String INITIAL_END_TIME_ATTRIBUTE
final double latestActivityEndTime
static List< Activity > getActivities(final Plan plan, final StageActivityHandling stageActivityHandling)
final double mutationRange
void setLegDepartureTimes(Plan plan)
final boolean mutateAroundInitialEndTimeOnly
final double mutationRangeStep
List< PlanElement > getPlanElements()
final boolean affectingDuration
MutateActivityTimeAllocation(final double mutationRange, boolean affectingDuration, final Random random, double latestActivityEndTime, boolean mutateAroundInitialEndTimeOnly, double mutationRangeStep)
double mutateTime(final double time, double mutationRange)