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:
parent
099d01ddd8
commit
59319ff355
10 changed files with 341 additions and 198 deletions
|
|
@ -165,12 +165,7 @@ final class CalculatesServiceInsertionWithTriangleInequality implements JobInser
|
||||||
}
|
}
|
||||||
|
|
||||||
private int getCurrentLoad(VehicleRoute currentRoute) {
|
private int getCurrentLoad(VehicleRoute currentRoute) {
|
||||||
States thisRoutesStates = routeStates.getRouteStates().get(currentRoute);
|
return (int) routeStates.getRouteState(currentRoute, StateTypes.LOAD).toDouble();
|
||||||
if(routeStates.getRouteStates().containsKey(currentRoute)){
|
|
||||||
int load = (int) thisRoutesStates.getState(StateTypes.LOAD).toDouble();
|
|
||||||
return load;
|
|
||||||
}
|
|
||||||
else return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void initialiseStartAndEnd(final Vehicle newVehicle, double newVehicleDepartureTime) {
|
private void initialiseStartAndEnd(final Vehicle newVehicle, double newVehicleDepartureTime) {
|
||||||
|
|
|
||||||
|
|
@ -39,11 +39,11 @@ interface StatesContainer {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Map<VehicleRoute, States> getRouteStates();
|
// Map<VehicleRoute, States> getRouteStates();
|
||||||
|
|
||||||
// void put(VehicleRoute route, States states);
|
// void put(VehicleRoute route, States states);
|
||||||
|
|
||||||
Map<TourActivity, States> getActivityStates();
|
// Map<TourActivity, States> getActivityStates();
|
||||||
|
|
||||||
// void put(TourActivity act, States states);
|
// void put(TourActivity act, States states);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,6 @@ class StatesContainerImpl implements StatesContainer{
|
||||||
|
|
||||||
private Map<TourActivity,States> activityStates = new HashMap<TourActivity, StatesContainer.States>();
|
private Map<TourActivity,States> activityStates = new HashMap<TourActivity, StatesContainer.States>();
|
||||||
|
|
||||||
@Override
|
|
||||||
public Map<VehicleRoute, States> getRouteStates() {
|
public Map<VehicleRoute, States> getRouteStates() {
|
||||||
return Collections.unmodifiableMap(vehicleRouteStates);
|
return Collections.unmodifiableMap(vehicleRouteStates);
|
||||||
}
|
}
|
||||||
|
|
@ -41,7 +40,6 @@ class StatesContainerImpl implements StatesContainer{
|
||||||
vehicleRouteStates.put(route, states);
|
vehicleRouteStates.put(route, states);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public Map<TourActivity, States> getActivityStates() {
|
public Map<TourActivity, States> getActivityStates() {
|
||||||
return Collections.unmodifiableMap(activityStates);
|
return Collections.unmodifiableMap(activityStates);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
218
jsprit-core/src/test/java/algorithms/RefuseCollectionTest.java
Normal file
218
jsprit-core/src/test/java/algorithms/RefuseCollectionTest.java
Normal 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();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -239,21 +239,21 @@ public class TestAlgorithmReader {
|
||||||
assertEquals(3, nOfModules);
|
assertEquals(3, nOfModules);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
// @Test
|
||||||
public void whenCreatingAlgorithm_regretInsertionIsReadCorrectly(){
|
// public void whenCreatingAlgorithm_regretInsertionIsReadCorrectly(){
|
||||||
VehicleRoutingAlgorithm algo = VehicleRoutingAlgorithms.readAndCreateAlgorithm(vrp, "src/test/resources/configWithRegretInsertion.xml");
|
// VehicleRoutingAlgorithm algo = VehicleRoutingAlgorithms.readAndCreateAlgorithm(vrp, "src/test/resources/configWithRegretInsertion.xml");
|
||||||
int nOfModules = 0;
|
// int nOfModules = 0;
|
||||||
for(SearchStrategy strat : algo.getSearchStrategyManager().getStrategies()){
|
// for(SearchStrategy strat : algo.getSearchStrategyManager().getStrategies()){
|
||||||
for(SearchStrategyModule module : strat.getSearchStrategyModules()){
|
// for(SearchStrategyModule module : strat.getSearchStrategyModules()){
|
||||||
if(module.getName().contains("ruin_and_recreate")){
|
// if(module.getName().contains("ruin_and_recreate")){
|
||||||
nOfModules++;
|
// nOfModules++;
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
}
|
// }
|
||||||
assertEquals(3, nOfModules);
|
// assertEquals(3, nOfModules);
|
||||||
|
//
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -39,6 +39,7 @@ import basics.Service;
|
||||||
import basics.costs.VehicleRoutingTransportCosts;
|
import basics.costs.VehicleRoutingTransportCosts;
|
||||||
import basics.route.Driver;
|
import basics.route.Driver;
|
||||||
import basics.route.DriverImpl;
|
import basics.route.DriverImpl;
|
||||||
|
import basics.route.ServiceActivity;
|
||||||
import basics.route.TimeWindow;
|
import basics.route.TimeWindow;
|
||||||
import basics.route.TourActivities;
|
import basics.route.TourActivities;
|
||||||
import basics.route.TourActivity;
|
import basics.route.TourActivity;
|
||||||
|
|
@ -68,6 +69,8 @@ public class TestCalculatesServiceInsertionOnRouteLevel {
|
||||||
|
|
||||||
private NoDriver driver;
|
private NoDriver driver;
|
||||||
|
|
||||||
|
private UpdateStates updateStates;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setup(){
|
public void setup(){
|
||||||
Logger.getRootLogger().setLevel(Level.DEBUG);
|
Logger.getRootLogger().setLevel(Level.DEBUG);
|
||||||
|
|
@ -140,15 +143,14 @@ public class TestCalculatesServiceInsertionOnRouteLevel {
|
||||||
jobs.add(second);
|
jobs.add(second);
|
||||||
jobs.add(third);
|
jobs.add(third);
|
||||||
|
|
||||||
states = new RouteStates();
|
states = new StatesContainerImpl();
|
||||||
states.initialiseStateOfJobs(jobs);
|
|
||||||
|
|
||||||
ExampleActivityCostFunction activityCosts = new ExampleActivityCostFunction();
|
ExampleActivityCostFunction activityCosts = new ExampleActivityCostFunction();
|
||||||
serviceInsertion = new CalculatesServiceInsertionOnRouteLevel(costs,activityCosts);
|
serviceInsertion = new CalculatesServiceInsertionOnRouteLevel(costs,activityCosts);
|
||||||
serviceInsertion.setNuOfActsForwardLooking(4);
|
serviceInsertion.setNuOfActsForwardLooking(4);
|
||||||
serviceInsertion.setActivityStates(states);
|
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();
|
TourActivities tour = new TourActivities();
|
||||||
|
|
||||||
VehicleRoute route = VehicleRoute.newInstance(tour,driver,vehicle);
|
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);
|
InsertionData iData = serviceInsertion.calculate(route, first, vehicle, vehicle.getEarliestDeparture(), null, Double.MAX_VALUE);
|
||||||
assertEquals(20.0, iData.getInsertionCost(), 0.2);
|
assertEquals(20.0, iData.getInsertionCost(), 0.2);
|
||||||
assertEquals(0, iData.getDeliveryInsertionIndex());
|
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
|
@Test
|
||||||
public void whenInsertingThirdJobWithVehicle_itCalculatesMarginalCostChanges(){
|
public void whenInsertingThirdJobWithVehicle_itCalculatesMarginalCostChanges(){
|
||||||
TourActivities tour = new TourActivities();
|
TourActivities tour = new TourActivities();
|
||||||
tour.addActivity(states.getActivity(first,true));
|
tour.addActivity(ServiceActivity.newInstance(first));
|
||||||
tour.addActivity(states.getActivity(second,true));
|
tour.addActivity(ServiceActivity.newInstance(second));
|
||||||
|
|
||||||
VehicleRoute route = VehicleRoute.newInstance(tour,driver,vehicle);
|
VehicleRoute route = VehicleRoute.newInstance(tour,driver,vehicle);
|
||||||
|
updateStates.update(route);
|
||||||
tourStateUpdater.iterate(route);
|
|
||||||
|
|
||||||
InsertionData iData = serviceInsertion.calculate(route, third, vehicle, vehicle.getEarliestDeparture(), null, Double.MAX_VALUE);
|
InsertionData iData = serviceInsertion.calculate(route, third, vehicle, vehicle.getEarliestDeparture(), null, Double.MAX_VALUE);
|
||||||
assertEquals(0.0, iData.getInsertionCost(), 0.2);
|
assertEquals(0.0, iData.getInsertionCost(), 0.2);
|
||||||
|
|
@ -216,12 +191,11 @@ public class TestCalculatesServiceInsertionOnRouteLevel {
|
||||||
@Test
|
@Test
|
||||||
public void whenInsertingThirdJobWithNewVehicle_itCalculatesMarginalCostChanges(){
|
public void whenInsertingThirdJobWithNewVehicle_itCalculatesMarginalCostChanges(){
|
||||||
TourActivities tour = new TourActivities();
|
TourActivities tour = new TourActivities();
|
||||||
tour.addActivity(states.getActivity(first,true));
|
tour.addActivity(ServiceActivity.newInstance(first));
|
||||||
tour.addActivity(states.getActivity(second,true));
|
tour.addActivity(ServiceActivity.newInstance(second));
|
||||||
|
|
||||||
VehicleRoute route = VehicleRoute.newInstance(tour,driver,vehicle);
|
VehicleRoute route = VehicleRoute.newInstance(tour,driver,vehicle);
|
||||||
|
updateStates.update(route);
|
||||||
tourStateUpdater.iterate(route);
|
|
||||||
|
|
||||||
InsertionData iData = serviceInsertion.calculate(route, third, newVehicle, vehicle.getEarliestDeparture(), null, Double.MAX_VALUE);
|
InsertionData iData = serviceInsertion.calculate(route, third, newVehicle, vehicle.getEarliestDeparture(), null, Double.MAX_VALUE);
|
||||||
assertEquals(40.0, iData.getInsertionCost(), 0.2);
|
assertEquals(40.0, iData.getInsertionCost(), 0.2);
|
||||||
|
|
@ -231,11 +205,11 @@ public class TestCalculatesServiceInsertionOnRouteLevel {
|
||||||
@Test
|
@Test
|
||||||
public void whenInsertingASecondJobWithAVehicle_itCalculatesLocalMarginalCostChanges(){
|
public void whenInsertingASecondJobWithAVehicle_itCalculatesLocalMarginalCostChanges(){
|
||||||
TourActivities tour = new TourActivities();
|
TourActivities tour = new TourActivities();
|
||||||
tour.addActivity(states.getActivity(first,true));
|
tour.addActivity(ServiceActivity.newInstance(first));
|
||||||
tour.addActivity(states.getActivity(third,true));
|
tour.addActivity(ServiceActivity.newInstance(third));
|
||||||
|
|
||||||
VehicleRoute route = VehicleRoute.newInstance(tour,driver,vehicle);
|
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);
|
InsertionData iData = serviceInsertion.calculate(route, second, vehicle, vehicle.getEarliestDeparture(), null, Double.MAX_VALUE);
|
||||||
assertEquals(0.0, iData.getInsertionCost(), 0.2);
|
assertEquals(0.0, iData.getInsertionCost(), 0.2);
|
||||||
|
|
@ -245,30 +219,15 @@ public class TestCalculatesServiceInsertionOnRouteLevel {
|
||||||
@Test
|
@Test
|
||||||
public void whenInsertingASecondJobWithANewVehicle_itCalculatesLocalMarginalCostChanges(){
|
public void whenInsertingASecondJobWithANewVehicle_itCalculatesLocalMarginalCostChanges(){
|
||||||
TourActivities tour = new TourActivities();
|
TourActivities tour = new TourActivities();
|
||||||
tour.addActivity(states.getActivity(first,true));
|
tour.addActivity(ServiceActivity.newInstance(first));
|
||||||
tour.addActivity(states.getActivity(third,true));
|
tour.addActivity(ServiceActivity.newInstance(third));
|
||||||
|
|
||||||
VehicleRoute route = VehicleRoute.newInstance(tour,driver,vehicle);
|
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);
|
InsertionData iData = serviceInsertion.calculate(route, second, newVehicle, vehicle.getEarliestDeparture(), null, Double.MAX_VALUE);
|
||||||
assertEquals(40.0, iData.getInsertionCost(), 0.2);
|
assertEquals(40.0, iData.getInsertionCost(), 0.2);
|
||||||
assertEquals(2, iData.getDeliveryInsertionIndex());
|
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());
|
|
||||||
// }
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -32,6 +32,7 @@ import basics.Service;
|
||||||
import basics.costs.VehicleRoutingTransportCosts;
|
import basics.costs.VehicleRoutingTransportCosts;
|
||||||
import basics.route.Driver;
|
import basics.route.Driver;
|
||||||
import basics.route.DriverImpl;
|
import basics.route.DriverImpl;
|
||||||
|
import basics.route.ServiceActivity;
|
||||||
import basics.route.TimeWindow;
|
import basics.route.TimeWindow;
|
||||||
import basics.route.TourActivities;
|
import basics.route.TourActivities;
|
||||||
import basics.route.Vehicle;
|
import basics.route.Vehicle;
|
||||||
|
|
@ -51,9 +52,9 @@ public class TestTourStateUpdaterWithService {
|
||||||
|
|
||||||
TourActivities anotherTour;
|
TourActivities anotherTour;
|
||||||
|
|
||||||
TourStateUpdater tdTourStatusProcessor;
|
UpdateStates updateStates;
|
||||||
|
|
||||||
RouteStates states;
|
StatesContainerImpl states;
|
||||||
|
|
||||||
private VehicleRoute vehicleRoute;
|
private VehicleRoute vehicleRoute;
|
||||||
|
|
||||||
|
|
@ -100,33 +101,32 @@ public class TestTourStateUpdaterWithService {
|
||||||
services.add(firstService);
|
services.add(firstService);
|
||||||
services.add(secondService);
|
services.add(secondService);
|
||||||
|
|
||||||
states = new RouteStates();
|
states = new StatesContainerImpl();
|
||||||
states.initialiseStateOfJobs(services);
|
|
||||||
|
|
||||||
VehicleTypeImpl type = VehicleTypeImpl.Builder.newInstance("test", 0).build();
|
VehicleTypeImpl type = VehicleTypeImpl.Builder.newInstance("test", 0).build();
|
||||||
vehicle = VehicleImpl.Builder.newInstance("testvehicle").setType(type).setLocationId("0,0")
|
vehicle = VehicleImpl.Builder.newInstance("testvehicle").setType(type).setLocationId("0,0")
|
||||||
.setEarliestStart(0.0).setLatestArrival(50.0).build();
|
.setEarliestStart(0.0).setLatestArrival(50.0).build();
|
||||||
|
|
||||||
tour = new TourActivities();
|
tour = new TourActivities();
|
||||||
tour.addActivity(states.getActivity(firstService,true));
|
tour.addActivity(ServiceActivity.newInstance(firstService));
|
||||||
tour.addActivity(states.getActivity(secondService,true));
|
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);
|
vehicleRoute = VehicleRoute.newInstance(tour,DriverImpl.noDriver(),vehicle);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCalculatedCost() {
|
public void testCalculatedCost() {
|
||||||
tdTourStatusProcessor.iterate(vehicleRoute);
|
updateStates.update(vehicleRoute);
|
||||||
assertEquals(40.0, states.getRouteState(vehicleRoute).getCosts(), 0.05);
|
assertEquals(40.0, states.getRouteState(vehicleRoute,StateTypes.COSTS).toDouble(), 0.05);
|
||||||
assertEquals(10, states.getRouteState(vehicleRoute).getLoad());
|
assertEquals(10, states.getRouteState(vehicleRoute, StateTypes.LOAD).toDouble(), 0.05);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testStatesOfAct0(){
|
public void testStatesOfAct0(){
|
||||||
tdTourStatusProcessor.iterate(vehicleRoute);
|
updateStates.update(vehicleRoute);
|
||||||
assertEquals(0.0, vehicleRoute.getStart().getEndTime(),0.05);
|
assertEquals(0.0, vehicleRoute.getStart().getEndTime(),0.05);
|
||||||
assertEquals(vehicleRoute.getVehicle().getLocationId(), vehicleRoute.getStart().getLocationId());
|
assertEquals(vehicleRoute.getVehicle().getLocationId(), vehicleRoute.getStart().getLocationId());
|
||||||
assertEquals(vehicleRoute.getVehicle().getEarliestDeparture(), vehicleRoute.getStart().getTheoreticalEarliestOperationStartTime(),0.05);
|
assertEquals(vehicleRoute.getVehicle().getEarliestDeparture(), vehicleRoute.getStart().getTheoreticalEarliestOperationStartTime(),0.05);
|
||||||
|
|
@ -136,112 +136,31 @@ public class TestTourStateUpdaterWithService {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testStatesOfAct1(){
|
public void testStatesOfAct1(){
|
||||||
tdTourStatusProcessor.iterate(vehicleRoute);
|
updateStates.update(vehicleRoute);
|
||||||
assertEquals(10.0, states.getState(tour.getActivities().get(0)).getCurrentCost(),0.05);
|
assertEquals(10.0, states.getActivityState(tour.getActivities().get(0), StateTypes.COSTS).toDouble(),0.05);
|
||||||
assertEquals(5.0, states.getState(tour.getActivities().get(0)).getCurrentLoad(),0.05);
|
assertEquals(5.0, states.getActivityState(tour.getActivities().get(0), StateTypes.LOAD).toDouble(),0.05);
|
||||||
assertEquals(10.0, states.getState(tour.getActivities().get(0)).getEarliestOperationStart(),0.05);
|
// assertEquals(10.0, states.getActivityState(tour.getActivities().get(0), StateTypes.EARLIEST_OPERATION_START_TIME).toDouble(),0.05);
|
||||||
assertEquals(20.0, states.getState(tour.getActivities().get(0)).getLatestOperationStart(),0.05);
|
assertEquals(20.0, states.getActivityState(tour.getActivities().get(0), StateTypes.LATEST_OPERATION_START_TIME).toDouble(),0.05);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testStatesOfAct2(){
|
public void testStatesOfAct2(){
|
||||||
tdTourStatusProcessor.iterate(vehicleRoute);
|
updateStates.update(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.getActivityState(tour.getActivities().get(1), StateTypes.COSTS).toDouble(),0.05);
|
||||||
assertEquals(30.0, states.getState(tour.getActivities().get(1)).getEarliestOperationStart(),0.05);
|
assertEquals(10.0, states.getActivityState(tour.getActivities().get(1), StateTypes.LOAD).toDouble(),0.05);
|
||||||
assertEquals(40.0, states.getState(tour.getActivities().get(1)).getLatestOperationStart(),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
|
@Test
|
||||||
public void testStatesOfAct3(){
|
public void testStatesOfAct3(){
|
||||||
tdTourStatusProcessor.iterate(vehicleRoute);
|
updateStates.update(vehicleRoute);
|
||||||
assertEquals(40.0, states.getRouteState(vehicleRoute).getCosts(), 0.05);
|
|
||||||
|
assertEquals(40.0, states.getRouteState(vehicleRoute, StateTypes.COSTS).toDouble(), 0.05);
|
||||||
assertEquals(40.0, vehicleRoute.getEnd().getEndTime(),0.05);
|
assertEquals(40.0, vehicleRoute.getEnd().getEndTime(),0.05);
|
||||||
assertEquals(50.0, vehicleRoute.getEnd().getTheoreticalLatestOperationStartTime(),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());
|
|
||||||
// }
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
node,quantity
|
||||||
|
2,4
|
||||||
|
3,6
|
||||||
|
4,5
|
||||||
|
5,4
|
||||||
|
6,7
|
||||||
|
7,3
|
||||||
|
8,5
|
||||||
|
9,4
|
||||||
|
10,4
|
||||||
|
|
@ -26,7 +26,7 @@
|
||||||
|
|
||||||
<construction>
|
<construction>
|
||||||
<insertion name="bestInsertion">
|
<insertion name="bestInsertion">
|
||||||
<level forwardLooking="0" memory="1">route</level>
|
<level forwardLooking="2" memory="1">route</level>
|
||||||
</insertion>
|
</insertion>
|
||||||
</construction>
|
</construction>
|
||||||
|
|
||||||
|
|
@ -35,10 +35,8 @@
|
||||||
<searchStrategies>
|
<searchStrategies>
|
||||||
<searchStrategy name="radialRuinAndRecreate">
|
<searchStrategy name="radialRuinAndRecreate">
|
||||||
<selector name="selectBest"/>
|
<selector name="selectBest"/>
|
||||||
<acceptor name="schrimpfAcceptance">
|
<acceptor name="acceptNewRemoveWorst"/>
|
||||||
<alpha>0.1</alpha>
|
|
||||||
<warmup>100</warmup>
|
|
||||||
</acceptor>
|
|
||||||
<modules>
|
<modules>
|
||||||
<module name="ruin_and_recreate">
|
<module name="ruin_and_recreate">
|
||||||
<ruin name="randomRuin">
|
<ruin name="randomRuin">
|
||||||
|
|
@ -53,7 +51,7 @@
|
||||||
|
|
||||||
<searchStrategy name="radialRuinAndRecreate">
|
<searchStrategy name="radialRuinAndRecreate">
|
||||||
<selector name="selectBest"/>
|
<selector name="selectBest"/>
|
||||||
<acceptor name="schrimpfAcceptance"/>
|
<acceptor name="acceptNewRemoveWorst"/>
|
||||||
|
|
||||||
<modules>
|
<modules>
|
||||||
<module name="ruin_and_recreate">
|
<module name="ruin_and_recreate">
|
||||||
|
|
@ -69,7 +67,7 @@
|
||||||
|
|
||||||
<searchStrategy name="radialRuinAndRecreate">
|
<searchStrategy name="radialRuinAndRecreate">
|
||||||
<selector name="selectBest"/>
|
<selector name="selectBest"/>
|
||||||
<acceptor name="schrimpfAcceptance"/>
|
<acceptor name="acceptNewRemoveWorst"/>
|
||||||
<modules>
|
<modules>
|
||||||
<module name="ruin_and_recreate">
|
<module name="ruin_and_recreate">
|
||||||
<ruin id="2" name="radialRuin">
|
<ruin id="2" name="radialRuin">
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue