Skip to content

Commit 38a4c7a

Browse files
authored
feat: DrtServiceAreaConstraint (#287)
1 parent c7a9346 commit 38a4c7a

3 files changed

Lines changed: 76 additions & 0 deletions

File tree

core/src/main/java/org/eqasim/core/simulation/mode_choice/EqasimModeChoiceModule.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.eqasim.core.simulation.mode_choice.utilities.predictors.PersonPredictor;
2626
import org.eqasim.core.simulation.mode_choice.utilities.predictors.PtPredictor;
2727
import org.eqasim.core.simulation.mode_choice.utilities.predictors.WalkPredictor;
28+
import org.eqasim.core.simulation.modes.drt.mode_choice.constraints.DrtServiceAreaConstraint;
2829
import org.eqasim.core.simulation.modes.drt.mode_choice.constraints.DrtWalkConstraint;
2930
import org.eqasim.core.simulation.modes.drt.mode_choice.predictors.DefaultDrtPredictor;
3031
import org.eqasim.core.simulation.modes.drt.mode_choice.predictors.DrtPredictor;
@@ -47,6 +48,7 @@ public class EqasimModeChoiceModule extends AbstractEqasimExtension {
4748
public static final String PASSENGER_CONSTRAINT_NAME = "PassengerConstraint";
4849
public static final String OUTSIDE_CONSTRAINT_NAME = "OutsideConstraint";
4950
public static final String DRT_WALK_CONSTRAINT = "DrtWalkConstraint";
51+
public static final String DRT_SERVICE_AREA_CONSTRAINT = "DrtServiceAreaConstraint";
5052
public static final String TOUR_LENGTH_FILTER_NAME = "TourLengthFilter";
5153
public static final String OUTSIDE_FILTER_NAME = "OutsideFilter";
5254

@@ -69,6 +71,7 @@ protected void installEqasimExtension() {
6971
bindTripConstraintFactory(PASSENGER_CONSTRAINT_NAME).to(PassengerConstraint.Factory.class);
7072
bindTripConstraintFactory(OUTSIDE_CONSTRAINT_NAME).to(OutsideConstraint.Factory.class);
7173
bindTripConstraintFactory(DRT_WALK_CONSTRAINT).to(DrtWalkConstraint.Factory.class);
74+
bindTripConstraintFactory(DRT_SERVICE_AREA_CONSTRAINT).to(DrtServiceAreaConstraint.Factory.class);
7275

7376
bindTourFilter(TOUR_LENGTH_FILTER_NAME).to(TourLengthFilter.class);
7477
bindTourFilter(OUTSIDE_FILTER_NAME).to(OutsideFilter.class);
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package org.eqasim.core.simulation.modes.drt.mode_choice.constraints;
2+
3+
import com.google.inject.Inject;
4+
import org.eqasim.core.scenario.cutter.extent.ScenarioExtent;
5+
import org.eqasim.core.scenario.cutter.extent.ShapeScenarioExtent;
6+
import org.matsim.api.core.v01.population.Person;
7+
import org.matsim.contrib.drt.run.DrtConfigGroup;
8+
import org.matsim.contrib.drt.run.MultiModeDrtConfigGroup;
9+
import org.matsim.contribs.discrete_mode_choice.model.DiscreteModeChoiceTrip;
10+
import org.matsim.contribs.discrete_mode_choice.model.constraints.AbstractTripConstraint;
11+
import org.matsim.contribs.discrete_mode_choice.model.trip_based.TripConstraint;
12+
import org.matsim.contribs.discrete_mode_choice.model.trip_based.TripConstraintFactory;
13+
import org.matsim.core.config.Config;
14+
import org.matsim.core.config.ConfigGroup;
15+
16+
import java.io.File;
17+
import java.io.IOException;
18+
import java.util.*;
19+
20+
public class DrtServiceAreaConstraint extends AbstractTripConstraint {
21+
22+
private final Map<String, ScenarioExtent> scenarioExtentByMode;
23+
24+
public DrtServiceAreaConstraint(Map<String, ScenarioExtent> scenarioExtentByMode) {
25+
this.scenarioExtentByMode = scenarioExtentByMode;
26+
}
27+
28+
@Override
29+
public boolean validateBeforeEstimation(DiscreteModeChoiceTrip trip, String mode, List<String> previousModes) {
30+
ScenarioExtent scenarioExtent = scenarioExtentByMode.get(mode);
31+
if(scenarioExtent != null) {
32+
return scenarioExtent.isInside(trip.getOriginActivity().getCoord()) && scenarioExtent.isInside(trip.getDestinationActivity().getCoord());
33+
}
34+
return true;
35+
}
36+
37+
38+
39+
public static class Factory implements TripConstraintFactory {
40+
41+
private final Map<String, ScenarioExtent> scenarioExtentByMode = new HashMap<>();
42+
43+
@Inject
44+
public Factory(Config config) {
45+
if(config.getModules().containsKey(MultiModeDrtConfigGroup.GROUP_NAME)) {
46+
MultiModeDrtConfigGroup multiModeDrtConfigGroup = (MultiModeDrtConfigGroup) config.getModules().get(MultiModeDrtConfigGroup.GROUP_NAME);
47+
multiModeDrtConfigGroup.getModalElements().stream()
48+
.filter(drtConfigGroup -> drtConfigGroup.operationalScheme.equals(DrtConfigGroup.OperationalScheme.serviceAreaBased))
49+
.forEach(drtConfigGroup -> {
50+
String extentPath = ConfigGroup.getInputFileURL(config.getContext(), drtConfigGroup.drtServiceAreaShapeFile).getPath();
51+
try {
52+
scenarioExtentByMode.put(drtConfigGroup.mode, new ShapeScenarioExtent.Builder(new File(extentPath), Optional.empty(), Optional.empty()).build());
53+
} catch (IOException e) {
54+
throw new RuntimeException(e);
55+
}
56+
});
57+
}
58+
}
59+
60+
@Override
61+
public TripConstraint createConstraint(Person person, List<DiscreteModeChoiceTrip> list, Collection<String> collection) {
62+
return new DrtServiceAreaConstraint(scenarioExtentByMode);
63+
}
64+
}
65+
}

core/src/main/java/org/eqasim/core/simulation/modes/drt/utils/AdaptConfigForDrt.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,15 @@ public static void adapt(Config config, Map<String, String> vehiclesPathByDrtMod
7070
cachedModes.addAll(vehiclesPathByDrtMode.keySet());
7171
dmcConfig.setCachedModes(cachedModes);
7272

73+
boolean serviceAreaDrt = false;
74+
7375
for(String drtMode: vehiclesPathByDrtMode.keySet()) {
7476
DrtConfigGroup drtConfigGroup = new DrtConfigGroup();
7577
drtConfigGroup.mode = drtMode;
7678
drtConfigGroup.operationalScheme = DrtConfigGroup.OperationalScheme.valueOf(operationalSchemes.get(drtMode));
79+
if(drtConfigGroup.operationalScheme.equals(DrtConfigGroup.OperationalScheme.serviceAreaBased)) {
80+
serviceAreaDrt = true;
81+
}
7782
drtConfigGroup.stopDuration = 15.0;
7883
DefaultDrtOptimizationConstraintsSet defaultDrtOptimizationConstraintsSet = (DefaultDrtOptimizationConstraintsSet) drtConfigGroup.addOrGetDrtOptimizationConstraintsParams().addOrGetDefaultDrtOptimizationConstraintsSet();
7984
defaultDrtOptimizationConstraintsSet.maxWaitTime = 600;
@@ -132,6 +137,9 @@ public static void adapt(Config config, Map<String, String> vehiclesPathByDrtMod
132137
legTimeConstraintSingleLegConfigGroups.forEach(legTimeConstraintConfigGroup::addParameterSet);
133138
}
134139
tripConstraints.add(EqasimModeChoiceModule.DRT_WALK_CONSTRAINT);
140+
if(serviceAreaDrt) {
141+
tripConstraints.add(EqasimModeChoiceModule.DRT_SERVICE_AREA_CONSTRAINT);
142+
}
135143
dmcConfig.setTripConstraints(tripConstraints);
136144

137145
DrtConfigs.adjustMultiModeDrtConfig(multiModeDrtConfigGroup, config.scoring(), config.routing());

0 commit comments

Comments
 (0)