1
0
Fork 0
mirror of https://github.com/graphhopper/jsprit.git synced 2020-01-24 07:45:05 +01:00

memorize overall best (#124, #125)

This commit is contained in:
oblonski 2014-08-28 20:18:13 +02:00
parent 86cd1bb0d7
commit 7be8a408f1

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (C) 2013 Stefan Schroeder * Copyright (C) 2014 Stefan Schroeder
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public * modify it under the terms of the GNU Lesser General Public
@ -23,6 +23,7 @@ import jsprit.core.problem.VehicleRoutingProblem;
import jsprit.core.problem.solution.VehicleRoutingProblemSolution; import jsprit.core.problem.solution.VehicleRoutingProblemSolution;
import jsprit.core.problem.solution.route.VehicleRoute; import jsprit.core.problem.solution.route.VehicleRoute;
import jsprit.core.problem.solution.route.activity.TourActivity; import jsprit.core.problem.solution.route.activity.TourActivity;
import jsprit.core.util.Solutions;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
@ -52,12 +53,10 @@ public class VehicleRoutingAlgorithm {
long i = counter++; long i = counter++;
long n = nextCounter; long n = nextCounter;
if (i >= n) { if (i >= n) {
if (nextCounter==n) {
nextCounter=n*2; nextCounter=n*2;
log.info(this.name + n); log.info(this.name + n);
} }
} }
}
public void reset() { public void reset() {
counter=0; counter=0;
@ -65,20 +64,20 @@ public class VehicleRoutingAlgorithm {
} }
} }
private static Logger logger = LogManager.getLogger(VehicleRoutingAlgorithm.class); private final static Logger logger = LogManager.getLogger(VehicleRoutingAlgorithm.class);
private VehicleRoutingProblem problem; private final Counter counter = new Counter("iterations ");
private final VehicleRoutingProblem problem;
private final SearchStrategyManager searchStrategyManager;
private final VehicleRoutingAlgorithmListeners algoListeners = new VehicleRoutingAlgorithmListeners();
private final Collection<VehicleRoutingProblemSolution> initialSolutions;
private int maxIterations = 100; private int maxIterations = 100;
private Counter counter = new Counter("iterations ");
private SearchStrategyManager searchStrategyManager;
private VehicleRoutingAlgorithmListeners algoListeners = new VehicleRoutingAlgorithmListeners();
private Collection<VehicleRoutingProblemSolution> initialSolutions;
private PrematureAlgorithmTermination prematureAlgorithmTermination = new PrematureAlgorithmTermination() { private PrematureAlgorithmTermination prematureAlgorithmTermination = new PrematureAlgorithmTermination() {
@Override @Override
@ -88,6 +87,8 @@ public class VehicleRoutingAlgorithm {
}; };
private VehicleRoutingProblemSolution bestEver = null;
public VehicleRoutingAlgorithm(VehicleRoutingProblem problem, SearchStrategyManager searchStrategyManager) { public VehicleRoutingAlgorithm(VehicleRoutingProblem problem, SearchStrategyManager searchStrategyManager) {
super(); super();
this.problem = problem; this.problem = problem;
@ -168,32 +169,45 @@ public class VehicleRoutingAlgorithm {
logger.info("algorithm starts"); logger.info("algorithm starts");
double now = System.currentTimeMillis(); double now = System.currentTimeMillis();
verify(); verify();
int nuOfIterationsThisAlgoIsRunning = maxIterations; int noIterationsThisAlgoIsRunning = maxIterations;
counter.reset(); counter.reset();
Collection<VehicleRoutingProblemSolution> solutions = new ArrayList<VehicleRoutingProblemSolution>(initialSolutions); Collection<VehicleRoutingProblemSolution> solutions = new ArrayList<VehicleRoutingProblemSolution>(initialSolutions);
algorithmStarts(problem,solutions); algorithmStarts(problem,solutions);
bestEver = Solutions.bestOf(solutions);
logger.info("iterations start"); logger.info("iterations start");
for(int i=0;i< maxIterations;i++){ for(int i=0;i< maxIterations;i++){
iterationStarts(i+1,problem,solutions); iterationStarts(i+1,problem,solutions);
counter.incCounter(); counter.incCounter();
SearchStrategy strategy = searchStrategyManager.getRandomStrategy(); SearchStrategy strategy = searchStrategyManager.getRandomStrategy();
DiscoveredSolution discoveredSolution = strategy.run(problem, solutions); DiscoveredSolution discoveredSolution = strategy.run(problem, solutions);
memorizeIfBestEver(discoveredSolution);
selectedStrategy(strategy.getName(),problem, solutions); selectedStrategy(strategy.getName(),problem, solutions);
if(prematureAlgorithmTermination.isPrematureBreak(discoveredSolution)){ if(prematureAlgorithmTermination.isPrematureBreak(discoveredSolution)){
logger.info("premature break at iteration "+ (i+1)); logger.info("premature break at iteration "+ (i+1));
nuOfIterationsThisAlgoIsRunning = (i+1); noIterationsThisAlgoIsRunning = (i+1);
break; break;
} }
iterationEnds(i+1,problem,solutions); iterationEnds(i+1,problem,solutions);
} }
logger.info("iterations end at " + nuOfIterationsThisAlgoIsRunning + " iterations"); logger.info("iterations end at " + noIterationsThisAlgoIsRunning + " iterations");
algorithmEnds(problem,solutions); addBestEver(solutions);
algorithmEnds(problem, solutions);
logger.info("total time: " + ((System.currentTimeMillis()-now)/1000.0) + "s"); logger.info("total time: " + ((System.currentTimeMillis()-now)/1000.0) + "s");
logger.info("done"); logger.info("done");
logger.info("------------------------------------------------"); logger.info("------------------------------------------------");
return solutions; return solutions;
} }
private void addBestEver(Collection<VehicleRoutingProblemSolution> 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<VehicleRoutingProblemSolution> solutions) { private void selectedStrategy(String name, VehicleRoutingProblem problem, Collection<VehicleRoutingProblemSolution> solutions) {
algoListeners.selectedStrategy(name,problem, solutions); algoListeners.selectedStrategy(name,problem, solutions);