Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Development of small scale commercial traffic & Move CarrierAnalysis to the freight contrib #3514

Merged
merged 68 commits into from
Oct 17, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
a35df06
update TODOS
rewertvsp Aug 29, 2024
97614b5
change service timeWindow
rewertvsp Aug 29, 2024
7ce25ff
Outsourced VehicleSelection and GetGenerationRates
Aleksander1234519 Sep 4, 2024
90085fe
Implemented Allocator to resolve service duration problem (untested)
Aleksander1234519 Sep 4, 2024
5bdb4c8
Resolved null error
Aleksander1234519 Sep 5, 2024
a173fd1
Fixed jspritIteration value-initialization bug
Aleksander1234519 Sep 5, 2024
b2b7b85
Merge branch 'refs/heads/master' into developmentOfSmallScaleCommerci…
rewertvsp Sep 10, 2024
8627fa3
change inputs of class by using globFile
rewertvsp Sep 10, 2024
14d70ad
add carrier analysis to small scale commercial generation
rewertvsp Sep 10, 2024
c3fcf76
format log massages
rewertvsp Sep 12, 2024
3555b3f
add more general carrier analysis
rewertvsp Sep 12, 2024
b70c482
clean up
rewertvsp Sep 12, 2024
f2a1875
update carrier_stats to new version
rewertvsp Sep 12, 2024
95dd98c
update carrier_stats to new version
rewertvsp Sep 12, 2024
a938a6f
Created a viability assurance for carrier plans with small vehicle fleet
Aleksander1234519 Sep 17, 2024
2a36f1f
Merge remote-tracking branch 'origin/developmentOfSmallScaleCommercia…
Aleksander1234519 Sep 17, 2024
0e0bc7f
Put the carrier-creation back into the main class
Aleksander1234519 Sep 17, 2024
696fd64
Outsourced VehicleSelection
Aleksander1234519 Sep 17, 2024
292327e
Specified event-classes
Aleksander1234519 Sep 17, 2024
83de8be
Refactored carrier-analysis and created tests
Aleksander1234519 Sep 18, 2024
9ec7243
Resolved FileSystemError
Aleksander1234519 Sep 18, 2024
43f116e
add TODO
rewertvsp Sep 19, 2024
cceee21
change pom for freight analysis
rewertvsp Sep 19, 2024
79db689
add two additional constructors and add separate carriers only analysis
rewertvsp Sep 19, 2024
016cf47
removed copied files to move the original files afterward
rewertvsp Sep 19, 2024
979dd02
update simple tests
rewertvsp Sep 19, 2024
7d1d2cc
make class independent of application contrib
rewertvsp Sep 19, 2024
3627d9d
move freight analysis into freight contrib
rewertvsp Sep 19, 2024
69cb4c1
Merge branch 'refs/heads/master' into developmentOfSmallScaleCommerci…
rewertvsp Sep 19, 2024
8eb44a5
add buffer try catch
rewertvsp Sep 19, 2024
8389cab
add comments
rewertvsp Sep 19, 2024
6b4bb3d
add number of not handled jobs
rewertvsp Sep 19, 2024
9fe1900
formatting
rewertvsp Sep 19, 2024
0bcef4e
use the current analysis version
rewertvsp Sep 19, 2024
37c8d5a
use delimiter and add comment
rewertvsp Sep 19, 2024
75b5a9b
update file for new carrier analysis
rewertvsp Sep 19, 2024
a6ec150
update file for new carrier analysis
rewertvsp Sep 19, 2024
5555782
use configurable delimiter for all classes
rewertvsp Sep 19, 2024
41dfb99
formatting
rewertvsp Sep 23, 2024
2c804c9
change parameters of method
rewertvsp Sep 24, 2024
9740e12
add possible solution for serviceTime selection
rewertvsp Sep 24, 2024
5f36d3e
add TODO
rewertvsp Sep 24, 2024
f3f77e9
renamed variables
Aleksander1234519 Sep 24, 2024
f593eeb
Merge branch 'refs/heads/master' into developmentOfSmallScaleCommerci…
rewertvsp Sep 24, 2024
5090ae2
Merge remote-tracking branch 'origin/developmentOfSmallScaleCommercia…
Aleksander1234519 Sep 25, 2024
6fa87bb
Implemented the replanning loop (still not fully working)
Aleksander1234519 Sep 25, 2024
eeee11d
restructure commercial specification interface
rewertvsp Sep 30, 2024
a004cd4
formatting
rewertvsp Sep 30, 2024
8ff8b7f
rename method
rewertvsp Sep 30, 2024
9ac0810
formatting
rewertvsp Sep 30, 2024
31d74aa
rename
rewertvsp Sep 30, 2024
605c7f6
add current version of solving all carriers
rewertvsp Sep 30, 2024
268189c
Merge branch 'refs/heads/master' into developmentOfSmallScaleCommerci…
rewertvsp Sep 30, 2024
f6d6a9c
use new CarrierUtils method
rewertvsp Sep 30, 2024
14c7e8c
Updated reference events file in test
Aleksander1234519 Oct 2, 2024
e7aa7ce
Removed old code/comments
Aleksander1234519 Oct 2, 2024
c6d634d
Moved odMatrix, resultingDataPerZone, linksPerZone into class attribu…
Aleksander1234519 Oct 2, 2024
aab4022
Javadoc and formatting
Aleksander1234519 Oct 2, 2024
9a08faa
Outsourced methods for unhandled-services into UnhandledServicesSolution
Aleksander1234519 Oct 8, 2024
1d53511
minor fixes
Aleksander1234519 Oct 8, 2024
9f62ecc
Merge branch 'refs/heads/master' into developmentOfSmallScaleCommerci…
rewertvsp Oct 15, 2024
742543a
updates tests for freight analysis to use more example inputs
rewertvsp Oct 17, 2024
73f37a9
formatting
rewertvsp Oct 17, 2024
ef170bf
Merge branch 'refs/heads/master' into developmentOfSmallScaleCommerci…
rewertvsp Oct 17, 2024
f26a08b
reduce iterations for test
rewertvsp Oct 17, 2024
abff745
try to fix test
rewertvsp Oct 17, 2024
7881ec1
remove usage of path to fix tests
rewertvsp Oct 17, 2024
6b1bc72
use new analysis version
rewertvsp Oct 17, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions contribs/freight/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,14 @@
<version>2025.0-SNAPSHOT</version>
</dependency>


