Skip to content

Commit dd2be26

Browse files
authored
use timedependetNetwork if it is set in the config (#4895)
1 parent b4e48ed commit dd2be26

2 files changed

Lines changed: 52 additions & 4 deletions

File tree

contribs/freight/src/main/java/org/matsim/freight/carriers/CarriersUtils.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
import org.matsim.api.core.v01.population.Plan;
5656
import org.matsim.contrib.roadpricing.*;
5757
import org.matsim.core.config.ConfigUtils;
58+
import org.matsim.core.network.TimeDependentNetwork;
5859
import org.matsim.core.utils.io.IOUtils;
5960
import org.matsim.core.utils.misc.Time;
6061
import org.matsim.freight.carriers.analysis.CarriersAnalysis;
@@ -276,7 +277,7 @@ public static void runJsprit(Scenario scenario, CarrierSelectionForSolution carr
276277
else
277278
log.warn("Jsprit analysis per carrier CSV file already exists at {}. Will append results to this file. If you want to start with a new file, please delete or move the existing file.", jspritAnalysisPerCarrierCSVPath);
278279
// necessary to create FreightCarriersConfigGroup before submitting to ThreadPoolExecutor
279-
ConfigUtils.addOrGetModule(scenario.getConfig(), FreightCarriersConfigGroup.class);
280+
FreightCarriersConfigGroup freightConfigGroup = ConfigUtils.addOrGetModule(scenario.getConfig(), FreightCarriersConfigGroup.class);
280281

281282
// Create the NetBasedCosts based on the network and the vehicle types
282283
//Consider tolls if a RoadPricingScheme is available in the scenario.
@@ -287,9 +288,14 @@ public static void runJsprit(Scenario scenario, CarrierSelectionForSolution carr
287288
log.debug("Was not able to get a RoadPricingScheme from scenario. Tolls cannot be considered.", e);
288289
}
289290

290-
final NetworkBasedTransportCosts netBasedCosts = NetworkBasedTransportCosts.Builder.newInstance(scenario.getNetwork(), getOrAddCarrierVehicleTypes(scenario).getVehicleTypes().values())
291-
.setRoadPricingScheme(roadPricingScheme)
292-
.build();
291+
NetworkBasedTransportCosts.Builder netBasedCostsBuilder = NetworkBasedTransportCosts.Builder.newInstance(scenario.getNetwork(), getOrAddCarrierVehicleTypes(scenario).getVehicleTypes().values())
292+
.setRoadPricingScheme(roadPricingScheme);
293+
294+
if (scenario.getNetwork() instanceof TimeDependentNetwork timeDependentNetwork && !timeDependentNetwork.getNetworkChangeEvents().isEmpty()) {
295+
netBasedCostsBuilder.setTimeSliceWidth(freightConfigGroup.getTravelTimeSliceWidth());
296+
}
297+
298+
final NetworkBasedTransportCosts netBasedCosts = netBasedCostsBuilder.build();
293299

294300
//Check if the inputs of the carrier(s) are consistent before starting the planning
295301
CarrierConsistencyCheckers.checkBeforePlanning(carriers, Level.ERROR);

contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/NetworkBasedTransportCostsTest.java

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,13 @@
3434
import org.matsim.api.core.v01.Coord;
3535
import org.matsim.api.core.v01.Id;
3636
import org.matsim.api.core.v01.Scenario;
37+
import org.matsim.api.core.v01.network.Link;
3738
import org.matsim.api.core.v01.network.Network;
3839
import org.matsim.contrib.roadpricing.*;
3940
import org.matsim.core.config.Config;
4041
import org.matsim.core.config.ConfigUtils;
42+
import org.matsim.core.network.NetworkChangeEvent;
43+
import org.matsim.core.network.TimeDependentNetwork;
4144
import org.matsim.core.network.io.MatsimNetworkReader;
4245
import org.matsim.core.scenario.ScenarioUtils;
4346
import org.matsim.core.utils.misc.Time;
@@ -162,6 +165,45 @@ void test_whenAddingTwoVehicleTypesViaConstructor_itMustAccountForThat(){
162165
Assertions.assertEquals(20000.0, networkBasedTransportCosts.getDistance(Location.newInstance("6"), Location.newInstance("21"), 0.0, vehicle2), 0.01);
163166
}
164167

168+
@Test
169+
void test_whenNetworkChangeEventsArePresent_itUsesTimeDependentFreespeed() {
170+
Config config = ConfigUtils.createConfig();
171+
config.network().setTimeVariantNetwork(true);
172+
Scenario scenario = ScenarioUtils.createScenario(config);
173+
String NETWORK_FILENAME = utils.getClassInputDirectory() + "network.xml";
174+
new MatsimNetworkReader(scenario.getNetwork()).readFile(NETWORK_FILENAME);
175+
Network network = scenario.getNetwork();
176+
177+
Id<Link> fromLinkId = Id.createLinkId("20");
178+
Id<Link> toLinkId = Id.createLinkId("21");
179+
Link toLink = network.getLinks().get(toLinkId);
180+
double originalFreespeed = toLink.getFreespeed();
181+
182+
NetworkChangeEvent changeEvent = new NetworkChangeEvent(3600.0);
183+
changeEvent.addLink(toLink);
184+
changeEvent.setFreespeedChange(new NetworkChangeEvent.ChangeValue(NetworkChangeEvent.ChangeType.ABSOLUTE_IN_SI_UNITS, 1.0));
185+
((TimeDependentNetwork) network).addNetworkChangeEvent(changeEvent);
186+
187+
NetworkBasedTransportCosts.Builder builder = NetworkBasedTransportCosts.Builder.newInstance(network);
188+
builder.addVehicleTypeSpecificCosts(TYPE_1, 0.0, 1.0, 0.0);
189+
NetworkBasedTransportCosts c = builder
190+
.setTimeSliceWidth(900)
191+
.build();
192+
193+
Vehicle vehicle = mock(Vehicle.class);
194+
com.graphhopper.jsprit.core.problem.vehicle.VehicleType type = mock(com.graphhopper.jsprit.core.problem.vehicle.VehicleType.class);
195+
when(type.getMaxVelocity()).thenReturn(100.0);
196+
when(type.getTypeId()).thenReturn(TYPE_1);
197+
when(vehicle.getType()).thenReturn(type);
198+
when(vehicle.getId()).thenReturn("vehicle1");
199+
200+
double beforeChange = c.getTransportTime(Location.newInstance(fromLinkId.toString()), Location.newInstance(toLinkId.toString()), 0.0, mock(Driver.class), vehicle);
201+
double afterChange = c.getTransportTime(Location.newInstance(fromLinkId.toString()), Location.newInstance(toLinkId.toString()), 3600.0, mock(Driver.class), vehicle);
202+
203+
Assertions.assertEquals(toLink.getLength() / originalFreespeed, beforeChange, 0.01);
204+
Assertions.assertEquals(toLink.getLength(), afterChange, 0.01);
205+
}
206+
165207

166208
/**
167209
* This test is a modified version of {@link #test_whenAddingTwoDifferentVehicleTypes_itMustAccountForThem}

0 commit comments

Comments
 (0)