diff --git a/jsprit-core/src/test/java/jsprit/core/algorithm/SearchStrategyManagerTest.java b/jsprit-core/src/test/java/jsprit/core/algorithm/SearchStrategyManagerTest.java index e9c21840..c96dc59d 100644 --- a/jsprit-core/src/test/java/jsprit/core/algorithm/SearchStrategyManagerTest.java +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/SearchStrategyManagerTest.java @@ -16,8 +16,15 @@ ******************************************************************************/ package jsprit.core.algorithm; +import jsprit.core.algorithm.acceptor.SolutionAcceptor; +import jsprit.core.algorithm.selector.SolutionSelector; +import jsprit.core.problem.solution.SolutionCostCalculator; +import jsprit.core.util.RandomNumberGeneration; +import org.junit.Assert; import org.junit.Test; +import java.util.ArrayList; +import java.util.List; import java.util.Random; import static org.hamcrest.CoreMatchers.is; @@ -192,4 +199,33 @@ public class SearchStrategyManagerTest { managerUnderTest.getRandomStrategy(); } + + @Test + public void strategyDrawShouldBeReproducible(){ + SearchStrategyManager managerUnderTest = new SearchStrategyManager(); + SearchStrategy mockedStrategy1 = new SearchStrategy("strat1" + ,mock(SolutionSelector.class),mock(SolutionAcceptor.class),mock(SolutionCostCalculator.class)); + SearchStrategy mockedStrategy2 = new SearchStrategy("strat2" + ,mock(SolutionSelector.class),mock(SolutionAcceptor.class),mock(SolutionCostCalculator.class)); + + managerUnderTest.addStrategy(mockedStrategy1, 0.2); + managerUnderTest.addStrategy(mockedStrategy2, 0.8); + List firstRecord = new ArrayList(); + for(int i=0; i<1000;i++){ + firstRecord.add(managerUnderTest.getRandomStrategy().getId()); + } + + RandomNumberGeneration.reset(); + List secondRecord = new ArrayList(); + for(int i=0; i<1000;i++){ + secondRecord.add(managerUnderTest.getRandomStrategy().getId()); + } + + for(int i=0;i<1000;i++){ + if(!firstRecord.get(i).equals(secondRecord.get(i))){ + Assert.assertFalse(true); + } + } + Assert.assertTrue(true); + } } diff --git a/jsprit-core/src/test/java/jsprit/core/algorithm/box/JspritTest.java b/jsprit-core/src/test/java/jsprit/core/algorithm/box/JspritTest.java index 17bf10c1..a5ac4705 100644 --- a/jsprit-core/src/test/java/jsprit/core/algorithm/box/JspritTest.java +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/box/JspritTest.java @@ -3,23 +3,38 @@ package jsprit.core.algorithm.box; import jsprit.core.algorithm.SearchStrategy; import jsprit.core.algorithm.VehicleRoutingAlgorithm; import jsprit.core.algorithm.listener.StrategySelectedListener; +import jsprit.core.algorithm.recreate.InsertionData; +import jsprit.core.algorithm.recreate.listener.BeforeJobInsertionListener; +import jsprit.core.algorithm.recreate.listener.JobInsertedListener; +import jsprit.core.algorithm.ruin.listener.RuinListener; +import jsprit.core.algorithm.termination.VariationCoefficientTermination; import jsprit.core.problem.Location; import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.io.VrpXMLReader; +import jsprit.core.problem.job.Job; import jsprit.core.problem.job.Service; import jsprit.core.problem.solution.VehicleRoutingProblemSolution; +import jsprit.core.problem.solution.route.VehicleRoute; import jsprit.core.problem.vehicle.VehicleImpl; +import jsprit.core.util.RandomNumberGeneration; +import jsprit.core.util.Solutions; import junit.framework.Assert; +import org.junit.Before; import org.junit.Test; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; +import java.util.*; /** * Created by schroeder on 06/03/15. */ public class JspritTest { + @Before + public void doBefore(){ + RandomNumberGeneration.reset(); + } + + @Test public void whenRunningJspritWithSingleCustomer_itShouldWork(){ Service s = Service.Builder.newInstance("s1").setLocation(Location.newInstance(1,1)).build(); @@ -210,4 +225,337 @@ public class JspritTest { } + @Test + public void strategyDrawShouldBeReproducible(){ + Service s = Service.Builder.newInstance("s1").setLocation(Location.newInstance(1,1)).build(); + Service s2 = Service.Builder.newInstance("s2").setLocation(Location.newInstance(1,2)).build(); + Service s3 = Service.Builder.newInstance("s3").setLocation(Location.newInstance(1,2)).build(); + Service s4 = Service.Builder.newInstance("s4").setLocation(Location.newInstance(1,2)).build(); + + VehicleImpl v = VehicleImpl.Builder.newInstance("v").setStartLocation(Location.newInstance(0,0)).build(); + VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance().addJob(s4).addJob(s3).addVehicle(v).addJob(s2).addJob(s).build(); + VehicleRoutingAlgorithm vra = Jsprit.createAlgorithm(vrp); + vra.setMaxIterations(1000); + final List firstRecord = new ArrayList(); + vra.addListener(new StrategySelectedListener() { + + @Override + public void informSelectedStrategy(SearchStrategy.DiscoveredSolution discoveredSolution, VehicleRoutingProblem vehicleRoutingProblem, Collection vehicleRoutingProblemSolutions) { + firstRecord.add(discoveredSolution.getStrategyId()); + } + + }); + vra.searchSolutions(); + + RandomNumberGeneration.reset(); + VehicleRoutingAlgorithm second = Jsprit.createAlgorithm(vrp); + second.setMaxIterations(1000); + final List secondRecord = new ArrayList(); + second.addListener(new StrategySelectedListener() { + + @Override + public void informSelectedStrategy(SearchStrategy.DiscoveredSolution discoveredSolution, VehicleRoutingProblem vehicleRoutingProblem, Collection vehicleRoutingProblemSolutions) { + secondRecord.add(discoveredSolution.getStrategyId()); + } + + }); + second.searchSolutions(); + + for(int i=0;i<1000;i++){ + if(!firstRecord.get(i).equals(secondRecord.get(i))){ + org.junit.Assert.assertFalse(true); + } + } + org.junit.Assert.assertTrue(true); + + } + + @Test + public void ruinedJobsShouldBeReproducible(){ + Service s = Service.Builder.newInstance("s1").setLocation(Location.newInstance(1,1)).build(); + Service s2 = Service.Builder.newInstance("s2").setLocation(Location.newInstance(1,2)).build(); + Service s3 = Service.Builder.newInstance("s3").setLocation(Location.newInstance(1,2)).build(); + Service s4 = Service.Builder.newInstance("s4").setLocation(Location.newInstance(1,2)).build(); + + VehicleImpl v = VehicleImpl.Builder.newInstance("v").setStartLocation(Location.newInstance(0,0)).build(); + VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance().addJob(s4).addJob(s3).addVehicle(v).addJob(s2).addJob(s).build(); + VehicleRoutingAlgorithm vra = Jsprit.createAlgorithm(vrp); + vra.setMaxIterations(1000); + final List firstRecord = new ArrayList(); + vra.addListener(new RuinListener() { + @Override + public void ruinStarts(Collection routes) { + + } + + @Override + public void ruinEnds(Collection routes, Collection unassignedJobs) { + + } + + @Override + public void removed(Job job, VehicleRoute fromRoute) { + firstRecord.add(job.getId()); + } + }); + vra.searchSolutions(); + + RandomNumberGeneration.reset(); + VehicleRoutingAlgorithm second = Jsprit.createAlgorithm(vrp); + second.setMaxIterations(1000); + final List secondRecord = new ArrayList(); + second.addListener(new RuinListener() { + @Override + public void ruinStarts(Collection routes) { + + } + + @Override + public void ruinEnds(Collection routes, Collection unassignedJobs) { + + } + + @Override + public void removed(Job job, VehicleRoute fromRoute) { + secondRecord.add(job.getId()); + } + }); + second.searchSolutions(); + + Assert.assertEquals(secondRecord.size(),firstRecord.size()); + for(int i=0;i firstRecord = new ArrayList(); + vra.addListener(new RuinListener() { + @Override + public void ruinStarts(Collection routes) { + + } + + @Override + public void ruinEnds(Collection routes, Collection unassignedJobs) { + + } + + @Override + public void removed(Job job, VehicleRoute fromRoute) { + firstRecord.add(job.getId()); + } + }); + vra.searchSolutions(); + + RandomNumberGeneration.reset(); + VehicleRoutingAlgorithm second = Jsprit.createAlgorithm(vrp); + second.setMaxIterations(1000); + final List secondRecord = new ArrayList(); + second.addListener(new RuinListener() { + @Override + public void ruinStarts(Collection routes) { + + } + + @Override + public void ruinEnds(Collection routes, Collection unassignedJobs) { + + } + + @Override + public void removed(Job job, VehicleRoute fromRoute) { + secondRecord.add(job.getId()); + } + }); + second.searchSolutions(); + + Assert.assertEquals(secondRecord.size(),firstRecord.size()); + for(int i=0;i firstRecord = new ArrayList(); + vra.addListener(new JobInsertedListener() { + @Override + public void informJobInserted(Job job2insert, VehicleRoute inRoute, double additionalCosts, double additionalTime) { + firstRecord.add(job2insert.getId()); + } + }); + vra.searchSolutions(); + + RandomNumberGeneration.reset(); + VehicleRoutingAlgorithm second = Jsprit.createAlgorithm(vrp); + second.setMaxIterations(1000); + final List secondRecord = new ArrayList(); + second.addListener(new JobInsertedListener() { + @Override + public void informJobInserted(Job job2insert, VehicleRoute inRoute, double additionalCosts, double additionalTime) { + secondRecord.add(job2insert.getId()); + } + }); + second.searchSolutions(); + + Assert.assertEquals(secondRecord.size(),firstRecord.size()); + for(int i=0;i firstRecord = new ArrayList(); + vra.addListener(new JobInsertedListener() { + @Override + public void informJobInserted(Job job2insert, VehicleRoute inRoute, double additionalCosts, double additionalTime) { + firstRecord.add(job2insert.getId()); + } + }); + vra.searchSolutions(); + + RandomNumberGeneration.reset(); + VehicleRoutingAlgorithm second = Jsprit.createAlgorithm(vrp); + second.setMaxIterations(200); + final List secondRecord = new ArrayList(); + second.addListener(new JobInsertedListener() { + @Override + public void informJobInserted(Job job2insert, VehicleRoute inRoute, double additionalCosts, double additionalTime) { + secondRecord.add(job2insert.getId()); + } + }); + second.searchSolutions(); + + Assert.assertEquals(secondRecord.size(),firstRecord.size()); + for(int i=0;i firstRecord = new ArrayList(); + vra.addListener(new BeforeJobInsertionListener() { + @Override + public void informBeforeJobInsertion(Job job, InsertionData data, VehicleRoute route) { + firstRecord.add(data.getDeliveryInsertionIndex()); + } + }); + Collection firstSolutions = vra.searchSolutions(); + + RandomNumberGeneration.reset(); + VehicleRoutingAlgorithm second = Jsprit.createAlgorithm(vrp); + second.setMaxIterations(200); + final List secondRecord = new ArrayList(); + second.addListener(new BeforeJobInsertionListener() { + @Override + public void informBeforeJobInsertion(Job job, InsertionData data, VehicleRoute route) { + secondRecord.add(data.getDeliveryInsertionIndex()); + } + }); + Collection secondSolutions = second.searchSolutions(); + + Assert.assertEquals(secondRecord.size(),firstRecord.size()); + for(int i=0;i firstRecord = new ArrayList(); + vra.addListener(new BeforeJobInsertionListener() { + @Override + public void informBeforeJobInsertion(Job job, InsertionData data, VehicleRoute route) { + firstRecord.add(data.getDeliveryInsertionIndex()); + } + }); + Collection firstSolutions = vra.searchSolutions(); + + RandomNumberGeneration.reset(); + VehicleRoutingAlgorithm second = Jsprit.createAlgorithm(vrp); + VariationCoefficientTermination secondTermination = new VariationCoefficientTermination(50, 0.005); + second.setPrematureAlgorithmTermination(secondTermination); + second.addListener(secondTermination); + second.setMaxIterations(1000); + final List secondRecord = new ArrayList(); + second.addListener(new BeforeJobInsertionListener() { + @Override + public void informBeforeJobInsertion(Job job, InsertionData data, VehicleRoute route) { + secondRecord.add(data.getDeliveryInsertionIndex()); + } + }); + Collection secondSolutions = second.searchSolutions(); + + Assert.assertEquals(secondRecord.size(),firstRecord.size()); + for(int i=0;i. - ******************************************************************************/ -package jsprit.core.algorithm.box; - -import org.junit.Test; - - -public class TestSchrimpf { - - @Test - public void whenUsingSchrimpfFactory_itFindsTheConfig(){ - - } - -}