Skip to content

Commit 9ae9965

Browse files
authored
Merge pull request #134 from matsim-org/master
Update matsim 2025 CW 8
2 parents f129993 + 7f81201 commit 9ae9965

File tree

190 files changed

+5169
-1465
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

190 files changed

+5169
-1465
lines changed

contribs/application/src/main/java/org/matsim/application/prepare/scenario/CreateScenarioCutOut.java

+25-11
Original file line numberDiff line numberDiff line change
@@ -476,8 +476,8 @@ private List<NetworkChangeEvent> generateNetworkChangeEvents(double timeFrameLen
476476
if (geomBuffer.contains(MGC.coord2Point(link.getCoord())))
477477
continue;
478478

479-
// Setting capacity outside shapefile (and buffer) to infinite
480-
link.setCapacity(Double.MAX_VALUE);
479+
// Setting capacity outside shapefile (and buffer) to a very large value, not max value, as this causes problem in the qsim
480+
link.setCapacity(1_000_000);
481481

482482
// Do this for the whole simulation run
483483
for (double time = 0; time < changeEventsMaxTime; time += timeFrameLength) {
@@ -621,16 +621,30 @@ public void run(Person person) {
621621
}
622622
}
623623

624-
// Remove routes that contain now non-existing links
625-
Set<Id<Link>> linkIds = TripStructureUtils.getLegs(plan).stream()
626-
.map(Leg::getRoute)
627-
.filter(r -> r instanceof NetworkRoute)
628-
.map(r -> (NetworkRoute) r)
629-
.flatMap(r -> Stream.concat(Stream.of(r.getStartLinkId(), r.getEndLinkId()), r.getLinkIds().stream()))
630-
.collect(Collectors.toSet());
624+
for (Leg leg : TripStructureUtils.getLegs(plan)) {
631625

632-
if (!linkIds.stream().allMatch(l -> network.getLinks().containsKey(l)))
633-
PopulationUtils.resetRoutes(person.getSelectedPlan());
626+
if (!(leg.getRoute() instanceof NetworkRoute r))
627+
continue;
628+
629+
Stream<Id<Link>> stream = Stream.concat(Stream.of(r.getStartLinkId(), r.getEndLinkId()), r.getLinkIds().stream());
630+
631+
boolean valid = stream.allMatch(l -> {
632+
633+
Link link = network.getLinks().get(l);
634+
635+
// Check if link is present in the network
636+
if (link == null)
637+
return false;
638+
639+
// Check if the link has the needed mode
640+
return link.getAllowedModes().contains(leg.getMode());
641+
});
642+
643+
if (!valid) {
644+
PopulationUtils.resetRoutes(plan);
645+
break;
646+
}
647+
}
634648
}
635649
}
636650

contribs/application/test/input/org/matsim/application/prepare/scenario/CreateScenarioCutOutTest/withEvents/cut_network.xml

+174-174
Large diffs are not rendered by default.

contribs/av/src/main/java/org/matsim/contrib/av/robotaxi/vehicles/CreateTaxiVehicles.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.matsim.contrib.dvrp.fleet.DvrpVehicleSpecification;
3535
import org.matsim.contrib.dvrp.fleet.FleetWriter;
3636
import org.matsim.contrib.dvrp.fleet.ImmutableDvrpVehicleSpecification;
37+
import org.matsim.contrib.dvrp.load.IntegerLoadType;
3738
import org.matsim.core.config.ConfigUtils;
3839
import org.matsim.core.gbl.MatsimRandom;
3940
import org.matsim.core.network.io.MatsimNetworkReader;
@@ -77,7 +78,7 @@ public static void main(String[] args) {
7778
.build());
7879

7980
}
80-
new FleetWriter(vehicles.stream()).write(taxisFile);
81+
new FleetWriter(vehicles.stream(), new IntegerLoadType("passengers")).write(taxisFile);
8182
}
8283

8384
}

contribs/drt-extensions/src/main/java/org/matsim/contrib/drt/extension/companions/DrtCompanionRideGenerator.java

