1
0
Fork 0
mirror of https://github.com/graphhopper/jsprit.git synced 2020-01-24 07:45:05 +01:00
This commit is contained in:
oblonski 2014-05-09 12:30:25 +02:00
parent fa7ff47b97
commit 8422b840a6
2 changed files with 159 additions and 8 deletions

View file

@ -43,15 +43,8 @@ public class VehicleRoutingTransportCostsMatrix extends AbstractForwardVehicleRo
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;
@ -148,6 +141,10 @@ public class VehicleRoutingTransportCostsMatrix extends AbstractForwardVehicleRo
log.warn("distance from " + from + " to " + to + " already exists. This overrides distance.");
}
distances.put(key, distance);
if(isSymmetric) {
RelationKey revKey = RelationKey.newKey(to, from);
if(distances.containsKey(revKey)) distances.put(revKey, distance);
}
return this;
}
@ -165,6 +162,10 @@ public class VehicleRoutingTransportCostsMatrix extends AbstractForwardVehicleRo
log.warn("transport-time from " + from + " to " + to + " already exists. This overrides distance.");
}
times.put(key, time);
if(isSymmetric) {
RelationKey revKey = RelationKey.newKey(to, from);
if(distances.containsKey(revKey)) distances.put(revKey, time);
}
return this;
}

View file

