1
0
Fork 0
mirror of https://github.com/graphhopper/jsprit.git synced 2020-01-24 07:45:05 +01:00
This commit is contained in:
oblonski 2014-11-16 12:19:55 +01:00
parent 99b30c460f
commit 9c857962d6

View file

@ -18,6 +18,7 @@
package jsprit.analysis.toolbox; package jsprit.analysis.toolbox;
import jsprit.core.algorithm.listener.AlgorithmEndsListener; import jsprit.core.algorithm.listener.AlgorithmEndsListener;
import jsprit.core.algorithm.listener.IterationStartsListener;
import jsprit.core.algorithm.recreate.InsertionData; import jsprit.core.algorithm.recreate.InsertionData;
import jsprit.core.algorithm.recreate.listener.BeforeJobInsertionListener; import jsprit.core.algorithm.recreate.listener.BeforeJobInsertionListener;
import jsprit.core.algorithm.recreate.listener.InsertionEndsListener; import jsprit.core.algorithm.recreate.listener.InsertionEndsListener;
@ -31,6 +32,7 @@ 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.problem.vehicle.Vehicle; import jsprit.core.problem.vehicle.Vehicle;
import jsprit.core.problem.vehicle.VehicleImpl; import jsprit.core.problem.vehicle.VehicleImpl;
import jsprit.core.util.Solutions;
import org.graphstream.graph.Edge; import org.graphstream.graph.Edge;
import org.graphstream.graph.Graph; import org.graphstream.graph.Graph;
import org.graphstream.graph.Node; import org.graphstream.graph.Node;
@ -43,7 +45,13 @@ import java.io.IOException;
import java.util.Collection; import java.util.Collection;
public class GraphStreamEventWriter implements RuinListener, InsertionStartsListener, BeforeJobInsertionListener, InsertionEndsListener, AlgorithmEndsListener { public class AlgorithmEventRecorder implements RuinListener, IterationStartsListener, InsertionStartsListener, BeforeJobInsertionListener, InsertionEndsListener, AlgorithmEndsListener {
public static enum RecordPolicy {
RECORD_AND_WRITE
}
public static final int BEFORE_RUIN_RENDER_SOLUTION = 2; public static final int BEFORE_RUIN_RENDER_SOLUTION = 2;
@ -53,13 +61,21 @@ public class GraphStreamEventWriter implements RuinListener, InsertionStartsList
public static final int CLEAR_SOLUTION = 3; public static final int CLEAR_SOLUTION = 3;
public static final int RENDER_FINAL_SOLUTION = 4;
private FileWriter writer; private FileWriter writer;
private Graph graph; private Graph graph;
private FileSinkDGS fileSink; private FileSinkDGS fileSink;
public GraphStreamEventWriter(VehicleRoutingProblem vrp, File outfile) { private int start_recording_at = 0;
private int end_recording_at = Integer.MAX_VALUE;
private int currentIteration = 0;
public AlgorithmEventRecorder(VehicleRoutingProblem vrp, File outfile) {
graph = new MultiGraph("g"); graph = new MultiGraph("g");
try { try {
writer = new FileWriter(outfile); writer = new FileWriter(outfile);
@ -72,7 +88,12 @@ public class GraphStreamEventWriter implements RuinListener, InsertionStartsList
initialiseGraph(vrp); initialiseGraph(vrp);
} }
public GraphStreamEventWriter(VehicleRoutingProblem vrp, VehicleRoutingProblemSolution initialSolution, File outfile) { public void setRecordingRange(int startIteration, int endIteration){
this.start_recording_at = startIteration;
this.end_recording_at = endIteration;
}
public AlgorithmEventRecorder(VehicleRoutingProblem vrp, VehicleRoutingProblemSolution initialSolution, File outfile) {
// this.outfile = outfile; // this.outfile = outfile;
// this.vrp = vrp; // this.vrp = vrp;
// graph = new MultiGraph("g"); // graph = new MultiGraph("g");
@ -91,7 +112,13 @@ public class GraphStreamEventWriter implements RuinListener, InsertionStartsList
@Override @Override
public void ruinStarts(Collection<VehicleRoute> routes) { public void ruinStarts(Collection<VehicleRoute> routes) {
if(!record()) return;
fileSink.stepBegins(graph.getId(),0,BEFORE_RUIN_RENDER_SOLUTION); fileSink.stepBegins(graph.getId(),0,BEFORE_RUIN_RENDER_SOLUTION);
recordRoutes(routes);
fileSink.stepBegins(graph.getId(),0,RUIN);
}
private void recordRoutes(Collection<VehicleRoute> routes) {
for(VehicleRoute route : routes){ for(VehicleRoute route : routes){
String prevNode = makeStartId(route.getVehicle()); String prevNode = makeStartId(route.getVehicle());
for(TourActivity act : route.getActivities()){ for(TourActivity act : route.getActivities()){
@ -102,7 +129,10 @@ public class GraphStreamEventWriter implements RuinListener, InsertionStartsList
String lastNode = makeEndId(route.getVehicle()); String lastNode = makeEndId(route.getVehicle());
addEdge(prevNode+"_"+lastNode,prevNode,lastNode); addEdge(prevNode+"_"+lastNode,prevNode,lastNode);
} }
fileSink.stepBegins(graph.getId(),0,RUIN); }
private boolean record() {
return currentIteration >= start_recording_at && currentIteration <= end_recording_at;
} }
@Override @Override
@ -112,6 +142,7 @@ public class GraphStreamEventWriter implements RuinListener, InsertionStartsList
@Override @Override
public void removed(Job job, VehicleRoute fromRoute) { public void removed(Job job, VehicleRoute fromRoute) {
if(!record()) return;
String nodeId = job.getId(); String nodeId = job.getId();
Node node = graph.getNode(nodeId); Node node = graph.getNode(nodeId);
markRemoved(node); markRemoved(node);
@ -137,6 +168,9 @@ public class GraphStreamEventWriter implements RuinListener, InsertionStartsList
@Override @Override
public void informAlgorithmEnds(VehicleRoutingProblem problem, Collection<VehicleRoutingProblemSolution> solutions) { public void informAlgorithmEnds(VehicleRoutingProblem problem, Collection<VehicleRoutingProblemSolution> solutions) {
VehicleRoutingProblemSolution solution = Solutions.bestOf(solutions);
fileSink.stepBegins(graph.getId(),0,BEFORE_RUIN_RENDER_SOLUTION);
recordRoutes(solution.getRoutes());
try { try {
fileSink.end(); fileSink.end();
writer.close(); writer.close();
@ -145,6 +179,11 @@ public class GraphStreamEventWriter implements RuinListener, InsertionStartsList
} }
} }
@Override
public void informIterationStarts(int i, VehicleRoutingProblem problem, Collection<VehicleRoutingProblemSolution> solutions) {
currentIteration = i;
}
private void initialiseGraph(VehicleRoutingProblem problem) { private void initialiseGraph(VehicleRoutingProblem problem) {
for(Vehicle vehicle : problem.getVehicles()){ for(Vehicle vehicle : problem.getVehicles()){
addVehicle(vehicle); addVehicle(vehicle);
@ -189,6 +228,7 @@ public class GraphStreamEventWriter implements RuinListener, InsertionStartsList
@Override @Override
public void informInsertionEnds(Collection<VehicleRoute> vehicleRoutes) { public void informInsertionEnds(Collection<VehicleRoute> vehicleRoutes) {
if(!record()) return;
fileSink.stepBegins(graph.getId(),0,CLEAR_SOLUTION); fileSink.stepBegins(graph.getId(),0,CLEAR_SOLUTION);
for(VehicleRoute route : vehicleRoutes){ for(VehicleRoute route : vehicleRoutes){
String prevNode = makeStartId(route.getVehicle()); String prevNode = makeStartId(route.getVehicle());
@ -204,6 +244,7 @@ public class GraphStreamEventWriter implements RuinListener, InsertionStartsList
@Override @Override
public void informBeforeJobInsertion(Job job, InsertionData data, VehicleRoute route) { public void informBeforeJobInsertion(Job job, InsertionData data, VehicleRoute route) {
if(!record()) return;
markInserted(job); markInserted(job);
boolean vehicleSwitch = false; boolean vehicleSwitch = false;
if(!(route.getVehicle() instanceof VehicleImpl.NoVehicle)) { if(!(route.getVehicle() instanceof VehicleImpl.NoVehicle)) {
@ -271,6 +312,7 @@ public class GraphStreamEventWriter implements RuinListener, InsertionStartsList
@Override @Override
public void informInsertionStarts(Collection<VehicleRoute> vehicleRoutes, Collection<Job> unassignedJobs) { public void informInsertionStarts(Collection<VehicleRoute> vehicleRoutes, Collection<Job> unassignedJobs) {
if(!record()) return;
fileSink.stepBegins(graph.getId(),0,RECREATE); fileSink.stepBegins(graph.getId(),0,RECREATE);
} }
} }