+11-2
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,8 @@
4343
import org.matsim.contrib.drt.extension.DrtWithExtensionsConfigGroup;
4444
import org.matsim.contrib.dvrp.fleet.DvrpVehicleSpecification;
4545
import org.matsim.contrib.dvrp.fleet.FleetSpecification;
46-
import org.matsim.contrib.dvrp.passenger.PassengerGroupIdentifier;
46+
import org.matsim.contrib.dvrp.load.IntegerLoad;
47+
import org.matsim.contrib.dvrp.passenger.PassengerGroupIdentifier;
4748
import org.matsim.core.controler.events.AfterMobsimEvent;
4849
import org.matsim.core.controler.events.BeforeMobsimEvent;
4950
import org.matsim.core.controler.listener.AfterMobsimListener;
@@ -80,10 +81,18 @@ final class DrtCompanionRideGenerator implements BeforeMobsimListener, AfterMobs
8081
final DrtWithExtensionsConfigGroup drtWithExtensionsConfigGroup) {
8182
this.scenario = scenario;
8283
this.drtMode = drtMode;
84+
85+
for (var vehicle : fleet.getVehicleSpecifications().values()) {
86+
// need IntegerType to determine the maxCapacity, but this could also be a config option /sh, januar 2025
87+
Preconditions.checkArgument(vehicle.getCapacity() instanceof IntegerLoad, "Companions require a IntegerLoadType in the current implementation.");
88+
}
89+
8390
this.maxCapacity = fleet.getVehicleSpecifications()
8491
.values()
8592
.stream()
86-
.mapToInt(DvrpVehicleSpecification::getCapacity)
93+
.map(DvrpVehicleSpecification::getCapacity)
94+
.map(IntegerLoad.class::cast)
95+
.mapToInt(IntegerLoad::getValue)
8796
.max()
8897
.orElse(0);
8998
installSampler(drtWithExtensionsConfigGroup);

contribs/drt-extensions/src/main/java/org/matsim/contrib/drt/extension/edrt/optimizer/EDrtVehicleDataEntryFactory.java

+12-7
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,19 @@
2424
import org.matsim.contrib.drt.optimizer.VehicleDataEntryFactoryImpl;
2525
import org.matsim.contrib.drt.optimizer.VehicleEntry;
2626
import org.matsim.contrib.dvrp.fleet.DvrpVehicle;
27+
import org.matsim.contrib.dvrp.load.DvrpLoadType;
28+
import org.matsim.contrib.dvrp.run.DvrpMode;
29+
import org.matsim.contrib.dvrp.run.DvrpModes;
2730
import org.matsim.contrib.dvrp.schedule.Schedule;
28-
import org.matsim.contrib.dvrp.schedule.Schedule.ScheduleStatus;
2931
import org.matsim.contrib.dvrp.schedule.Task;
3032
import org.matsim.contrib.dvrp.schedule.Task.TaskStatus;
3133
import org.matsim.contrib.ev.fleet.Battery;
3234
import org.matsim.contrib.evrp.ETask;
3335
import org.matsim.contrib.evrp.EvDvrpVehicle;
3436
import org.matsim.contrib.evrp.tracker.ETaskTracker;
37+
import org.matsim.core.modal.ModalProviders;
3538

36-
import com.google.inject.Provider;
39+
import com.google.inject.Singleton;
3740

3841
/**
3942
* @author michalm
@@ -51,9 +54,9 @@ public EVehicleEntry(VehicleEntry entry, double socBeforeFinalStay) {
5154
private final double minimumRelativeSoc;
5255
private final VehicleDataEntryFactoryImpl entryFactory;
5356

54-
public EDrtVehicleDataEntryFactory(double minimumRelativeSoc) {
57+
public EDrtVehicleDataEntryFactory(double minimumRelativeSoc, DvrpLoadType loadType) {
5558
this.minimumRelativeSoc = minimumRelativeSoc;
56-
entryFactory = new VehicleDataEntryFactoryImpl();
59+
entryFactory = new VehicleDataEntryFactoryImpl(loadType);
5760
}
5861

5962
@Override
@@ -101,16 +104,18 @@ public VehicleEntry create(DvrpVehicle vehicle, double currentTime) {
101104
return entry == null ? null : new EVehicleEntry(entry, chargeBeforeNextTask);
102105
}
103106

104-
public static class EDrtVehicleDataEntryFactoryProvider implements Provider<VehicleEntry.EntryFactory> {
107+
@Singleton
108+
public static class EDrtVehicleDataEntryFactoryProvider extends ModalProviders.AbstractProvider<DvrpMode, EDrtVehicleDataEntryFactory> {
105109
private final double minimumRelativeSoc;
106110

107-
public EDrtVehicleDataEntryFactoryProvider(double minimumRelativeSoc) {
111+
public EDrtVehicleDataEntryFactoryProvider(String mode, double minimumRelativeSoc) {
112+
super(mode, DvrpModes::mode);
108113
this.minimumRelativeSoc = minimumRelativeSoc;
109114
}
110115

111116
@Override
112117
public EDrtVehicleDataEntryFactory get() {
113-
return new EDrtVehicleDataEntryFactory(minimumRelativeSoc);
118+
return new EDrtVehicleDataEntryFactory(minimumRelativeSoc, getModalInstance(DvrpLoadType.class));
114119
}
115120
}
116121
}

contribs/drt-extensions/src/main/java/org/matsim/contrib/drt/extension/edrt/run/EDrtModeOptimizerQSimModule.java

+22-3
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import org.matsim.contrib.drt.passenger.DrtOfferAcceptor;
4040
import org.matsim.contrib.drt.prebooking.PrebookingActionCreator;
4141
import org.matsim.contrib.drt.run.DrtConfigGroup;
42+
import org.matsim.contrib.drt.schedule.DrtRoutingDriveTaskUpdater;
4243
import org.matsim.contrib.drt.schedule.DrtTaskFactory;
4344
import org.matsim.contrib.drt.scheduler.DefaultRequestInsertionScheduler;
4445
import org.matsim.contrib.drt.scheduler.DrtScheduleInquiry;
@@ -52,6 +53,7 @@
5253
import org.matsim.contrib.dvrp.run.AbstractDvrpModeQSimModule;
5354
import org.matsim.contrib.dvrp.run.DvrpConfigGroup;
5455
import org.matsim.contrib.dvrp.run.DvrpModes;
56+
import org.matsim.contrib.dvrp.schedule.DriveTaskUpdater;
5557
import org.matsim.contrib.dvrp.schedule.ScheduleTimingUpdater;
5658
import org.matsim.contrib.dvrp.vrpagent.VrpAgentLogic;
5759
import org.matsim.contrib.dvrp.vrpagent.VrpLegFactory;
@@ -62,6 +64,8 @@
6264
import org.matsim.core.mobsim.framework.MobsimTimer;
6365
import org.matsim.core.modal.ModalProviders;
6466
import org.matsim.core.router.costcalculators.TravelDisutilityFactory;
67+
import org.matsim.core.router.speedy.SpeedyALTFactory;
68+
import org.matsim.core.router.util.LeastCostPathCalculator;
6569
import org.matsim.core.router.util.TravelDisutility;
6670
import org.matsim.core.router.util.TravelTime;
6771

@@ -138,8 +142,7 @@ public EmptyVehicleChargingScheduler get() {
138142

139143
install(DrtModeOptimizerQSimModule.getInsertionSearchQSimModule(drtCfg));
140144

141-
bindModal(VehicleEntry.EntryFactory.class).toProvider(
142-
EDrtVehicleDataEntryFactory.EDrtVehicleDataEntryFactoryProvider.class).asEagerSingleton();
145+
bindModal(VehicleEntry.EntryFactory.class).to(modalKey(EDrtVehicleDataEntryFactory.class));
143146

144147
DrtOptimizationConstraintsSet defaultConstraintsSet = drtCfg.addOrGetDrtOptimizationConstraintsParams().addOrGetDefaultDrtOptimizationConstraintsSet();
145148
bindModal(CostCalculationStrategy.class)
@@ -180,9 +183,25 @@ public EmptyVehicleRelocator get() {
180183
defaultConstraintsSet.maxAllowedPickupDelay)));
181184
bindModal(DrtOfferAcceptor.class).to(modalKey(DefaultOfferAcceptor.class));
182185

186+
if (!drtCfg.updateRoutes) {
187+
bindModal(DriveTaskUpdater.class).toInstance(DriveTaskUpdater.NOOP);
188+
} else {
189+
bindModal(DriveTaskUpdater.class).toProvider(modalProvider(getter -> {
190+
TravelTime travelTime = getter.getModal(TravelTime.class);
191+
Network network = getter.getModal(Network.class);
192+
DrtTaskFactory taskFactory = getter.getModal(DrtTaskFactory.class);
193+
TravelDisutility travelDisutility = getter.getModal(
194+
TravelDisutilityFactory.class).createTravelDisutility(travelTime);
195+
196+
LeastCostPathCalculator lcpc = new SpeedyALTFactory().createPathCalculator(network, travelDisutility, travelTime);
197+
return new DrtRoutingDriveTaskUpdater(taskFactory, lcpc, travelTime);
198+
})).in(Singleton.class);
199+
}
200+
183201
bindModal(ScheduleTimingUpdater.class).toProvider(modalProvider(
184202
getter -> new ScheduleTimingUpdater(getter.get(MobsimTimer.class),
185-
new EDrtStayTaskEndTimeCalculator(getter.getModal(StopTimeCalculator.class))))).asEagerSingleton();
203+
new EDrtStayTaskEndTimeCalculator(getter.getModal(StopTimeCalculator.class)),
204+
getter.getModal(DriveTaskUpdater.class)))).asEagerSingleton();
186205

187206
bindModal(VrpLegFactory.class).toProvider(modalProvider(getter -> {
188207
DvrpConfigGroup dvrpCfg = getter.get(DvrpConfigGroup.class);

contribs/drt-extensions/src/main/java/org/matsim/contrib/drt/extension/edrt/run/RunEDrtScenario.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
import java.net.URL;
2424

25+
import org.matsim.contrib.drt.extension.edrt.optimizer.EDrtVehicleDataEntryFactory;
2526
import org.matsim.contrib.drt.extension.edrt.optimizer.EDrtVehicleDataEntryFactory.EDrtVehicleDataEntryFactoryProvider;
2627
import org.matsim.contrib.drt.run.DrtConfigGroup;
2728
import org.matsim.contrib.drt.run.MultiModeDrtConfigGroup;
@@ -64,8 +65,8 @@ public static Controler createControler(Config config, boolean otfvis) {
6465
controler.addOverridingModule(new AbstractDvrpModeModule(drtCfg.getMode()) {
6566
@Override
6667
public void install() {
67-
bind(EDrtVehicleDataEntryFactoryProvider.class).toInstance(
68-
new EDrtVehicleDataEntryFactoryProvider(MIN_RELATIVE_SOC));
68+
bindModal(EDrtVehicleDataEntryFactory.class).toProvider(
69+
new EDrtVehicleDataEntryFactoryProvider(getMode(), MIN_RELATIVE_SOC));
6970
}
7071
});
7172
}

contribs/drt-extensions/src/main/java/org/matsim/contrib/drt/extension/fiss/FISSModule.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
import org.matsim.vehicles.VehicleUtils;
1818
import org.matsim.vehicles.Vehicles;
1919

20-
class FISSModule extends AbstractModule{
20+
public class FISSModule extends AbstractModule{
2121
private static final Logger LOG = LogManager.getLogger( FISSModule.class );
2222

2323
@Override public void install(){

contribs/drt-extensions/src/main/java/org/matsim/contrib/drt/extension/insertion/DrtInsertionModule.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.matsim.contrib.drt.optimizer.insertion.CostCalculationStrategy;
2727
import org.matsim.contrib.drt.passenger.DrtOfferAcceptor;
2828
import org.matsim.contrib.drt.run.DrtConfigGroup;
29+
import org.matsim.contrib.dvrp.load.DvrpLoadType;
2930
import org.matsim.contrib.dvrp.run.AbstractDvrpModeQSimModule;
3031
import org.matsim.core.router.costcalculators.OnlyTimeDependentTravelDisutility;
3132
import org.matsim.core.router.speedy.SpeedyALTFactory;
@@ -302,7 +303,7 @@ private void configureRangeContraint(List<Key<? extends DrtInsertionConstraint>>
302303
distanceApproximator = null;
303304
}
304305

305-
return new VehicleRangeConstraint(vehicleRangeSupplier, distanceCalculator, distanceApproximator);
306+
return new VehicleRangeConstraint(vehicleRangeSupplier, distanceCalculator, distanceApproximator, getter.getModal(DvrpLoadType.class));
306307
}));
307308

308309
constraintBindings.add(modalKey(VehicleRangeConstraint.class));
@@ -448,7 +449,7 @@ private void configureVehicleDistanceObjective() {
448449
distanceCalculator = getter.getModal(RoutingDistanceCalculator.class);
449450
}
450451

451-
return new VehicleDistanceObjective(vehicleDistanceWeights, distanceCalculator);
452+
return new VehicleDistanceObjective(vehicleDistanceWeights, distanceCalculator, getter.getModal(DvrpLoadType.class));
452453
}));
453454
}
454455

contribs/drt-extensions/src/main/java/org/matsim/contrib/drt/extension/insertion/constraints/ExclusivityConstraint.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public boolean checkInsertion(DrtRequest drtRequest, Insertion insertion, Detour
2525

2626
private boolean isValidInsertionForExclusiveRequest(DrtRequest drtRequest, Insertion insertion,
2727
DetourTimeInfo detourTimeInfo) {
28-
if (insertion.pickup.previousWaypoint.getOutgoingOccupancy() > 0) {
28+
if (!insertion.pickup.previousWaypoint.getOutgoingOccupancy().isEmpty()) {
2929
// attempt to attach pickup to existing trip
3030
return false;
3131
}
@@ -67,4 +67,4 @@ private boolean isValidInsertionForStandardRequest(DrtRequest drtRequest, Insert
6767
static public interface ExclusivityVoter {
6868
boolean isExclusive(DrtRequest request);
6969
}
70-
}
70+
}

contribs/drt-extensions/src/main/java/org/matsim/contrib/drt/extension/insertion/constraints/VehicleRangeConstraint.java

+5-3
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,21 @@
1111
import org.matsim.contrib.drt.optimizer.insertion.InsertionGenerator.Insertion;
1212
import org.matsim.contrib.drt.passenger.DrtRequest;
1313
import org.matsim.contrib.dvrp.fleet.DvrpVehicle;
14+
import org.matsim.contrib.dvrp.load.DvrpLoadType;
1415

1516
public class VehicleRangeConstraint implements DrtInsertionConstraint {
16-
private final InsertionDistanceCalculator insertionCalculator = new InsertionDistanceCalculator();
17-
17+
private final InsertionDistanceCalculator insertionCalculator;
18+
1819
private final VehicleRangeSupplier rangeSupplier;
1920
private final DistanceCalculator distanceCalculator;
2021
private final DistanceApproximator distanceApproximator;
2122

2223
public VehicleRangeConstraint(VehicleRangeSupplier rangeSupplier, DistanceCalculator distanceEstimator,
23-
@Nullable DistanceApproximator distanceApproximator) {
24+
@Nullable DistanceApproximator distanceApproximator, DvrpLoadType loadType) {
2425
this.rangeSupplier = rangeSupplier;
2526
this.distanceCalculator = distanceEstimator;
2627
this.distanceApproximator = distanceApproximator;
28+
this.insertionCalculator = new InsertionDistanceCalculator(loadType);
2729
}
2830

2931
@Override

0 commit comments

Comments
 (0)