diff --git a/jsprit-core/src/main/java/jsprit/core/algorithm/VehicleRoutingAlgorithm.java b/jsprit-core/src/main/java/jsprit/core/algorithm/VehicleRoutingAlgorithm.java
index 68e799a0..5a1eaabe 100644
--- a/jsprit-core/src/main/java/jsprit/core/algorithm/VehicleRoutingAlgorithm.java
+++ b/jsprit-core/src/main/java/jsprit/core/algorithm/VehicleRoutingAlgorithm.java
@@ -1,16 +1,16 @@
/*******************************************************************************
- * Copyright (C) 2013 Stefan Schroeder
- *
+ * Copyright (C) 2014 Stefan Schroeder
+ *
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
+ * License as published by the Free Software Foundation; either
* version 3.0 of the License, or (at your option) any later version.
- *
+ *
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see .
******************************************************************************/
@@ -23,6 +23,7 @@ import jsprit.core.problem.VehicleRoutingProblem;
import jsprit.core.problem.solution.VehicleRoutingProblemSolution;
import jsprit.core.problem.solution.route.VehicleRoute;
import jsprit.core.problem.solution.route.activity.TourActivity;
+import jsprit.core.util.Solutions;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -52,10 +53,8 @@ public class VehicleRoutingAlgorithm {
long i = counter++;
long n = nextCounter;
if (i >= n) {
- if (nextCounter==n) {
- nextCounter=n*2;
- log.info(this.name + n);
- }
+ nextCounter=n*2;
+ log.info(this.name + n);
}
}
@@ -65,20 +64,20 @@ public class VehicleRoutingAlgorithm {
}
}
- private static Logger logger = LogManager.getLogger(VehicleRoutingAlgorithm.class);
-
- private VehicleRoutingProblem problem;
-
- private int maxIterations = 100;
-
- private Counter counter = new Counter("iterations ");
-
- private SearchStrategyManager searchStrategyManager;
-
- private VehicleRoutingAlgorithmListeners algoListeners = new VehicleRoutingAlgorithmListeners();
-
- private Collection initialSolutions;
-
+ private final static Logger logger = LogManager.getLogger(VehicleRoutingAlgorithm.class);
+
+ private final Counter counter = new Counter("iterations ");
+
+ private final VehicleRoutingProblem problem;
+
+ private final SearchStrategyManager searchStrategyManager;
+
+ private final VehicleRoutingAlgorithmListeners algoListeners = new VehicleRoutingAlgorithmListeners();
+
+ private final Collection initialSolutions;
+
+ private int maxIterations = 100;
+
private PrematureAlgorithmTermination prematureAlgorithmTermination = new PrematureAlgorithmTermination() {
@Override
@@ -87,6 +86,8 @@ public class VehicleRoutingAlgorithm {
}
};
+
+ private VehicleRoutingProblemSolution bestEver = null;
public VehicleRoutingAlgorithm(VehicleRoutingProblem problem, SearchStrategyManager searchStrategyManager) {
super();
@@ -168,34 +169,47 @@ public class VehicleRoutingAlgorithm {
logger.info("algorithm starts");
double now = System.currentTimeMillis();
verify();
- int nuOfIterationsThisAlgoIsRunning = maxIterations;
+ int noIterationsThisAlgoIsRunning = maxIterations;
counter.reset();
Collection solutions = new ArrayList(initialSolutions);
algorithmStarts(problem,solutions);
- logger.info("iterations start");
+ bestEver = Solutions.bestOf(solutions);
+ logger.info("iterations start");
for(int i=0;i< maxIterations;i++){
iterationStarts(i+1,problem,solutions);
counter.incCounter();
SearchStrategy strategy = searchStrategyManager.getRandomStrategy();
DiscoveredSolution discoveredSolution = strategy.run(problem, solutions);
+ memorizeIfBestEver(discoveredSolution);
selectedStrategy(strategy.getName(),problem, solutions);
if(prematureAlgorithmTermination.isPrematureBreak(discoveredSolution)){
logger.info("premature break at iteration "+ (i+1));
- nuOfIterationsThisAlgoIsRunning = (i+1);
+ noIterationsThisAlgoIsRunning = (i+1);
break;
}
iterationEnds(i+1,problem,solutions);
}
- logger.info("iterations end at " + nuOfIterationsThisAlgoIsRunning + " iterations");
- algorithmEnds(problem,solutions);
+ logger.info("iterations end at " + noIterationsThisAlgoIsRunning + " iterations");
+ addBestEver(solutions);
+ algorithmEnds(problem, solutions);
logger.info("total time: " + ((System.currentTimeMillis()-now)/1000.0) + "s");
logger.info("done");
logger.info("------------------------------------------------");
return solutions;
}
-
-
- private void selectedStrategy(String name, VehicleRoutingProblem problem, Collection solutions) {
+
+ private void addBestEver(Collection solutions) {
+ if(bestEver != null) solutions.add(bestEver);
+ }
+
+ private void memorizeIfBestEver(DiscoveredSolution discoveredSolution) {
+ if(discoveredSolution == null) return;
+ if(bestEver == null) bestEver = discoveredSolution.getSolution();
+ else if(discoveredSolution.getSolution().getCost() < bestEver.getCost()) bestEver = discoveredSolution.getSolution();
+ }
+
+
+ private void selectedStrategy(String name, VehicleRoutingProblem problem, Collection solutions) {
algoListeners.selectedStrategy(name,problem, solutions);
}