From 057f12869778ab82f0055ba2b9bf7ac12375edbc Mon Sep 17 00:00:00 2001 From: oblonski <4sschroeder@gmail.com> Date: Sat, 10 May 2014 16:34:25 +0200 Subject: [PATCH] outsourced automatic threshold initialization from algorithm.acceptor.SchrimpfAcceptance to algorithm.acceptor.SchrimpfInitialThresholdGenerator --- .../SchrimpfInitialThresholdGenerator.java | 72 ++++++++++++++++++- .../acceptor/SchrimpfAcceptanceTest.java | 1 + 2 files changed, 70 insertions(+), 3 deletions(-) diff --git a/jsprit-core/src/main/java/jsprit/core/algorithm/acceptor/SchrimpfInitialThresholdGenerator.java b/jsprit-core/src/main/java/jsprit/core/algorithm/acceptor/SchrimpfInitialThresholdGenerator.java index 4c452277..50b8f41e 100644 --- a/jsprit-core/src/main/java/jsprit/core/algorithm/acceptor/SchrimpfInitialThresholdGenerator.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/acceptor/SchrimpfInitialThresholdGenerator.java @@ -1,9 +1,75 @@ package jsprit.core.algorithm.acceptor; -class SchrimpfInitialThresholdGenerator { +import java.net.URL; +import java.util.Collection; + +import org.apache.commons.math.stat.descriptive.moment.StandardDeviation; +import org.apache.log4j.Logger; + +import jsprit.core.algorithm.VehicleRoutingAlgorithm; +import jsprit.core.algorithm.io.AlgorithmConfig; +import jsprit.core.algorithm.io.AlgorithmConfigXmlReader; +import jsprit.core.algorithm.io.VehicleRoutingAlgorithms; +import jsprit.core.algorithm.listener.AlgorithmStartsListener; +import jsprit.core.algorithm.listener.IterationEndsListener; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; +import jsprit.core.util.Resource; +import jsprit.core.util.Solutions; + +public class SchrimpfInitialThresholdGenerator implements AlgorithmStartsListener { - public double getInitialThreshold(){ - return 0.0; + private static Logger logger = Logger.getLogger(SchrimpfInitialThresholdGenerator.class); + + private SchrimpfAcceptance schrimpfAcceptance; + + private int nOfRandomWalks; + + public SchrimpfInitialThresholdGenerator(SchrimpfAcceptance schrimpfAcceptance, int nOfRandomWalks) { + super(); + this.schrimpfAcceptance = schrimpfAcceptance; + this.nOfRandomWalks = nOfRandomWalks; + } + + @Override + public void informAlgorithmStarts(VehicleRoutingProblem problem,VehicleRoutingAlgorithm algorithm,Collection solutions) { + logger.info("---------------------------------------------------------------------"); + logger.info("prepare schrimpfAcceptanceFunction, i.e. determine initial threshold"); + logger.info("start random-walk (see randomWalk.xml)"); + double now = System.currentTimeMillis(); + + /* + * randomWalk to determine standardDev + */ + final double[] results = new double[nOfRandomWalks]; + + URL resource = Resource.getAsURL("randomWalk.xml"); + AlgorithmConfig algorithmConfig = new AlgorithmConfig(); + new AlgorithmConfigXmlReader(algorithmConfig).read(resource); + VehicleRoutingAlgorithm vra = VehicleRoutingAlgorithms.createAlgorithm(problem, algorithmConfig); + vra.setNuOfIterations(nOfRandomWalks); + vra.getAlgorithmListeners().addListener(new IterationEndsListener() { + + @Override + public void informIterationEnds(int iteration, VehicleRoutingProblem problem, Collection solutions) { + double result = Solutions.bestOf(solutions).getCost(); +// logger.info("result="+result); + results[iteration-1] = result; + } + + }); + vra.searchSolutions(); + + StandardDeviation dev = new StandardDeviation(); + double standardDeviation = dev.evaluate(results); + double initialThreshold = standardDeviation / 2; + + schrimpfAcceptance.setInitialThreshold(initialThreshold); + + logger.info("warmup done"); + logger.info("total time: " + ((System.currentTimeMillis()-now)/1000.0) + "s"); + logger.info("initial threshold: " + initialThreshold); + logger.info("---------------------------------------------------------------------"); } } diff --git a/jsprit-core/src/test/java/jsprit/core/algorithm/acceptor/SchrimpfAcceptanceTest.java b/jsprit-core/src/test/java/jsprit/core/algorithm/acceptor/SchrimpfAcceptanceTest.java index 4def40c4..e5fb0574 100644 --- a/jsprit-core/src/test/java/jsprit/core/algorithm/acceptor/SchrimpfAcceptanceTest.java +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/acceptor/SchrimpfAcceptanceTest.java @@ -23,6 +23,7 @@ public class SchrimpfAcceptanceTest { return when(mock(VehicleRoutingProblemSolution.class).getCost()).thenReturn(cost).getMock(); } + @SuppressWarnings("deprecation") @Before public void setup() { schrimpfAcceptance = new SchrimpfAcceptance(1, 0.3, 100);