From e93920239eaa7e51ec415f8e45acfb4b741db975 Mon Sep 17 00:00:00 2001 From: Kai Martins-Turner Date: Wed, 28 Dec 2022 23:00:04 +0100 Subject: [PATCH 1/2] update MATSim version --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 87986cf974d..4ab9efe87fa 100644 --- a/pom.xml +++ b/pom.xml @@ -14,7 +14,7 @@ org.matsim matsim-all - 15.0-PR2335 + 15.0-PR2342 From d3244016db9f5e66ce0b26fd1eaaf25e5f87342e Mon Sep 17 00:00:00 2001 From: Kai Martins-Turner Date: Wed, 28 Dec 2022 23:19:57 +0100 Subject: [PATCH 2/2] score based on vehicleIds --- .../MyEventBasedCarrierScorer.java | 54 +++++++------------ 1 file changed, 18 insertions(+), 36 deletions(-) diff --git a/src/main/java/example/lsp/initialPlans/MyEventBasedCarrierScorer.java b/src/main/java/example/lsp/initialPlans/MyEventBasedCarrierScorer.java index 009baafe215..3c8394e31cd 100644 --- a/src/main/java/example/lsp/initialPlans/MyEventBasedCarrierScorer.java +++ b/src/main/java/example/lsp/initialPlans/MyEventBasedCarrierScorer.java @@ -9,20 +9,17 @@ import org.matsim.api.core.v01.events.LinkEnterEvent; import org.matsim.api.core.v01.network.Network; import org.matsim.contrib.freight.carrier.Carrier; -import org.matsim.contrib.freight.carrier.ScheduledTour; import org.matsim.contrib.freight.carrier.Tour; import org.matsim.contrib.freight.controler.CarrierScoringFunctionFactory; import org.matsim.contrib.freight.events.FreightTourEndEvent; import org.matsim.contrib.freight.events.FreightTourStartEvent; import org.matsim.core.scoring.ScoringFunction; import org.matsim.core.scoring.SumScoringFunction; +import org.matsim.vehicles.Vehicle; import org.matsim.vehicles.VehicleType; import org.matsim.vehicles.VehicleUtils; -import java.util.Arrays; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; +import java.util.*; /** * @author Kai Martins-Turner (kturner) @@ -39,8 +36,8 @@ class MyEventBasedCarrierScorer implements CarrierScoringFunctionFactory { public ScoringFunction createScoringFunction(Carrier carrier) { SumScoringFunction sf = new SumScoringFunction(); - sf.addScoringFunction(new EventBasedScoring(carrier)); - sf.addScoringFunction(new LinkBasedTollScoring(carrier, toll)); + sf.addScoringFunction(new EventBasedScoring()); + sf.addScoringFunction(new LinkBasedTollScoring(toll)); return sf; } @@ -58,7 +55,6 @@ void setToll (double toll) { private class EventBasedScoring implements SumScoringFunction.ArbitraryEventScoring { final Logger log = LogManager.getLogger(EventBasedScoring.class); - private final Carrier carrier; private double score; private final double MAX_SHIFT_DURATION = 8 * 3600; @@ -67,9 +63,8 @@ private class EventBasedScoring implements SumScoringFunction.ArbitraryEventScor private final Map, Double> tourStartTime = new LinkedHashMap<>(); - public EventBasedScoring(Carrier carrier) { + public EventBasedScoring() { super(); - this.carrier = carrier; } @Override public void finish() { @@ -98,9 +93,7 @@ private void handleEvent(FreightTourStartEvent event) { //Fix costs for vehicle usage private void handleEvent(FreightTourEndEvent event) { //Fix costs for vehicle usage - //FIXME: Bei den FreightServiceEvents sind die MATSim vehicleIds drinnen. --> Gut final VehicleType vehicleType = (VehicleUtils.findVehicle(event.getVehicleId(), scenario)).getType(); - // score = score - vehicleType.getCostInformation().getFixedCosts(); //score all vehicles with fixed costs double tourDuration = event.getTime() - tourStartTime.get(event.getTourId()); { //limit fixexd costs scoring @@ -130,47 +123,38 @@ private void handleEvent(FreightTourEndEvent event) { } } - // variable costs per Time + // variable costs per time score = score - (tourDuration * vehicleType.getCostInformation().getCostsPerSecond()); } private void handleEvent(LinkEnterEvent event) { final double distance = network.getLinks().get(event.getLinkId()).getLength(); - //FIXME: Bei den LinkEnterEvents sind die "Dummy" vehicle"Ids" des carriers drinnen. - final double costPerMeter = carrier.getCarrierCapabilities().getCarrierVehicles().get(event.getVehicleId()).getType().getCostInformation().getCostsPerMeter(); + final double costPerMeter = (VehicleUtils.findVehicle(event.getVehicleId(), scenario)).getType().getCostInformation().getCostsPerMeter(); + // variable costs per distance score = score - (distance * costPerMeter); } } /** - * Calculate some toll for drinving on a link + * Calculate some toll for driving on a link * This a lazy implementation of a cordon toll. + * A vehicle is only tolled once. */ class LinkBasedTollScoring implements SumScoringFunction.ArbitraryEventScoring { final Logger log = LogManager.getLogger(EventBasedScoring.class); - private final Carrier carrier; + private final double toll; private double score; - private double tollingCounter; - private double maxNumberOfTollings; //Begrenze Anzahl der Bemautungen private final List vehicleTypesToBeTolled = Arrays.asList("large50"); - public LinkBasedTollScoring(Carrier carrier, double toll) { + private final List> tolledVehicles = new ArrayList<>(); + + public LinkBasedTollScoring(double toll) { super(); - this.carrier = carrier; this.toll = toll; - for (ScheduledTour scheduledTour : carrier.getSelectedPlan().getScheduledTours()) { - //Das ist noch nicht Perfekt, weil es besser wäre, dass nur jedes Fahrzeuig wirklich einmal bemautet wird. - //Aber es begrenzt immerhin auf die Anzahl der Fahrzeuge des Types, die unterwegs sind. - //Siehe auch untern bei der Bemautung selbst - //kmt nov '22 - if (vehicleTypesToBeTolled.contains(scheduledTour.getVehicle().getType().getId().toString())) { - this.maxNumberOfTollings++; - } - } } @Override public void finish() {} @@ -189,19 +173,17 @@ private void handleEvent(LinkEnterEvent event) { // List tolledLinkList = Arrays.asList("i(5,5)R"); List tolledLinkList = Arrays.asList("i(3,4)", "i(3,6)", "i(7,5)R", "i(7,7)R", "j(4,8)R", "j(6,8)R", "j(3,4)", "j(5,4)"); - //TODO: Leider ist hier nicht die (MATSim/mobsim) vehicleId verfügbar, sodass ein echter Ausschluss von Doppel-Bemautung nicht möglich ist. - //Somit bleibt argumentativ nur, dass es echte Cordon-Maut ist, die bei JEDER Einfahrt bezahlt werden muss. - final Id vehicleTypeId = carrier.getCarrierCapabilities().getCarrierVehicles().get(event.getVehicleId()).getType().getId(); + final Id vehicleTypeId = (VehicleUtils.findVehicle(event.getVehicleId(), scenario)).getType().getId(); - if (tollingCounter < maxNumberOfTollings) { + //toll a vehicle only once. + if (!tolledVehicles.contains(event.getVehicleId())) if (vehicleTypesToBeTolled.contains(vehicleTypeId.toString())) { if (tolledLinkList.contains(event.getLinkId().toString())) { log.info("Tolling caused by event: " + event); - tollingCounter++; + tolledVehicles.add(event.getVehicleId()); score = score - toll; } } - } } } }