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 b239a8d7..8fd87b36 100644 --- a/jsprit-analysis/src/main/java/jsprit/analysis/toolbox/GraphStreamViewer.java +++ b/jsprit-analysis/src/main/java/jsprit/analysis/toolbox/GraphStreamViewer.java @@ -21,16 +21,17 @@ public class GraphStreamViewer { protected static String styleSheet = "node {" + " size: 7px, 7px;" + - " fill-color: orange;" + + " fill-color: rgb(255,204,0);" + " text-alignment: at-right;" + " stroke-mode: plain;" + " stroke-color: black;" + + " stroke-width: 1.0;" + "}" + "node.pickup {" + - " fill-color: green;" + + " fill-color: rgb(255,204,0);" + "}" + "node.delivery {" + - " fill-color: blue;" + + " fill-color: rgb(0,102,153);" + "}" + "node.depot {" + " fill-color: red;" + @@ -93,154 +94,36 @@ public class GraphStreamViewer { } - private static void display(View view){ - System.setProperty("org.graphstream.ui.renderer", "org.graphstream.ui.j2dviewer.J2DGraphRenderer"); - Graph g = new MultiGraph("g"); - g.addAttribute("ui.quality"); - g.addAttribute("ui.antialias"); - g.addAttribute("ui.stylesheet", styleSheet); - - Viewer viewer = g.display(); - if(!view.enableAutoDisplay) viewer.disableAutoLayout(); - - - for(Vehicle vehicle : view.vrp.getVehicles()){ - renderVehicle(g,vehicle,view.label); - sleep(view.renderDelay); - } - - for(Job j : view.vrp.getJobs().values()){ - if(j instanceof Service){ - renderService(g,(Service)j,view.label); - } - else if(j instanceof Shipment){ - renderShipment(g,(Shipment)j,view.label,view.renderShipments); - } - sleep(view.renderDelay); - } - - if(view.solution != null){ - int routeId = 1; - for(VehicleRoute route : view.solution.getRoutes()){ - renderRoute(g,route,routeId,view.renderDelay); - sleep(view.renderDelay); - routeId++; - } - } - - if(view.boundingBox != null){ -//// viewer.getDefaultView().getCamera().setViewPercent(0.5); -// System.out.println("metric="+viewer.getDefaultView().getCamera().getMetrics()); -//// viewer.getDefaultView().getCamera().setViewCenter(15000, 50000, 0); -//// viewer.getDefaultView().getCamera().setViewPercent(0.5); -// viewer.getDefaultView().getCamera().setBounds(10000,40000, 0, 20000, 60000, 0); -// System.out.println("metric="+viewer.getDefaultView().getCamera().getMetrics()); -//// viewer.getDefaultView().se -// viewer.getDefaultView().display(viewer.getGraphicGraph(), true); -//// viewer.getDefaultView().getCamera().setViewPercent(0.5); -// - } - } - public static void display(VehicleRoutingProblem vrp, int renderDelay_in_ms) { - View builder = new View(vrp); - builder.setRenderDelay(renderDelay_in_ms); - display(builder); - } +// public static void display(VehicleRoutingProblem vrp, int renderDelay_in_ms) { +// View builder = new View(vrp); +// builder.setRenderDelay(renderDelay_in_ms); +// display(); +// } - private static void renderShipment(Graph g, Shipment shipment, Label label, boolean renderShipments) { - - Node n1 = g.addNode(makeId(shipment.getId(),shipment.getPickupLocation())); - if(label.equals(Label.ID)) n1.addAttribute("ui.label", shipment.getId()); - n1.addAttribute("x", shipment.getPickupCoord().getX()); - n1.addAttribute("y", shipment.getPickupCoord().getY()); - n1.setAttribute("ui.class", "pickup"); - - Node n2 = g.addNode(makeId(shipment.getId(),shipment.getDeliveryLocation())); - if(label.equals(Label.ID)) n2.addAttribute("ui.label", shipment.getId()); - n2.addAttribute("x", shipment.getDeliveryCoord().getX()); - n2.addAttribute("y", shipment.getDeliveryCoord().getY()); - n2.setAttribute("ui.class", "delivery"); - - if(renderShipments){ - Edge s = g.addEdge(shipment.getId(), makeId(shipment.getId(),shipment.getPickupLocation()), - makeId(shipment.getId(),shipment.getDeliveryLocation()), true); - s.addAttribute("ui.class", "shipment"); - } - - } - - private static void sleep(long renderDelay_in_ms2) { - try { - Thread.sleep(renderDelay_in_ms2); - } catch (InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - }; - - } - - private static void renderService(Graph g, Service service, Label label) { - Node n = g.addNode(makeId(service.getId(),service.getLocationId())); - if(label.equals(Label.ID)) n.addAttribute("ui.label", service.getId()); - n.addAttribute("x", service.getCoord().getX()); - n.addAttribute("y", service.getCoord().getY()); - if(service.getType().equals("pickup")) n.setAttribute("ui.class", "pickup"); - if(service.getType().equals("delivery")) n.setAttribute("ui.class", "delivery"); - } - - private static String makeId(String id, String locationId) { - return new StringBuffer().append(id).append("_").append(locationId).toString(); - } - - private static void renderVehicle(Graph g, Vehicle vehicle, Label label) { - Node n = g.addNode(makeId(vehicle.getId(),vehicle.getLocationId())); - if(label.equals(Label.ID)) n.addAttribute("ui.label", "depot"); - n.addAttribute("x", vehicle.getCoord().getX()); - n.addAttribute("y", vehicle.getCoord().getY()); - n.setAttribute("ui.class", "depot"); - } + - public static void display(VehicleRoutingProblem vrp) { - display(new View(vrp)); - } +// public static void display(VehicleRoutingProblem vrp) { +// display(); +// } - public static void display(VehicleRoutingProblem vrp, VehicleRoutingProblemSolution solution, int renderDelay_in_ms, boolean enableAutoLayout) { - View view = new View(vrp,solution); - view.setEnableAutoDisplay(enableAutoLayout); - view.setRenderDelay(renderDelay_in_ms); - display(view); - } - - public static void display(VehicleRoutingProblem vrp, VehicleRoutingProblemSolution solution, int renderDelay_in_ms) { - View view = new View(vrp,solution); - view.setRenderDelay(renderDelay_in_ms); - display(view); - } - - public static void display(VehicleRoutingProblem vrp, VehicleRoutingProblemSolution solution) { - display(new View(vrp,solution)); - } - - private static void renderRoute(Graph g, VehicleRoute route, int routeId, long renderDelay_in_ms) { - int vehicle_edgeId = 1; - String prevIdentifier = makeId(route.getVehicle().getId(),route.getVehicle().getLocationId()); - for(TourActivity act : route.getActivities()){ - String currIdentifier = makeId(((JobActivity)act).getJob().getId(),act.getLocationId()); - g.addEdge(makeEdgeId(routeId,vehicle_edgeId), prevIdentifier, currIdentifier, true); - prevIdentifier = currIdentifier; - vehicle_edgeId++; - sleep(renderDelay_in_ms); - } - if(route.getVehicle().isReturnToDepot()){ - g.addEdge(makeEdgeId(routeId,vehicle_edgeId), prevIdentifier, makeId(route.getVehicle().getId(),route.getVehicle().getLocationId()), true); - } - } - - private static String makeEdgeId(int routeId, int vehicle_edgeId) { - return Integer.valueOf(routeId).toString() + "." + Integer.valueOf(vehicle_edgeId).toString(); - } +// public static void display(VehicleRoutingProblem vrp, VehicleRoutingProblemSolution solution, int renderDelay_in_ms, boolean enableAutoLayout) { +// View view = new View(vrp,solution); +// view.setEnableAutoDisplay(enableAutoLayout); +// view.setRenderDelay(renderDelay_in_ms); +// display(); +// } +// +// public static void display(VehicleRoutingProblem vrp, VehicleRoutingProblemSolution solution, int renderDelay_in_ms) { +// View view = new View(vrp,solution); +// view.setRenderDelay(renderDelay_in_ms); +// display(); +// } +// +// public static void display(VehicleRoutingProblem vrp, VehicleRoutingProblemSolution solution) { +// display(); +// } public static enum Label { NO_LABEL, ID @@ -310,18 +193,168 @@ public class GraphStreamViewer { // public GraphStreamViewer setBoundingBox(double minX, double minY, double maxX, double maxY){ // boundingBox = new BoundingBox(minX,minY,maxX,maxY); // return this; +// } + +// public void display(){ +// display(); +//// View view = new View(vrp,solution); +//// view.setEnableAutoDisplay(enableAutoLayout); +//// view.setLabel(label); +//// view.setRenderDelay(renderDelay_in_ms); +//// view.setRenderShipments(renderShipments); +//// view.setBoundingBox(boundingBox); +//// display(view); // } public void display(){ - View view = new View(vrp,solution); - view.setEnableAutoDisplay(enableAutoLayout); - view.setLabel(label); - view.setRenderDelay(renderDelay_in_ms); - view.setRenderShipments(renderShipments); - view.setBoundingBox(boundingBox); - display(view); - } + System.setProperty("org.graphstream.ui.renderer", "org.graphstream.ui.j2dviewer.J2DGraphRenderer"); + Graph g = new MultiGraph("g"); + g.addAttribute("ui.quality"); + g.addAttribute("ui.antialias"); + g.addAttribute("ui.stylesheet", styleSheet); + + Viewer viewer = g.display(); + if(!enableAutoLayout) viewer.disableAutoLayout(); + + + for(Vehicle vehicle : vrp.getVehicles()){ + renderVehicle(g,vehicle,label); + sleep(renderDelay_in_ms); + } + + for(Job j : vrp.getJobs().values()){ + if(j instanceof Service){ + renderService(g,(Service)j,label); + } + else if(j instanceof Shipment){ + renderShipment(g,(Shipment)j,label,renderShipments); + } + sleep(renderDelay_in_ms); + } + + if(solution != null){ + int routeId = 1; + for(VehicleRoute route : solution.getRoutes()){ + renderRoute(g,route,routeId,renderDelay_in_ms); + sleep(renderDelay_in_ms); + routeId++; + } + } + + // if(view.boundingBox != null){ + //// viewer.getDefaultView().getCamera().setViewPercent(0.5); + // System.out.println("metric="+viewer.getDefaultView().getCamera().getMetrics()); + //// viewer.getDefaultView().getCamera().setViewCenter(15000, 50000, 0); + //// viewer.getDefaultView().getCamera().setViewPercent(0.5); + // viewer.getDefaultView().getCamera().setBounds(10000,40000, 0, 20000, 60000, 0); + // System.out.println("metric="+viewer.getDefaultView().getCamera().getMetrics()); + //// viewer.getDefaultView().se + // viewer.getDefaultView().display(viewer.getGraphicGraph(), true); + //// viewer.getDefaultView().getCamera().setViewPercent(0.5); + // + // } + + } + + // public static void display(VehicleRoutingProblem vrp, int renderDelay_in_ms) { + // View builder = new View(vrp); + // builder.setRenderDelay(renderDelay_in_ms); + // display(); + // } + private void renderShipment(Graph g, Shipment shipment, Label label, boolean renderShipments) { + + Node n1 = g.addNode(makeId(shipment.getId(),shipment.getPickupLocation())); + if(label.equals(Label.ID)) n1.addAttribute("ui.label", shipment.getId()); + n1.addAttribute("x", shipment.getPickupCoord().getX()); + n1.addAttribute("y", shipment.getPickupCoord().getY()); + n1.setAttribute("ui.class", "pickup"); + + Node n2 = g.addNode(makeId(shipment.getId(),shipment.getDeliveryLocation())); + if(label.equals(Label.ID)) n2.addAttribute("ui.label", shipment.getId()); + n2.addAttribute("x", shipment.getDeliveryCoord().getX()); + n2.addAttribute("y", shipment.getDeliveryCoord().getY()); + n2.setAttribute("ui.class", "delivery"); + + if(renderShipments){ + Edge s = g.addEdge(shipment.getId(), makeId(shipment.getId(),shipment.getPickupLocation()), + makeId(shipment.getId(),shipment.getDeliveryLocation()), true); + s.addAttribute("ui.class", "shipment"); + } + + } + + private void sleep(long renderDelay_in_ms2) { + try { + Thread.sleep(renderDelay_in_ms2); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + }; + + } + + private void renderService(Graph g, Service service, Label label) { + Node n = g.addNode(makeId(service.getId(),service.getLocationId())); + if(label.equals(Label.ID)) n.addAttribute("ui.label", service.getId()); + n.addAttribute("x", service.getCoord().getX()); + n.addAttribute("y", service.getCoord().getY()); + if(service.getType().equals("pickup")) n.setAttribute("ui.class", "pickup"); + if(service.getType().equals("delivery")) n.setAttribute("ui.class", "delivery"); + } + + private String makeId(String id, String locationId) { + return new StringBuffer().append(id).append("_").append(locationId).toString(); + } + + private void renderVehicle(Graph g, Vehicle vehicle, Label label) { + Node n = g.addNode(makeId(vehicle.getId(),vehicle.getLocationId())); + if(label.equals(Label.ID)) n.addAttribute("ui.label", "depot"); + n.addAttribute("x", vehicle.getCoord().getX()); + n.addAttribute("y", vehicle.getCoord().getY()); + n.setAttribute("ui.class", "depot"); + } + + // public static void display(VehicleRoutingProblem vrp) { + // display(); + // } + + // public static void display(VehicleRoutingProblem vrp, VehicleRoutingProblemSolution solution, int renderDelay_in_ms, boolean enableAutoLayout) { + // View view = new View(vrp,solution); + // view.setEnableAutoDisplay(enableAutoLayout); + // view.setRenderDelay(renderDelay_in_ms); + // display(); + // } + // + // public static void display(VehicleRoutingProblem vrp, VehicleRoutingProblemSolution solution, int renderDelay_in_ms) { + // View view = new View(vrp,solution); + // view.setRenderDelay(renderDelay_in_ms); + // display(); + // } + // + // public static void display(VehicleRoutingProblem vrp, VehicleRoutingProblemSolution solution) { + // display(); + // } + + private void renderRoute(Graph g, VehicleRoute route, int routeId, long renderDelay_in_ms) { + int vehicle_edgeId = 1; + String prevIdentifier = makeId(route.getVehicle().getId(),route.getVehicle().getLocationId()); + for(TourActivity act : route.getActivities()){ + String currIdentifier = makeId(((JobActivity)act).getJob().getId(),act.getLocationId()); + g.addEdge(makeEdgeId(routeId,vehicle_edgeId), prevIdentifier, currIdentifier, true); + prevIdentifier = currIdentifier; + vehicle_edgeId++; + sleep(renderDelay_in_ms); + } + if(route.getVehicle().isReturnToDepot()){ + g.addEdge(makeEdgeId(routeId,vehicle_edgeId), prevIdentifier, makeId(route.getVehicle().getId(),route.getVehicle().getLocationId()), true); + } + } + + private String makeEdgeId(int routeId, int vehicle_edgeId) { + return Integer.valueOf(routeId).toString() + "." + Integer.valueOf(vehicle_edgeId).toString(); + } + // public void saveAsPNG(String filename){ // // } diff --git a/jsprit-examples/src/main/java/jsprit/examples/BicycleMessenger.java b/jsprit-examples/src/main/java/jsprit/examples/BicycleMessenger.java index ab07d7ea..375f977e 100644 --- a/jsprit-examples/src/main/java/jsprit/examples/BicycleMessenger.java +++ b/jsprit-examples/src/main/java/jsprit/examples/BicycleMessenger.java @@ -240,25 +240,25 @@ public class BicycleMessenger { //if you want, terminate it after 1000 iterations with no change // algorithm.setPrematureAlgorithmTermination(new IterationWithoutImprovementTermination(1000)); algorithm.addListener(new AlgorithmSearchProgressChartListener("output/progress.png")); - algorithm.setNuOfIterations(200); + algorithm.setNuOfIterations(2000); Collection solutions = algorithm.searchSolutions(); //this is just to ensure that solution meet the above constraints validateSolution(Solutions.bestOf(solutions), bicycleMessengerProblem, nearestMessengers); -// //you may want to plot the problem -// Plotter plotter = new Plotter(bicycleMessengerProblem); -//// plotter.setBoundingBox(10000, 47500, 20000, 67500); -// plotter.plotShipments(true); -// plotter.plot("output/bicycleMessengerProblem.png", "bicycleMessenger"); -// -// //and the problem as well as the solution -// Plotter plotter1 = new Plotter(bicycleMessengerProblem, Solutions.bestOf(solutions)); -// plotter1.plotShipments(true); -// plotter1.setShowFirstActivity(true); -//// plotter1.setBoundingBox(5000, 45500, 25000, 66500); -// plotter1.plot("output/bicycleMessengerSolution.png", "bicycleMessenger"); + //you may want to plot the problem + Plotter plotter = new Plotter(bicycleMessengerProblem); +// plotter.setBoundingBox(10000, 47500, 20000, 67500); + plotter.plotShipments(true); + plotter.plot("output/bicycleMessengerProblem.png", "bicycleMessenger"); + + //and the problem as well as the solution + Plotter plotter1 = new Plotter(bicycleMessengerProblem, Solutions.bestOf(solutions)); + plotter1.plotShipments(true); + plotter1.setShowFirstActivity(true); +// plotter1.setBoundingBox(5000, 45500, 25000, 66500); + plotter1.plot("output/bicycleMessengerSolution.png", "bicycleMessenger"); //and write out your solution in xml new VrpXMLWriter(bicycleMessengerProblem, solutions).write("output/bicycleMessenger.xml"); diff --git a/jsprit-examples/src/main/java/jsprit/examples/MultipleDepotExample.java b/jsprit-examples/src/main/java/jsprit/examples/MultipleDepotExample.java index d6c0e35e..14071e2b 100644 --- a/jsprit-examples/src/main/java/jsprit/examples/MultipleDepotExample.java +++ b/jsprit-examples/src/main/java/jsprit/examples/MultipleDepotExample.java @@ -21,6 +21,7 @@ import java.util.Arrays; import java.util.Collection; import jsprit.analysis.toolbox.AlgorithmSearchProgressChartListener; +import jsprit.analysis.toolbox.GraphStreamViewer; import jsprit.analysis.toolbox.SolutionPlotter; import jsprit.analysis.toolbox.SolutionPrinter; import jsprit.analysis.toolbox.StopWatch; @@ -113,6 +114,8 @@ public class MultipleDepotExample { SolutionPrinter.print(Solutions.bestOf(solutions)); SolutionPlotter.plotSolutionAsPNG(vrp, Solutions.bestOf(solutions), "output/p01_solution.png", "p01"); + new GraphStreamViewer(vrp, Solutions.bestOf(solutions)).setRenderDelay(100).display(); + } } diff --git a/jsprit-examples/src/main/java/jsprit/examples/PickupAndDeliveryExample2.java b/jsprit-examples/src/main/java/jsprit/examples/PickupAndDeliveryExample2.java index 51bb1fc3..6ee0b8ae 100644 --- a/jsprit-examples/src/main/java/jsprit/examples/PickupAndDeliveryExample2.java +++ b/jsprit-examples/src/main/java/jsprit/examples/PickupAndDeliveryExample2.java @@ -107,7 +107,8 @@ public class PickupAndDeliveryExample2 { plotter.setShowFirstActivity(true); plotter.plot("output/pd_christophides_vrpnc1_solution.png","pd_vrpnc1"); - GraphStreamViewer.display(vrp, solution, 100); + + new GraphStreamViewer(vrp, solution).setRenderDelay(100).labelWith(jsprit.analysis.toolbox.GraphStreamViewer.Label.ID).display(); } diff --git a/jsprit-examples/src/main/java/jsprit/examples/SimpleEnRoutePickupAndDeliveryOpenRoutesExample.java b/jsprit-examples/src/main/java/jsprit/examples/SimpleEnRoutePickupAndDeliveryOpenRoutesExample.java index f07be474..37b30c2d 100644 --- a/jsprit-examples/src/main/java/jsprit/examples/SimpleEnRoutePickupAndDeliveryOpenRoutesExample.java +++ b/jsprit-examples/src/main/java/jsprit/examples/SimpleEnRoutePickupAndDeliveryOpenRoutesExample.java @@ -129,7 +129,7 @@ public class SimpleEnRoutePickupAndDeliveryOpenRoutesExample { solutionPlotter.plotShipments(true); solutionPlotter.plot("output/simpleEnRoutePickupAndDeliveryExample_solution.png", "en-route pickup and delivery"); - GraphStreamViewer.display(problem, bestSolution, 100); + new GraphStreamViewer(problem, bestSolution).setRenderDelay(100).display(); } } diff --git a/jsprit-examples/src/main/java/jsprit/examples/SolomonExample.java b/jsprit-examples/src/main/java/jsprit/examples/SolomonExample.java index 47aab40b..3840d534 100644 --- a/jsprit-examples/src/main/java/jsprit/examples/SolomonExample.java +++ b/jsprit-examples/src/main/java/jsprit/examples/SolomonExample.java @@ -101,7 +101,7 @@ public class SolomonExample { // GraphStream.display(vrp,100); - GraphStreamViewer.display(vrp,solution); + new GraphStreamViewer(vrp,solution).display(); } diff --git a/jsprit-examples/src/main/java/jsprit/examples/SolomonOpenExample.java b/jsprit-examples/src/main/java/jsprit/examples/SolomonOpenExample.java index d272fa1f..99dbc305 100644 --- a/jsprit-examples/src/main/java/jsprit/examples/SolomonOpenExample.java +++ b/jsprit-examples/src/main/java/jsprit/examples/SolomonOpenExample.java @@ -95,7 +95,7 @@ public class SolomonOpenExample { SolutionPlotter.plotSolutionAsPNG(vrp, solution, "output/solomon_C101_open_solution.png","C101"); - GraphStreamViewer.display(vrp, solution, 50, false); + new GraphStreamViewer(vrp, solution).setRenderDelay(50).setEnableAutoLayout(true).display(); } diff --git a/jsprit-examples/src/main/java/jsprit/examples/VRPWithBackhaulsExample.java b/jsprit-examples/src/main/java/jsprit/examples/VRPWithBackhaulsExample.java index c18de248..f42f0fc9 100644 --- a/jsprit-examples/src/main/java/jsprit/examples/VRPWithBackhaulsExample.java +++ b/jsprit-examples/src/main/java/jsprit/examples/VRPWithBackhaulsExample.java @@ -102,7 +102,7 @@ public class VRPWithBackhaulsExample { // plotter.setShowFirstActivity(true); // plotter.plot("output/vrpwbh_solomon_r101_solution.png","vrpwbh_r101"); - GraphStreamViewer.display(vrp, solution, 100); + new GraphStreamViewer(vrp, solution).setRenderDelay(100).setEnableAutoLayout(false).display(); }