mirror of
https://github.com/graphhopper/jsprit.git
synced 2020-01-24 07:45:05 +01:00
add bad job list
This commit is contained in:
parent
62331ccfd9
commit
c3155a0938
5 changed files with 7 additions and 128 deletions
|
|
@ -1,125 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (C) 2013 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
|
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
|
||||||
******************************************************************************/
|
|
||||||
package jsprit.core.algorithm;
|
|
||||||
|
|
||||||
import jsprit.core.algorithm.io.VehicleRoutingAlgorithms;
|
|
||||||
import jsprit.core.algorithm.listener.AlgorithmStartsListener;
|
|
||||||
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.*;
|
|
||||||
import org.apache.commons.math.stat.descriptive.moment.Mean;
|
|
||||||
import org.apache.commons.math.stat.descriptive.moment.StandardDeviation;
|
|
||||||
import org.apache.logging.log4j.LogManager;
|
|
||||||
import org.apache.logging.log4j.Logger;
|
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
|
|
||||||
|
|
||||||
class NeighborhoodThresholdInitialiser implements AlgorithmStartsListener{
|
|
||||||
|
|
||||||
private static Logger log = LogManager.getLogger(NeighborhoodThresholdInitialiser.class);
|
|
||||||
|
|
||||||
private NeighborhoodImpl neighborhood;
|
|
||||||
|
|
||||||
private VehicleRoutingAlgorithmFactory routingAlgorithmFactory = new VehicleRoutingAlgorithmFactory() {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public VehicleRoutingAlgorithm createAlgorithm(VehicleRoutingProblem vrp) {
|
|
||||||
VehicleRoutingAlgorithm algorithm = VehicleRoutingAlgorithms.readAndCreateAlgorithm(vrp, "resources/config.xml");
|
|
||||||
return algorithm;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
private int crowFlySpeed = 20;
|
|
||||||
|
|
||||||
public NeighborhoodThresholdInitialiser(NeighborhoodImpl neighborhood) {
|
|
||||||
this.neighborhood = neighborhood;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param crowFlySpeed the crowFlySpeed to set
|
|
||||||
*/
|
|
||||||
public void setCrowFlySpeed(int crowFlySpeed) {
|
|
||||||
this.crowFlySpeed = crowFlySpeed;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param routingAlgorithmFactory the routingAlgorithm to set
|
|
||||||
*/
|
|
||||||
public void setRoutingAlgorithmFactory(VehicleRoutingAlgorithmFactory routingAlgorithmFactory) {
|
|
||||||
this.routingAlgorithmFactory = routingAlgorithmFactory;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void initialise(VehicleRoutingProblem problem){
|
|
||||||
informAlgorithmStarts(problem, null, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void informAlgorithmStarts(VehicleRoutingProblem problem, VehicleRoutingAlgorithm algorithm, Collection<VehicleRoutingProblemSolution> solutions) {
|
|
||||||
VehicleRoutingProblem.Builder builder = VehicleRoutingProblem.Builder.newInstance();
|
|
||||||
builder.addAllJobs(problem.getJobs().values());
|
|
||||||
builder.addAllVehicles(problem.getVehicles());
|
|
||||||
CrowFlyCosts crowFly = new CrowFlyCosts(builder.getLocations());
|
|
||||||
crowFly.speed = crowFlySpeed;
|
|
||||||
builder.setRoutingCost(crowFly);
|
|
||||||
VehicleRoutingProblem pblm = builder.build();
|
|
||||||
|
|
||||||
VehicleRoutingAlgorithm algo = routingAlgorithmFactory.createAlgorithm(pblm);
|
|
||||||
Collection<VehicleRoutingProblemSolution> mySolutions = algo.searchSolutions();
|
|
||||||
|
|
||||||
double threshold = determineThreshold(pblm,builder.getLocations(), mySolutions);
|
|
||||||
neighborhood.setThreshold(threshold);
|
|
||||||
neighborhood.initialise();
|
|
||||||
}
|
|
||||||
|
|
||||||
private double determineThreshold(VehicleRoutingProblem pblm, Locations locations, Collection<VehicleRoutingProblemSolution> mySolutions) {
|
|
||||||
VehicleRoutingProblemSolution bestSolution = Solutions.bestOf(mySolutions);
|
|
||||||
double[] distances = new double[bestSolution.getRoutes().size()+pblm.getJobs().size()];
|
|
||||||
getDistances(distances,bestSolution,locations);
|
|
||||||
Mean mean = new Mean();
|
|
||||||
double meanValue = mean.evaluate(distances);
|
|
||||||
StandardDeviation dev = new StandardDeviation();
|
|
||||||
double devValue = dev.evaluate(distances, meanValue);
|
|
||||||
log.info("mean="+meanValue+", dev="+devValue);
|
|
||||||
return meanValue + devValue;
|
|
||||||
// + 2*devValue;
|
|
||||||
// return Double.MAX_VALUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void getDistances(double[] distances, VehicleRoutingProblemSolution bestSolution, Locations locations) {
|
|
||||||
int index = 0;
|
|
||||||
for(VehicleRoute route : bestSolution.getRoutes()){
|
|
||||||
TourActivity prev = null;
|
|
||||||
for(TourActivity act : route.getTourActivities().getActivities()){
|
|
||||||
if(prev == null){ prev = act; continue; }
|
|
||||||
double dist = EuclideanDistanceCalculator.calculateDistance(locations.getCoord(prev.getLocationId()), locations.getCoord(act.getLocationId()));
|
|
||||||
// log.info("dist="+dist);
|
|
||||||
distances[index] = dist;
|
|
||||||
index++;
|
|
||||||
prev = act;
|
|
||||||
}
|
|
||||||
// double dist = EuclideanDistanceCalculator.calculateDistance(locations.getCoord(prev.getLocationId()), locations.getCoord(route.getEnd().getLocationId()));
|
|
||||||
// distances[index] = dist;
|
|
||||||
// index++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -52,7 +52,7 @@ public class VariablePlusFixedSolutionCostCalculatorFactory {
|
||||||
c += stateManager.getRouteState(r, InternalStates.COSTS, Double.class);
|
c += stateManager.getRouteState(r, InternalStates.COSTS, Double.class);
|
||||||
c += getFixedCosts(r.getVehicle());
|
c += getFixedCosts(r.getVehicle());
|
||||||
}
|
}
|
||||||
c += solution.getBadJobs().size() * c * .1;
|
c += solution.getBadJobs().size() * c * .05;
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -526,7 +526,9 @@ public class VehicleRoutingProblem {
|
||||||
*
|
*
|
||||||
* @param penaltyFactor penaltyFactor of penaltyVehicle
|
* @param penaltyFactor penaltyFactor of penaltyVehicle
|
||||||
* @return this builder
|
* @return this builder
|
||||||
|
* @deprecated since 1.3.2-SNAPSHOT bad job list replaces penalty vehicles
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public Builder addPenaltyVehicles(double penaltyFactor){
|
public Builder addPenaltyVehicles(double penaltyFactor){
|
||||||
this.addPenaltyVehicles = true;
|
this.addPenaltyVehicles = true;
|
||||||
this.penaltyFactor = penaltyFactor;
|
this.penaltyFactor = penaltyFactor;
|
||||||
|
|
@ -543,7 +545,9 @@ public class VehicleRoutingProblem {
|
||||||
* @param penaltyFactor the penaltyFactor of penaltyVehicle
|
* @param penaltyFactor the penaltyFactor of penaltyVehicle
|
||||||
* @param penaltyFixedCosts which is an absolute penaltyValue (in contrary to penaltyFactor)
|
* @param penaltyFixedCosts which is an absolute penaltyValue (in contrary to penaltyFactor)
|
||||||
* @return this builder
|
* @return this builder
|
||||||
|
* @deprecated since 1.3.2-SNAPSHOT bad job list replaces penalty vehicles
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public Builder addPenaltyVehicles(double penaltyFactor, double penaltyFixedCosts){
|
public Builder addPenaltyVehicles(double penaltyFactor, double penaltyFixedCosts){
|
||||||
this.addPenaltyVehicles = true;
|
this.addPenaltyVehicles = true;
|
||||||
this.penaltyFactor = penaltyFactor;
|
this.penaltyFactor = penaltyFactor;
|
||||||
|
|
|
||||||
|
|
@ -272,7 +272,7 @@ public class BicycleMessenger {
|
||||||
vraBuilder.addDefaultCostCalculators();
|
vraBuilder.addDefaultCostCalculators();
|
||||||
vraBuilder.setStateAndConstraintManager(stateManager, constraintManager);
|
vraBuilder.setStateAndConstraintManager(stateManager, constraintManager);
|
||||||
VehicleRoutingAlgorithm algorithm = vraBuilder.build();
|
VehicleRoutingAlgorithm algorithm = vraBuilder.build();
|
||||||
algorithm.setMaxIterations(2000);
|
algorithm.setMaxIterations(5000);
|
||||||
VariationCoefficientTermination prematureAlgorithmTermination = new VariationCoefficientTermination(200, 0.001);
|
VariationCoefficientTermination prematureAlgorithmTermination = new VariationCoefficientTermination(200, 0.001);
|
||||||
// algorithm.setPrematureAlgorithmTermination(prematureAlgorithmTermination);
|
// algorithm.setPrematureAlgorithmTermination(prematureAlgorithmTermination);
|
||||||
// algorithm.addListener(prematureAlgorithmTermination);
|
// algorithm.addListener(prematureAlgorithmTermination);
|
||||||
|
|
|
||||||
|
|
@ -105,7 +105,7 @@ public class MultipleDepotExampleWithPenaltyVehicles {
|
||||||
* solve the problem
|
* solve the problem
|
||||||
*/
|
*/
|
||||||
VehicleRoutingAlgorithm vra = VehicleRoutingAlgorithms.readAndCreateAlgorithm(vrp, "input/algorithmConfig.xml");
|
VehicleRoutingAlgorithm vra = VehicleRoutingAlgorithms.readAndCreateAlgorithm(vrp, "input/algorithmConfig.xml");
|
||||||
vra.setMaxIterations(2000);
|
vra.setMaxIterations(5000);
|
||||||
vra.getAlgorithmListeners().addListener(new StopWatch(),Priority.HIGH);
|
vra.getAlgorithmListeners().addListener(new StopWatch(),Priority.HIGH);
|
||||||
vra.getAlgorithmListeners().addListener(new AlgorithmSearchProgressChartListener("output/progress.png"));
|
vra.getAlgorithmListeners().addListener(new AlgorithmSearchProgressChartListener("output/progress.png"));
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue