Skip to content

Commit

Permalink
Merge pull request #77 from matsim-vsp/scoring_MATSim2342
Browse files Browse the repository at this point in the history
Fix Event-based scoring after fixing in MATSim-libs
  • Loading branch information
kt86 authored Dec 28, 2022
2 parents 836fa4a + d324401 commit 3dc840a
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 37 deletions.
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
<parent>
<groupId>org.matsim</groupId>
<artifactId>matsim-all</artifactId>
<version>15.0-PR2335</version>
<version>15.0-PR2342</version>
<!-- <version>15.0-SNAPSHOT</version>-->
<relativePath/>
</parent>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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;
}

Expand All @@ -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;
Expand All @@ -67,9 +63,8 @@ private class EventBasedScoring implements SumScoringFunction.ArbitraryEventScor

private final Map<Id<Tour>, Double> tourStartTime = new LinkedHashMap<>();

public EventBasedScoring(Carrier carrier) {
public EventBasedScoring() {
super();
this.carrier = carrier;
}

@Override public void finish() {
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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<String> vehicleTypesToBeTolled = Arrays.asList("large50");

public LinkBasedTollScoring(Carrier carrier, double toll) {
private final List<Id<Vehicle>> 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() {}
Expand All @@ -189,19 +173,17 @@ private void handleEvent(LinkEnterEvent event) {
// List<String> tolledLinkList = Arrays.asList("i(5,5)R");
List<String> 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<VehicleType> vehicleTypeId = carrier.getCarrierCapabilities().getCarrierVehicles().get(event.getVehicleId()).getType().getId();
final Id<VehicleType> 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;
}
}
}
}
}
}

0 comments on commit 3dc840a

Please sign in to comment.