From ad13826e5b6b131f49a7a508260feae838b3d085 Mon Sep 17 00:00:00 2001 From: oblonski Date: Tue, 29 Sep 2015 19:49:29 +0200 Subject: [PATCH] reproducibility - related to #156 --- .../algorithm/recreate/RegretInsertion.java | 5 + .../recreate/RegretInsertionConcurrent.java | 5 + .../jsprit/core/algorithm/box/JspritTest.java | 181 ++++++++++++++++++ 3 files changed, 191 insertions(+) diff --git a/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/RegretInsertion.java b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/RegretInsertion.java index e395fcf7..75d89998 100644 --- a/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/RegretInsertion.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/RegretInsertion.java @@ -253,6 +253,11 @@ public class RegretInsertion extends AbstractInsertionStrategy { if (scoredJob.getScore() > bestScoredJob.getScore()) { bestScoredJob = scoredJob; } + else if (scoredJob.getScore() == bestScoredJob.getScore()){ + if(scoredJob.getJob().getId().compareTo(bestScoredJob.getJob().getId()) <= 0){ + bestScoredJob = scoredJob; + } + } } } return bestScoredJob; diff --git a/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/RegretInsertionConcurrent.java b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/RegretInsertionConcurrent.java index 8e922728..c599226c 100644 --- a/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/RegretInsertionConcurrent.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/RegretInsertionConcurrent.java @@ -136,6 +136,11 @@ public class RegretInsertionConcurrent extends AbstractInsertionStrategy { } else if (sJob.getScore() > bestScoredJob.getScore()) { bestScoredJob = sJob; } + else if (sJob.getScore() == bestScoredJob.getScore()){ + if(sJob.getJob().getId().compareTo(bestScoredJob.getJob().getId()) <= 0){ + bestScoredJob = sJob; + } + } } } catch (InterruptedException e) { Thread.currentThread().interrupt(); 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 6dd1fafd..3dbf420b 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,6 +3,8 @@ 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.problem.Location; @@ -185,6 +187,51 @@ public class JspritTest { } + @Test + public void strategyDrawShouldBeReproducibleV2() { + 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.Builder.newInstance(vrp).setProperty(Jsprit.Parameter.THREADS,"4").buildAlgorithm(); + vra.setMaxIterations(100); + 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.Builder.newInstance(vrp).setProperty(Jsprit.Parameter.THREADS,"2").buildAlgorithm(); + second.setMaxIterations(100); + 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 < 100; 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(); @@ -192,6 +239,72 @@ public class JspritTest { 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.Builder.newInstance(vrp) + .setProperty(Jsprit.Strategy.WORST_REGRET,"0.") + .setProperty(Jsprit.Strategy.WORST_BEST, "0.") + .setProperty(Jsprit.Parameter.THREADS, "2").buildAlgorithm(); + vra.setMaxIterations(100); + 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(); + + VehicleRoutingAlgorithm second = Jsprit.Builder.newInstance(vrp).setProperty(Jsprit.Parameter.THREADS, "4") + .setProperty(Jsprit.Strategy.WORST_REGRET, "0.") + .setProperty(Jsprit.Strategy.WORST_BEST, "0.") + .buildAlgorithm(); + second.setMaxIterations(100); + 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.size(); i++) { + if (!firstRecord.get(i).equals(secondRecord.get(i))) { + Assert.assertFalse(true); + } + } + Assert.assertTrue(true); + } + + @Test + public void ruinedJobsShouldBeReproducibleV2() { + 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); @@ -286,5 +399,73 @@ public class JspritTest { Assert.assertTrue(true); } + @Test + public void insertionShouldBeReproducibleV2() { + Service s = Service.Builder.newInstance("s1").setLocation(Location.newInstance(1, 1)).build(); + Service s2 = Service.Builder.newInstance("s2").setLocation(Location.newInstance(1, 1)).build(); + Service s3 = Service.Builder.newInstance("s3").setLocation(Location.newInstance(1, 3)).build(); + Service s4 = Service.Builder.newInstance("s4").setLocation(Location.newInstance(1, 4)).build(); + + VehicleImpl v = VehicleImpl.Builder.newInstance("v").setStartLocation(Location.newInstance(0, 0)).build(); + VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance().setFleetSize(VehicleRoutingProblem.FleetSize.FINITE).addJob(s4).addJob(s3).addVehicle(v).addJob(s2).addJob(s).build(); + + VehicleRoutingAlgorithm vra = Jsprit.Builder.newInstance(vrp) + .setProperty(Jsprit.Strategy.WORST_REGRET,"0.") + .setProperty(Jsprit.Strategy.WORST_BEST, "0.") + .setProperty(Jsprit.Parameter.THREADS, "4").buildAlgorithm(); + vra.setMaxIterations(100); + final List firstRecord = new ArrayList(); + final List firstRecordCosts = new ArrayList(); + vra.addListener(new BeforeJobInsertionListener() { + @Override + public void informBeforeJobInsertion(Job job, InsertionData data, VehicleRoute route) { + String id = job.getId(); + firstRecordCosts.add(data.getInsertionCost()); + firstRecord.add(id); + } + }); + vra.searchSolutions(); + + VehicleRoutingAlgorithm second = Jsprit.Builder.newInstance(vrp) + .setProperty(Jsprit.Strategy.WORST_REGRET,"0.") + .setProperty(Jsprit.Strategy.WORST_BEST, "0.") + .setProperty(Jsprit.Parameter.THREADS, "5").buildAlgorithm(); + second.setMaxIterations(100); + final List secondRecord = new ArrayList(); + final List secondRecordCosts = new ArrayList(); + second.addListener(new BeforeJobInsertionListener() { + @Override + public void informBeforeJobInsertion(Job job, InsertionData data, VehicleRoute route) { + secondRecord.add(job.getId()); + secondRecordCosts.add(data.getInsertionCost()); + } + }); + second.searchSolutions(); + +// for(int i=0;i