<!-- Needed for freight analysis, but is currently not possible because of circle dependency with Application-->
<!-- <dependency>-->
<!-- <groupId>org.matsim.contrib</groupId>-->
<!-- <artifactId>application</artifactId>-->
<!-- <version>2025.0-SNAPSHOT</version>-->
<!-- </dependency>-->

<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,18 +25,19 @@
import org.apache.logging.log4j.Logger;
import org.matsim.api.core.v01.Id;
import org.matsim.api.core.v01.Scenario;
import org.matsim.api.core.v01.events.Event;
import org.matsim.freight.carriers.Carriers;
import org.matsim.freight.carriers.events.CarrierShipmentDeliveryStartEvent;
import org.matsim.freight.carriers.events.CarrierShipmentPickupStartEvent;
import org.matsim.core.events.handler.BasicEventHandler;
import org.matsim.freight.carriers.events.eventhandler.CarrierShipmentDeliveryStartEventHandler;
import org.matsim.freight.carriers.events.eventhandler.CarrierShipmentPickupStartEventHandler;
import org.matsim.vehicles.Vehicle;
import org.matsim.vehicles.VehicleType;
import org.matsim.vehicles.VehicleUtils;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Path;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.LinkedList;
Expand All @@ -47,27 +48,21 @@
/**
* @author Kai Martins-Turner (kturner)
*/
public class CarrierLoadAnalysis implements BasicEventHandler {
public class CarrierLoadAnalysis implements CarrierShipmentPickupStartEventHandler, CarrierShipmentDeliveryStartEventHandler {

private static final Logger log = LogManager.getLogger(CarrierLoadAnalysis.class);

private final String delimiter;
Carriers carriers;

private final Map<Id<Vehicle>, LinkedList<Integer>> vehicle2Load = new LinkedHashMap<>();

public CarrierLoadAnalysis(Carriers carriers) {
public CarrierLoadAnalysis(String delimiter, Carriers carriers) {
this.delimiter = delimiter;
this.carriers = carriers;
}

@Override public void handleEvent(Event event) {
if (event.getEventType().equals(CarrierShipmentPickupStartEvent.EVENT_TYPE)) {
handlePickup( event);
} if (event.getEventType().equals(CarrierShipmentDeliveryStartEvent.EVENT_TYPE)) {
handleDelivery(event);
}
}

private void handlePickup(Event event) {
@Override
public void handleEvent(CarrierShipmentPickupStartEvent event) {
Id<Vehicle> vehicleId = Id.createVehicleId(event.getAttributes().get("vehicle"));
Integer demand = Integer.valueOf(event.getAttributes().get(ATTRIBUTE_CAPACITYDEMAND));

Expand All @@ -82,8 +77,8 @@ private void handlePickup(Event event) {
vehicle2Load.put(vehicleId, list);
}


private void handleDelivery(Event event) {
@Override
public void handleEvent(CarrierShipmentDeliveryStartEvent event) {
Id<Vehicle> vehicleId = Id.createVehicleId(event.getAttributes().get("vehicle"));
Integer demand = Integer.valueOf(event.getAttributes().get(ATTRIBUTE_CAPACITYDEMAND));

Expand All @@ -95,12 +90,15 @@ private void handleDelivery(Event event) {
void writeLoadPerVehicle(String analysisOutputDirectory, Scenario scenario) throws IOException {
log.info("Writing out vehicle load analysis ...");
//Load per vehicle
String fileName = analysisOutputDirectory + "Load_perVehicle.tsv";
String fileName = Path.of(analysisOutputDirectory).resolve("Load_perVehicle.tsv").toString();

BufferedWriter bw1 = new BufferedWriter(new FileWriter(fileName));

//Write headline:
bw1.write("vehicleId \t capacity \t maxLoad \t load state during tour");
bw1.write(String.join(delimiter,"vehicleId",
"capacity",
"maxLoad",
"load state during tour"));
bw1.newLine();

for (Id<Vehicle> vehicleId : vehicle2Load.keySet()) {
Expand All @@ -112,13 +110,13 @@ void writeLoadPerVehicle(String analysisOutputDirectory, Scenario scenario) thro
final Double capacity = vehicleType.getCapacity().getOther();

bw1.write(vehicleId.toString());
bw1.write("\t" + capacity);
bw1.write("\t" + maxLoad);
bw1.write("\t" + load);
bw1.write(delimiter + capacity);
bw1.write(delimiter + maxLoad);
bw1.write(delimiter + load);
bw1.newLine();
}

bw1.close();
log.info("Output written to " + fileName);
log.info("Output written to {}", fileName);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
/*
* *********************************************************************** *
* project: org.matsim.*
* *********************************************************************** *
* *
* copyright : (C) by the members listed in the COPYING, *
* LICENSE and WARRANTY file. *
* email : info at matsim dot org *
* *
* *********************************************************************** *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* See also COPYING, LICENSE and WARRANTY file *
* *
* ***********************************************************************
*
*/

package org.matsim.freight.carriers.analysis;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.matsim.api.core.v01.Id;
import org.matsim.core.utils.misc.Time;
import org.matsim.freight.carriers.*;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Path;
import java.util.TreeMap;

/**
* Some basic analysis / data collection for {@link Carriers}(files)
* <p></p>
* For all carriers it writes out the:
* - score of the selected plan
* - number of tours (= vehicles) of the selected plan
* - number of Services (input)
* - number of Services (handled)
* - number of shipments (input)
* - number of shipments (handled)
* - number of not handled jobs
* - number of planned demand size
* - number of handled demand size
* to a tsv-file.
*
* @author Kai Martins-Turner (kturner), Ricardo Ewert
*/
public class CarrierPlanAnalysis {

private static final Logger log = LogManager.getLogger(CarrierPlanAnalysis.class);
public final String delimiter;

Carriers carriers;

public CarrierPlanAnalysis(String delimiter, Carriers carriers) {
this.delimiter = delimiter;
this.carriers = carriers;
}

public void runAnalysisAndWriteStats(String analysisOutputDirectory) throws IOException {
log.info("Writing out carrier analysis ...");
//Load per vehicle
String fileName = Path.of(analysisOutputDirectory).resolve("Carrier_stats.tsv").toString();

try (BufferedWriter bw1 = new BufferedWriter(new FileWriter(fileName))) {

//Write headline:
bw1.write(String.join(delimiter,
"carrierId",
"MATSimScoreSelectedPlan",
"jSpritScoreSelectedPlan",
"nuOfTours",
"nuOfShipments(input)",
"nuOfShipments(handled)",
"nuOfServices(input)",
"nuOfServices(handled)",
"noOfNotHandledJobs",
"nuOfPlanedDemandSize",
"nuOfHandledDemandSize",
"jspritComputationTime[HH:mm:ss]"
));
bw1.newLine();

final TreeMap<Id<Carrier>, Carrier> sortedCarrierMap = new TreeMap<>(carriers.getCarriers());

for (Carrier carrier : sortedCarrierMap.values()) {

int numberOfPlanedShipments = carrier.getShipments().size();
int numberOfPlanedServices = carrier.getServices().size();
int numberOfHandledPickups = (int) carrier.getSelectedPlan().getScheduledTours().stream().mapToDouble(
t -> t.getTour().getTourElements().stream().filter(te -> te instanceof Tour.Pickup).count()).sum();
int numberOfHandledDeliveries = (int) carrier.getSelectedPlan().getScheduledTours().stream().mapToDouble(
t -> t.getTour().getTourElements().stream().filter(te -> te instanceof Tour.Delivery).count()).sum();
int nuOfServiceHandled = (int) carrier.getSelectedPlan().getScheduledTours().stream().mapToDouble(
t -> t.getTour().getTourElements().stream().filter(te -> te instanceof Tour.ServiceActivity).count()).sum();
int numberOfPlanedDemandSize;
int numberOfHandledDemandSize;
int notHandledJobs;
if (numberOfPlanedShipments > 0) {
numberOfPlanedDemandSize = carrier.getShipments().values().stream().mapToInt(CarrierShipment::getSize).sum();
numberOfHandledDemandSize = carrier.getSelectedPlan().getScheduledTours().stream().mapToInt(
t -> t.getTour().getTourElements().stream().filter(te -> te instanceof Tour.Pickup).mapToInt(
te -> (((Tour.Pickup) te).getShipment().getSize())).sum()).sum();
notHandledJobs = numberOfPlanedShipments - numberOfHandledPickups;
} else {
numberOfPlanedDemandSize = carrier.getServices().values().stream().mapToInt(CarrierService::getCapacityDemand).sum();
numberOfHandledDemandSize = carrier.getSelectedPlan().getScheduledTours().stream().mapToInt(
t -> t.getTour().getTourElements().stream().filter(te -> te instanceof Tour.ServiceActivity).mapToInt(
te -> ((Tour.ServiceActivity) te).getService().getCapacityDemand()).sum()).sum();
notHandledJobs = numberOfPlanedServices - nuOfServiceHandled;
}

if (numberOfPlanedServices != nuOfServiceHandled) {
log.warn("Number of services in input and handled are not equal for carrier {}. Jobs Input: {}, Jobs Handled: {}",
carrier.getId(), numberOfPlanedServices, nuOfServiceHandled);
}
if (numberOfPlanedShipments != numberOfHandledPickups) {
log.warn("Number of shipments in input and handled are not equal for carrier {}. Jobs Input: {}, Jobs Handled: {}",
carrier.getId(), numberOfPlanedShipments, numberOfHandledPickups);
}
if (numberOfHandledDeliveries != numberOfHandledPickups) {
log.warn(
"Number of handled pickups and deliveries are not equal for carrier {}. Pickups: {}, Deliveries: {}. This should not happen!!",
carrier.getId(), numberOfHandledPickups, numberOfHandledDeliveries);
}
bw1.write(carrier.getId().toString());
bw1.write(delimiter + carrier.getSelectedPlan().getScore());
bw1.write(delimiter + carrier.getSelectedPlan().getJspritScore());
bw1.write(delimiter + carrier.getSelectedPlan().getScheduledTours().size());
bw1.write(delimiter + numberOfPlanedShipments);
bw1.write(delimiter + numberOfHandledPickups);
bw1.write(delimiter + numberOfPlanedServices);
bw1.write(delimiter + nuOfServiceHandled);
bw1.write(delimiter + notHandledJobs);
bw1.write(delimiter + numberOfPlanedDemandSize);
bw1.write(delimiter + numberOfHandledDemandSize);
if (CarriersUtils.getJspritComputationTime(carrier) != Integer.MIN_VALUE)
bw1.write(delimiter + Time.writeTime(CarriersUtils.getJspritComputationTime(carrier), Time.TIMEFORMAT_HHMMSS));
else
bw1.write(delimiter + "null");

bw1.newLine();
}

bw1.close();
log.info("Output written to {}", fileName);
} catch (IOException e) {
log.error("Error writing output to file: {}", fileName);
throw e;
}
}
}
Loading
Loading