diff --git a/jsprit-analysis/src/main/java/jsprit/analysis/toolbox/GraphStreamEventWriter.java b/jsprit-analysis/src/main/java/jsprit/analysis/toolbox/GraphStreamEventWriter.java
index e7c23366..a3c7cef7 100644
--- a/jsprit-analysis/src/main/java/jsprit/analysis/toolbox/GraphStreamEventWriter.java
+++ b/jsprit-analysis/src/main/java/jsprit/analysis/toolbox/GraphStreamEventWriter.java
@@ -1,9 +1,27 @@
+/*******************************************************************************
+ * 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
+ * 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 .
+ ******************************************************************************/
+
package jsprit.analysis.toolbox;
import jsprit.core.algorithm.listener.AlgorithmEndsListener;
import jsprit.core.algorithm.recreate.InsertionData;
import jsprit.core.algorithm.recreate.listener.BeforeJobInsertionListener;
import jsprit.core.algorithm.recreate.listener.InsertionEndsListener;
+import jsprit.core.algorithm.recreate.listener.InsertionStartsListener;
import jsprit.core.algorithm.ruin.listener.RuinListener;
import jsprit.core.problem.VehicleRoutingProblem;
import jsprit.core.problem.job.Job;
@@ -17,52 +35,37 @@ import org.graphstream.graph.Edge;
import org.graphstream.graph.Graph;
import org.graphstream.graph.Node;
import org.graphstream.graph.implementations.MultiGraph;
+import org.graphstream.stream.file.FileSinkDGS;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-/**
- * Created by stefan on 14.11.14.
- */
-public class GraphStreamEventWriter implements RuinListener, BeforeJobInsertionListener, InsertionEndsListener, AlgorithmEndsListener {
- static class Edges {
+public class GraphStreamEventWriter implements RuinListener, InsertionStartsListener, BeforeJobInsertionListener, InsertionEndsListener, AlgorithmEndsListener {
- String inEdgeId;
+ public static final int BEFORE_RUIN_RENDER_SOLUTION = 2;
- String outEdgeId;
+ public static final int RUIN = 0;
- Edges(String inEdgeId, String outEdgeId) {
- this.inEdgeId = inEdgeId;
- this.outEdgeId = outEdgeId;
- }
- }
+ public static final int RECREATE = 1;
- private File outfile;
+ public static final int CLEAR_SOLUTION = 3;
private FileWriter writer;
- private Map in_out_edges = new HashMap();
-
private Graph graph;
- private VehicleRoutingProblem vrp;
-
- private boolean notInitialized = true;
+ private FileSinkDGS fileSink;
public GraphStreamEventWriter(VehicleRoutingProblem vrp, File outfile) {
- this.outfile = outfile;
- this.vrp = vrp;
graph = new MultiGraph("g");
try {
writer = new FileWriter(outfile);
- writeHead();
+ fileSink = new FileSinkDGS();
+ fileSink.begin(writer);
+ graph.addSink(fileSink);
} catch (IOException e) {
e.printStackTrace();
}
@@ -70,16 +73,16 @@ public class GraphStreamEventWriter implements RuinListener, BeforeJobInsertionL
}
public GraphStreamEventWriter(VehicleRoutingProblem vrp, VehicleRoutingProblemSolution initialSolution, File outfile) {
- this.outfile = outfile;
- this.vrp = vrp;
- graph = new MultiGraph("g");
- try {
- writer = new FileWriter(outfile);
- writeHead();
- } catch (IOException e) {
- e.printStackTrace();
- }
- initialiseGraph(vrp,initialSolution);
+// this.outfile = outfile;
+// this.vrp = vrp;
+// graph = new MultiGraph("g");
+// try {
+// writer = new FileWriter(outfile);
+// writeHead();
+// } catch (IOException e) {
+// e.printStackTrace();
+// }
+// initialiseGraph(vrp,initialSolution);
}
private void initialiseGraph(VehicleRoutingProblem vrp, VehicleRoutingProblemSolution initialSolution) {
@@ -88,6 +91,7 @@ public class GraphStreamEventWriter implements RuinListener, BeforeJobInsertionL
@Override
public void ruinStarts(Collection routes) {
+ fileSink.stepBegins(graph.getId(),0,BEFORE_RUIN_RENDER_SOLUTION);
for(VehicleRoute route : routes){
String prevNode = makeStartId(route.getVehicle());
for(TourActivity act : route.getActivities()){
@@ -98,18 +102,7 @@ public class GraphStreamEventWriter implements RuinListener, BeforeJobInsertionL
String lastNode = makeEndId(route.getVehicle());
addEdge(prevNode+"_"+lastNode,prevNode,lastNode);
}
- }
-
- private void removeNode(Node node) {
- graph.removeNode(node);
- String eventString = "dn " + node.getId() + "\n";
- System.out.print(eventString);
- try {
- writer.write(eventString);
- } catch (IOException e) {
- e.printStackTrace();
- }
-
+ fileSink.stepBegins(graph.getId(),0,RUIN);
}
@Override
@@ -119,12 +112,9 @@ public class GraphStreamEventWriter implements RuinListener, BeforeJobInsertionL
@Override
public void removed(Job job, VehicleRoute fromRoute) {
- System.out.println("remove job " + job.getId());
String nodeId = job.getId();
Node node = graph.getNode(nodeId);
-
markRemoved(node);
-
Edge entering = node.getEnteringEdge(0);
removeEdge(entering.getId());
Edge leaving = node.getLeavingEdge(0);
@@ -139,11 +129,6 @@ public class GraphStreamEventWriter implements RuinListener, BeforeJobInsertionL
private void markRemoved(Node node) {
node.setAttribute("ui.class","removed");
- try {
- writer.write("cn " + node.getId() + " ui.class:removed\n");
- } catch (IOException e) {
- e.printStackTrace();
- }
}
private String makeEdgeId(Node from, Node to) {
@@ -153,17 +138,13 @@ public class GraphStreamEventWriter implements RuinListener, BeforeJobInsertionL
@Override
public void informAlgorithmEnds(VehicleRoutingProblem problem, Collection solutions) {
try {
+ fileSink.end();
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
- private void writeHead() throws IOException {
- writer.write("DGS004\n");
- writer.write("null 0 0\n");
- }
-
private void initialiseGraph(VehicleRoutingProblem problem) {
for(Vehicle vehicle : problem.getVehicles()){
addVehicle(vehicle);
@@ -176,23 +157,18 @@ public class GraphStreamEventWriter implements RuinListener, BeforeJobInsertionL
}
private void addVehicle(Vehicle vehicle) {
- try {
- String startId = makeStartId(vehicle);
- String startNodeEventString = "an " + startId + " x:" + vehicle.getStartLocationCoordinate().getX() + " y:"
- + vehicle.getStartLocationCoordinate().getY() + " ui.class:depot\n";
- System.out.print(startNodeEventString);
- writer.write(startNodeEventString);
- graph.addNode(startId);
- String endId = makeEndId(vehicle);
- if(!startId.equals(endId)){
- String endNodeEventString = "an " + endId + " x:" + vehicle.getEndLocationCoordinate().getX() + " y:"
- + vehicle.getEndLocationCoordinate().getY() + " ui.class:depot\n";
- System.out.print(endNodeEventString);
- writer.write( endNodeEventString);
- graph.addNode(endId);
- }
- } catch (IOException e) {
- e.printStackTrace();
+ String startId = makeStartId(vehicle);
+ Node node = graph.addNode(startId);
+ node.addAttribute("x",vehicle.getStartLocationCoordinate().getX());
+ node.addAttribute("y",vehicle.getStartLocationCoordinate().getY());
+ node.addAttribute("ui.class","depot");
+
+ String endId = makeEndId(vehicle);
+ if(!startId.equals(endId)){
+ Node endNode = graph.addNode(endId);
+ endNode.addAttribute("x",vehicle.getEndLocationCoordinate().getX());
+ endNode.addAttribute("y",vehicle.getEndLocationCoordinate().getY());
+ endNode.addAttribute("ui.class","depot");
}
}
@@ -206,18 +182,14 @@ public class GraphStreamEventWriter implements RuinListener, BeforeJobInsertionL
}
private void addService(Service service) {
- try {
- String eventString = "an " + service.getId() + " x:" + service.getCoord().getX() + " y:" + service.getCoord().getY() + "\n";
- System.out.print(eventString);
- writer.write(eventString);
- graph.addNode(service.getId());
- } catch (IOException e) {
- e.printStackTrace();
- }
+ Node serviceNode = graph.addNode(service.getId());
+ serviceNode.addAttribute("x", service.getCoord().getX());
+ serviceNode.addAttribute("y", service.getCoord().getY());
}
@Override
public void informInsertionEnds(Collection vehicleRoutes) {
+ fileSink.stepBegins(graph.getId(),0,CLEAR_SOLUTION);
for(VehicleRoute route : vehicleRoutes){
String prevNode = makeStartId(route.getVehicle());
for(TourActivity act : route.getActivities()){
@@ -232,7 +204,6 @@ public class GraphStreamEventWriter implements RuinListener, BeforeJobInsertionL
@Override
public void informBeforeJobInsertion(Job job, InsertionData data, VehicleRoute route) {
- System.out.println("insert job " + job.getId());
markInserted(job);
boolean vehicleSwitch = false;
if(!(route.getVehicle() instanceof VehicleImpl.NoVehicle)) {
@@ -241,7 +212,6 @@ public class GraphStreamEventWriter implements RuinListener, BeforeJobInsertionL
}
}
if(vehicleSwitch && !route.getActivities().isEmpty()){
- System.out.println("switch vehicle " + route.getVehicle().getId() + " --> " + data.getSelectedVehicle().getId());
String oldStart = makeStartId(route.getVehicle());
String firstAct = ((TourActivity.JobActivity)route.getActivities().get(0)).getJob().getId();
String oldEnd = makeEndId(route.getVehicle());
@@ -281,22 +251,10 @@ public class GraphStreamEventWriter implements RuinListener, BeforeJobInsertionL
private void markInserted(Job job) {
graph.getNode(job.getId()).removeAttribute("ui.class");
- try {
- writer.write("cn " + job.getId() + " -ui.class\n");
- } catch (IOException e) {
- e.printStackTrace();
- }
}
private void removeEdge(String edgeId) {
- try {
- String eventString = "de " + edgeId + "\n";
- System.out.print(eventString);
- writer.write(eventString);
- graph.removeEdge(edgeId);
- } catch (IOException e) {
- e.printStackTrace();
- }
+ graph.removeEdge(edgeId);
}
private boolean isFirst(InsertionData data, VehicleRoute route) {
@@ -308,14 +266,11 @@ public class GraphStreamEventWriter implements RuinListener, BeforeJobInsertionL
}
private void addEdge(String edgeId, String fromNode, String toNode) {
- try {
- String eventString = "ae " + edgeId + " " + fromNode + " > " + toNode + "\n";
- System.out.print(eventString);
- writer.write(eventString);
- graph.addEdge(edgeId,fromNode,toNode,true);
- } catch (IOException e) {
- e.printStackTrace();
- }
+ graph.addEdge(edgeId,fromNode,toNode,true);
}
+ @Override
+ public void informInsertionStarts(Collection vehicleRoutes, Collection unassignedJobs) {
+ fileSink.stepBegins(graph.getId(),0,RECREATE);
+ }
}
diff --git a/jsprit-analysis/src/main/java/jsprit/analysis/toolbox/GraphStreamViewer.java b/jsprit-analysis/src/main/java/jsprit/analysis/toolbox/GraphStreamViewer.java
index c20375a3..0cb2fd3a 100644
--- a/jsprit-analysis/src/main/java/jsprit/analysis/toolbox/GraphStreamViewer.java
+++ b/jsprit-analysis/src/main/java/jsprit/analysis/toolbox/GraphStreamViewer.java
@@ -43,6 +43,22 @@ import java.awt.*;
public class GraphStreamViewer {
+
+ public static Graph createMultiGraph(String name, String style){
+ Graph g = new MultiGraph(name);
+ g.addAttribute("ui.quality");
+ g.addAttribute("ui.antialias");
+ g.addAttribute("ui.stylesheet", style);
+ return g;
+ }
+
+ public static View createEmbeddedView(Graph graph, double scaling){
+ Viewer viewer = new Viewer(graph,Viewer.ThreadingModel.GRAPH_IN_ANOTHER_THREAD);
+ View view = viewer.addDefaultView(false);
+ view.setPreferredSize(new Dimension((int)(698*scaling),(int)(440*scaling)));
+ return view;
+ }
+
public static String STYLESHEET =
"node {" +
" size: 10px, 10px;" +
@@ -184,14 +200,14 @@ public class GraphStreamViewer {
Graph g = createMultiGraph("g");
- View view = createEmbeddedView(g);
+ View view = createEmbeddedView(g,scaling);
- JFrame jframe = createJFrame(view);
+ JFrame jframe = createJFrame(view,scaling);
render(g,view);
}
- public JFrame createJFrame(View view) {
+ private JFrame createJFrame(View view, double scaling) {
JFrame jframe = new JFrame();
JPanel basicPanel = new JPanel();
basicPanel.setLayout(new BoxLayout(basicPanel, BoxLayout.Y_AXIS));
@@ -231,19 +247,8 @@ public class GraphStreamViewer {
return jframe;
}
- public View createEmbeddedView(Graph g) {
- Viewer viewer = new Viewer(g,Viewer.ThreadingModel.GRAPH_IN_ANOTHER_THREAD);
- View view = viewer.addDefaultView(false);
- view.setPreferredSize(new Dimension((int)(698*scaling),(int)(440*scaling)));
- return view;
- }
-
- public Graph createMultiGraph(String name) {
- Graph g = new MultiGraph(name);
- g.addAttribute("ui.quality");
- g.addAttribute("ui.antialias");
- g.addAttribute("ui.stylesheet", STYLESHEET);
- return g;
+ private Graph createMultiGraph(String name) {
+ return GraphStreamViewer.createMultiGraph(name,STYLESHEET);
}
private void render(Graph g, View view) {