mirror of
https://github.com/graphhopper/jsprit.git
synced 2020-01-24 07:45:05 +01:00
analyse effects of strategies
This commit is contained in:
parent
3213765b50
commit
c1c140e683
1 changed files with 162 additions and 0 deletions
|
|
@ -0,0 +1,162 @@
|
|||
/*
|
||||
* Licensed to GraphHopper GmbH under one or more contributor
|
||||
* license agreements. See the NOTICE file distributed with this work for
|
||||
* additional information regarding copyright ownership.
|
||||
*
|
||||
* GraphHopper GmbH licenses this file to you under the Apache License,
|
||||
* Version 2.0 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.graphhopper.jsprit.analysis.toolbox;
|
||||
|
||||
import com.graphhopper.jsprit.core.algorithm.SearchStrategy;
|
||||
import com.graphhopper.jsprit.core.algorithm.listener.AlgorithmEndsListener;
|
||||
import com.graphhopper.jsprit.core.algorithm.listener.IterationStartsListener;
|
||||
import com.graphhopper.jsprit.core.algorithm.listener.StrategySelectedListener;
|
||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
||||
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.PrintWriter;
|
||||
import java.io.Writer;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* Created by schroeder on 27/04/17.
|
||||
*/
|
||||
public class StrategyAnalyser implements AlgorithmEndsListener, StrategySelectedListener, IterationStartsListener {
|
||||
|
||||
|
||||
public static class Strategy {
|
||||
|
||||
private final String id;
|
||||
|
||||
private int selected = 0;
|
||||
|
||||
private int improved = 0;
|
||||
|
||||
private int countNewSolution = 0;
|
||||
|
||||
private List<Double> improvements = new ArrayList<>();
|
||||
|
||||
public Strategy(String id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public void selected() {
|
||||
selected++;
|
||||
}
|
||||
|
||||
public void improvedSolution(double improvement) {
|
||||
improved++;
|
||||
improvements.add(improvement);
|
||||
}
|
||||
|
||||
public void newSolution() {
|
||||
countNewSolution++;
|
||||
}
|
||||
|
||||
public String getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public int getCountSelected() {
|
||||
return selected;
|
||||
}
|
||||
|
||||
public int getCountImproved() {
|
||||
return improved;
|
||||
}
|
||||
|
||||
public int getCountNewSolution() {
|
||||
return countNewSolution;
|
||||
}
|
||||
|
||||
public List<Double> getImprovements() {
|
||||
return improvements;
|
||||
}
|
||||
}
|
||||
|
||||
private Map<String, Strategy> strategyMap = new HashMap<>();
|
||||
|
||||
private Collection<VehicleRoutingProblemSolution> last;
|
||||
|
||||
private Writer out;
|
||||
|
||||
@Override
|
||||
public void informIterationStarts(int i, VehicleRoutingProblem problem, Collection<VehicleRoutingProblemSolution> solutions) {
|
||||
last = new ArrayList<>(solutions);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void informSelectedStrategy(SearchStrategy.DiscoveredSolution discoveredSolution, VehicleRoutingProblem vehicleRoutingProblem, Collection<VehicleRoutingProblemSolution> vehicleRoutingProblemSolutions) {
|
||||
String strategyId = discoveredSolution.getStrategyId();
|
||||
if (!strategyMap.containsKey(strategyId)) {
|
||||
strategyMap.put(strategyId, new Strategy(strategyId));
|
||||
}
|
||||
Strategy strategy = strategyMap.get(strategyId);
|
||||
strategy.selected();
|
||||
if (discoveredSolution.isAccepted()) strategy.newSolution();
|
||||
if (isBetter(vehicleRoutingProblemSolutions, last)) {
|
||||
strategy.improvedSolution(getImprovement(vehicleRoutingProblemSolutions, last));
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public void setOutWriter(Writer out) {
|
||||
this.out = out;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void informAlgorithmEnds(VehicleRoutingProblem problem, Collection<VehicleRoutingProblemSolution> solutions) {
|
||||
if (out == null) out = new PrintWriter(System.out);
|
||||
try {
|
||||
for (String stratId : strategyMap.keySet()) {
|
||||
StrategyAnalyser.Strategy strategy = strategyMap.get(stratId);
|
||||
out.write("id: " + stratId + ", #selected: " + strategy.getCountSelected() + ", #newSolutions: " + strategy.getCountNewSolution()
|
||||
+ ", #improvedSolutions: " + strategy.getCountImproved() + ", improvements: " + strategy.getImprovements().toString() + "\n");
|
||||
}
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
} finally {
|
||||
try {
|
||||
out.flush();
|
||||
out.close();
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private double getImprovement(Collection<VehicleRoutingProblemSolution> vehicleRoutingProblemSolutions, Collection<VehicleRoutingProblemSolution> last) {
|
||||
for (VehicleRoutingProblemSolution solution : vehicleRoutingProblemSolutions) {
|
||||
for (VehicleRoutingProblemSolution lastSolution : last) {
|
||||
if (solution.getCost() < lastSolution.getCost())
|
||||
return Math.round(lastSolution.getCost() - solution.getCost());
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
private boolean isBetter(Collection<VehicleRoutingProblemSolution> vehicleRoutingProblemSolutions, Collection<VehicleRoutingProblemSolution> last) {
|
||||
for (VehicleRoutingProblemSolution solution : vehicleRoutingProblemSolutions) {
|
||||
for (VehicleRoutingProblemSolution lastSolution : last) {
|
||||
if (solution.getCost() < lastSolution.getCost()) return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public Map<String, Strategy> getStrategies() {
|
||||
return strategyMap;
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue