From d8f7af7fb5a426d094db93092f62b0f94fe30d42 Mon Sep 17 00:00:00 2001 From: oblonski Date: Fri, 30 Jun 2017 10:44:39 +0200 Subject: [PATCH] add helper --- .../acceptor/SchrimpfAcceptance.java | 39 ++++++++++++++++++- .../VariationCoefficientTermination.java | 15 +++++++ 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/acceptor/SchrimpfAcceptance.java b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/acceptor/SchrimpfAcceptance.java index f89960b0..f104a1ca 100644 --- a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/acceptor/SchrimpfAcceptance.java +++ b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/acceptor/SchrimpfAcceptance.java @@ -25,7 +25,9 @@ import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolutio import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.ArrayList; import java.util.Collection; +import java.util.List; /** @@ -78,7 +80,6 @@ public class SchrimpfAcceptance implements SolutionAcceptor, IterationStartsList private final int solutionMemory; - public SchrimpfAcceptance(int solutionMemory, double alpha) { this.alpha = alpha; this.solutionMemory = solutionMemory; @@ -110,6 +111,32 @@ public class SchrimpfAcceptance implements SolutionAcceptor, IterationStartsList return solutionAccepted; } + public boolean acceptSolution(VehicleRoutingProblemSolution solution, VehicleRoutingProblemSolution newSolution) { + List solutions = new ArrayList<>(); + solutions.add(solution); + boolean solutionAccepted = false; + if (solutions.size() < solutionMemory) { + solutions.add(newSolution); + solutionAccepted = true; + } else { + VehicleRoutingProblemSolution worst = null; + double threshold = getThreshold(currentIteration); + for (VehicleRoutingProblemSolution solutionInMemory : solutions) { + if (worst == null) worst = solutionInMemory; + else if (solutionInMemory.getCost() > worst.getCost()) worst = solutionInMemory; + } + if (worst == null) { + solutions.add(newSolution); + solutionAccepted = true; + } else if (newSolution.getCost() < worst.getCost() + threshold) { + solutions.remove(worst); + solutions.add(newSolution); + solutionAccepted = true; + } + } + return solutionAccepted; + } + @Override public String toString() { return "[name=SchrimpfAcceptance][alpha=" + alpha + "]"; @@ -136,6 +163,16 @@ public class SchrimpfAcceptance implements SolutionAcceptor, IterationStartsList this.initialThreshold = initialThreshold; } + public void setMaxIterations(int maxIteration) { + this.maxIterations = maxIteration; + } + + public void incIteration() { + currentIteration++; + } + + ; + @Override public void informAlgorithmStarts(VehicleRoutingProblem problem, VehicleRoutingAlgorithm algorithm, Collection solutions) { reset(); diff --git a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/termination/VariationCoefficientTermination.java b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/termination/VariationCoefficientTermination.java index 5e900b35..5f177c3d 100644 --- a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/termination/VariationCoefficientTermination.java +++ b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/termination/VariationCoefficientTermination.java @@ -30,7 +30,9 @@ import org.apache.commons.math3.stat.descriptive.moment.StandardDeviation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.ArrayList; import java.util.Collection; +import java.util.List; /** @@ -119,9 +121,22 @@ public class VariationCoefficientTermination implements PrematureAlgorithmTermin } } + public void informIterationEnds(int i, VehicleRoutingProblem problem, VehicleRoutingProblemSolution solution) { + informIterationEnds(i, problem, toList(solution)); + } + + private List toList(VehicleRoutingProblemSolution solution) { + List solutions = new ArrayList<>(); + solutions.add(solution); + return solutions; + } + @Override public void informIterationStarts(int i, VehicleRoutingProblem problem, Collection solutions) { if (lastAccepted == null) lastAccepted = Solutions.bestOf(solutions); } + public void informIterationStarts(int i, VehicleRoutingProblem problem, VehicleRoutingProblemSolution solution) { + informIterationStarts(i, problem, toList(solution)); + } }