From 79140768103110daa9112619ed439b7ed766ad43 Mon Sep 17 00:00:00 2001 From: oblonski <4sschroeder@gmail.com> Date: Fri, 16 May 2014 16:11:29 +0200 Subject: [PATCH] add tests to reproduce bug #98 --- ...niteFleet_withTimeAndDistanceCosts_IT.java | 205 ++++++++++++++++++ ...ehicleRoutingTransportCostsMatrixTest.java | 96 +++++++- 2 files changed, 298 insertions(+), 3 deletions(-) create mode 100644 jsprit-core/src/test/java/jsprit/core/algorithm/RefuseCollectionWithCostsHigherThanTimesAndFiniteFleet_withTimeAndDistanceCosts_IT.java diff --git a/jsprit-core/src/test/java/jsprit/core/algorithm/RefuseCollectionWithCostsHigherThanTimesAndFiniteFleet_withTimeAndDistanceCosts_IT.java b/jsprit-core/src/test/java/jsprit/core/algorithm/RefuseCollectionWithCostsHigherThanTimesAndFiniteFleet_withTimeAndDistanceCosts_IT.java new file mode 100644 index 00000000..2002f0e8 --- /dev/null +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/RefuseCollectionWithCostsHigherThanTimesAndFiniteFleet_withTimeAndDistanceCosts_IT.java @@ -0,0 +1,205 @@ +/******************************************************************************* + * Copyright (C) 2013 Stefan Schroeder + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + ******************************************************************************/ +package jsprit.core.algorithm; + +import static org.junit.Assert.assertEquals; + +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 jsprit.core.algorithm.box.GreedySchrimpfFactory; +import jsprit.core.algorithm.termination.IterationWithoutImprovementTermination; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.VehicleRoutingProblem.FleetSize; +import jsprit.core.problem.job.Service; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; +import jsprit.core.problem.vehicle.Vehicle; +import jsprit.core.problem.vehicle.VehicleImpl; +import jsprit.core.problem.vehicle.VehicleTypeImpl; +import jsprit.core.reporting.SolutionPrinter; +import jsprit.core.reporting.SolutionPrinter.Print; +import jsprit.core.util.Solutions; +import jsprit.core.util.VehicleRoutingTransportCostsMatrix; +import jsprit.core.util.VehicleRoutingTransportCostsMatrix.Builder; + +import org.junit.Test; + + + +public class RefuseCollectionWithCostsHigherThanTimesAndFiniteFleet_withTimeAndDistanceCosts_IT { + + 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; + } + } + + @Test + public void testAlgo(){ + + + /* + * create vehicle-type and vehicle + */ + VehicleTypeImpl.Builder typeBuilder = VehicleTypeImpl.Builder.newInstance("vehicle-type").addCapacityDimension(0, 23); + typeBuilder.setCostPerDistance(1.0).setCostPerTime(1.); + VehicleTypeImpl bigType = typeBuilder.build(); + + VehicleImpl.Builder vehicleBuilder = VehicleImpl.Builder.newInstance("vehicle"); + vehicleBuilder.setStartLocationId("1"); + vehicleBuilder.setType(bigType); + vehicleBuilder.setLatestArrival(220); + 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.setPrematureAlgorithmTermination(new IterationWithoutImprovementTermination(100)); + Collection solutions = vra.searchSolutions(); + + SolutionPrinter.print(vrp, Solutions.bestOf(solutions), Print.VERBOSE); + + assertEquals(2.*397.+397.,Solutions.bestOf(solutions).getCost(),0.01); + assertEquals(2,Solutions.bestOf(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]).addSizeDimension(0, Integer.parseInt(lineTokens[1])).setLocationId(lineTokens[0]).build(); + /* + * and add it to problem + */ + vrpBuilder.addJob(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], 2.*Integer.parseInt(lineTokens[2])); + matrixBuilder.addTransportTime(lineTokens[0],lineTokens[1], Integer.parseInt(lineTokens[2])); + } + reader.close(); + + } + + +} diff --git a/jsprit-core/src/test/java/jsprit/core/util/VehicleRoutingTransportCostsMatrixTest.java b/jsprit-core/src/test/java/jsprit/core/util/VehicleRoutingTransportCostsMatrixTest.java index 27cb0f16..2ec9dcb9 100644 --- a/jsprit-core/src/test/java/jsprit/core/util/VehicleRoutingTransportCostsMatrixTest.java +++ b/jsprit-core/src/test/java/jsprit/core/util/VehicleRoutingTransportCostsMatrixTest.java @@ -3,7 +3,6 @@ package jsprit.core.util; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; - import jsprit.core.problem.vehicle.Vehicle; import jsprit.core.problem.vehicle.VehicleType; import jsprit.core.problem.vehicle.VehicleTypeImpl; @@ -124,7 +123,7 @@ public class VehicleRoutingTransportCostsMatrixTest { @Test public void whenAddingTimeToAsymmetricMatrixUsingStringAsKey_itShouldReturnCorrectValues(){ - VehicleRoutingTransportCostsMatrix.Builder matrixBuilder = VehicleRoutingTransportCostsMatrix.Builder.newInstance(true); + VehicleRoutingTransportCostsMatrix.Builder matrixBuilder = VehicleRoutingTransportCostsMatrix.Builder.newInstance(false); matrixBuilder.addTransportTime("from", "to", 2.); matrixBuilder.addTransportTime("to", "from", 4.); VehicleRoutingTransportCostsMatrix matrix = matrixBuilder.build(); @@ -137,7 +136,7 @@ public class VehicleRoutingTransportCostsMatrixTest { VehicleType type = VehicleTypeImpl.Builder.newInstance("t").setCostPerDistance(0.).setCostPerTime(1.).build(); Vehicle vehicle = mock(Vehicle.class); when(vehicle.getType()).thenReturn(type); - VehicleRoutingTransportCostsMatrix.Builder matrixBuilder = VehicleRoutingTransportCostsMatrix.Builder.newInstance(true); + VehicleRoutingTransportCostsMatrix.Builder matrixBuilder = VehicleRoutingTransportCostsMatrix.Builder.newInstance(false); matrixBuilder.addTransportTime("from", "to", 2.); matrixBuilder.addTransportTime("to", "from", 4.); VehicleRoutingTransportCostsMatrix matrix = matrixBuilder.build(); @@ -146,5 +145,96 @@ public class VehicleRoutingTransportCostsMatrixTest { assertEquals(2.,matrix.getTransportCost("from", "to", 0.0, null, vehicle),0.1); assertEquals(4.,matrix.getTransportCost("to", "from", 0.0, null, vehicle),0.1); } + + @Test + public void whenAddingTimeAndDistanceToSymmetricMatrix_itShouldReturnCorrectValues(){ + VehicleRoutingTransportCostsMatrix.Builder matrixBuilder = VehicleRoutingTransportCostsMatrix.Builder.newInstance(true); + matrixBuilder.addTransportDistance("1", "2", 20.); + matrixBuilder.addTransportTime("1", "2", 2.); + VehicleRoutingTransportCostsMatrix matrix = matrixBuilder.build(); + Vehicle vehicle = mock(Vehicle.class); + VehicleType type = VehicleTypeImpl.Builder.newInstance("t").setCostPerDistance(1.).setCostPerTime(2.).build(); + when(vehicle.getType()).thenReturn(type); + assertEquals(24.,matrix.getTransportCost("1", "2", 0.0, null, vehicle),0.1); + assertEquals(24.,matrix.getTransportCost("2", "1", 0.0, null, vehicle),0.1); + } + + @Test + public void whenAddingTimeAndDistanceToSymmetricMatrixUsingStringAsKey_itShouldReturnCorrectValues(){ + VehicleRoutingTransportCostsMatrix.Builder matrixBuilder = VehicleRoutingTransportCostsMatrix.Builder.newInstance(true); + matrixBuilder.addTransportTime("from", "to", 2.); + Vehicle vehicle = mock(Vehicle.class); + VehicleType type = VehicleTypeImpl.Builder.newInstance("t").setCostPerDistance(1.).setCostPerTime(2.).build(); + when(vehicle.getType()).thenReturn(type); + VehicleRoutingTransportCostsMatrix matrix = matrixBuilder.build(); + assertEquals(4.,matrix.getTransportCost("from", "to", 0.0, null, vehicle),0.1); + assertEquals(4.,matrix.getTransportCost("to", "from", 0.0, null, vehicle),0.1); + } + + @Test + public void whenAddingTimeAndDistanceToAsymmetricMatrix_itShouldReturnCorrectValues(){ + VehicleRoutingTransportCostsMatrix.Builder matrixBuilder = VehicleRoutingTransportCostsMatrix.Builder.newInstance(false); + matrixBuilder.addTransportTime("1", "2", 2.); + matrixBuilder.addTransportTime("2", "1", 8.); + VehicleRoutingTransportCostsMatrix matrix = matrixBuilder.build(); + Vehicle vehicle = mock(Vehicle.class); + VehicleType type = VehicleTypeImpl.Builder.newInstance("t").setCostPerDistance(1.).setCostPerTime(2.).build(); + when(vehicle.getType()).thenReturn(type); + assertEquals(4.,matrix.getTransportCost("1", "2", 0.0, null, vehicle),0.1); + assertEquals(16.,matrix.getTransportCost("2", "1", 0.0, null, vehicle),0.1); + } + + @Test + public void whenAddingTimeAndDistanceToAsymmetricMatrixUsingStringAsKey_itShouldReturnCorrectValues(){ + VehicleRoutingTransportCostsMatrix.Builder matrixBuilder = VehicleRoutingTransportCostsMatrix.Builder.newInstance(false); + matrixBuilder.addTransportTime("from", "to", 2.); + matrixBuilder.addTransportDistance("from", "to", 1.); + matrixBuilder.addTransportTime("to", "from", 4.); + matrixBuilder.addTransportDistance("to", "from", 3.); + VehicleRoutingTransportCostsMatrix matrix = matrixBuilder.build(); + Vehicle vehicle = mock(Vehicle.class); + VehicleType type = VehicleTypeImpl.Builder.newInstance("t").setCostPerDistance(1.).setCostPerTime(2.).build(); + when(vehicle.getType()).thenReturn(type); + assertEquals(5.,matrix.getTransportCost("from", "to", 0.0, null, vehicle),0.1); + assertEquals(11.,matrix.getTransportCost("to", "from", 0.0, null, vehicle),0.1); + } + + + + @Test + public void whenAddingTimeAndDistanceToAsymmetricMatrixUsingStringAsKey_itShouldReturnCorrectCostValues(){ + VehicleType type = VehicleTypeImpl.Builder.newInstance("t").setCostPerDistance(2.).setCostPerTime(1.).build(); + Vehicle vehicle = mock(Vehicle.class); + when(vehicle.getType()).thenReturn(type); + VehicleRoutingTransportCostsMatrix.Builder matrixBuilder = VehicleRoutingTransportCostsMatrix.Builder.newInstance(false); + matrixBuilder.addTransportTime("from", "to", 2.); + matrixBuilder.addTransportDistance("from", "to", 3.); + matrixBuilder.addTransportTime("to", "from", 4.); + matrixBuilder.addTransportDistance("to", "from", 5.); + VehicleRoutingTransportCostsMatrix matrix = matrixBuilder.build(); + + assertEquals(8.,matrix.getTransportCost("from", "to", 0.0, null, vehicle),0.1); + assertEquals(14.,matrix.getTransportCost("to", "from", 0.0, null, vehicle),0.1); + } + + @Test + public void whenAddingTimeAndDistanceToSymmetricMatrixUsingStringAsKey_and_overridesEntry_itShouldReturnCorrectValues(){ + VehicleRoutingTransportCostsMatrix.Builder matrixBuilder = VehicleRoutingTransportCostsMatrix.Builder.newInstance(true); + + matrixBuilder.addTransportDistance("from", "to", 1.); + matrixBuilder.addTransportTime("from", "to", 2.); + + matrixBuilder.addTransportDistance("to", "from", 1.); + matrixBuilder.addTransportTime("to", "from", 2.); + + VehicleRoutingTransportCostsMatrix matrix = matrixBuilder.build(); + Vehicle vehicle = mock(Vehicle.class); + VehicleType type = VehicleTypeImpl.Builder.newInstance("t").setCostPerDistance(1.).setCostPerTime(0.).build(); + when(vehicle.getType()).thenReturn(type); + assertEquals(1.,matrix.getDistance("from", "to"),0.1); + assertEquals(1.,matrix.getDistance("to", "from"),0.1); + assertEquals(1.,matrix.getTransportCost("from", "to", 0.0, null, vehicle),0.1); + assertEquals(1.,matrix.getTransportCost("to", "from", 0.0, null, vehicle),0.1); + } }