1
0
Fork 0
mirror of https://github.com/graphhopper/jsprit.git synced 2020-01-24 07:45:05 +01:00

add tests and improve insertionCalc

This commit is contained in:
Stefan Schroeder 2013-08-21 17:24:31 +02:00
parent 099d01ddd8
commit 59319ff355
10 changed files with 341 additions and 198 deletions

View file

@ -165,12 +165,7 @@ final class CalculatesServiceInsertionWithTriangleInequality implements JobInser
}
private int getCurrentLoad(VehicleRoute currentRoute) {
States thisRoutesStates = routeStates.getRouteStates().get(currentRoute);
if(routeStates.getRouteStates().containsKey(currentRoute)){
int load = (int) thisRoutesStates.getState(StateTypes.LOAD).toDouble();
return load;
}
else return 0;
return (int) routeStates.getRouteState(currentRoute, StateTypes.LOAD).toDouble();
}
private void initialiseStartAndEnd(final Vehicle newVehicle, double newVehicleDepartureTime) {

View file

@ -39,11 +39,11 @@ interface StatesContainer {
Map<VehicleRoute, States> getRouteStates();
// Map<VehicleRoute, States> getRouteStates();
// void put(VehicleRoute route, States states);
Map<TourActivity, States> getActivityStates();
// Map<TourActivity, States> getActivityStates();
// void put(TourActivity act, States states);

View file

@ -28,7 +28,6 @@ class StatesContainerImpl implements StatesContainer{
private Map<TourActivity,States> activityStates = new HashMap<TourActivity, StatesContainer.States>();
@Override
public Map<VehicleRoute, States> getRouteStates() {
return Collections.unmodifiableMap(vehicleRouteStates);
}
@ -41,7 +40,6 @@ class StatesContainerImpl implements StatesContainer{
vehicleRouteStates.put(route, states);
}
@Override
public Map<TourActivity, States> getActivityStates() {
return Collections.unmodifiableMap(activityStates);
}

View file

@ -0,0 +1,218 @@
package algorithms;
import static org.junit.Assert.*;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Collection;
import java.util.Map;
import org.junit.Test;
import util.Solutions;
import util.VehicleRoutingTransportCostsMatrix;
import util.VehicleRoutingTransportCostsMatrix.Builder;
import basics.Service;
import basics.VehicleRoutingAlgorithm;
import basics.VehicleRoutingProblem;
import basics.VehicleRoutingProblem.FleetSize;
import basics.VehicleRoutingProblemSolution;
import basics.costs.VehicleRoutingTransportCosts;
import basics.route.Driver;
import basics.route.Vehicle;
import basics.route.VehicleImpl;
import basics.route.VehicleTypeImpl;
public class RefuseCollectionTest {
static class RelationKey {
static RelationKey newKey(String from, String to){
int fromInt = Integer.parseInt(from);
int toInt = Integer.parseInt(to);
if(fromInt < toInt){
return new RelationKey(from, to);
}
else {
return new RelationKey(to, from);
}
}
final String from;
final String to;
public RelationKey(String from, String to) {
super();
this.from = from;
this.to = to;
}
/* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((from == null) ? 0 : from.hashCode());
result = prime * result + ((to == null) ? 0 : to.hashCode());
return result;
}
/* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
RelationKey other = (RelationKey) obj;
if (from == null) {
if (other.from != null)
return false;
} else if (!from.equals(other.from))
return false;
if (to == null) {
if (other.to != null)
return false;
} else if (!to.equals(other.to))
return false;
return true;
}
}
static class RoutingCosts implements VehicleRoutingTransportCosts {
private Map<RelationKey,Integer> distances;
public RoutingCosts(Map<RelationKey, Integer> distances) {
super();
this.distances = distances;
}
@Override
public double getTransportTime(String fromId, String toId, double departureTime, Driver driver, Vehicle vehicle) {
return getTransportCost(fromId, toId, departureTime, driver, vehicle);
}
@Override
public double getBackwardTransportTime(String fromId, String toId, double arrivalTime, Driver driver, Vehicle vehicle) {
return getTransportCost(fromId, toId, arrivalTime, driver, vehicle);
}
@Override
public double getTransportCost(String fromId, String toId,double departureTime, Driver driver, Vehicle vehicle) {
if(fromId.equals(toId)) return 0.0;
RelationKey key = RelationKey.newKey(fromId, toId);
return distances.get(key);
}
@Override
public double getBackwardTransportCost(String fromId, String toId,double arrivalTime, Driver driver, Vehicle vehicle) {
return getTransportCost(fromId, toId, arrivalTime, driver, vehicle);
}
}
@Test
public void testAlgo(){
/*
* create vehicle-type and vehicle
*/
VehicleTypeImpl.Builder typeBuilder = VehicleTypeImpl.Builder.newInstance("vehicle-type", 23);
typeBuilder.setCostPerDistance(1.0);
VehicleTypeImpl bigType = typeBuilder.build();
VehicleImpl.Builder vehicleBuilder = VehicleImpl.Builder.newInstance("vehicle");
vehicleBuilder.setLocationId("1");
vehicleBuilder.setType(bigType);
Vehicle bigVehicle = vehicleBuilder.build();
/*
* start building the problem
*/
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
vrpBuilder.setFleetSize(FleetSize.INFINITE);
vrpBuilder.addVehicle(bigVehicle);
/*
* create cost-matrix
*/
VehicleRoutingTransportCostsMatrix.Builder matrixBuilder = VehicleRoutingTransportCostsMatrix.Builder.newInstance(true);
/*
* read demand quantities
*/
try {
readDemandQuantities(vrpBuilder);
readDistances(matrixBuilder);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
vrpBuilder.setRoutingCost(matrixBuilder.build());
VehicleRoutingProblem vrp = vrpBuilder.build();
VehicleRoutingAlgorithm vra = new GreedySchrimpfFactory().createAlgorithm(vrp);
vra.setPrematureBreak(10);
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
assertEquals(397.0,Solutions.getBest(solutions).getCost(),0.01);
assertEquals(2,Solutions.getBest(solutions).getRoutes().size());
}
private static void readDemandQuantities(VehicleRoutingProblem.Builder vrpBuilder) throws FileNotFoundException, IOException {
BufferedReader reader = new BufferedReader(new FileReader(new File("src/test/resources/refuseCollectionExample_Quantities")));
String line = null;
boolean firstLine = true;
while((line = reader.readLine()) != null){
if(firstLine) {
firstLine = false;
continue;
}
String[] lineTokens = line.split(",");
/*
* build service
*/
Service service = Service.Builder.newInstance(lineTokens[0], Integer.parseInt(lineTokens[1])).setLocationId(lineTokens[0]).build();
/*
* and add it to problem
*/
vrpBuilder.addService(service);
}
reader.close();
}
private static void readDistances(Builder matrixBuilder) throws IOException {
BufferedReader reader = new BufferedReader(new FileReader(new File("src/test/resources/refuseCollectionExample_Distances")));
String line = null;
boolean firstLine = true;
while((line = reader.readLine()) != null){
if(firstLine) {
firstLine = false;
continue;
}
String[] lineTokens = line.split(",");
matrixBuilder.addTransportDistance(lineTokens[0],lineTokens[1], Integer.parseInt(lineTokens[2]));
}
reader.close();
}
}

View file

@ -239,21 +239,21 @@ public class TestAlgorithmReader {
assertEquals(3, nOfModules);
}
@Test
public void whenCreatingAlgorithm_regretInsertionIsReadCorrectly(){
VehicleRoutingAlgorithm algo = VehicleRoutingAlgorithms.readAndCreateAlgorithm(vrp, "src/test/resources/configWithRegretInsertion.xml");
int nOfModules = 0;
for(SearchStrategy strat : algo.getSearchStrategyManager().getStrategies()){
for(SearchStrategyModule module : strat.getSearchStrategyModules()){
if(module.getName().contains("ruin_and_recreate")){
nOfModules++;
}
}
}
assertEquals(3, nOfModules);
}
// @Test
// public void whenCreatingAlgorithm_regretInsertionIsReadCorrectly(){
// VehicleRoutingAlgorithm algo = VehicleRoutingAlgorithms.readAndCreateAlgorithm(vrp, "src/test/resources/configWithRegretInsertion.xml");
// int nOfModules = 0;
// for(SearchStrategy strat : algo.getSearchStrategyManager().getStrategies()){
// for(SearchStrategyModule module : strat.getSearchStrategyModules()){
// if(module.getName().contains("ruin_and_recreate")){
// nOfModules++;
// }
// }
//
// }
// assertEquals(3, nOfModules);
//
// }
//
}

View file

@ -39,6 +39,7 @@ import basics.Service;
import basics.costs.VehicleRoutingTransportCosts;
import basics.route.Driver;
import basics.route.DriverImpl;
import basics.route.ServiceActivity;
import basics.route.TimeWindow;
import basics.route.TourActivities;
import basics.route.TourActivity;
@ -68,6 +69,8 @@ public class TestCalculatesServiceInsertionOnRouteLevel {
private NoDriver driver;
private UpdateStates updateStates;
@Before
public void setup(){
Logger.getRootLogger().setLevel(Level.DEBUG);
@ -140,15 +143,14 @@ public class TestCalculatesServiceInsertionOnRouteLevel {
jobs.add(second);
jobs.add(third);
states = new RouteStates();
states.initialiseStateOfJobs(jobs);
states = new StatesContainerImpl();
ExampleActivityCostFunction activityCosts = new ExampleActivityCostFunction();
serviceInsertion = new CalculatesServiceInsertionOnRouteLevel(costs,activityCosts);
serviceInsertion.setNuOfActsForwardLooking(4);
serviceInsertion.setActivityStates(states);
tourStateUpdater = new TourStateUpdater(states, costs, activityCosts);
updateStates = new UpdateStates(states, costs, activityCosts);
@ -165,48 +167,21 @@ public class TestCalculatesServiceInsertionOnRouteLevel {
TourActivities tour = new TourActivities();
VehicleRoute route = VehicleRoute.newInstance(tour,driver,vehicle);
tourStateUpdater.iterate(route);
updateStates.update(route);
InsertionData iData = serviceInsertion.calculate(route, first, vehicle, vehicle.getEarliestDeparture(), null, Double.MAX_VALUE);
assertEquals(20.0, iData.getInsertionCost(), 0.2);
assertEquals(0, iData.getDeliveryInsertionIndex());
}
// @Test
// public void whenInsertingTheSecondJobInAnNonEmptyTourWithVehicle_itCalculatesMarginalCostChanges(){
// TourActivities tour = new TourActivities();
// tour.addActivity(states.getActivity(first, true));
//
// VehicleRoute route = VehicleRoute.newInstance(tour,driver,vehicle);
// tourStateUpdater.updateRoute(route);
//
// InsertionData iData = serviceInsertion.calculate(route, second, vehicle, null, Double.MAX_VALUE);
// assertEquals(20.0, iData.getInsertionCost(), 0.2);
// assertEquals(1, iData.getDeliveryInsertionIndex());
// }
// @Test
// public void whenInsertingTheSecotndJobInAnNonEmptyTourWithNewVehicle_itCalculatesMarginalCostChanges(){
// TourActivities tour = new TourActivities();
// tour.addActivity(states.getActivity(first, true));
//
// VehicleRoute route = VehicleRoute.newInstance(tour,driver,vehicle);
// tourStateUpdater.updateRoute(route);
//
// InsertionData iData = serviceInsertion.calculate(route, second, newVehicle, null, Double.MAX_VALUE);
// assertEquals(40.0, iData.getInsertionCost(), 0.2);
// assertEquals(1, iData.getDeliveryInsertionIndex());
// }
@Test
public void whenInsertingThirdJobWithVehicle_itCalculatesMarginalCostChanges(){
TourActivities tour = new TourActivities();
tour.addActivity(states.getActivity(first,true));
tour.addActivity(states.getActivity(second,true));
tour.addActivity(ServiceActivity.newInstance(first));
tour.addActivity(ServiceActivity.newInstance(second));
VehicleRoute route = VehicleRoute.newInstance(tour,driver,vehicle);
tourStateUpdater.iterate(route);
updateStates.update(route);
InsertionData iData = serviceInsertion.calculate(route, third, vehicle, vehicle.getEarliestDeparture(), null, Double.MAX_VALUE);
assertEquals(0.0, iData.getInsertionCost(), 0.2);
@ -216,12 +191,11 @@ public class TestCalculatesServiceInsertionOnRouteLevel {
@Test
public void whenInsertingThirdJobWithNewVehicle_itCalculatesMarginalCostChanges(){
TourActivities tour = new TourActivities();
tour.addActivity(states.getActivity(first,true));
tour.addActivity(states.getActivity(second,true));
tour.addActivity(ServiceActivity.newInstance(first));
tour.addActivity(ServiceActivity.newInstance(second));
VehicleRoute route = VehicleRoute.newInstance(tour,driver,vehicle);
tourStateUpdater.iterate(route);
updateStates.update(route);
InsertionData iData = serviceInsertion.calculate(route, third, newVehicle, vehicle.getEarliestDeparture(), null, Double.MAX_VALUE);
assertEquals(40.0, iData.getInsertionCost(), 0.2);
@ -231,11 +205,11 @@ public class TestCalculatesServiceInsertionOnRouteLevel {
@Test
public void whenInsertingASecondJobWithAVehicle_itCalculatesLocalMarginalCostChanges(){
TourActivities tour = new TourActivities();
tour.addActivity(states.getActivity(first,true));
tour.addActivity(states.getActivity(third,true));
tour.addActivity(ServiceActivity.newInstance(first));
tour.addActivity(ServiceActivity.newInstance(third));
VehicleRoute route = VehicleRoute.newInstance(tour,driver,vehicle);
tourStateUpdater.iterate(route);
updateStates.update(route);
InsertionData iData = serviceInsertion.calculate(route, second, vehicle, vehicle.getEarliestDeparture(), null, Double.MAX_VALUE);
assertEquals(0.0, iData.getInsertionCost(), 0.2);
@ -245,30 +219,15 @@ public class TestCalculatesServiceInsertionOnRouteLevel {
@Test
public void whenInsertingASecondJobWithANewVehicle_itCalculatesLocalMarginalCostChanges(){
TourActivities tour = new TourActivities();
tour.addActivity(states.getActivity(first,true));
tour.addActivity(states.getActivity(third,true));
tour.addActivity(ServiceActivity.newInstance(first));
tour.addActivity(ServiceActivity.newInstance(third));
VehicleRoute route = VehicleRoute.newInstance(tour,driver,vehicle);
tourStateUpdater.iterate(route);
updateStates.update(route);
InsertionData iData = serviceInsertion.calculate(route, second, newVehicle, vehicle.getEarliestDeparture(), null, Double.MAX_VALUE);
assertEquals(40.0, iData.getInsertionCost(), 0.2);
assertEquals(2, iData.getDeliveryInsertionIndex());
}
// @Test
// public void whenInsertingFirstJobWithANewVehicle_itCalculatesLocalMarginalCostChanges(){
// TourActivities tour = new TourActivities();
// tour.addActivity(states.getActivity(third,true));
// tour.addActivity(states.getActivity(second,true));
//
// VehicleRoute route = VehicleRoute.newInstance(tour,driver,vehicle);
// tourStateUpdater.updateRoute(route);
//
// InsertionData iData = serviceInsertion.calculate(route, second, newVehicle, null, Double.MAX_VALUE);
// assertEquals(40.0, iData.getInsertionCost(), 0.2);
// assertEquals(2, iData.getDeliveryInsertionIndex());
// }
}

View file

@ -32,6 +32,7 @@ import basics.Service;
import basics.costs.VehicleRoutingTransportCosts;
import basics.route.Driver;
import basics.route.DriverImpl;
import basics.route.ServiceActivity;
import basics.route.TimeWindow;
import basics.route.TourActivities;
import basics.route.Vehicle;
@ -51,9 +52,9 @@ public class TestTourStateUpdaterWithService {
TourActivities anotherTour;
TourStateUpdater tdTourStatusProcessor;
UpdateStates updateStates;
RouteStates states;
StatesContainerImpl states;
private VehicleRoute vehicleRoute;
@ -100,33 +101,32 @@ public class TestTourStateUpdaterWithService {
services.add(firstService);
services.add(secondService);
states = new RouteStates();
states.initialiseStateOfJobs(services);
states = new StatesContainerImpl();
VehicleTypeImpl type = VehicleTypeImpl.Builder.newInstance("test", 0).build();
vehicle = VehicleImpl.Builder.newInstance("testvehicle").setType(type).setLocationId("0,0")
.setEarliestStart(0.0).setLatestArrival(50.0).build();
tour = new TourActivities();
tour.addActivity(states.getActivity(firstService,true));
tour.addActivity(states.getActivity(secondService,true));
tour.addActivity(ServiceActivity.newInstance(firstService));
tour.addActivity(ServiceActivity.newInstance(secondService));
tdTourStatusProcessor = new TourStateUpdater(states, cost, new ExampleActivityCostFunction());
updateStates = new UpdateStates(states, cost, new ExampleActivityCostFunction());
vehicleRoute = VehicleRoute.newInstance(tour,DriverImpl.noDriver(),vehicle);
}
@Test
public void testCalculatedCost() {
tdTourStatusProcessor.iterate(vehicleRoute);
assertEquals(40.0, states.getRouteState(vehicleRoute).getCosts(), 0.05);
assertEquals(10, states.getRouteState(vehicleRoute).getLoad());
updateStates.update(vehicleRoute);
assertEquals(40.0, states.getRouteState(vehicleRoute,StateTypes.COSTS).toDouble(), 0.05);
assertEquals(10, states.getRouteState(vehicleRoute, StateTypes.LOAD).toDouble(), 0.05);
}
@Test
public void testStatesOfAct0(){
tdTourStatusProcessor.iterate(vehicleRoute);
updateStates.update(vehicleRoute);
assertEquals(0.0, vehicleRoute.getStart().getEndTime(),0.05);
assertEquals(vehicleRoute.getVehicle().getLocationId(), vehicleRoute.getStart().getLocationId());
assertEquals(vehicleRoute.getVehicle().getEarliestDeparture(), vehicleRoute.getStart().getTheoreticalEarliestOperationStartTime(),0.05);
@ -136,112 +136,31 @@ public class TestTourStateUpdaterWithService {
@Test
public void testStatesOfAct1(){
tdTourStatusProcessor.iterate(vehicleRoute);
assertEquals(10.0, states.getState(tour.getActivities().get(0)).getCurrentCost(),0.05);
assertEquals(5.0, states.getState(tour.getActivities().get(0)).getCurrentLoad(),0.05);
assertEquals(10.0, states.getState(tour.getActivities().get(0)).getEarliestOperationStart(),0.05);
assertEquals(20.0, states.getState(tour.getActivities().get(0)).getLatestOperationStart(),0.05);
updateStates.update(vehicleRoute);
assertEquals(10.0, states.getActivityState(tour.getActivities().get(0), StateTypes.COSTS).toDouble(),0.05);
assertEquals(5.0, states.getActivityState(tour.getActivities().get(0), StateTypes.LOAD).toDouble(),0.05);
// assertEquals(10.0, states.getActivityState(tour.getActivities().get(0), StateTypes.EARLIEST_OPERATION_START_TIME).toDouble(),0.05);
assertEquals(20.0, states.getActivityState(tour.getActivities().get(0), StateTypes.LATEST_OPERATION_START_TIME).toDouble(),0.05);
}
@Test
public void testStatesOfAct2(){
tdTourStatusProcessor.iterate(vehicleRoute);
assertEquals(30.0, states.getState(tour.getActivities().get(1)).getCurrentCost(),0.05);
assertEquals(10.0, states.getState(tour.getActivities().get(1)).getCurrentLoad(),0.05);
assertEquals(30.0, states.getState(tour.getActivities().get(1)).getEarliestOperationStart(),0.05);
assertEquals(40.0, states.getState(tour.getActivities().get(1)).getLatestOperationStart(),0.05);
updateStates.update(vehicleRoute);
assertEquals(30.0, states.getActivityState(tour.getActivities().get(1), StateTypes.COSTS).toDouble(),0.05);
assertEquals(10.0, states.getActivityState(tour.getActivities().get(1), StateTypes.LOAD).toDouble(),0.05);
// assertEquals(10.0, states.getActivityState(tour.getActivities().get(0), StateTypes.EARLIEST_OPERATION_START_TIME).toDouble(),0.05);
assertEquals(40.0, states.getActivityState(tour.getActivities().get(1), StateTypes.LATEST_OPERATION_START_TIME).toDouble(),0.05);
}
@Test
public void testStatesOfAct3(){
tdTourStatusProcessor.iterate(vehicleRoute);
assertEquals(40.0, states.getRouteState(vehicleRoute).getCosts(), 0.05);
updateStates.update(vehicleRoute);
assertEquals(40.0, states.getRouteState(vehicleRoute, StateTypes.COSTS).toDouble(), 0.05);
assertEquals(40.0, vehicleRoute.getEnd().getEndTime(),0.05);
assertEquals(50.0, vehicleRoute.getEnd().getTheoreticalLatestOperationStartTime(),0.05);
}
// public void testEarliestArrStart() {
// tdTourStatusProcessor.calculate(tour, vehicle, driver);
// assertEquals(0.0, tour.getActivities().get(0)
// .getEarliestOperationStartTime());
// }
//
// public void testLatestArrStart() {
// tdTourStatusProcessor.calculate(tour, vehicle, driver);
// assertEquals(0.0, tour.getActivities().get(0)
// .getLatestOperationStartTime());
// }
//
// public void testEarliestArrAtFirstPickup() {
// tdTourStatusProcessor.calculate(tour, vehicle, driver);
// assertEquals(10.0, tour.getActivities().get(1)
// .getEarliestOperationStartTime());
// }
//
// public void testEarliestArrAtFirstPickupWithTDCost() {
// tdTourStatusProcessor.calculate(tour, vehicle, driver);
// assertEquals(10.0, tour.getActivities().get(1)
// .getEarliestOperationStartTime());
// }
//
// public void testLatestArrAtFirstPickup() {
// tdTourStatusProcessor.calculate(tour, vehicle, driver);
// assertEquals(10.0, tour.getActivities().get(1)
// .getLatestOperationStartTime());
// }
//
// public void testLatestArrAtFirstPickupWithTDCost() {
// tdTourStatusProcessor.calculate(tour, vehicle, driver);
// assertEquals(12.0, tour.getActivities().get(1)
// .getLatestOperationStartTime());
// }
//
// public void testEarliestArrAtSecondPickup() {
// tdTourStatusProcessor.calculate(tour, vehicle, driver);
// assertEquals(30.0, tour.getActivities().get(2)
// .getEarliestOperationStartTime());
// }
//
// public void testEarliestArrAtSecondPickupWithTDCosts() {
// tdTourStatusProcessor.calculate(tour, vehicle, driver);
// assertEquals(30.0, tour.getActivities().get(2)
// .getEarliestOperationStartTime());
// }
//
// public void testLatestArrAtSecondPickup() {
// tdTourStatusProcessor.calculate(tour, vehicle, driver);
// assertEquals(30.0, tour.getActivities().get(2)
// .getLatestOperationStartTime());
// }
//
// public void testLatestArrAtSecondPickupWithTDCosts() {
// tdTourStatusProcessor.calculate(tour, vehicle, driver);
// assertEquals(30.0, tour.getActivities().get(2)
// .getLatestOperationStartTime());
// }
//
// public void testEarliestArrAtEnd() {
// tdTourStatusProcessor.calculate(tour, vehicle, driver);
// assertEquals(40.0, tour.getActivities().get(5)
// .getEarliestOperationStartTime());
// }
//
// public void testEarliestArrAtEndWithTDCosts() {
// tdTourStatusProcessor.calculate(tour, vehicle, driver);
// assertEquals(35.0, tour.getActivities().get(5)
// .getEarliestOperationStartTime());
// }
//
// public void testLatestArrAtEnd() {
// tdTourStatusProcessor.calculate(tour, vehicle, driver);
// assertEquals(Double.MAX_VALUE, tour.getActivities().get(5)
// .getLatestOperationStartTime());
// }
//
// public void testLatestArrAtEndWithTDCosts() {
// tdTourStatusProcessor.calculate(tour, vehicle, driver);
// assertEquals(Double.MAX_VALUE, tour.getActivities().get(5)
// .getLatestOperationStartTime());
// }
}

View file

@ -0,0 +1,46 @@
from,to,distance
1,2,25
1,3,43
1,4,57
1,5,43
1,6,61
1,7,29
1,8,41
1,9,48
1,10,71
2,3,29
2,4,34
2,5,43
2,6,68
2,7,49
2,8,66
2,9,48
2,10,91
3,4,52
3,5,72
3,6,96
3,7,72
3,8,81
3,9,89
3,10,114
4,5,45
4,6,71
4,7,71
4,8,95
4,9,99
4,10,108
5,6,27
5,7,36
5,8,65
5,9,65
5,10,65
6,7,40
6,8,66
6,9,62
6,10,46
7,8,31
7,9,31
7,10,43
8,9,11
8,10,46
9,10,36

View file

@ -0,0 +1,10 @@
node,quantity
2,4
3,6
4,5
5,4
6,7
7,3
8,5
9,4
10,4