@ -0,0 +1,150 @@
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;
import org.junit.Test;
public class VehicleRoutingTransportCostsMatrixTest {
@Test
public void whenAddingDistanceToSymmetricMatrix_itShouldReturnCorrectValues(){
VehicleRoutingTransportCostsMatrix.Builder matrixBuilder = VehicleRoutingTransportCostsMatrix.Builder.newInstance(true);
matrixBuilder.addTransportDistance("1", "2", 2.);
VehicleRoutingTransportCostsMatrix matrix = matrixBuilder.build();
assertEquals(2.,matrix.getTransportCost("1", "2", 0.0, null, null),0.1);
assertEquals(2.,matrix.getDistance("1", "2"),0.1);
assertEquals(2.,matrix.getTransportCost("2", "1", 0.0, null, null),0.1);
assertEquals(2.,matrix.getDistance("2", "1"),0.1);
}
@Test
public void whenAddingDistanceToSymmetricMatrixUsingStringAsKey_itShouldReturnCorrectValues(){
VehicleRoutingTransportCostsMatrix.Builder matrixBuilder = VehicleRoutingTransportCostsMatrix.Builder.newInstance(true);
matrixBuilder.addTransportDistance("from", "to", 2.);
VehicleRoutingTransportCostsMatrix matrix = matrixBuilder.build();
assertEquals(2.,matrix.getTransportCost("from", "to", 0.0, null, null),0.1);
assertEquals(2.,matrix.getDistance("from", "to"),0.1);
assertEquals(2.,matrix.getTransportCost("to", "from", 0.0, null, null),0.1);
assertEquals(2.,matrix.getDistance("from", "to"),0.1);
}
@Test
public void whenAddingDistanceToSymmetricMatrixWhereKeyAlreadyExists_itShouldOverrideValues(){
VehicleRoutingTransportCostsMatrix.Builder matrixBuilder = VehicleRoutingTransportCostsMatrix.Builder.newInstance(true);
matrixBuilder.addTransportDistance("from", "to", 2.);
//overide
matrixBuilder.addTransportDistance("from", "to", 4.);
VehicleRoutingTransportCostsMatrix matrix = matrixBuilder.build();
assertEquals(4.,matrix.getTransportCost("from", "to", 0.0, null, null),0.1);
assertEquals(4.,matrix.getDistance("from", "to"),0.1);
assertEquals(4.,matrix.getTransportCost("to", "from", 0.0, null, null),0.1);
assertEquals(4.,matrix.getDistance("from", "to"),0.1);
}
@Test
public void whenAddingDistanceToSymmetricMatrixWhereReverseKeyAlreadyExists_itShouldOverrideValues(){
VehicleRoutingTransportCostsMatrix.Builder matrixBuilder = VehicleRoutingTransportCostsMatrix.Builder.newInstance(true);
matrixBuilder.addTransportDistance("from", "to", 2.);
//overide
matrixBuilder.addTransportDistance("to", "from", 4.);
VehicleRoutingTransportCostsMatrix matrix = matrixBuilder.build();
assertEquals(4.,matrix.getTransportCost("from", "to", 0.0, null, null),0.1);
assertEquals(4.,matrix.getDistance("from", "to"),0.1);
assertEquals(4.,matrix.getTransportCost("to", "from", 0.0, null, null),0.1);
assertEquals(4.,matrix.getDistance("from", "to"),0.1);
}
@Test
public void whenAddingDistanceToAsymmetricMatrix_itShouldReturnCorrectValues(){
VehicleRoutingTransportCostsMatrix.Builder matrixBuilder = VehicleRoutingTransportCostsMatrix.Builder.newInstance(false);
matrixBuilder.addTransportDistance("1", "2", 2.);
VehicleRoutingTransportCostsMatrix matrix = matrixBuilder.build();
assertEquals(2.,matrix.getTransportCost("1", "2", 0.0, null, null),0.1);
}
@Test(expected=IllegalStateException.class)
public void whenRequestingRelationThatDoesNotExist_itShouldThrowException(){
VehicleRoutingTransportCostsMatrix.Builder matrixBuilder = VehicleRoutingTransportCostsMatrix.Builder.newInstance(false);
matrixBuilder.addTransportDistance("1", "2", 2.);
VehicleRoutingTransportCostsMatrix matrix = matrixBuilder.build();
matrix.getTransportCost("2", "1", 0.0, null, null);
}
@Test
public void whenAddingDistanceToAsymmetricMatrixUsingStringAsKey_itShouldReturnCorrectValues(){
VehicleRoutingTransportCostsMatrix.Builder matrixBuilder = VehicleRoutingTransportCostsMatrix.Builder.newInstance(false);
matrixBuilder.addTransportDistance("from", "to", 2.);
matrixBuilder.addTransportDistance("to", "from", 4.);
VehicleRoutingTransportCostsMatrix matrix = matrixBuilder.build();
assertEquals(2.,matrix.getTransportCost("from", "to", 0.0, null, null),0.1);
assertEquals(4.,matrix.getTransportCost("to", "from", 0.0, null, null),0.1);
}
@Test
public void whenAddingTimeToSymmetricMatrix_itShouldReturnCorrectValues(){
VehicleRoutingTransportCostsMatrix.Builder matrixBuilder = VehicleRoutingTransportCostsMatrix.Builder.newInstance(true);
matrixBuilder.addTransportTime("1", "2", 2.);
VehicleRoutingTransportCostsMatrix matrix = matrixBuilder.build();
assertEquals(2.,matrix.getTransportTime("1", "2", 0.0, null, null),0.1);
assertEquals(2.,matrix.getTransportTime("2", "1", 0.0, null, null),0.1);
}
@Test
public void whenAddingTimeToSymmetricMatrixUsingStringAsKey_itShouldReturnCorrectValues(){
VehicleRoutingTransportCostsMatrix.Builder matrixBuilder = VehicleRoutingTransportCostsMatrix.Builder.newInstance(true);
matrixBuilder.addTransportTime("from", "to", 2.);
VehicleRoutingTransportCostsMatrix matrix = matrixBuilder.build();
assertEquals(2.,matrix.getTransportTime("from", "to", 0.0, null, null),0.1);
assertEquals(2.,matrix.getTransportTime("to", "from", 0.0, null, null),0.1);
}
@Test
public void whenAddingTimeToAsymmetricMatrix_itShouldReturnCorrectValues(){
VehicleRoutingTransportCostsMatrix.Builder matrixBuilder = VehicleRoutingTransportCostsMatrix.Builder.newInstance(false);
matrixBuilder.addTransportTime("1", "2", 2.);
VehicleRoutingTransportCostsMatrix matrix = matrixBuilder.build();
assertEquals(2.,matrix.getTransportTime("1", "2", 0.0, null, null),0.1);
}
@Test(expected=IllegalStateException.class)
public void whenRequestingTimeOfRelationThatDoesNotExist_itShouldThrowException(){
VehicleRoutingTransportCostsMatrix.Builder matrixBuilder = VehicleRoutingTransportCostsMatrix.Builder.newInstance(false);
matrixBuilder.addTransportTime("1", "2", 2.);
VehicleRoutingTransportCostsMatrix matrix = matrixBuilder.build();
matrix.getTransportTime("2", "1", 0.0, null, null);
}
@Test
public void whenAddingTimeToAsymmetricMatrixUsingStringAsKey_itShouldReturnCorrectValues(){
VehicleRoutingTransportCostsMatrix.Builder matrixBuilder = VehicleRoutingTransportCostsMatrix.Builder.newInstance(true);
matrixBuilder.addTransportTime("from", "to", 2.);
matrixBuilder.addTransportTime("to", "from", 4.);
VehicleRoutingTransportCostsMatrix matrix = matrixBuilder.build();
assertEquals(2.,matrix.getTransportTime("from", "to", 0.0, null, null),0.1);
assertEquals(4.,matrix.getTransportTime("to", "from", 0.0, null, null),0.1);
}
@Test
public void whenAddingTimeToAsymmetricMatrixUsingStringAsKey_itShouldReturnCorrectCostValues(){
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);
matrixBuilder.addTransportTime("from", "to", 2.);
matrixBuilder.addTransportTime("to", "from", 4.);
VehicleRoutingTransportCostsMatrix matrix = matrixBuilder.build();
// assertEquals(2.,matrix.getTransportTime("from", "to", 0.0, null, null),0.1);
// assertEquals(4.,matrix.getTransportTime("to", "from", 0.0, null, null),0.1);
assertEquals(2.,matrix.getTransportCost("from", "to", 0.0, null, vehicle),0.1);
assertEquals(4.,matrix.getTransportCost("to", "from", 0.0, null, vehicle),0.1);
}
}