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

add multiple time windows to services

This commit is contained in:
oblonski 2015-05-26 09:17:47 +02:00
parent 954f2588a4
commit 7582c5e038
13 changed files with 278 additions and 51 deletions

View file

@ -0,0 +1,79 @@
package jsprit.core.algorithm;
import jsprit.core.algorithm.box.Jsprit;
import jsprit.core.problem.Location;
import jsprit.core.problem.VehicleRoutingProblem;
import jsprit.core.problem.job.Service;
import jsprit.core.problem.solution.VehicleRoutingProblemSolution;
import jsprit.core.problem.vehicle.VehicleImpl;
import jsprit.core.util.Solutions;
import junit.framework.Assert;
import org.junit.Test;
/**
* Created by schroeder on 26/05/15.
*/
public class MultipleTimeWindowsTest {
@Test
public void service2ShouldNotBeInserted(){
Service s = Service.Builder.newInstance("s1").setLocation(Location.newInstance(10,0)).build();
Service s2 = Service.Builder.newInstance("s2")
.addTimeWindow(50.,60.)
.setLocation(Location.newInstance(20, 0)).build();
VehicleImpl v = VehicleImpl.Builder.newInstance("v1").setStartLocation(Location.newInstance(0,0))
.setEarliestStart(0.).setLatestArrival(40).build();
VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance().addJob(s).addJob(s2).addVehicle(v).build();
VehicleRoutingAlgorithm algorithm = Jsprit.createAlgorithm(vrp);
algorithm.setMaxIterations(100);
VehicleRoutingProblemSolution solution = Solutions.bestOf(algorithm.searchSolutions());
Assert.assertEquals(1,solution.getUnassignedJobs().size());
}
@Test
public void service2ShouldBeInsertedIntoNewVehicle(){
Service s = Service.Builder.newInstance("s1").setLocation(Location.newInstance(10,0))
.addTimeWindow(5.,15.).build();
Service s2 = Service.Builder.newInstance("s2")
.addTimeWindow(50.,60.)
.setLocation(Location.newInstance(20, 0)).build();
VehicleImpl v = VehicleImpl.Builder.newInstance("v1").setStartLocation(Location.newInstance(0,0))
.setEarliestStart(0.).setLatestArrival(40).build();
VehicleImpl v2 = VehicleImpl.Builder.newInstance("v2").setStartLocation(Location.newInstance(0,0))
.setEarliestStart(40.).setLatestArrival(80).build();
VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance().addJob(s).addJob(s2).addVehicle(v).addVehicle(v2).build();
VehicleRoutingAlgorithm algorithm = Jsprit.createAlgorithm(vrp);
algorithm.setMaxIterations(100);
VehicleRoutingProblemSolution solution = Solutions.bestOf(algorithm.searchSolutions());
Assert.assertEquals(0,solution.getUnassignedJobs().size());
Assert.assertEquals(2, solution.getRoutes().size());
}
@Test
public void service2ShouldBeInserted(){
Service s = Service.Builder.newInstance("s1").setLocation(Location.newInstance(10,0)).build();
Service s2 = Service.Builder.newInstance("s2")
.addTimeWindow(50., 60.).addTimeWindow(15., 25)
.setLocation(Location.newInstance(20, 0)).build();
VehicleImpl v = VehicleImpl.Builder.newInstance("v1").setStartLocation(Location.newInstance(0,0))
.setEarliestStart(0.).setLatestArrival(40).build();
VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance().addJob(s).addJob(s2).addVehicle(v).build();
VehicleRoutingAlgorithm algorithm = Jsprit.createAlgorithm(vrp);
algorithm.setMaxIterations(100);
VehicleRoutingProblemSolution solution = Solutions.bestOf(algorithm.searchSolutions());
Assert.assertEquals(0,solution.getUnassignedJobs().size());
}
}

View file

@ -184,4 +184,28 @@ public class ServiceTest {
assertEquals("name",s.getName());
}
@Test
public void shouldKnowMultipleTimeWindows(){
Service s = Service.Builder.newInstance("s").setLocation(Location.newInstance("loc"))
.addTimeWindow(TimeWindow.newInstance(0., 10.)).addTimeWindow(TimeWindow.newInstance(20., 30.))
.setName("name").build();
assertEquals(2,s.getTimeWindows(0.).size());
}
@Test(expected = IllegalStateException.class)
public void whenMultipleTWOverlap_throwEx(){
Service s = Service.Builder.newInstance("s").setLocation(Location.newInstance("loc"))
.addTimeWindow(TimeWindow.newInstance(0.,10.))
.addTimeWindow(TimeWindow.newInstance(5., 30.))
.setName("name").build();
}
@Test(expected = IllegalStateException.class)
public void whenMultipleTWOverlap2_throwEx(){
Service s = Service.Builder.newInstance("s").setLocation(Location.newInstance("loc"))
.addTimeWindow(TimeWindow.newInstance(20., 30.))
.addTimeWindow(TimeWindow.newInstance(0., 25.))
.setName("name").build();
}
}