diff --git a/jsprit-analysis/src/main/java/analysis/SolutionPrinter.java b/jsprit-analysis/src/main/java/analysis/SolutionPrinter.java deleted file mode 100644 index 5a9d782f..00000000 --- a/jsprit-analysis/src/main/java/analysis/SolutionPrinter.java +++ /dev/null @@ -1,90 +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 . - ******************************************************************************/ -package analysis; - -import basics.VehicleRoutingProblemSolution; -import basics.route.DefaultVehicleRouteCostCalculator; -import basics.route.VehicleRoute; - -/** - * Printer to print the details of a vehicle-routing-problem solution. - * - * @author stefan schroeder - * - */ -public class SolutionPrinter { - - /** - * Enum to indicate verbose-level. - * - *

Print.CONCISE and Print.VERBOSE are available. - * - * @author stefan schroeder - * - */ - public enum Print { - - CONCISE,VERBOSE - } - - /** - * Prints costs and #vehicles to stdout (System.out.println). - * - * @param solution - */ - public static void print(VehicleRoutingProblemSolution solution){ - System.out.println("[costs="+solution.getCost() + "]"); - System.out.println("[#vehicles="+solution.getRoutes().size() + "]"); - - } - - /** - * Prints the details of the solution according to a print-level, i.e. Print.CONCISE or PRINT.VERBOSE. - * - *

CONCISE prints total-costs and #vehicles. - *

VERBOSE prints the route-details additionally. If the DefaultVehicleRouteCostCalculator (which is the standard-calculator) - * is used in VehicleRoute, then route-costs are differentiated further between transport, activity, vehicle, driver and other-costs. - * - * @param solution - * @param level - * - * @deprecated is not going to work anymore - */ - @Deprecated - public static void print(VehicleRoutingProblemSolution solution, Print level){ - if(level.equals(Print.CONCISE)){ - print(solution); - } - else{ - print(solution); - System.out.println("routes"); - int routeCount = 1; - for(VehicleRoute route : solution.getRoutes()){ - System.out.println("[route="+routeCount+"][departureTime="+route.getStart().getEndTime()+"[total=" + route.getCost() + "]"); - if(route.getVehicleRouteCostCalculator() instanceof DefaultVehicleRouteCostCalculator){ - DefaultVehicleRouteCostCalculator defaultCalc = (DefaultVehicleRouteCostCalculator) route.getVehicleRouteCostCalculator(); - System.out.println("[transport=" + defaultCalc.getTpCosts() + "][activity=" + defaultCalc.getActCosts() + - "][vehicle=" + defaultCalc.getVehicleCosts() + "][driver=" + defaultCalc.getDriverCosts() + "][other=" + defaultCalc.getOther() + "]"); - } - routeCount++; - } - } - - - } - -} diff --git a/jsprit-analysis/src/main/java/analysis/AlgorithmSearchProgressChartListener.java b/jsprit-analysis/src/main/java/jsprit/analysis/toolbox/AlgorithmSearchProgressChartListener.java similarity index 92% rename from jsprit-analysis/src/main/java/analysis/AlgorithmSearchProgressChartListener.java rename to jsprit-analysis/src/main/java/jsprit/analysis/toolbox/AlgorithmSearchProgressChartListener.java index af7962d2..0a2a1d6e 100644 --- a/jsprit-analysis/src/main/java/analysis/AlgorithmSearchProgressChartListener.java +++ b/jsprit-analysis/src/main/java/jsprit/analysis/toolbox/AlgorithmSearchProgressChartListener.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package analysis; +package jsprit.analysis.toolbox; import java.io.File; import java.io.IOException; @@ -22,24 +22,24 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; +import jsprit.core.algorithm.VehicleRoutingAlgorithm; +import jsprit.core.algorithm.listener.AlgorithmEndsListener; +import jsprit.core.algorithm.listener.AlgorithmStartsListener; +import jsprit.core.algorithm.listener.IterationEndsListener; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; + import org.apache.log4j.Logger; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartUtilities; import org.jfree.chart.JFreeChart; import org.jfree.chart.axis.NumberAxis; -import org.jfree.chart.axis.NumberTickUnit; import org.jfree.chart.plot.PlotOrientation; import org.jfree.chart.plot.XYPlot; import org.jfree.data.Range; import org.jfree.data.xy.XYSeries; import org.jfree.data.xy.XYSeriesCollection; -import basics.VehicleRoutingAlgorithm; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblemSolution; -import basics.algo.AlgorithmEndsListener; -import basics.algo.AlgorithmStartsListener; -import basics.algo.IterationEndsListener; /** @@ -77,6 +77,9 @@ public class AlgorithmSearchProgressChartListener implements IterationEndsListen public AlgorithmSearchProgressChartListener(String pngFileName) { super(); this.filename = pngFileName; + if(!this.filename.endsWith("png")){ + this.filename += ".png"; + } } diff --git a/jsprit-analysis/src/main/java/analysis/ConcurrentBenchmarker.java b/jsprit-analysis/src/main/java/jsprit/analysis/toolbox/ConcurrentBenchmarker.java similarity index 92% rename from jsprit-analysis/src/main/java/analysis/ConcurrentBenchmarker.java rename to jsprit-analysis/src/main/java/jsprit/analysis/toolbox/ConcurrentBenchmarker.java index 8642074c..25a71439 100644 --- a/jsprit-analysis/src/main/java/analysis/ConcurrentBenchmarker.java +++ b/jsprit-analysis/src/main/java/jsprit/analysis/toolbox/ConcurrentBenchmarker.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package analysis; +package jsprit.analysis.toolbox; import java.util.ArrayList; import java.util.Collection; @@ -25,20 +25,21 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; +import jsprit.analysis.util.BenchmarkWriter; +import jsprit.core.algorithm.VehicleRoutingAlgorithm; +import jsprit.core.algorithm.VehicleRoutingAlgorithmFactory; +import jsprit.core.algorithm.io.VehicleRoutingAlgorithms; +import jsprit.core.algorithm.listener.VehicleRoutingAlgorithmListeners.Priority; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; +import jsprit.core.util.BenchmarkInstance; +import jsprit.core.util.BenchmarkResult; +import jsprit.core.util.Solutions; + import org.apache.commons.math.stat.descriptive.DescriptiveStatistics; import org.apache.log4j.Level; import org.apache.log4j.Logger; -import util.BenchmarkInstance; -import util.BenchmarkResult; -import util.BenchmarkWriter; -import util.Solutions; -import algorithms.VehicleRoutingAlgorithms; -import basics.VehicleRoutingAlgorithm; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblemSolution; -import basics.algo.VehicleRoutingAlgorithmFactory; -import basics.algo.VehicleRoutingAlgorithmListeners.Priority; public class ConcurrentBenchmarker { diff --git a/jsprit-analysis/src/main/java/analysis/Plotter.java b/jsprit-analysis/src/main/java/jsprit/analysis/toolbox/Plotter.java similarity index 95% rename from jsprit-analysis/src/main/java/analysis/Plotter.java rename to jsprit-analysis/src/main/java/jsprit/analysis/toolbox/Plotter.java index ff259b45..4e494bd1 100644 --- a/jsprit-analysis/src/main/java/analysis/Plotter.java +++ b/jsprit-analysis/src/main/java/jsprit/analysis/toolbox/Plotter.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package analysis; +package jsprit.analysis.toolbox; import java.awt.BasicStroke; import java.awt.Color; @@ -25,6 +25,19 @@ import java.util.Collection; import java.util.HashMap; import java.util.Map; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.job.Delivery; +import jsprit.core.problem.job.Job; +import jsprit.core.problem.job.Pickup; +import jsprit.core.problem.job.Service; +import jsprit.core.problem.job.Shipment; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; +import jsprit.core.problem.solution.route.VehicleRoute; +import jsprit.core.problem.solution.route.activity.TourActivity; +import jsprit.core.problem.vehicle.Vehicle; +import jsprit.core.util.Coordinate; +import jsprit.core.util.Locations; + import org.apache.log4j.Logger; import org.jfree.chart.ChartUtilities; import org.jfree.chart.JFreeChart; @@ -43,18 +56,6 @@ import org.jfree.data.xy.XYSeries; import org.jfree.data.xy.XYSeriesCollection; import org.jfree.ui.RectangleEdge; -import util.Coordinate; -import util.Locations; -import basics.Delivery; -import basics.Job; -import basics.Pickup; -import basics.Service; -import basics.Shipment; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblemSolution; -import basics.route.TourActivity; -import basics.route.Vehicle; -import basics.route.VehicleRoute; public class Plotter { @@ -80,8 +81,6 @@ public class Plotter { private VehicleRoutingProblem vrp; - private VehicleRoutingProblemSolution solution; - private boolean plotSolutionAsWell = false; private boolean plotShipments = true; @@ -116,11 +115,13 @@ public class Plotter { } public void plot(String pngFileName, String plotTitle){ + String filename = pngFileName; + if(!pngFileName.endsWith(".png")) filename += ".png"; if(plotSolutionAsWell){ - plotSolutionAsPNG(vrp, routes, pngFileName, plotTitle); + plotSolutionAsPNG(vrp, routes, filename, plotTitle); } else{ - plotVrpAsPNG(vrp, pngFileName, plotTitle); + plotVrpAsPNG(vrp, filename, plotTitle); } } diff --git a/jsprit-analysis/src/main/java/analysis/SolutionPlotter.java b/jsprit-analysis/src/main/java/jsprit/analysis/toolbox/SolutionPlotter.java similarity index 92% rename from jsprit-analysis/src/main/java/analysis/SolutionPlotter.java rename to jsprit-analysis/src/main/java/jsprit/analysis/toolbox/SolutionPlotter.java index a66e84c2..141c8c22 100644 --- a/jsprit-analysis/src/main/java/analysis/SolutionPlotter.java +++ b/jsprit-analysis/src/main/java/jsprit/analysis/toolbox/SolutionPlotter.java @@ -14,11 +14,9 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package analysis; +package jsprit.analysis.toolbox; -import java.awt.BasicStroke; import java.awt.Color; -import java.awt.geom.Ellipse2D; import java.io.File; import java.io.IOException; import java.util.Collection; @@ -27,31 +25,29 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.job.Delivery; +import jsprit.core.problem.job.Job; +import jsprit.core.problem.job.Pickup; +import jsprit.core.problem.job.Service; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; +import jsprit.core.problem.solution.route.VehicleRoute; +import jsprit.core.problem.solution.route.activity.TourActivity; +import jsprit.core.problem.vehicle.Vehicle; +import jsprit.core.util.Coordinate; +import jsprit.core.util.Locations; + import org.apache.log4j.Logger; import org.jfree.chart.ChartUtilities; import org.jfree.chart.JFreeChart; -import org.jfree.chart.annotations.XYShapeAnnotation; import org.jfree.chart.axis.NumberAxis; -import org.jfree.chart.labels.XYItemLabelGenerator; import org.jfree.chart.plot.XYPlot; import org.jfree.chart.renderer.xy.XYItemRenderer; import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer; import org.jfree.data.xy.XYDataItem; -import org.jfree.data.xy.XYDataset; import org.jfree.data.xy.XYSeries; import org.jfree.data.xy.XYSeriesCollection; -import util.Coordinate; -import util.Locations; -import basics.Delivery; -import basics.Job; -import basics.Pickup; -import basics.Service; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblemSolution; -import basics.route.TourActivity; -import basics.route.Vehicle; -import basics.route.VehicleRoute; /** @@ -82,7 +78,9 @@ public class SolutionPlotter { * @see VehicleRoutingProblem, VehicleRoutingProblemSolution */ public static void plotVrpAsPNG(VehicleRoutingProblem vrp, String pngFile, String title){ - log.info("plot routes to " + pngFile); + String filename = pngFile; + if(!pngFile.endsWith(".png")) filename += ".png"; + log.info("plot routes to " + filename); XYSeriesCollection problem; Map labels = new HashMap(); try { @@ -93,7 +91,7 @@ public class SolutionPlotter { } XYPlot plot = createPlot(problem, labels); JFreeChart chart = new JFreeChart(title, plot); - save(chart,pngFile); + save(chart,filename); } /** @@ -106,7 +104,9 @@ public class SolutionPlotter { * @see VehicleRoute */ public static void plotRoutesAsPNG(Collection routes, Locations locations, String pngFile, String title) { - log.info("plot routes to " + pngFile); + String filename = pngFile; + if(!pngFile.endsWith(".png")) filename += ".png"; + log.info("plot routes to " + filename); XYSeriesCollection problem; Map labels = new HashMap(); try { @@ -118,7 +118,7 @@ public class SolutionPlotter { XYSeriesCollection solutionColl = makeSolutionSeries(routes,locations); XYPlot plot = createPlot(problem, solutionColl, labels); JFreeChart chart = new JFreeChart(title, plot); - save(chart,pngFile); + save(chart,filename); } /** @@ -133,7 +133,9 @@ public class SolutionPlotter { * @see VehicleRoutingProblem, VehicleRoutingProblemSolution */ public static void plotSolutionAsPNG(VehicleRoutingProblem vrp, VehicleRoutingProblemSolution solution, String pngFile, String title){ - log.info("plot solution to " + pngFile); + String filename = pngFile; + if(!pngFile.endsWith(".png")) filename += ".png"; + log.info("plot solution to " + filename); XYSeriesCollection problem; XYSeriesCollection solutionColl; Map labels = new HashMap(); @@ -146,7 +148,7 @@ public class SolutionPlotter { } XYPlot plot = createPlot(problem, solutionColl, labels); JFreeChart chart = new JFreeChart(title, plot); - save(chart,pngFile); + save(chart,filename); } diff --git a/jsprit-analysis/src/main/java/jsprit/analysis/toolbox/SolutionPrinter.java b/jsprit-analysis/src/main/java/jsprit/analysis/toolbox/SolutionPrinter.java new file mode 100644 index 00000000..01b5f750 --- /dev/null +++ b/jsprit-analysis/src/main/java/jsprit/analysis/toolbox/SolutionPrinter.java @@ -0,0 +1,88 @@ +/******************************************************************************* + * 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 . + ******************************************************************************/ +package jsprit.analysis.toolbox; + +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; + +/** + * Printer to print the details of a vehicle-routing-problem solution. + * + * @author stefan schroeder + * + */ +public class SolutionPrinter { + + /** + * Enum to indicate verbose-level. + * + *

Print.CONCISE and Print.VERBOSE are available. + * + * @author stefan schroeder + * + */ + public enum Print { + + CONCISE,VERBOSE + } + + /** + * Prints costs and #vehicles to stdout (System.out.println). + * + * @param solution + */ + public static void print(VehicleRoutingProblemSolution solution){ + System.out.println("[costs="+solution.getCost() + "]"); + System.out.println("[#vehicles="+solution.getRoutes().size() + "]"); + + } + +// /** +// * Prints the details of the solution according to a print-level, i.e. Print.CONCISE or PRINT.VERBOSE. +// * +// *

CONCISE prints total-costs and #vehicles. +// *

VERBOSE prints the route-details additionally. If the DefaultVehicleRouteCostCalculator (which is the standard-calculator) +// * is used in VehicleRoute, then route-costs are differentiated further between transport, activity, vehicle, driver and other-costs. +// * +// * @param solution +// * @param level +// * +// * @deprecated is not going to work anymore +// */ +// @Deprecated +// public static void print(VehicleRoutingProblemSolution solution, Print level){ +// if(level.equals(Print.CONCISE)){ +// print(solution); +// } +// else{ +// print(solution); +// System.out.println("routes"); +// int routeCount = 1; +// for(VehicleRoute route : solution.getRoutes()){ +// System.out.println("[route="+routeCount+"][departureTime="+route.getStart().getEndTime()+"[total=" + route.getCost() + "]"); +// if(route.getVehicleRouteCostCalculator() instanceof DefaultVehicleRouteCostCalculator){ +// DefaultVehicleRouteCostCalculator defaultCalc = (DefaultVehicleRouteCostCalculator) route.getVehicleRouteCostCalculator(); +// System.out.println("[transport=" + defaultCalc.getTpCosts() + "][activity=" + defaultCalc.getActCosts() + +// "][vehicle=" + defaultCalc.getVehicleCosts() + "][driver=" + defaultCalc.getDriverCosts() + "][other=" + defaultCalc.getOther() + "]"); +// } +// routeCount++; +// } +// } +// +// +// } + +} diff --git a/jsprit-analysis/src/main/java/analysis/StopWatch.java b/jsprit-analysis/src/main/java/jsprit/analysis/toolbox/StopWatch.java similarity index 86% rename from jsprit-analysis/src/main/java/analysis/StopWatch.java rename to jsprit-analysis/src/main/java/jsprit/analysis/toolbox/StopWatch.java index 86f6314c..837d6581 100644 --- a/jsprit-analysis/src/main/java/analysis/StopWatch.java +++ b/jsprit-analysis/src/main/java/jsprit/analysis/toolbox/StopWatch.java @@ -14,17 +14,18 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package analysis; +package jsprit.analysis.toolbox; import java.util.Collection; +import jsprit.core.algorithm.VehicleRoutingAlgorithm; +import jsprit.core.algorithm.listener.AlgorithmEndsListener; +import jsprit.core.algorithm.listener.AlgorithmStartsListener; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; + import org.apache.log4j.Logger; -import basics.VehicleRoutingAlgorithm; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblemSolution; -import basics.algo.AlgorithmEndsListener; -import basics.algo.AlgorithmStartsListener; public class StopWatch implements AlgorithmStartsListener, AlgorithmEndsListener{ diff --git a/jsprit-analysis/src/main/java/util/BenchmarkWriter.java b/jsprit-analysis/src/main/java/jsprit/analysis/util/BenchmarkWriter.java similarity index 93% rename from jsprit-analysis/src/main/java/util/BenchmarkWriter.java rename to jsprit-analysis/src/main/java/jsprit/analysis/util/BenchmarkWriter.java index a6e55c40..a4b2be2b 100644 --- a/jsprit-analysis/src/main/java/util/BenchmarkWriter.java +++ b/jsprit-analysis/src/main/java/jsprit/analysis/util/BenchmarkWriter.java @@ -14,10 +14,12 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package util; +package jsprit.analysis.util; import java.util.Collection; +import jsprit.core.util.BenchmarkResult; + public interface BenchmarkWriter { public void write(Collection results); } diff --git a/jsprit-analysis/src/main/java/util/HtmlBenchmarkTableWriter.java b/jsprit-analysis/src/main/java/jsprit/analysis/util/HtmlBenchmarkTableWriter.java similarity index 99% rename from jsprit-analysis/src/main/java/util/HtmlBenchmarkTableWriter.java rename to jsprit-analysis/src/main/java/jsprit/analysis/util/HtmlBenchmarkTableWriter.java index df8fce20..52dae708 100644 --- a/jsprit-analysis/src/main/java/util/HtmlBenchmarkTableWriter.java +++ b/jsprit-analysis/src/main/java/jsprit/analysis/util/HtmlBenchmarkTableWriter.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package util; +package jsprit.analysis.util; import java.io.BufferedWriter; import java.io.File; @@ -22,6 +22,8 @@ import java.io.FileWriter; import java.io.IOException; import java.util.Collection; +import jsprit.core.util.BenchmarkResult; + import org.jfree.chart.renderer.xy.DeviationRenderer; public class HtmlBenchmarkTableWriter implements BenchmarkWriter{ diff --git a/jsprit-core/src/main/java/algorithms/BestInsertionStrategyFactory.java b/jsprit-core/src/main/java/algorithms/BestInsertionStrategyFactory.java deleted file mode 100644 index beb92f46..00000000 --- a/jsprit-core/src/main/java/algorithms/BestInsertionStrategyFactory.java +++ /dev/null @@ -1,19 +0,0 @@ -package algorithms; - -import basics.VehicleRoutingProblem; - -public class BestInsertionStrategyFactory implements InsertionStrategyFactory{ - - private JobInsertionCostsCalculator jobInsertionCalculator; - - public BestInsertionStrategyFactory(JobInsertionCostsCalculator jobInsertionCalculator) { - super(); - this.jobInsertionCalculator = jobInsertionCalculator; - } - - @Override - public InsertionStrategy createStrategy(VehicleRoutingProblem vrp) { - return new BestInsertion(jobInsertionCalculator); - } - -} diff --git a/jsprit-core/src/main/java/algorithms/ConcurrentVehicleRoutingAlgorithmWrapper.java b/jsprit-core/src/main/java/algorithms/ConcurrentVehicleRoutingAlgorithmWrapper.java deleted file mode 100644 index 54b83de2..00000000 --- a/jsprit-core/src/main/java/algorithms/ConcurrentVehicleRoutingAlgorithmWrapper.java +++ /dev/null @@ -1,15 +0,0 @@ -package algorithms; - -public class ConcurrentVehicleRoutingAlgorithmWrapper { - - - private int nuOfThreads; - - public ConcurrentVehicleRoutingAlgorithmWrapper(int nuOfThreads) { - super(); - this.nuOfThreads = nuOfThreads; - } - - - -} diff --git a/jsprit-core/src/main/java/algorithms/FindCheaperVehicle.java b/jsprit-core/src/main/java/algorithms/FindCheaperVehicle.java deleted file mode 100644 index e78d7847..00000000 --- a/jsprit-core/src/main/java/algorithms/FindCheaperVehicle.java +++ /dev/null @@ -1,53 +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 . - ******************************************************************************/ -package algorithms; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -import basics.Job; -import basics.algo.InsertionStartsListener; -import basics.route.VehicleRoute; - -class FindCheaperVehicle implements InsertionStartsListener{ - - FindCheaperVehicleAlgo findCheaperVehicle; - - public FindCheaperVehicle(FindCheaperVehicleAlgo findCheaperVehicle) { - super(); - this.findCheaperVehicle = findCheaperVehicle; - } - - @Override - public void informInsertionStarts(Collection vehicleRoutes, Collection unassignedJobs) { - List newRoutes = new ArrayList(); - for(VehicleRoute route : vehicleRoutes){ - if(route.isEmpty()) continue; - VehicleRoute cheaperRoute = findCheaperVehicle.runAndGetVehicleRoute(route); - newRoutes.add(cheaperRoute); - } - vehicleRoutes.clear(); - vehicleRoutes.addAll(newRoutes); - } - - @Override - public String toString() { - return "[name=findCheaperVehicle]"; - } - -} diff --git a/jsprit-core/src/main/java/algorithms/FindCheaperVehicleAlgo.java b/jsprit-core/src/main/java/algorithms/FindCheaperVehicleAlgo.java deleted file mode 100644 index abbfb90a..00000000 --- a/jsprit-core/src/main/java/algorithms/FindCheaperVehicleAlgo.java +++ /dev/null @@ -1,110 +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 . - ******************************************************************************/ -package algorithms; - -import java.util.ArrayList; -import java.util.List; - -import org.apache.log4j.Logger; - -import basics.route.TourActivities; -import basics.route.TourActivity; -import basics.route.Vehicle; -import basics.route.VehicleFleetManager; -import basics.route.VehicleImpl.NoVehicle; -import basics.route.VehicleRoute; - - - -final class FindCheaperVehicleAlgo { - - private static Logger log = Logger.getLogger(FindCheaperVehicleAlgo.class); - - private VehicleFleetManager fleetManager; - - private VehicleRouteUpdater tourStateCalculator; - - private AuxilliaryCostCalculator auxilliaryCostCalculator; - - private double weightFixCosts = 1.0; - - private StateGetter states; - - public void setWeightFixCosts(double weightFixCosts) { - this.weightFixCosts = weightFixCosts; - } - - public void setStates(StateGetter states) { - this.states = states; - } - - public FindCheaperVehicleAlgo(VehicleFleetManager fleetManager, VehicleRouteUpdater tourStateCalculator, AuxilliaryCostCalculator auxilliaryCostCalculator) { - super(); - this.fleetManager = fleetManager; - this.tourStateCalculator = tourStateCalculator; - this.auxilliaryCostCalculator = auxilliaryCostCalculator; - } - - - public VehicleRoute runAndGetVehicleRoute(VehicleRoute vehicleRoute) { - if(vehicleRoute.getVehicle() instanceof NoVehicle){ - return vehicleRoute; - } - if(vehicleRoute.getTourActivities() == null || vehicleRoute.getVehicle() == null){ - return vehicleRoute; - } -// Collection availableVehicleTypes = fleetManager.getAvailableVehicleTypes(new TypeKey(vehicleRoute.getVehicle().getType(),vehicleRoute.getVehicle().getLocationId())); - double bestSaving = 0.0; - Vehicle bestVehicle = null; - List path = new ArrayList(); - path.add(vehicleRoute.getStart()); - path.addAll(vehicleRoute.getTourActivities().getActivities()); - path.add(vehicleRoute.getEnd()); - - for(Vehicle vehicle : fleetManager.getAvailableVehicles(vehicleRoute.getVehicle().getType().getTypeId(), vehicleRoute.getVehicle().getLocationId())){ -// Vehicle vehicle = fleetManager.getEmptyVehicle(vehicleType); - if(vehicle.getType().getTypeId().equals(vehicleRoute.getVehicle().getType().getTypeId())){ - continue; - } - if(states.getRouteState(vehicleRoute,StateFactory.LOAD).toDouble() <= vehicle.getCapacity()){ - double fixCostSaving = vehicleRoute.getVehicle().getType().getVehicleCostParams().fix - vehicle.getType().getVehicleCostParams().fix; - double departureTime = vehicleRoute.getStart().getEndTime(); - double newCost = auxilliaryCostCalculator.costOfPath(path, departureTime, vehicleRoute.getDriver(), vehicle); - double varCostSaving = states.getRouteState(vehicleRoute, StateFactory.COSTS).toDouble() - newCost; - double totalCostSaving = varCostSaving + weightFixCosts*fixCostSaving; - if(totalCostSaving > bestSaving){ - bestSaving = totalCostSaving; - bestVehicle = vehicle; - } - } - } - if(bestVehicle != null){ - try{ - fleetManager.unlock(vehicleRoute.getVehicle()); - fleetManager.lock(bestVehicle); - } - catch(IllegalStateException e){ - throw new IllegalStateException(e); - } - TourActivities newTour = TourActivities.copyOf(vehicleRoute.getTourActivities()); - tourStateCalculator.iterate(vehicleRoute); - return VehicleRoute.newInstance(newTour,vehicleRoute.getDriver(),bestVehicle); - } - return vehicleRoute; - } - -} diff --git a/jsprit-core/src/main/java/algorithms/Gendreau.java b/jsprit-core/src/main/java/algorithms/Gendreau.java deleted file mode 100644 index 39de8fd1..00000000 --- a/jsprit-core/src/main/java/algorithms/Gendreau.java +++ /dev/null @@ -1,220 +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 . - ******************************************************************************/ -package algorithms; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Random; -import java.util.Set; - -import org.apache.log4j.Logger; - -import util.RandomNumberGeneration; -import basics.Job; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblemSolution; -import basics.algo.InsertionListener; -import basics.algo.RuinListener; -import basics.algo.SearchStrategyModule; -import basics.algo.SearchStrategyModuleListener; -import basics.route.TourActivity; -import basics.route.TourActivity.JobActivity; -import basics.route.VehicleFleetManager; -import basics.route.VehicleRoute; - -public final class Gendreau implements SearchStrategyModule{ - - private final static Logger log = Logger.getLogger(Gendreau.class); - - private final static String NAME = "gendreauPostOpt"; - - private final RuinStrategy ruin; - - private final VehicleRoutingProblem vrp; - - private final InsertionStrategy insertionStrategy; - - private VehicleFleetManager fleetManager; - - private Random random = RandomNumberGeneration.getRandom(); - - private int nOfIterations = 10; - - private double shareOfJobsToRuin = 0.15; - - public void setShareOfJobsToRuin(double shareOfJobsToRuin) { - this.shareOfJobsToRuin = shareOfJobsToRuin; - } - - public Gendreau(VehicleRoutingProblem vrp, RuinStrategy ruin, InsertionStrategy insertionStrategy, VehicleFleetManager vehicleFleetManager) { - super(); - InsertionListeners insertionListeners = new InsertionListeners(); - insertionListeners.addAllListeners(insertionStrategy.getListeners()); - new Inserter(insertionListeners); - this.ruin = ruin; - this.vrp = vrp; - this.insertionStrategy = insertionStrategy; - this.fleetManager = vehicleFleetManager; - } - - @Override - public String toString() { - return "[name=gendreau][iterations="+nOfIterations+"][share2ruin="+shareOfJobsToRuin+"]"; - } - - public void setRandom(Random random) { - this.random = random; - } - - - public void setNuOfIterations(int nOfIterations) { - this.nOfIterations = nOfIterations; - } - -// public void setFleetManager(VehicleFleetManager vehicleFleetManager) { -// this.fleetManager = vehicleFleetManager; -// -// } - - @Override - public VehicleRoutingProblemSolution runAndGetSolution(VehicleRoutingProblemSolution vrpSolution) { -// log.info("run gendreau postopt"); - VehicleRoutingProblemSolution bestSolution = vrpSolution; - int itersWithoutImprovement = 0; - - for(int i=0;i copiedRoutes = copyRoutes(bestSolution.getRoutes()); - iniFleet(copiedRoutes); - - VehicleRoute route2split = pickRouteThatHasAtLeastTwoJobs(copiedRoutes); - if(route2split == null) continue; - List jobsInRoute = getJobs(route2split); - Set unassignedJobs = new HashSet(); - unassignedJobs.addAll(jobsInRoute); - copiedRoutes.remove(route2split); - - Collections.shuffle(jobsInRoute,random); - Job targetJob = jobsInRoute.get(0); - int nOfJobs2BeRemovedAdditionally = (int) (shareOfJobsToRuin*(double)vrp.getJobs().size()); - Collection unassignedJobsList = ruin.ruin(copiedRoutes, targetJob, nOfJobs2BeRemovedAdditionally); - unassignedJobs.addAll(unassignedJobsList); - - VehicleRoute emptyRoute1 = VehicleRoute.emptyRoute(); - copiedRoutes.add(emptyRoute1); - insertionStrategy.insertJobs(Arrays.asList(emptyRoute1), Arrays.asList(targetJob)); - - unassignedJobs.remove(targetJob); - - VehicleRoute emptyRoute2 = VehicleRoute.emptyRoute(); - copiedRoutes.add(emptyRoute2); - Job job2 = jobsInRoute.get(1); - insertionStrategy.insertJobs(Arrays.asList(emptyRoute2), Arrays.asList(job2)); - - unassignedJobs.remove(job2); - - insertionStrategy.insertJobs(copiedRoutes, unassignedJobs); - double cost = getCost(copiedRoutes); - - if(cost < bestSolution.getCost()){ -// log.info("BING - new: " + cost + " old: " + bestSolution.getCost()); - bestSolution = new VehicleRoutingProblemSolution(copiedRoutes, cost); - itersWithoutImprovement=0; - } - else{ - itersWithoutImprovement++; - if(itersWithoutImprovement > 200){ -// log.info("BREAK i="+i); - break; - } - } - } - return bestSolution; - } - - private List copyRoutes(Collection routes) { - List routeList = new ArrayList(); - for(VehicleRoute r : routes){ - routeList.add(VehicleRoute.copyOf(r)); - } - return routeList; - } - - private void iniFleet(Collection routes) { - fleetManager.unlockAll(); - for(VehicleRoute route : routes){ - if(!route.isEmpty()){ - fleetManager.lock(route.getVehicle()); - } - } - } - - private double getCost(Collection routes) { - double c = 0.0; - for(VehicleRoute r : routes){ - c+=r.getCost(); - } - return c; - } - - private List getJobs(VehicleRoute route2split) { - Set jobs = new HashSet(); - for(TourActivity act : route2split.getTourActivities().getActivities()){ - if(act instanceof JobActivity){ - jobs.add(((JobActivity) act).getJob()); - } - } - return new ArrayList(jobs); - } - - private VehicleRoute pickRouteThatHasAtLeastTwoJobs(Collection routeList) { - List routes = new ArrayList(); - for(VehicleRoute r : routeList){ - if(getJobs(r).size() > 1){ - routes.add(r); - } - } - if(routes.isEmpty()) return null; - Collections.shuffle(routes,random); - return routes.get(0); - } - - @Override - public String getName() { - return NAME; - } - - @Override - public void addModuleListener(SearchStrategyModuleListener moduleListener) { - if(moduleListener instanceof InsertionListener){ - InsertionListener iListener = (InsertionListener) moduleListener; - if(!insertionStrategy.getListeners().contains(iListener)){ - insertionStrategy.addListener(iListener); - } - } - if(moduleListener instanceof RuinListener){ - RuinListener rListener = (RuinListener) moduleListener; - if(!ruin.getListeners().contains(rListener)){ - ruin.addListener(rListener); - } - } - - } -} diff --git a/jsprit-core/src/main/java/algorithms/HardActivityStateLevelConstraint.java b/jsprit-core/src/main/java/algorithms/HardActivityStateLevelConstraint.java deleted file mode 100644 index ed0147cf..00000000 --- a/jsprit-core/src/main/java/algorithms/HardActivityStateLevelConstraint.java +++ /dev/null @@ -1,15 +0,0 @@ -package algorithms; - -import basics.route.TourActivity; - -public interface HardActivityStateLevelConstraint { - - static enum ConstraintsStatus { - - NOT_FULFILLED_BREAK, NOT_FULFILLED, FULFILLED; - - } - - public ConstraintsStatus fulfilled(InsertionContext iFacts, TourActivity prevAct, TourActivity newAct, TourActivity nextAct, double prevActDepTime); - -} \ No newline at end of file diff --git a/jsprit-core/src/main/java/algorithms/HardRouteStateLevelConstraint.java b/jsprit-core/src/main/java/algorithms/HardRouteStateLevelConstraint.java deleted file mode 100644 index 0f414f1d..00000000 --- a/jsprit-core/src/main/java/algorithms/HardRouteStateLevelConstraint.java +++ /dev/null @@ -1,8 +0,0 @@ -package algorithms; - - -public interface HardRouteStateLevelConstraint { - - public boolean fulfilled(InsertionContext insertionContext); - -} \ No newline at end of file diff --git a/jsprit-core/src/main/java/algorithms/JobDistanceBeeline.java b/jsprit-core/src/main/java/algorithms/JobDistanceBeeline.java deleted file mode 100644 index f4287639..00000000 --- a/jsprit-core/src/main/java/algorithms/JobDistanceBeeline.java +++ /dev/null @@ -1,57 +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 . - ******************************************************************************/ -package algorithms; - -import util.CrowFlyCosts; -import util.Locations; -import basics.Job; -import basics.Service; - - - -class JobDistanceBeeline implements JobDistance { - - private Locations locations; - - public JobDistanceBeeline(Locations locations) { - super(); - this.locations = locations; - } - - @Override - public double getDistance(Job i, Job j) { - double avgCost = 0.0; - if (i instanceof Service && j instanceof Service) { - if (i.equals(j)) { - avgCost = 0.0; - } else { - Service s_i = (Service) i; - Service s_j = (Service) j; - avgCost = calcDist(s_i.getLocationId(), s_j.getLocationId()); - } - } else { - throw new UnsupportedOperationException( - "currently, this class just works with shipments and services."); - } - return avgCost; - } - - private double calcDist(String from, String to) { - return new CrowFlyCosts(locations).getTransportCost(from, to, 0.0,null, null); - } - -} diff --git a/jsprit-core/src/main/java/algorithms/ScoredJob.java b/jsprit-core/src/main/java/algorithms/ScoredJob.java deleted file mode 100644 index d7519673..00000000 --- a/jsprit-core/src/main/java/algorithms/ScoredJob.java +++ /dev/null @@ -1,59 +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 . - ******************************************************************************/ -package algorithms; - -import basics.Job; -import basics.route.VehicleRoute; - - - -class ScoredJob { - - private final Job job; - - private final double score; - - private final InsertionData insertionData; - - private final VehicleRoute route; - - public ScoredJob(final Job job, final double score, final InsertionData insertionData, final VehicleRoute route) { - super(); - this.job = job; - this.score = score; - this.insertionData = insertionData; - this.route = route; - } - - public InsertionData getInsertionData() { - return insertionData; - } - - public VehicleRoute getRoute() { - return route; - } - - public Job getJob() { - return job; - } - - public double getScore() { - return score; - } - - -} diff --git a/jsprit-core/src/main/java/algorithms/ShipmentPickupsFirstConstraint.java b/jsprit-core/src/main/java/algorithms/ShipmentPickupsFirstConstraint.java deleted file mode 100644 index 971f3e27..00000000 --- a/jsprit-core/src/main/java/algorithms/ShipmentPickupsFirstConstraint.java +++ /dev/null @@ -1,16 +0,0 @@ -package algorithms; - -import basics.route.DeliverShipment; -import basics.route.PickupShipment; -import basics.route.TourActivity; - -public class ShipmentPickupsFirstConstraint implements HardActivityStateLevelConstraint { - - @Override - public ConstraintsStatus fulfilled(InsertionContext iFacts, TourActivity prevAct, TourActivity newAct, TourActivity nextAct, double prevActDepTime) { - if(newAct instanceof DeliverShipment && nextAct instanceof PickupShipment){ return ConstraintsStatus.NOT_FULFILLED; } - if(newAct instanceof PickupShipment && prevAct instanceof DeliverShipment){ return ConstraintsStatus.NOT_FULFILLED_BREAK; } - return ConstraintsStatus.FULFILLED; - } - -} \ No newline at end of file diff --git a/jsprit-core/src/main/java/algorithms/StateUpdater.java b/jsprit-core/src/main/java/algorithms/StateUpdater.java deleted file mode 100644 index 9fd80a19..00000000 --- a/jsprit-core/src/main/java/algorithms/StateUpdater.java +++ /dev/null @@ -1,5 +0,0 @@ -package algorithms; - -public interface StateUpdater { - -} diff --git a/jsprit-core/src/main/java/algorithms/UpdateEarliestStartTime.java b/jsprit-core/src/main/java/algorithms/UpdateEarliestStartTime.java deleted file mode 100644 index 8faa8f08..00000000 --- a/jsprit-core/src/main/java/algorithms/UpdateEarliestStartTime.java +++ /dev/null @@ -1,37 +0,0 @@ -package algorithms; - -import util.ActivityTimeTracker; -import algorithms.StateManager.StateImpl; -import basics.costs.VehicleRoutingTransportCosts; -import basics.route.ActivityVisitor; -import basics.route.TourActivity; -import basics.route.VehicleRoute; - -class UpdateEarliestStartTime implements ActivityVisitor,StateUpdater{ - - private StateManager states; - - private ActivityTimeTracker timeTracker; - - public UpdateEarliestStartTime(StateManager states, VehicleRoutingTransportCosts transportCosts) { - super(); - this.states = states; - timeTracker = new ActivityTimeTracker(transportCosts); - } - - @Override - public void begin(VehicleRoute route) { - timeTracker.begin(route); - } - - @Override - public void visit(TourActivity activity) { - timeTracker.visit(activity); - states.putActivityState(activity, StateFactory.EARLIEST_OPERATION_START_TIME, new StateImpl(Math.max(timeTracker.getActArrTime(), activity.getTheoreticalEarliestOperationStartTime()))); - - } - - @Override - public void finish() {} - -} \ No newline at end of file diff --git a/jsprit-core/src/main/java/algorithms/VehicleRouteUpdater.java b/jsprit-core/src/main/java/algorithms/VehicleRouteUpdater.java deleted file mode 100644 index 869db6cf..00000000 --- a/jsprit-core/src/main/java/algorithms/VehicleRouteUpdater.java +++ /dev/null @@ -1,33 +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 . - ******************************************************************************/ -package algorithms; - -import basics.route.VehicleRoute; - - -/** - * Updater that updates a vehicleRoute, e.g. the total costs or the time-windows. - * - * @author stefan schroeder - * - */ - -interface VehicleRouteUpdater { - - public void iterate(VehicleRoute vehicleRoute); - -} diff --git a/jsprit-core/src/main/java/algorithms/VehicleRoutingAlgorithmFactoryImpl.java b/jsprit-core/src/main/java/algorithms/VehicleRoutingAlgorithmFactoryImpl.java deleted file mode 100644 index 35e5a96f..00000000 --- a/jsprit-core/src/main/java/algorithms/VehicleRoutingAlgorithmFactoryImpl.java +++ /dev/null @@ -1,41 +0,0 @@ -package algorithms; - -import basics.VehicleRoutingAlgorithm; -import basics.VehicleRoutingProblem; -import basics.algo.SearchStrategyManager; -import basics.algo.VehicleRoutingAlgorithmFactory; -import basics.route.VehicleFleetManager; - -public class VehicleRoutingAlgorithmFactoryImpl implements VehicleRoutingAlgorithmFactory{ - - private SearchStrategyManager searchStrategyManager; - - private StateManager stateManager; - - private VehicleFleetManager fleetManager; - - public VehicleRoutingAlgorithmFactoryImpl(SearchStrategyManager searchStrategyManager, - StateManager stateManager, VehicleFleetManager fleetManager) { - super(); - this.searchStrategyManager = searchStrategyManager; - this.stateManager = stateManager; - this.fleetManager = fleetManager; - } - - @Override - public VehicleRoutingAlgorithm createAlgorithm(VehicleRoutingProblem vrp) { - this.stateManager.addActivityVisitor(new UpdateVariableCosts(vrp.getActivityCosts(), vrp.getTransportCosts(), this.stateManager)); -//<<<<<<< HEAD -// this.stateManager.addActivityVisitor(new UpdateMaxLoad(this.stateManager)); - this.stateManager.addActivityVisitor(new UpdateActivityTimes(vrp.getTransportCosts())); -//======= -//// this.stateManager.addActivityVisitor(new UpdateMaxLoad_(this.stateManager)); -//>>>>>>> refs/heads/pickupAndDelivery - VehicleRoutingAlgorithm algorithm = new VehicleRoutingAlgorithm(vrp, searchStrategyManager); - algorithm.getAlgorithmListeners().addListener(stateManager); - algorithm.getSearchStrategyManager().addSearchStrategyModuleListener(stateManager); - algorithm.getSearchStrategyManager().addSearchStrategyModuleListener(new RemoveEmptyVehicles(fleetManager)); - return algorithm; - } - -} diff --git a/jsprit-core/src/main/java/basics/algo/InsertionListeners.java b/jsprit-core/src/main/java/basics/algo/InsertionListeners.java deleted file mode 100644 index 821f166d..00000000 --- a/jsprit-core/src/main/java/basics/algo/InsertionListeners.java +++ /dev/null @@ -1,42 +0,0 @@ -package basics.algo; - -import java.util.ArrayList; -import java.util.Collection; - -import basics.Job; -import basics.route.VehicleRoute; - -public class InsertionListeners { - - private Collection startListeners = new ArrayList(); - - private Collection jobInsertedListeners = new ArrayList(); - - private Collection endListeners = new ArrayList(); - - public void addListener(InsertionListener insertionListener){ - if(insertionListener instanceof InsertionStartsListener) startListeners.add((InsertionStartsListener) insertionListener); - if(insertionListener instanceof JobInsertedListener) jobInsertedListeners.add((JobInsertedListener) insertionListener); - if(insertionListener instanceof InsertionEndsListener) endListeners.add((InsertionEndsListener) insertionListener); -// else throw new IllegalStateException("cannot add this type of insertionListener"); - } - - public void removeListener(InsertionListener insertionListener){ - if(insertionListener instanceof InsertionStartsListener) startListeners.remove((InsertionStartsListener) insertionListener); - if(insertionListener instanceof JobInsertedListener) jobInsertedListeners.remove((JobInsertedListener) insertionListener); - if(insertionListener instanceof InsertionEndsListener) endListeners.remove((InsertionEndsListener) insertionListener); -// else throw new IllegalStateException("cannot remove this type of insertionListener"); - } - - public void insertionStarts(Collection vehicleRoutes, Collection unassignedJobs){ - for(InsertionStartsListener l : startListeners) l.informInsertionStarts(vehicleRoutes, unassignedJobs); - } - - public void jobInserted(Job job2insert, VehicleRoute inRoute, double additionalCosts, double additionalTime){ - for(JobInsertedListener l : jobInsertedListeners) l.informJobInserted(job2insert, inRoute, additionalCosts, additionalTime); - } - - public void insertionEnds(Collection vehicleRoutes){ - for(InsertionEndsListener l : endListeners){ l.informInsertionEnds(vehicleRoutes); } - } -} diff --git a/jsprit-core/src/main/java/basics/costs/DefaultVehicleRoutingActivityCosts.java b/jsprit-core/src/main/java/basics/costs/DefaultVehicleRoutingActivityCosts.java deleted file mode 100644 index f9a91b4b..00000000 --- a/jsprit-core/src/main/java/basics/costs/DefaultVehicleRoutingActivityCosts.java +++ /dev/null @@ -1,42 +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 . - ******************************************************************************/ -package basics.costs; - -import basics.route.Driver; -import basics.route.TourActivity; -import basics.route.Vehicle; - - -/** - * DefaultActivityCosts = 0.0, i.e. activities do not induce costs at all. - * - * @author schroeder - * - */ -public class DefaultVehicleRoutingActivityCosts implements VehicleRoutingActivityCosts{ - - @Override - public double getActivityCost(TourActivity tourAct, double arrivalTime, Driver driver, Vehicle vehicle) { - return 0; - } - - @Override - public String toString() { - return "[name=defaultActivityCosts]"; - } - -} diff --git a/jsprit-core/src/main/java/basics/route/DefaultVehicleRouteCostCalculator.java b/jsprit-core/src/main/java/basics/route/DefaultVehicleRouteCostCalculator.java deleted file mode 100644 index c388630c..00000000 --- a/jsprit-core/src/main/java/basics/route/DefaultVehicleRouteCostCalculator.java +++ /dev/null @@ -1,128 +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 . - ******************************************************************************/ -package basics.route; - - - -public class DefaultVehicleRouteCostCalculator implements VehicleRouteCostCalculator { - - private double tpCosts = 0.0; - private double actCosts = 0.0; - private double vehicleCosts = 0.0; - private double driverCosts = 0.0; - private double other = 0.0; - - public DefaultVehicleRouteCostCalculator(){} - - private DefaultVehicleRouteCostCalculator(DefaultVehicleRouteCostCalculator costCalc){ - this.tpCosts=costCalc.getTpCosts(); - this.actCosts = costCalc.getActCosts(); - this.driverCosts = costCalc.getDriverCosts(); - this.other = costCalc.getOther(); - this.vehicleCosts = costCalc.getVehicleCosts(); - } - - public void addTransportCost(double tpCost) { - this.tpCosts+=tpCost; - } - - public void addActivityCost(double actCost){ - this.actCosts+=actCost; - } - - public void price(Vehicle vehicle){ - if(vehicle != null){ - VehicleType type = vehicle.getType(); - if(type != null){ - this.vehicleCosts = type.getVehicleCostParams().fix; - } - } - } - - public void price(Driver driver){ - - } - - @Override - public void finish() { - // TODO Auto-generated method stub - - } - - @Override - public void reset() { - tpCosts = 0.0; - actCosts = 0.0; - vehicleCosts = 0.0; - driverCosts = 0.0; - other = 0.0; - } - - @Override - public void addOtherCost(double cost) { - this.other = cost; - - } - - @Override - public double getCosts() { - return tpCosts + actCosts + vehicleCosts + driverCosts + other; - } - - /** - * @return the tpCosts - */ - public double getTpCosts() { - return tpCosts; - } - - /** - * @return the actCosts - */ - public double getActCosts() { - return actCosts; - } - - /** - * @return the vehicleCosts - */ - public double getVehicleCosts() { - return vehicleCosts; - } - - /** - * @return the driverCosts - */ - public double getDriverCosts() { - return driverCosts; - } - - /** - * @return the other - */ - public double getOther() { - return other; - } - - @Override - public VehicleRouteCostCalculator duplicate() { - return new DefaultVehicleRouteCostCalculator(this); - } - - - -} diff --git a/jsprit-core/src/main/java/basics/route/VehicleRoute.java b/jsprit-core/src/main/java/basics/route/VehicleRoute.java deleted file mode 100644 index 865f3aa3..00000000 --- a/jsprit-core/src/main/java/basics/route/VehicleRoute.java +++ /dev/null @@ -1,209 +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 . - ******************************************************************************/ -package basics.route; - -import basics.route.VehicleImpl.NoVehicle; - -public class VehicleRoute { - - public static VehicleRoute copyOf(VehicleRoute route) { - return new VehicleRoute(route); - } - - public static VehicleRoute newInstance(TourActivities tour, Driver driver, Vehicle vehicle) { - return new VehicleRoute(tour,driver,vehicle); - } - - public static VehicleRoute emptyRoute() { - return new VehicleRoute(TourActivities.emptyTour(), DriverImpl.noDriver(), VehicleImpl.noVehicle()); - } - - public static class Builder { - - public static Builder newInstance(Start start, End end){ - return new Builder(start,end); - } - - private Start start; - - private End end; - - private Vehicle vehicle = VehicleImpl.noVehicle(); - - private Driver driver = DriverImpl.noDriver(); - - private TourActivities tour; - - private Builder(Start start, End end) { - super(); - this.start = start; - this.end = end; - this.tour = TourActivities.emptyTour(); - } - - public Builder setVehicle(Vehicle vehicle){ - this.vehicle = vehicle; - return this; - } - - public Builder setDriver(Driver driver){ - this.driver = driver; - return this; - } - - public Builder addActivity(TourActivity act){ - if(act instanceof Start || act instanceof End){ - throw new IllegalStateException("tourActivity should be of type Delivery or Pickup, but is of type " + act.getName()); - } - tour.addActivity(act); - return this; - } - - public VehicleRoute build(){ - return new VehicleRoute(this); - } - } - - private TourActivities tourActivities; - - private Vehicle vehicle; - - private Driver driver; - - private Start start; - - private End end; - - @Deprecated - private VehicleRouteCostCalculator costCalculator = new DefaultVehicleRouteCostCalculator(); - - @Deprecated - public VehicleRouteCostCalculator getVehicleRouteCostCalculator(){ - return costCalculator; - } - - private VehicleRoute(VehicleRoute route){ - this.start = Start.copyOf(route.getStart()); - this.end = End.copyOf(route.getEnd()); - this.tourActivities = TourActivities.copyOf(route.getTourActivities()); - this.vehicle = route.getVehicle(); - this.driver = route.getDriver(); - this.costCalculator = route.getVehicleRouteCostCalculator().duplicate(); - } - - private VehicleRoute(TourActivities tour, Driver driver, Vehicle vehicle) { - super(); - verify(tour, driver, vehicle); - this.tourActivities = tour; - this.vehicle = vehicle; - this.driver = driver; - setStartAndEnd(vehicle, vehicle.getEarliestDeparture()); - } - - private VehicleRoute(Builder builder){ - this.tourActivities = builder.tour; - this.vehicle = builder.vehicle; - this.driver = builder.driver; - this.start = builder.start; - this.end = builder.end; - } - - private void verify(TourActivities tour, Driver driver, Vehicle vehicle) { - if(tour == null || driver == null || vehicle == null) throw new IllegalStateException("null is not allowed for tour, driver or vehicle. use emptyRoute. use Tour.emptyTour, DriverImpl.noDriver() and VehicleImpl.noVehicle() instead." + - "\n\tor make it easier and use VehicleRoute.emptyRoute()"); - if(!tour.isEmpty() && vehicle instanceof NoVehicle){ - throw new IllegalStateException("if tour is not empty. there must be a vehicle for this tour, but there is no vehicle."); - } - } - - public TourActivities getTourActivities() { - return tourActivities; - } - - - public Vehicle getVehicle() { - return vehicle; - } - - public Driver getDriver() { - return driver; - } - - public void setVehicle(Vehicle vehicle, double vehicleDepTime){ - this.vehicle = vehicle; - setStartAndEnd(vehicle, vehicleDepTime); - } - - public void setDepartureTime(double vehicleDepTime){ - if(start == null) throw new IllegalStateException("cannot set departureTime without having a vehicle on this route. use setVehicle(vehicle,departureTime) instead."); - start.setEndTime(vehicleDepTime); - } - - public double getDepartureTime(){ - if(start == null) throw new IllegalStateException("cannot get departureTime without having a vehicle on this route. use setVehicle(vehicle,departureTime) instead."); - return start.getEndTime(); - } - - private void setStartAndEnd(Vehicle vehicle, double vehicleDepTime) { - if(!(vehicle instanceof NoVehicle)){ - if(start == null && end == null){ - start = Start.newInstance(vehicle.getLocationId(), vehicle.getEarliestDeparture(), vehicle.getLatestArrival()); - end = End.newInstance(vehicle.getLocationId(), vehicle.getEarliestDeparture(), vehicle.getLatestArrival()); - } - start.setEndTime(vehicleDepTime); - start.setTheoreticalEarliestOperationStartTime(vehicle.getEarliestDeparture()); - start.setTheoreticalLatestOperationStartTime(vehicle.getLatestArrival()); - start.setLocationId(vehicle.getLocationId()); - end.setLocationId(vehicle.getLocationId()); - end.setTheoreticalEarliestOperationStartTime(vehicle.getEarliestDeparture()); - end.setTheoreticalLatestOperationStartTime(vehicle.getLatestArrival()); - } - - } - - - public boolean isEmpty() { - return tourActivities.isEmpty(); - } - - public Start getStart() { - return start; - } - - public End getEnd() { - return end; - } - - @Override - public String toString() { - return "[start="+start+"][end=" + end + "][departureTime=" + start.getEndTime() + "][vehicle=" + vehicle + "][driver=" + driver + "][nuOfActs="+tourActivities.getActivities().size()+"]"; - } - - @Deprecated - public void setVehicleRouteCostCalculator(VehicleRouteCostCalculator costAccumulator){ - this.costCalculator = costAccumulator; - } - - @Deprecated - public double getCost() { - if(tourActivities.isEmpty()){ - return 0.0; - } - return costCalculator.getCosts(); - } - -} diff --git a/jsprit-core/src/main/java/basics/route/VehicleRouteBuilder.java b/jsprit-core/src/main/java/basics/route/VehicleRouteBuilder.java deleted file mode 100644 index 9c2bb4f7..00000000 --- a/jsprit-core/src/main/java/basics/route/VehicleRouteBuilder.java +++ /dev/null @@ -1,151 +0,0 @@ -package basics.route; - -import java.util.HashSet; -import java.util.Set; - -import basics.Service; -import basics.Shipment; - -/** - * Builds a {@link VehicleRoute}. - * - * @author schroeder - * - */ -public class VehicleRouteBuilder { - - private Vehicle vehicle; - - private Driver driver; - - private Start start; - - private TourActivities tourActivities = new TourActivities(); - - private TourActivityFactory serviceActivityFactory = new DefaultTourActivityFactory(); - - private TourShipmentActivityFactory shipmentActivityFactory = new DefaultShipmentActivityFactory(); - - private Set openShipments = new HashSet(); - - public void setServiceActivityFactory(TourActivityFactory serviceActivityFactory) { - this.serviceActivityFactory = serviceActivityFactory; - } - - public void setShipmentActivityFactory(TourShipmentActivityFactory shipmentActivityFactory) { - this.shipmentActivityFactory = shipmentActivityFactory; - } - - /** - * Constructs the route-builder. - * @param vehicle - * @param driver - */ - public VehicleRouteBuilder(Vehicle vehicle, Driver driver) { - super(); - this.vehicle = vehicle; - this.driver = driver; - start = Start.newInstance(vehicle.getLocationId(), vehicle.getEarliestDeparture(), vehicle.getLatestArrival()); - start.setEndTime(vehicle.getEarliestDeparture()); - End.newInstance(vehicle.getLocationId(), vehicle.getEarliestDeparture(), vehicle.getLatestArrival()); - } - - /** - * Sets the departure-time of the route. - * - * @param departureTime - * @return - */ - public VehicleRouteBuilder setDepartureTime(double departureTime){ - start.setEndTime(departureTime); - return this; - } - - public VehicleRouteBuilder addService(Service service){ - addService(service,0.0,0.0); - return this; - } - - public VehicleRouteBuilder addService(Service service, double arrTime, double endTime){ - TourActivity act = serviceActivityFactory.createActivity(service); - act.setArrTime(arrTime); - act.setEndTime(endTime); - tourActivities.addActivity(act); - return this; - } - - /** - * Adds a the pickup of the specified shipment. - * - * @param shipment - * @throws IllegalStateException if method has already been called with the specified shipment. - * @return - */ - public VehicleRouteBuilder addPickup(Shipment shipment){ - addPickup(shipment,0.0,0.0); - return this; - } - - /** - * Adds a the pickup of the specified shipment at specified arrival and end-time. - * - * @param shipment - * @throws IllegalStateException if method has already been called with the specified shipment. - * @return - */ - public VehicleRouteBuilder addPickup(Shipment shipment, double arrTime, double endTime){ - if(openShipments.contains(shipment)) throw new IllegalStateException("shipment has already been added. cannot add it twice."); - TourActivity act = shipmentActivityFactory.createPickup(shipment); - act.setArrTime(arrTime); - act.setEndTime(endTime); - tourActivities.addActivity(act); - openShipments.add(shipment); - return this; - } - - /** - * Adds a the delivery of the specified shipment. - * - * @param shipment - * @throws IllegalStateException if specified shipment has not been picked up yet (i.e. method addPickup(shipment) has not been called yet). - * @return - */ - public VehicleRouteBuilder addDelivery(Shipment shipment){ - addDelivery(shipment,0.0,0.0); - return this; - } - - /** - * Adds a the delivery of the specified shipment at a specified arrival and endTime. - * - * @param shipment - * @throws IllegalStateException if specified shipment has not been picked up yet (i.e. method addPickup(shipment) has not been called yet). - * @return - */ - public VehicleRouteBuilder addDelivery(Shipment shipment, double arrTime, double endTime){ - if(openShipments.contains(shipment)){ - TourActivity act = shipmentActivityFactory.createDelivery(shipment); - act.setArrTime(arrTime); - act.setEndTime(endTime); - tourActivities.addActivity(act); - openShipments.remove(shipment); - } - else{ throw new IllegalStateException("cannot deliver shipment. shipment " + shipment + " needs to be picked up first."); } - return this; - } - - /** - * Builds the route. - * - * @return {@link VehicleRoute} - * @throws IllegalStateException if there are still shipments that have been picked up though but not delivery. - */ - public VehicleRoute build(){ - if(!openShipments.isEmpty()){ - throw new IllegalStateException("there are still shipments that have not been delivered yet."); - } - VehicleRoute route = VehicleRoute.newInstance(tourActivities, driver, vehicle); - return route; - } - -} diff --git a/jsprit-core/src/main/java/basics/route/VehicleRouteCostCalculator.java b/jsprit-core/src/main/java/basics/route/VehicleRouteCostCalculator.java deleted file mode 100644 index 0f3c4941..00000000 --- a/jsprit-core/src/main/java/basics/route/VehicleRouteCostCalculator.java +++ /dev/null @@ -1,40 +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 . - ******************************************************************************/ -package basics.route; - -@Deprecated -public interface VehicleRouteCostCalculator { - - public void addTransportCost(double cost); - - public void addActivityCost(double cost); - - public void addOtherCost(double cost); - - public void price(Vehicle vehicle); - - public void price(Driver driver); - - public double getCosts(); - - public void finish(); - - public void reset(); - - public VehicleRouteCostCalculator duplicate(); - -} diff --git a/jsprit-core/src/main/java/jsprit/core/algorithm/FindCheaperVehicle.java b/jsprit-core/src/main/java/jsprit/core/algorithm/FindCheaperVehicle.java new file mode 100644 index 00000000..155fa90e --- /dev/null +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/FindCheaperVehicle.java @@ -0,0 +1,54 @@ +///******************************************************************************* +// * 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 . +// ******************************************************************************/ +//package jsprit.core.algorithm; +// +//import java.util.ArrayList; +//import java.util.Collection; +//import java.util.List; +// +//import jsprit.core.algorithm.recreate.listener.InsertionStartsListener; +//import jsprit.core.problem.job.Job; +//import jsprit.core.problem.solution.route.VehicleRoute; +// +// +//class FindCheaperVehicle implements InsertionStartsListener{ +// +// FindCheaperVehicleAlgo findCheaperVehicle; +// +// public FindCheaperVehicle(FindCheaperVehicleAlgo findCheaperVehicle) { +// super(); +// this.findCheaperVehicle = findCheaperVehicle; +// } +// +// @Override +// public void informInsertionStarts(Collection vehicleRoutes, Collection unassignedJobs) { +// List newRoutes = new ArrayList(); +// for(VehicleRoute route : vehicleRoutes){ +// if(route.isEmpty()) continue; +// VehicleRoute cheaperRoute = findCheaperVehicle.runAndGetVehicleRoute(route); +// newRoutes.add(cheaperRoute); +// } +// vehicleRoutes.clear(); +// vehicleRoutes.addAll(newRoutes); +// } +// +// @Override +// public String toString() { +// return "[name=findCheaperVehicle]"; +// } +// +//} diff --git a/jsprit-core/src/main/java/jsprit/core/algorithm/FindCheaperVehicleAlgo.java b/jsprit-core/src/main/java/jsprit/core/algorithm/FindCheaperVehicleAlgo.java new file mode 100644 index 00000000..c40165bf --- /dev/null +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/FindCheaperVehicleAlgo.java @@ -0,0 +1,114 @@ +///******************************************************************************* +// * 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 . +// ******************************************************************************/ +//package jsprit.core.algorithm; +// +//import java.util.ArrayList; +//import java.util.List; +// +//import jsprit.core.algorithm.recreate.AuxilliaryCostCalculator; +//import jsprit.core.algorithm.state.StateFactory; +//import jsprit.core.algorithm.state.StateGetter; +//import jsprit.core.problem.solution.route.VehicleRoute; +//import jsprit.core.problem.solution.route.activity.TourActivities; +//import jsprit.core.problem.solution.route.activity.TourActivity; +//import jsprit.core.problem.vehicle.Vehicle; +//import jsprit.core.problem.vehicle.VehicleFleetManager; +//import jsprit.core.problem.vehicle.VehicleImpl.NoVehicle; +// +//import org.apache.log4j.Logger; +// +// +// +// +//final class FindCheaperVehicleAlgo { +// +// private static Logger log = Logger.getLogger(FindCheaperVehicleAlgo.class); +// +// private VehicleFleetManager fleetManager; +// +// private VehicleRouteUpdater tourStateCalculator; +// +// private AuxilliaryCostCalculator auxilliaryCostCalculator; +// +// private double weightFixCosts = 1.0; +// +// private StateGetter states; +// +// public void setWeightFixCosts(double weightFixCosts) { +// this.weightFixCosts = weightFixCosts; +// } +// +// public void setStates(StateGetter states) { +// this.states = states; +// } +// +// public FindCheaperVehicleAlgo(VehicleFleetManager fleetManager, VehicleRouteUpdater tourStateCalculator, AuxilliaryCostCalculator auxilliaryCostCalculator) { +// super(); +// this.fleetManager = fleetManager; +// this.tourStateCalculator = tourStateCalculator; +// this.auxilliaryCostCalculator = auxilliaryCostCalculator; +// } +// +// +// public VehicleRoute runAndGetVehicleRoute(VehicleRoute vehicleRoute) { +// if(vehicleRoute.getVehicle() instanceof NoVehicle){ +// return vehicleRoute; +// } +// if(vehicleRoute.getTourActivities() == null || vehicleRoute.getVehicle() == null){ +// return vehicleRoute; +// } +//// Collection availableVehicleTypes = fleetManager.getAvailableVehicleTypes(new TypeKey(vehicleRoute.getVehicle().getType(),vehicleRoute.getVehicle().getLocationId())); +// double bestSaving = 0.0; +// Vehicle bestVehicle = null; +// List path = new ArrayList(); +// path.add(vehicleRoute.getStart()); +// path.addAll(vehicleRoute.getTourActivities().getActivities()); +// path.add(vehicleRoute.getEnd()); +// +// for(Vehicle vehicle : fleetManager.getAvailableVehicles(vehicleRoute.getVehicle().getType().getTypeId(), vehicleRoute.getVehicle().getLocationId())){ +//// Vehicle vehicle = fleetManager.getEmptyVehicle(vehicleType); +// if(vehicle.getType().getTypeId().equals(vehicleRoute.getVehicle().getType().getTypeId())){ +// continue; +// } +// if(states.getRouteState(vehicleRoute,StateFactory.LOAD).toDouble() <= vehicle.getCapacity()){ +// double fixCostSaving = vehicleRoute.getVehicle().getType().getVehicleCostParams().fix - vehicle.getType().getVehicleCostParams().fix; +// double departureTime = vehicleRoute.getStart().getEndTime(); +// double newCost = auxilliaryCostCalculator.costOfPath(path, departureTime, vehicleRoute.getDriver(), vehicle); +// double varCostSaving = states.getRouteState(vehicleRoute, StateFactory.COSTS).toDouble() - newCost; +// double totalCostSaving = varCostSaving + weightFixCosts*fixCostSaving; +// if(totalCostSaving > bestSaving){ +// bestSaving = totalCostSaving; +// bestVehicle = vehicle; +// } +// } +// } +// if(bestVehicle != null){ +// try{ +// fleetManager.unlock(vehicleRoute.getVehicle()); +// fleetManager.lock(bestVehicle); +// } +// catch(IllegalStateException e){ +// throw new IllegalStateException(e); +// } +// TourActivities newTour = TourActivities.copyOf(vehicleRoute.getTourActivities()); +// tourStateCalculator.iterate(vehicleRoute); +// return VehicleRoute.newInstance(newTour,vehicleRoute.getDriver(),bestVehicle); +// } +// return vehicleRoute; +// } +// +//} diff --git a/jsprit-core/src/main/java/algorithms/InsertionInitialSolutionFactory.java b/jsprit-core/src/main/java/jsprit/core/algorithm/InsertionInitialSolutionFactory.java similarity index 88% rename from jsprit-core/src/main/java/algorithms/InsertionInitialSolutionFactory.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/InsertionInitialSolutionFactory.java index 39e990ce..fe9d7cfb 100644 --- a/jsprit-core/src/main/java/algorithms/InsertionInitialSolutionFactory.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/InsertionInitialSolutionFactory.java @@ -30,18 +30,21 @@ * * * *********************************************************************** */ -package algorithms; +package jsprit.core.algorithm; import java.util.ArrayList; import java.util.List; +import jsprit.core.algorithm.recreate.InsertionStrategy; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.job.Job; +import jsprit.core.problem.solution.InitialSolutionFactory; +import jsprit.core.problem.solution.SolutionCostCalculator; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; +import jsprit.core.problem.solution.route.VehicleRoute; + import org.apache.log4j.Logger; -import basics.Job; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblemSolution; -import basics.algo.SolutionCostCalculator; -import basics.route.VehicleRoute; diff --git a/jsprit-core/src/main/java/algorithms/NeighborhoodThresholdInitialiser.java b/jsprit-core/src/main/java/jsprit/core/algorithm/NeighborhoodThresholdInitialiser.java similarity index 88% rename from jsprit-core/src/main/java/algorithms/NeighborhoodThresholdInitialiser.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/NeighborhoodThresholdInitialiser.java index a9abcdfe..cf9ac210 100644 --- a/jsprit-core/src/main/java/algorithms/NeighborhoodThresholdInitialiser.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/NeighborhoodThresholdInitialiser.java @@ -14,26 +14,26 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms; +package jsprit.core.algorithm; import java.util.Collection; +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.CrowFlyCosts; +import jsprit.core.util.EuclideanDistanceCalculator; +import jsprit.core.util.Locations; +import jsprit.core.util.NeighborhoodImpl; +import jsprit.core.util.Solutions; + import org.apache.commons.math.stat.descriptive.moment.Mean; import org.apache.commons.math.stat.descriptive.moment.StandardDeviation; import org.apache.log4j.Logger; -import util.CrowFlyCosts; -import util.EuclideanDistanceCalculator; -import util.Locations; -import util.NeighborhoodImpl; -import util.Solutions; -import basics.VehicleRoutingAlgorithm; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblemSolution; -import basics.algo.AlgorithmStartsListener; -import basics.algo.VehicleRoutingAlgorithmFactory; -import basics.route.TourActivity; -import basics.route.VehicleRoute; class NeighborhoodThresholdInitialiser implements AlgorithmStartsListener{ diff --git a/jsprit-core/src/main/java/algorithms/RemoveEmptyVehicles.java b/jsprit-core/src/main/java/jsprit/core/algorithm/RemoveEmptyVehicles.java similarity index 86% rename from jsprit-core/src/main/java/algorithms/RemoveEmptyVehicles.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/RemoveEmptyVehicles.java index 587020bd..7f393dad 100644 --- a/jsprit-core/src/main/java/algorithms/RemoveEmptyVehicles.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/RemoveEmptyVehicles.java @@ -14,22 +14,19 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms; +package jsprit.core.algorithm; import java.util.ArrayList; import java.util.Collection; import java.util.List; -import org.apache.log4j.Logger; +import jsprit.core.algorithm.recreate.listener.InsertionEndsListener; +import jsprit.core.problem.solution.route.VehicleRoute; +import jsprit.core.problem.vehicle.VehicleFleetManager; -import basics.algo.InsertionEndsListener; -import basics.route.VehicleFleetManager; -import basics.route.VehicleRoute; public class RemoveEmptyVehicles implements InsertionEndsListener{ - private static Logger log = Logger.getLogger(RemoveEmptyVehicles.class); - private VehicleFleetManager fleetManager; public RemoveEmptyVehicles(VehicleFleetManager fleetManager) { diff --git a/jsprit-core/src/main/java/algorithms/ResetAndIniFleetManager.java b/jsprit-core/src/main/java/jsprit/core/algorithm/ResetAndIniFleetManager.java similarity index 72% rename from jsprit-core/src/main/java/algorithms/ResetAndIniFleetManager.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/ResetAndIniFleetManager.java index 81c68738..cffed4e1 100644 --- a/jsprit-core/src/main/java/algorithms/ResetAndIniFleetManager.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/ResetAndIniFleetManager.java @@ -14,25 +14,22 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms; +package jsprit.core.algorithm; import java.util.ArrayList; import java.util.Collection; -import org.apache.log4j.Logger; +import jsprit.core.algorithm.recreate.listener.InsertionStartsListener; +import jsprit.core.problem.job.Job; +import jsprit.core.problem.solution.route.VehicleRoute; +import jsprit.core.problem.vehicle.VehicleFleetManager; -import basics.Job; -import basics.algo.InsertionStartsListener; -import basics.route.VehicleFleetManager; -import basics.route.VehicleRoute; -class ResetAndIniFleetManager implements InsertionStartsListener{ +public class ResetAndIniFleetManager implements InsertionStartsListener{ - private static Logger log = Logger.getLogger(ResetAndIniFleetManager.class); - private VehicleFleetManager vehicleFleetManager; - ResetAndIniFleetManager(VehicleFleetManager vehicleFleetManager) { + public ResetAndIniFleetManager(VehicleFleetManager vehicleFleetManager) { super(); this.vehicleFleetManager = vehicleFleetManager; } @@ -42,12 +39,7 @@ class ResetAndIniFleetManager implements InsertionStartsListener{ vehicleFleetManager.unlockAll(); Collection routes = new ArrayList(vehicleRoutes); for(VehicleRoute route : routes){ -// if(route.isEmpty()){ -// vehicleRoutes.remove(route); -// } -// else{ - vehicleFleetManager.lock(route.getVehicle()); -// } + vehicleFleetManager.lock(route.getVehicle()); } } diff --git a/jsprit-core/src/main/java/basics/algo/SearchStrategy.java b/jsprit-core/src/main/java/jsprit/core/algorithm/SearchStrategy.java similarity index 92% rename from jsprit-core/src/main/java/basics/algo/SearchStrategy.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/SearchStrategy.java index c63ecc2e..465d58a5 100644 --- a/jsprit-core/src/main/java/basics/algo/SearchStrategy.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/SearchStrategy.java @@ -14,18 +14,21 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.algo; +package jsprit.core.algorithm; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import jsprit.core.algorithm.acceptor.SolutionAcceptor; +import jsprit.core.algorithm.listener.SearchStrategyModuleListener; +import jsprit.core.algorithm.selector.SolutionSelector; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.solution.SolutionCostCalculator; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; + import org.apache.log4j.Logger; -import algorithms.acceptors.SolutionAcceptor; -import algorithms.selectors.SolutionSelector; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblemSolution; diff --git a/jsprit-core/src/main/java/basics/algo/SearchStrategyManager.java b/jsprit-core/src/main/java/jsprit/core/algorithm/SearchStrategyManager.java similarity index 93% rename from jsprit-core/src/main/java/basics/algo/SearchStrategyManager.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/SearchStrategyManager.java index 853ced35..8b98bb32 100644 --- a/jsprit-core/src/main/java/basics/algo/SearchStrategyManager.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/SearchStrategyManager.java @@ -14,14 +14,17 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.algo; +package jsprit.core.algorithm; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Random; -import util.RandomNumberGeneration; +import jsprit.core.algorithm.listener.SearchStrategyListener; +import jsprit.core.algorithm.listener.SearchStrategyModuleListener; +import jsprit.core.util.RandomNumberGeneration; + public class SearchStrategyManager { diff --git a/jsprit-core/src/main/java/basics/algo/SearchStrategyModule.java b/jsprit-core/src/main/java/jsprit/core/algorithm/SearchStrategyModule.java similarity index 87% rename from jsprit-core/src/main/java/basics/algo/SearchStrategyModule.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/SearchStrategyModule.java index fde99f71..6551b11b 100644 --- a/jsprit-core/src/main/java/basics/algo/SearchStrategyModule.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/SearchStrategyModule.java @@ -14,9 +14,10 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.algo; +package jsprit.core.algorithm; -import basics.VehicleRoutingProblemSolution; +import jsprit.core.algorithm.listener.SearchStrategyModuleListener; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; public interface SearchStrategyModule { diff --git a/jsprit-core/src/main/java/algorithms/VariablePlusFixedSolutionCostCalculatorFactory.java b/jsprit-core/src/main/java/jsprit/core/algorithm/VariablePlusFixedSolutionCostCalculatorFactory.java similarity index 51% rename from jsprit-core/src/main/java/algorithms/VariablePlusFixedSolutionCostCalculatorFactory.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/VariablePlusFixedSolutionCostCalculatorFactory.java index b24a5df9..6d8104e3 100644 --- a/jsprit-core/src/main/java/algorithms/VariablePlusFixedSolutionCostCalculatorFactory.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/VariablePlusFixedSolutionCostCalculatorFactory.java @@ -1,14 +1,16 @@ -package algorithms; +package jsprit.core.algorithm; -import basics.VehicleRoutingProblemSolution; -import basics.algo.SolutionCostCalculator; -import basics.route.VehicleRoute; +import jsprit.core.problem.solution.SolutionCostCalculator; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; +import jsprit.core.problem.solution.route.VehicleRoute; +import jsprit.core.problem.solution.route.state.RouteAndActivityStateGetter; +import jsprit.core.problem.solution.route.state.StateFactory; public class VariablePlusFixedSolutionCostCalculatorFactory { - private StateManager stateManager; + private RouteAndActivityStateGetter stateManager; - public VariablePlusFixedSolutionCostCalculatorFactory(StateManager stateManager) { + public VariablePlusFixedSolutionCostCalculatorFactory(RouteAndActivityStateGetter stateManager) { super(); this.stateManager = stateManager; } diff --git a/jsprit-core/src/main/java/basics/VehicleRoutingAlgorithm.java b/jsprit-core/src/main/java/jsprit/core/algorithm/VehicleRoutingAlgorithm.java similarity index 73% rename from jsprit-core/src/main/java/basics/VehicleRoutingAlgorithm.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/VehicleRoutingAlgorithm.java index 150a68f4..313cb388 100644 --- a/jsprit-core/src/main/java/basics/VehicleRoutingAlgorithm.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/VehicleRoutingAlgorithm.java @@ -14,26 +14,29 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics; +package jsprit.core.algorithm; import java.util.ArrayList; import java.util.Collection; +import jsprit.core.algorithm.SearchStrategy.DiscoveredSolution; +import jsprit.core.algorithm.acceptor.SolutionAcceptor; +import jsprit.core.algorithm.listener.AlgorithmEndsListener; +import jsprit.core.algorithm.listener.AlgorithmStartsListener; +import jsprit.core.algorithm.listener.IterationEndsListener; +import jsprit.core.algorithm.listener.IterationStartsListener; +import jsprit.core.algorithm.listener.SearchStrategyListener; +import jsprit.core.algorithm.listener.SearchStrategyModuleListener; +import jsprit.core.algorithm.listener.StrategySelectedListener; +import jsprit.core.algorithm.listener.VehicleRoutingAlgorithmListener; +import jsprit.core.algorithm.listener.VehicleRoutingAlgorithmListeners; +import jsprit.core.algorithm.termination.IterationWithoutImprovementTermination; +import jsprit.core.algorithm.termination.PrematureAlgorithmTermination; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; + import org.apache.log4j.Logger; -import util.Counter; -import algorithms.acceptors.SolutionAcceptor; -import basics.algo.AlgorithmEndsListener; -import basics.algo.AlgorithmStartsListener; -import basics.algo.IterationEndsListener; -import basics.algo.IterationStartsListener; -import basics.algo.IterationWithoutImprovementBreaker; -import basics.algo.PrematureAlgorithmBreaker; -import basics.algo.SearchStrategy; -import basics.algo.SearchStrategy.DiscoveredSolution; -import basics.algo.SearchStrategyManager; -import basics.algo.VehicleRoutingAlgorithmListener; -import basics.algo.VehicleRoutingAlgorithmListeners; /** * Algorithm that solves a {@link VehicleRoutingProblem}. @@ -43,7 +46,36 @@ import basics.algo.VehicleRoutingAlgorithmListeners; */ public class VehicleRoutingAlgorithm { - + private static class Counter { + private final String name; + private long counter = 0; + private long nextCounter = 1; + private static final Logger log = Logger.getLogger(Counter.class); + + public Counter(final String name) { + this.name = name; + } + + public void incCounter() { + long i = counter++; + long n = nextCounter; + if (i >= n) { + if (nextCounter==n) { + nextCounter=n*2; + log.info(this.name + n); + } + } + } + + public void print() { + log.info(this.name + counter); + } + + public void reset() { + counter=0; + nextCounter=1; + } + } public static final int NOBREAK = Integer.MAX_VALUE; @@ -61,7 +93,7 @@ public class VehicleRoutingAlgorithm { private Collection initialSolutions; - private PrematureAlgorithmBreaker prematureAlgorithmBreaker = new PrematureAlgorithmBreaker() { + private PrematureAlgorithmTermination prematureAlgorithmTermination = new PrematureAlgorithmTermination() { @Override public boolean isPrematureBreak(DiscoveredSolution discoveredSolution) { @@ -100,15 +132,16 @@ public class VehicleRoutingAlgorithm { * Improvement is what {@link SolutionAcceptor} understands about improvement. Or to put it in other words, the algo breaks prematurely after * the assigned number of iterations without solution-acceptance. * - * + * @deprecated use setPrematureAlgorithmTermination(new IterationWithoutImprovementTermination(int nuIterationsWithoutImprovement)); * @param nuIterationsWithoutImprovement */ + @Deprecated public void setPrematureBreak(int nuIterationsWithoutImprovement){ - prematureAlgorithmBreaker = new IterationWithoutImprovementBreaker(nuIterationsWithoutImprovement); + prematureAlgorithmTermination = new IterationWithoutImprovementTermination(nuIterationsWithoutImprovement); } - public void setPrematureAlgorithmBreaker(PrematureAlgorithmBreaker prematureAlgorithmBreaker){ - this.prematureAlgorithmBreaker = prematureAlgorithmBreaker; + public void setPrematureAlgorithmTermination(PrematureAlgorithmTermination prematureAlgorithmTermination){ + this.prematureAlgorithmTermination = prematureAlgorithmTermination; } /** @@ -146,7 +179,7 @@ public class VehicleRoutingAlgorithm { SearchStrategy strategy = searchStrategyManager.getRandomStrategy(); DiscoveredSolution discoveredSolution = strategy.run(problem, solutions); selectedStrategy(strategy.getName(),problem, solutions); - if(prematureAlgorithmBreaker.isPrematureBreak(discoveredSolution)){ + if(prematureAlgorithmTermination.isPrematureBreak(discoveredSolution)){ logger.info("premature break at iteration "+ (i+1)); nuOfIterationsThisAlgoIsRunning = (i+1); break; @@ -193,6 +226,12 @@ public class VehicleRoutingAlgorithm { public VehicleRoutingAlgorithmListeners getAlgorithmListeners() { return algoListeners; } + + public void addListener(VehicleRoutingAlgorithmListener l){ + algoListeners.addListener(l); + if(l instanceof SearchStrategyListener) searchStrategyManager.addSearchStrategyListener((SearchStrategyListener) l); + if(l instanceof SearchStrategyModuleListener) searchStrategyManager.addSearchStrategyModuleListener((SearchStrategyModuleListener) l); + } private void iterationEnds(int i, VehicleRoutingProblem problem, Collection solutions) { algoListeners.iterationEnds(i,problem, solutions); diff --git a/jsprit-core/src/main/java/basics/algo/VehicleRoutingAlgorithmFactory.java b/jsprit-core/src/main/java/jsprit/core/algorithm/VehicleRoutingAlgorithmFactory.java similarity index 91% rename from jsprit-core/src/main/java/basics/algo/VehicleRoutingAlgorithmFactory.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/VehicleRoutingAlgorithmFactory.java index e0b9be1c..40749bdb 100644 --- a/jsprit-core/src/main/java/basics/algo/VehicleRoutingAlgorithmFactory.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/VehicleRoutingAlgorithmFactory.java @@ -14,10 +14,9 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.algo; +package jsprit.core.algorithm; -import basics.VehicleRoutingAlgorithm; -import basics.VehicleRoutingProblem; +import jsprit.core.problem.VehicleRoutingProblem; public interface VehicleRoutingAlgorithmFactory { diff --git a/jsprit-core/src/main/java/algorithms/acceptors/AcceptNewRemoveFirst.java b/jsprit-core/src/main/java/jsprit/core/algorithm/acceptor/AcceptNewRemoveFirst.java similarity index 94% rename from jsprit-core/src/main/java/algorithms/acceptors/AcceptNewRemoveFirst.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/acceptor/AcceptNewRemoveFirst.java index abaa1e00..8da92a94 100644 --- a/jsprit-core/src/main/java/algorithms/acceptors/AcceptNewRemoveFirst.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/acceptor/AcceptNewRemoveFirst.java @@ -14,11 +14,12 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms.acceptors; +package jsprit.core.algorithm.acceptor; import java.util.Collection; -import basics.VehicleRoutingProblemSolution; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; + public class AcceptNewRemoveFirst implements SolutionAcceptor{ diff --git a/jsprit-core/src/main/java/jsprit/core/algorithm/acceptor/ExperimentalSchrimpfAcceptance.java b/jsprit-core/src/main/java/jsprit/core/algorithm/acceptor/ExperimentalSchrimpfAcceptance.java new file mode 100644 index 00000000..ab81bbd3 --- /dev/null +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/acceptor/ExperimentalSchrimpfAcceptance.java @@ -0,0 +1,158 @@ +/******************************************************************************* + * 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 . + ******************************************************************************/ +package jsprit.core.algorithm.acceptor; + +import java.net.URL; +import java.util.Collection; + +import jsprit.core.algorithm.VehicleRoutingAlgorithm; +import jsprit.core.algorithm.io.AlgorithmConfig; +import jsprit.core.algorithm.io.AlgorithmConfigXmlReader; +import jsprit.core.algorithm.io.VehicleRoutingAlgorithms; +import jsprit.core.algorithm.listener.AlgorithmStartsListener; +import jsprit.core.algorithm.listener.IterationEndsListener; +import jsprit.core.algorithm.listener.IterationStartsListener; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; +import jsprit.core.util.Resource; +import jsprit.core.util.Solutions; + +import org.apache.commons.math.stat.descriptive.moment.StandardDeviation; +import org.apache.log4j.Logger; + + + + +public class ExperimentalSchrimpfAcceptance implements SolutionAcceptor, IterationStartsListener, AlgorithmStartsListener{ + + private static Logger logger = Logger.getLogger(ExperimentalSchrimpfAcceptance.class); + + private final double alpha; + + private int nOfTotalIterations = 1000; + + private int currentIteration = 0; + + private double initialThreshold = 0.0; + + private final int nOfRandomWalks; + + private final int solutionMemory; + + + public ExperimentalSchrimpfAcceptance(int solutionMemory, double alpha, int nOfWarmupIterations) { + super(); + this.alpha = alpha; + this.nOfRandomWalks = nOfWarmupIterations; + this.solutionMemory = solutionMemory; + logger.info("initialise " + this); + } + + + + @Override + public boolean acceptSolution(Collection solutions, VehicleRoutingProblemSolution newSolution) { + boolean solutionAccepted = false; + if (solutions.size() < solutionMemory) { + solutions.add(newSolution); + solutionAccepted = true; + } else { + VehicleRoutingProblemSolution worst = null; + double threshold = getThreshold(currentIteration); + for(VehicleRoutingProblemSolution solutionInMemory : solutions){ + if(worst == null) worst = solutionInMemory; + else if(solutionInMemory.getCost() > worst.getCost()) worst = solutionInMemory; + } + if(newSolution.getRoutes().size() < worst.getRoutes().size()){ + solutions.remove(worst); + solutions.add(newSolution); + solutionAccepted = true; + } + else if(newSolution.getRoutes().size() == worst.getRoutes().size() && newSolution.getCost() < worst.getCost() + threshold){ + solutions.remove(worst); + solutions.add(newSolution); + solutionAccepted = true; + } + } + return solutionAccepted; + } + + @Override + public String toString() { + return "[name=schrimpfAcceptanceFunction][alpha="+alpha+"][warmup=" + nOfRandomWalks + "]"; + } + + private double getThreshold(int iteration) { + double scheduleVariable = (double) iteration / (double) nOfTotalIterations; +// logger.debug("iter="+iteration+" totalIter="+nOfTotalIterations+" scheduling="+scheduleVariable); + double currentThreshold = initialThreshold * Math.exp(-Math.log(2) * scheduleVariable / alpha); + return currentThreshold; + } + + + @Override + public void informAlgorithmStarts(VehicleRoutingProblem problem, VehicleRoutingAlgorithm algorithm, Collection solutions) { + reset(); + logger.info("---------------------------------------------------------------------"); + logger.info("prepare schrimpfAcceptanceFunction, i.e. determine initial threshold"); + logger.info("start random-walk (see randomWalk.xml)"); + double now = System.currentTimeMillis(); + this.nOfTotalIterations = algorithm.getNuOfIterations(); + + /* + * randomWalk to determine standardDev + */ + final double[] results = new double[nOfRandomWalks]; + + URL resource = Resource.getAsURL("randomWalk.xml"); + AlgorithmConfig algorithmConfig = new AlgorithmConfig(); + new AlgorithmConfigXmlReader(algorithmConfig).read(resource); + VehicleRoutingAlgorithm vra = VehicleRoutingAlgorithms.createAlgorithm(problem, algorithmConfig); + vra.setNuOfIterations(nOfRandomWalks); + vra.getAlgorithmListeners().addListener(new IterationEndsListener() { + + @Override + public void informIterationEnds(int iteration, VehicleRoutingProblem problem, Collection solutions) { + double result = Solutions.getBest(solutions).getCost(); +// logger.info("result="+result); + results[iteration-1] = result; + } + + }); + vra.searchSolutions(); + + StandardDeviation dev = new StandardDeviation(); + double standardDeviation = dev.evaluate(results); + initialThreshold = standardDeviation / 2; + + logger.info("warmup done"); + logger.info("total time: " + ((System.currentTimeMillis()-now)/1000.0) + "s"); + logger.info("initial threshold: " + initialThreshold); + logger.info("---------------------------------------------------------------------"); + + } + + private void reset() { + currentIteration = 0; + } + + @Override + public void informIterationStarts(int i, VehicleRoutingProblem problem, Collection solutions) { + currentIteration = i; + } + +} diff --git a/jsprit-core/src/main/java/algorithms/acceptors/AcceptNewIfBetterThanWorst.java b/jsprit-core/src/main/java/jsprit/core/algorithm/acceptor/GreedyAcceptance.java similarity index 83% rename from jsprit-core/src/main/java/algorithms/acceptors/AcceptNewIfBetterThanWorst.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/acceptor/GreedyAcceptance.java index 6ed85659..1f896697 100644 --- a/jsprit-core/src/main/java/algorithms/acceptors/AcceptNewIfBetterThanWorst.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/acceptor/GreedyAcceptance.java @@ -14,18 +14,19 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms.acceptors; +package jsprit.core.algorithm.acceptor; import java.util.Collection; -import basics.VehicleRoutingProblemSolution; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; -public class AcceptNewIfBetterThanWorst implements SolutionAcceptor{ + +public class GreedyAcceptance implements SolutionAcceptor{ private final int solutionMemory; - public AcceptNewIfBetterThanWorst(int solutionMemory){ + public GreedyAcceptance(int solutionMemory){ this.solutionMemory = solutionMemory; } @@ -47,6 +48,12 @@ public class AcceptNewIfBetterThanWorst implements SolutionAcceptor{ if (worstSolution == null) worstSolution = s; else if (s.getCost() > worstSolution.getCost()) worstSolution = s; } +// if(newSolution.getRoutes().size() < worstSolution.getRoutes().size()){ +// solutions.remove(worstSolution); +// solutions.add(newSolution); +// solutionAccepted = true; +// } +// else if(newSolution.getCost() < worstSolution.getCost()){ solutions.remove(worstSolution); solutions.add(newSolution); diff --git a/jsprit-core/src/main/java/jsprit/core/algorithm/acceptor/GreedyAcceptance_minVehFirst.java b/jsprit-core/src/main/java/jsprit/core/algorithm/acceptor/GreedyAcceptance_minVehFirst.java new file mode 100644 index 00000000..ae5b0976 --- /dev/null +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/acceptor/GreedyAcceptance_minVehFirst.java @@ -0,0 +1,73 @@ +/******************************************************************************* + * 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 . + ******************************************************************************/ +package jsprit.core.algorithm.acceptor; + +import java.util.Collection; + +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; + + + +public class GreedyAcceptance_minVehFirst implements SolutionAcceptor{ + + private final int solutionMemory; + + public GreedyAcceptance_minVehFirst(int solutionMemory){ + this.solutionMemory = solutionMemory; + } + + /** + * Accepts every solution if solution memory allows. If memory occupied, than accepts new solution only if better than the worst in memory. + * Consequently, the worst solution is removed from solutions, and the new solution added. + * + *

Note that this modifies Collection solutions. + */ + @Override + public boolean acceptSolution(Collection solutions, VehicleRoutingProblemSolution newSolution) { + boolean solutionAccepted = false; + if (solutions.size() < solutionMemory) { + solutions.add(newSolution); + solutionAccepted = true; + } else { + VehicleRoutingProblemSolution worstSolution = null; + for (VehicleRoutingProblemSolution s : solutions) { + if (worstSolution == null) worstSolution = s; + else if (s.getRoutes().size() > worstSolution.getRoutes().size()) worstSolution = s; + } + if(newSolution.getRoutes().size() < worstSolution.getRoutes().size()){ + solutions.remove(worstSolution); + solutions.add(newSolution); + solutionAccepted = true; + } + else if(newSolution.getRoutes().size() == worstSolution.getRoutes().size() && newSolution.getCost() < worstSolution.getCost()){ + solutions.remove(worstSolution); + solutions.add(newSolution); + solutionAccepted = true; + } + } + return solutionAccepted; + } + + @Override + public String toString() { + return "[name=greedyAcceptance_minVehFirst]"; + } + + + + +} diff --git a/jsprit-core/src/main/java/algorithms/acceptors/SchrimpfAcceptance.java b/jsprit-core/src/main/java/jsprit/core/algorithm/acceptor/SchrimpfAcceptance.java similarity index 88% rename from jsprit-core/src/main/java/algorithms/acceptors/SchrimpfAcceptance.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/acceptor/SchrimpfAcceptance.java index 544b8872..9b181c8a 100644 --- a/jsprit-core/src/main/java/algorithms/acceptors/SchrimpfAcceptance.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/acceptor/SchrimpfAcceptance.java @@ -14,25 +14,26 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms.acceptors; +package jsprit.core.algorithm.acceptor; import java.net.URL; import java.util.Collection; +import jsprit.core.algorithm.VehicleRoutingAlgorithm; +import jsprit.core.algorithm.io.AlgorithmConfig; +import jsprit.core.algorithm.io.AlgorithmConfigXmlReader; +import jsprit.core.algorithm.io.VehicleRoutingAlgorithms; +import jsprit.core.algorithm.listener.AlgorithmStartsListener; +import jsprit.core.algorithm.listener.IterationEndsListener; +import jsprit.core.algorithm.listener.IterationStartsListener; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; +import jsprit.core.util.Resource; +import jsprit.core.util.Solutions; + import org.apache.commons.math.stat.descriptive.moment.StandardDeviation; import org.apache.log4j.Logger; -import util.Resource; -import util.Solutions; -import algorithms.VehicleRoutingAlgorithms; -import basics.VehicleRoutingAlgorithm; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblemSolution; -import basics.algo.AlgorithmStartsListener; -import basics.algo.IterationEndsListener; -import basics.algo.IterationStartsListener; -import basics.io.AlgorithmConfig; -import basics.io.AlgorithmConfigXmlReader; diff --git a/jsprit-core/src/main/java/algorithms/acceptors/SolutionAcceptor.java b/jsprit-core/src/main/java/jsprit/core/algorithm/acceptor/SolutionAcceptor.java similarity index 93% rename from jsprit-core/src/main/java/algorithms/acceptors/SolutionAcceptor.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/acceptor/SolutionAcceptor.java index f0debbeb..23cd70d1 100644 --- a/jsprit-core/src/main/java/algorithms/acceptors/SolutionAcceptor.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/acceptor/SolutionAcceptor.java @@ -14,11 +14,12 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms.acceptors; +package jsprit.core.algorithm.acceptor; import java.util.Collection; -import basics.VehicleRoutingProblemSolution; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; + /** * Acceptor that decides whether the newSolution is accepted or not. diff --git a/jsprit-core/src/main/java/algorithms/GreedySchrimpfFactory.java b/jsprit-core/src/main/java/jsprit/core/algorithm/box/GreedySchrimpfFactory.java similarity index 86% rename from jsprit-core/src/main/java/algorithms/GreedySchrimpfFactory.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/box/GreedySchrimpfFactory.java index c8faf88f..a757b9a5 100644 --- a/jsprit-core/src/main/java/algorithms/GreedySchrimpfFactory.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/box/GreedySchrimpfFactory.java @@ -14,15 +14,17 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms; +package jsprit.core.algorithm.box; import java.net.URL; -import util.Resource; -import basics.VehicleRoutingAlgorithm; -import basics.VehicleRoutingProblem; -import basics.io.AlgorithmConfig; -import basics.io.AlgorithmConfigXmlReader; +import jsprit.core.algorithm.VehicleRoutingAlgorithm; +import jsprit.core.algorithm.io.AlgorithmConfig; +import jsprit.core.algorithm.io.AlgorithmConfigXmlReader; +import jsprit.core.algorithm.io.VehicleRoutingAlgorithms; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.util.Resource; + /** diff --git a/jsprit-core/src/main/java/algorithms/SchrimpfFactory.java b/jsprit-core/src/main/java/jsprit/core/algorithm/box/SchrimpfFactory.java similarity index 86% rename from jsprit-core/src/main/java/algorithms/SchrimpfFactory.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/box/SchrimpfFactory.java index 0d54ee20..efb1655a 100644 --- a/jsprit-core/src/main/java/algorithms/SchrimpfFactory.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/box/SchrimpfFactory.java @@ -14,15 +14,17 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms; +package jsprit.core.algorithm.box; import java.net.URL; -import util.Resource; -import basics.VehicleRoutingAlgorithm; -import basics.VehicleRoutingProblem; -import basics.io.AlgorithmConfig; -import basics.io.AlgorithmConfigXmlReader; +import jsprit.core.algorithm.VehicleRoutingAlgorithm; +import jsprit.core.algorithm.io.AlgorithmConfig; +import jsprit.core.algorithm.io.AlgorithmConfigXmlReader; +import jsprit.core.algorithm.io.VehicleRoutingAlgorithms; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.util.Resource; + /** diff --git a/jsprit-core/src/main/java/basics/io/AlgorithmConfig.java b/jsprit-core/src/main/java/jsprit/core/algorithm/io/AlgorithmConfig.java similarity index 97% rename from jsprit-core/src/main/java/basics/io/AlgorithmConfig.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/io/AlgorithmConfig.java index 6aaefc90..1fa3f1c1 100644 --- a/jsprit-core/src/main/java/basics/io/AlgorithmConfig.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/io/AlgorithmConfig.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.io; +package jsprit.core.algorithm.io; import org.apache.commons.configuration.XMLConfiguration; diff --git a/jsprit-core/src/main/java/basics/io/AlgorithmConfigXmlReader.java b/jsprit-core/src/main/java/jsprit/core/algorithm/io/AlgorithmConfigXmlReader.java similarity index 97% rename from jsprit-core/src/main/java/basics/io/AlgorithmConfigXmlReader.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/io/AlgorithmConfigXmlReader.java index 13d2709e..c3ae89be 100644 --- a/jsprit-core/src/main/java/basics/io/AlgorithmConfigXmlReader.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/io/AlgorithmConfigXmlReader.java @@ -14,19 +14,20 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.io; +package jsprit.core.algorithm.io; import java.io.IOException; import java.io.InputStream; import java.net.URL; +import jsprit.core.util.Resource; + import org.apache.commons.configuration.ConfigurationException; import org.apache.log4j.Logger; import org.xml.sax.EntityResolver; import org.xml.sax.InputSource; import org.xml.sax.SAXException; -import util.Resource; public class AlgorithmConfigXmlReader { diff --git a/jsprit-core/src/main/java/algorithms/InsertionFactory.java b/jsprit-core/src/main/java/jsprit/core/algorithm/io/InsertionFactory.java similarity index 76% rename from jsprit-core/src/main/java/algorithms/InsertionFactory.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/io/InsertionFactory.java index 64ec876e..6f23a2a9 100644 --- a/jsprit-core/src/main/java/algorithms/InsertionFactory.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/io/InsertionFactory.java @@ -14,19 +14,24 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms; +package jsprit.core.algorithm.io; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutorService; +import jsprit.core.algorithm.listener.VehicleRoutingAlgorithmListeners.PrioritizedVRAListener; +import jsprit.core.algorithm.recreate.BestInsertionBuilder; +import jsprit.core.algorithm.recreate.InsertionStrategy; +import jsprit.core.algorithm.recreate.listener.InsertionListener; +import jsprit.core.algorithm.state.StateManager; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.constraint.ConstraintManager; +import jsprit.core.problem.vehicle.VehicleFleetManager; + import org.apache.commons.configuration.HierarchicalConfiguration; import org.apache.log4j.Logger; -import basics.VehicleRoutingProblem; -import basics.algo.InsertionListener; -import basics.algo.VehicleRoutingAlgorithmListeners.PrioritizedVRAListener; -import basics.route.VehicleFleetManager; class InsertionFactory { @@ -44,16 +49,17 @@ class InsertionFactory { List insertionListeners = new ArrayList(); List algoListeners = new ArrayList(); - CalculatorBuilder calcBuilder = new CalculatorBuilder(insertionListeners, algorithmListeners); - calcBuilder.setStates(routeStates); - calcBuilder.setVehicleRoutingProblem(vrp); - calcBuilder.setVehicleFleetManager(vehicleFleetManager); - calcBuilder.setConstraintManager(constraintManager); + BestInsertionBuilder iBuilder = new BestInsertionBuilder(vrp, vehicleFleetManager, routeStates, constraintManager); + + if(executorService != null){ + iBuilder.setConcurrentMode(executorService, nuOfThreads); + } if(config.containsKey("level")){ String level = config.getString("level"); if(level.equals("local")){ - calcBuilder.setLocalLevel(); + iBuilder.setLocalLevel(); +// calcBuilder.setLocalLevel(); } else if(level.equals("route")){ int forwardLooking = 0; @@ -64,11 +70,12 @@ class InsertionFactory { else log.warn("parameter route[@forwardLooking] is missing. by default it is 0 which equals to local level"); if(mem != null) memory = Integer.parseInt(mem); else log.warn("parameter route[@memory] is missing. by default it is 1"); - calcBuilder.setRouteLevel(forwardLooking, memory); + iBuilder.setRouteLevel(forwardLooking, memory); +// calcBuilder.setRouteLevel(forwardLooking, memory); } else throw new IllegalStateException("level " + level + " is not known. currently it only knows \"local\" or \"route\""); } - else calcBuilder.setLocalLevel(); + else iBuilder.setLocalLevel(); if(config.containsKey("considerFixedCosts") || config.containsKey("considerFixedCost")){ String val = config.getString("considerFixedCosts"); @@ -79,21 +86,19 @@ class InsertionFactory { if(weight == null) weight = config.getString("considerFixedCost[@weight]"); if(weight != null) fixedCostWeight = Double.parseDouble(weight); else log.warn("parameter considerFixedCosts[@weight] is missing. by default, it is 0.5."); - calcBuilder.considerFixedCosts(fixedCostWeight); + iBuilder.considerFixedCosts(fixedCostWeight); } } String timeSliceString = config.getString("experimental[@timeSlice]"); String neighbors = config.getString("experimental[@neighboringSlices]"); if(timeSliceString != null && neighbors != null){ - calcBuilder.experimentalTimeScheduler(Double.parseDouble(timeSliceString),Integer.parseInt(neighbors)); + iBuilder.experimentalTimeScheduler(Double.parseDouble(timeSliceString),Integer.parseInt(neighbors)); } - JobInsertionCostsCalculator jic = calcBuilder.build(); - - if(insertionName.equals("bestInsertion")){ - insertionStrategy = new BestInsertion(jic); + insertionStrategy = iBuilder.build(); } + else throw new IllegalStateException("currently only 'bestInsertion' is supported"); for(InsertionListener l : insertionListeners) insertionStrategy.addListener(l); algorithmListeners.addAll(algoListeners); diff --git a/jsprit-core/src/main/java/algorithms/VehicleRoutingAlgorithms.java b/jsprit-core/src/main/java/jsprit/core/algorithm/io/VehicleRoutingAlgorithms.java similarity index 74% rename from jsprit-core/src/main/java/algorithms/VehicleRoutingAlgorithms.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/io/VehicleRoutingAlgorithms.java index 8d3ae5ed..faa84ee3 100644 --- a/jsprit-core/src/main/java/algorithms/VehicleRoutingAlgorithms.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/io/VehicleRoutingAlgorithms.java @@ -14,9 +14,10 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms; +package jsprit.core.algorithm.io; +import java.lang.Thread.UncaughtExceptionHandler; import java.net.URL; import java.util.ArrayList; import java.util.Collection; @@ -26,48 +27,68 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import jsprit.core.algorithm.InsertionInitialSolutionFactory; +import jsprit.core.algorithm.RemoveEmptyVehicles; +import jsprit.core.algorithm.ResetAndIniFleetManager; +import jsprit.core.algorithm.SearchStrategy; +import jsprit.core.algorithm.SearchStrategy.DiscoveredSolution; +import jsprit.core.algorithm.SearchStrategyManager; +import jsprit.core.algorithm.SearchStrategyModule; +import jsprit.core.algorithm.VehicleRoutingAlgorithm; +import jsprit.core.algorithm.acceptor.AcceptNewRemoveFirst; +import jsprit.core.algorithm.acceptor.ExperimentalSchrimpfAcceptance; +import jsprit.core.algorithm.acceptor.GreedyAcceptance; +import jsprit.core.algorithm.acceptor.GreedyAcceptance_minVehFirst; +import jsprit.core.algorithm.acceptor.SchrimpfAcceptance; +import jsprit.core.algorithm.acceptor.SolutionAcceptor; +import jsprit.core.algorithm.io.VehicleRoutingAlgorithms.TypedMap.AbstractKey; +import jsprit.core.algorithm.io.VehicleRoutingAlgorithms.TypedMap.AcceptorKey; +import jsprit.core.algorithm.io.VehicleRoutingAlgorithms.TypedMap.InsertionStrategyKey; +import jsprit.core.algorithm.io.VehicleRoutingAlgorithms.TypedMap.RuinStrategyKey; +import jsprit.core.algorithm.io.VehicleRoutingAlgorithms.TypedMap.SelectorKey; +import jsprit.core.algorithm.io.VehicleRoutingAlgorithms.TypedMap.StrategyModuleKey; +import jsprit.core.algorithm.listener.AlgorithmEndsListener; +import jsprit.core.algorithm.listener.AlgorithmStartsListener; +import jsprit.core.algorithm.listener.VehicleRoutingAlgorithmListeners.PrioritizedVRAListener; +import jsprit.core.algorithm.listener.VehicleRoutingAlgorithmListeners.Priority; +import jsprit.core.algorithm.module.RuinAndRecreateModule; +import jsprit.core.algorithm.recreate.InsertionStrategy; +import jsprit.core.algorithm.recreate.VehicleSwitched; +import jsprit.core.algorithm.recreate.listener.InsertionListener; +import jsprit.core.algorithm.ruin.RadialRuinStrategyFactory; +import jsprit.core.algorithm.ruin.RandomRuinStrategyFactory; +import jsprit.core.algorithm.ruin.RuinStrategy; +import jsprit.core.algorithm.ruin.distance.AvgServiceAndShipmentDistance; +import jsprit.core.algorithm.ruin.distance.JobDistance; +import jsprit.core.algorithm.selector.SelectBest; +import jsprit.core.algorithm.selector.SelectRandomly; +import jsprit.core.algorithm.selector.SolutionSelector; +import jsprit.core.algorithm.state.StateManager; +import jsprit.core.algorithm.state.UpdateActivityTimes; +import jsprit.core.algorithm.state.UpdateVariableCosts; +import jsprit.core.algorithm.termination.IterationWithoutImprovementTermination; +import jsprit.core.algorithm.termination.PrematureAlgorithmTermination; +import jsprit.core.algorithm.termination.TimeTermination; +import jsprit.core.algorithm.termination.VariationCoefficientTermination; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.VehicleRoutingProblem.FleetSize; +import jsprit.core.problem.constraint.ConstraintManager; +import jsprit.core.problem.solution.SolutionCostCalculator; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; +import jsprit.core.problem.solution.route.VehicleRoute; +import jsprit.core.problem.solution.route.state.StateFactory; +import jsprit.core.problem.vehicle.FiniteFleetManagerFactory; +import jsprit.core.problem.vehicle.InfiniteFleetManagerFactory; +import jsprit.core.problem.vehicle.Vehicle; +import jsprit.core.problem.vehicle.VehicleFleetManager; +import jsprit.core.util.SolutionVerifier; import org.apache.commons.configuration.HierarchicalConfiguration; import org.apache.commons.configuration.XMLConfiguration; import org.apache.log4j.Logger; -import algorithms.VehicleRoutingAlgorithms.TypedMap.AbstractKey; -import algorithms.VehicleRoutingAlgorithms.TypedMap.AcceptorKey; -import algorithms.VehicleRoutingAlgorithms.TypedMap.InsertionStrategyKey; -import algorithms.VehicleRoutingAlgorithms.TypedMap.RuinStrategyKey; -import algorithms.VehicleRoutingAlgorithms.TypedMap.SelectorKey; -import algorithms.VehicleRoutingAlgorithms.TypedMap.StrategyModuleKey; -import algorithms.acceptors.AcceptNewIfBetterThanWorst; -import algorithms.acceptors.AcceptNewRemoveFirst; -import algorithms.acceptors.SchrimpfAcceptance; -import algorithms.acceptors.SolutionAcceptor; -import algorithms.selectors.SelectBest; -import algorithms.selectors.SelectRandomly; -import algorithms.selectors.SolutionSelector; -import basics.VehicleRoutingAlgorithm; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblem.FleetSize; -import basics.VehicleRoutingProblemSolution; -import basics.algo.AlgorithmStartsListener; -import basics.algo.InsertionListener; -import basics.algo.IterationWithoutImprovementBreaker; -import basics.algo.PrematureAlgorithmBreaker; -import basics.algo.SearchStrategy; -import basics.algo.SearchStrategy.DiscoveredSolution; -import basics.algo.SearchStrategyManager; -import basics.algo.SearchStrategyModule; -import basics.algo.SolutionCostCalculator; -import basics.algo.TimeBreaker; -import basics.algo.VariationCoefficientBreaker; -import basics.algo.VehicleRoutingAlgorithmListeners.PrioritizedVRAListener; -import basics.algo.VehicleRoutingAlgorithmListeners.Priority; -import basics.io.AlgorithmConfig; -import basics.io.AlgorithmConfigXmlReader; -import basics.route.FiniteFleetManagerFactory; -import basics.route.InfiniteFleetManagerFactory; -import basics.route.Vehicle; -import basics.route.VehicleFleetManager; -import basics.route.VehicleRoute; @@ -371,12 +392,12 @@ public class VehicleRoutingAlgorithms { * @return {@link VehicleRoutingAlgorithm} */ public static VehicleRoutingAlgorithm createAlgorithm(final VehicleRoutingProblem vrp, final AlgorithmConfig algorithmConfig){ - return createAlgo(vrp,algorithmConfig.getXMLConfiguration(),null,0); + return createAlgo(vrp,algorithmConfig.getXMLConfiguration(),0); } @Deprecated public static VehicleRoutingAlgorithm readAndCreateAlgorithm(final VehicleRoutingProblem vrp, final XMLConfiguration config){ - return createAlgo(vrp,config,null,0); + return createAlgo(vrp,config,0); } /** @@ -390,7 +411,7 @@ public class VehicleRoutingAlgorithms { AlgorithmConfig algorithmConfig = new AlgorithmConfig(); AlgorithmConfigXmlReader xmlReader = new AlgorithmConfigXmlReader(algorithmConfig); xmlReader.read(configURL); - return createAlgo(vrp,algorithmConfig.getXMLConfiguration(),null,0); + return createAlgo(vrp,algorithmConfig.getXMLConfiguration(),0); } /** @@ -404,26 +425,18 @@ public class VehicleRoutingAlgorithms { AlgorithmConfig algorithmConfig = new AlgorithmConfig(); AlgorithmConfigXmlReader xmlReader = new AlgorithmConfigXmlReader(algorithmConfig); xmlReader.read(configFileName); - return createAlgo(vrp,algorithmConfig.getXMLConfiguration(),null, 0); + return createAlgo(vrp,algorithmConfig.getXMLConfiguration(),0); } - /** - * Read and creates {@link VehicleRoutingAlgorithm} from config-file. - * - * @param vrp - * @param configFileName - * @param nuOfThreads TODO - * @param {@link ExecutorService} - * @return {@link VehicleRoutingAlgorithm} - */ - private static VehicleRoutingAlgorithm readAndCreateConcurrentAlgorithm(final VehicleRoutingProblem vrp, final String configFileName, final ExecutorService executorService, int nuOfThreads){ + public static VehicleRoutingAlgorithm readAndCreateAlgorithm(VehicleRoutingProblem vrp, int nThreads, String configFileName) { AlgorithmConfig algorithmConfig = new AlgorithmConfig(); AlgorithmConfigXmlReader xmlReader = new AlgorithmConfigXmlReader(algorithmConfig); xmlReader.read(configFileName); - return createAlgo(vrp,algorithmConfig.getXMLConfiguration(), executorService, nuOfThreads); + return createAlgo(vrp,algorithmConfig.getXMLConfiguration(),nThreads); } - private static VehicleRoutingAlgorithm createAlgo(final VehicleRoutingProblem vrp, XMLConfiguration config, ExecutorService executorService, int nuOfThreads){ + private static VehicleRoutingAlgorithm createAlgo(final VehicleRoutingProblem vrp, XMLConfiguration config, int nuOfThreads){ + // map to store constructed modules TypedMap definedClasses = new TypedMap(); @@ -434,11 +447,46 @@ public class VehicleRoutingAlgorithms { // insertion listeners List insertionListeners = new ArrayList(); + //threading + final ExecutorService executorService; + if(nuOfThreads > 0){ + log.info("setup executor-service with " + nuOfThreads + " threads"); + executorService = Executors.newFixedThreadPool(nuOfThreads); + algorithmListeners.add(new PrioritizedVRAListener(Priority.LOW, new AlgorithmEndsListener() { + + @Override + public void informAlgorithmEnds(VehicleRoutingProblem problem,Collection solutions) { + log.info("shutdown executor-service"); + executorService.shutdown(); + } + })); + Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() { + + @Override + public void uncaughtException(Thread arg0, Throwable arg1) { + System.err.println(arg1.toString()); + System.exit(0); + } + }); + Runtime.getRuntime().addShutdownHook(new Thread(){ + public void run(){ + if(!executorService.isShutdown()){ + System.err.println("shutdowHook shuts down executorService"); + executorService.shutdown(); + } + } + }); + } + else executorService = null; + + //create fleetmanager final VehicleFleetManager vehicleFleetManager = createFleetManager(vrp); //create state-manager - final StateManager stateManager = new StateManager(); + final StateManager stateManager = new StateManager(vrp); + stateManager.updateLoadStates(); + stateManager.updateTimeWindowStates(); /* * define constraints @@ -486,8 +534,8 @@ public class VehicleRoutingAlgorithms { // UpdateLoads loadUpdater = new UpdateLoads(stateManager); // stateManager.addListener(loadUpdater); // stateManager.addActivityVisitor(loadUpdater); - stateManager.addActivityVisitor(new UpdateActivityTimes(vrp.getTransportCosts())); - stateManager.addActivityVisitor(new UpdateVariableCosts(vrp.getActivityCosts(), vrp.getTransportCosts(), stateManager)); + stateManager.addStateUpdater(new UpdateActivityTimes(vrp.getTransportCosts())); + stateManager.addStateUpdater(new UpdateVariableCosts(vrp.getActivityCosts(), vrp.getTransportCosts(), stateManager)); // stateManager.addActivityVisitor(new UpdateOccuredDeliveries(stateManager)); // stateManager.addActivityVisitor(new TimeWindowUpdater(stateManager, vrp.getTransportCosts())); @@ -501,8 +549,8 @@ public class VehicleRoutingAlgorithms { metaAlgorithm.getSearchStrategyManager().addSearchStrategyModuleListener(new VehicleSwitched(vehicleFleetManager)); //define prematureBreak - PrematureAlgorithmBreaker prematureAlgoBreaker = getPrematureBreaker(config,algorithmListeners); - metaAlgorithm.setPrematureAlgorithmBreaker(prematureAlgoBreaker); + PrematureAlgorithmTermination prematureAlgoBreaker = getPrematureBreaker(config,algorithmListeners); + metaAlgorithm.setPrematureAlgorithmTermination(prematureAlgoBreaker); //misc algorithmListeners.add(new PrioritizedVRAListener(Priority.LOW, new SolutionVerifier())); @@ -546,11 +594,11 @@ public class VehicleRoutingAlgorithms { "makes sure your config file contains one of these options"); } - private static PrematureAlgorithmBreaker getPrematureBreaker(XMLConfiguration config, Set algorithmListeners) { + private static PrematureAlgorithmTermination getPrematureBreaker(XMLConfiguration config, Set algorithmListeners) { String basedOn = config.getString("prematureBreak[@basedOn]"); if(basedOn == null){ log.info("set default prematureBreak, i.e. no premature break at all."); - return new PrematureAlgorithmBreaker() { + return new PrematureAlgorithmTermination() { @Override public boolean isPrematureBreak(DiscoveredSolution discoveredSolution) { @@ -563,14 +611,14 @@ public class VehicleRoutingAlgorithms { String iter = config.getString("prematureBreak.iterations"); if(iter == null) throw new IllegalStateException("prematureBreak.iterations is missing"); int iterations = Integer.valueOf(iter); - return new IterationWithoutImprovementBreaker(iterations); + return new IterationWithoutImprovementTermination(iterations); } if(basedOn.equals("time")){ log.info("set prematureBreak based on time"); String timeString = config.getString("prematureBreak.time"); if(timeString == null) throw new IllegalStateException("prematureBreak.time is missing"); double time = Double.valueOf(timeString); - TimeBreaker timeBreaker = new TimeBreaker(time); + TimeTermination timeBreaker = new TimeTermination(time); algorithmListeners.add(new PrioritizedVRAListener(Priority.LOW, timeBreaker)); return timeBreaker; } @@ -582,7 +630,7 @@ public class VehicleRoutingAlgorithms { if(iterationsString == null) throw new IllegalStateException("prematureBreak.iterations is missing"); double threshold = Double.valueOf(thresholdString); int iterations = Integer.valueOf(iterationsString); - VariationCoefficientBreaker variationCoefficientBreaker = new VariationCoefficientBreaker(iterations, threshold); + VariationCoefficientTermination variationCoefficientBreaker = new VariationCoefficientTermination(iterations, threshold); algorithmListeners.add(new PrioritizedVRAListener(Priority.LOW, variationCoefficientBreaker)); return variationCoefficientBreaker; } @@ -687,7 +735,7 @@ public class VehicleRoutingAlgorithms { SolutionAcceptor definedAcceptor = typedMap.get(acceptorKey); if(definedAcceptor != null) return definedAcceptor; if(acceptorName.equals("acceptNewRemoveWorst")){ - AcceptNewIfBetterThanWorst acceptor = new AcceptNewIfBetterThanWorst(solutionMemory); + GreedyAcceptance acceptor = new GreedyAcceptance(solutionMemory); typedMap.put(acceptorKey, acceptor); return acceptor; } @@ -696,6 +744,16 @@ public class VehicleRoutingAlgorithms { typedMap.put(acceptorKey, acceptor); return acceptor; } + if(acceptorName.equals("greedyAcceptance")){ + GreedyAcceptance acceptor = new GreedyAcceptance(solutionMemory); + typedMap.put(acceptorKey, acceptor); + return acceptor; + } + if(acceptorName.equals("greedyAcceptance_minVehFirst")){ + GreedyAcceptance_minVehFirst acceptor = new GreedyAcceptance_minVehFirst(solutionMemory); + typedMap.put(acceptorKey, acceptor); + return acceptor; + } if(acceptorName.equals("schrimpfAcceptance")){ int iterOfSchrimpf = strategyConfig.getInt("acceptor.warmup"); double alpha = strategyConfig.getDouble("acceptor.alpha"); @@ -704,6 +762,14 @@ public class VehicleRoutingAlgorithms { typedMap.put(acceptorKey, schrimpf); return schrimpf; } + if(acceptorName.equals("experimentalSchrimpfAcceptance")){ + int iterOfSchrimpf = strategyConfig.getInt("acceptor.warmup"); + double alpha = strategyConfig.getDouble("acceptor.alpha"); + ExperimentalSchrimpfAcceptance schrimpf = new ExperimentalSchrimpfAcceptance(solutionMemory, alpha, iterOfSchrimpf); + algorithmListeners.add(new PrioritizedVRAListener(Priority.LOW, schrimpf)); + typedMap.put(acceptorKey, schrimpf); + return schrimpf; + } else{ throw new IllegalStateException("solution acceptor " + acceptorName + " is not known"); } @@ -735,7 +801,7 @@ public class VehicleRoutingAlgorithms { } else if(ruin_name.equals("radialRuin")){ String ruin_distance = moduleConfig.getString("ruin.distance"); - JobDistance jobDistance = new AvgJobDistance(vrp.getTransportCosts()); + JobDistance jobDistance = new AvgServiceAndShipmentDistance(vrp.getTransportCosts()); // if(ruin_distance == null) jobDistance // else { // if(ruin_distance.equals("euclidean")){ @@ -768,39 +834,40 @@ public class VehicleRoutingAlgorithms { return rrModule; } if(moduleName.equals("gendreau")){ - int iterations = moduleConfig.getInt("iterations"); - double share = moduleConfig.getDouble("share"); - String ruinName = moduleConfig.getString("ruin[@name]"); - if(ruinName == null) throw new IllegalStateException("gendreau.ruin[@name] is missing. set it to \"radialRuin\" or \"randomRuin\""); - String ruinId = moduleConfig.getString("ruin[@id]"); - if(ruinId == null) ruinId = "noId"; - ModKey ruinKey = makeKey(ruinName,ruinId); - RuinStrategyKey stratKey = new RuinStrategyKey(ruinKey); - RuinStrategy ruin = definedClasses.get(stratKey); - if(ruin == null){ - ruin = new RuinRadial(vrp, 0.3, new AvgJobDistance(vrp.getTransportCosts())); - definedClasses.put(stratKey, ruin); - } - - String insertionName = moduleConfig.getString("insertion[@name]"); - if(insertionName == null) throw new IllegalStateException("gendreau.insertion[@name] is missing. set it to \"regretInsertion\" or \"bestInsertion\""); - String insertionId = moduleConfig.getString("insertion[@id]"); - if(insertionId == null) insertionId = "noId"; - ModKey insertionKey = makeKey(insertionName,insertionId); - InsertionStrategyKey insertionStrategyKey = new InsertionStrategyKey(insertionKey); - InsertionStrategy insertion = definedClasses.get(insertionStrategyKey); - if(insertion == null){ - List insertionConfigs = moduleConfig.configurationsAt("insertion"); - if(insertionConfigs.size() != 1) throw new IllegalStateException("this should be 1"); - List prioListeners = new ArrayList(); - insertion = createInsertionStrategy(insertionConfigs.get(0), vrp, vehicleFleetManager, routeStates, prioListeners, executorService, nuOfThreads, constraintManager); - algorithmListeners.addAll(prioListeners); - } - Gendreau gendreau = new Gendreau(vrp, ruin, insertion, vehicleFleetManager); - gendreau.setShareOfJobsToRuin(share); - gendreau.setNuOfIterations(iterations); - definedClasses.put(strategyModuleKey, gendreau); - return gendreau; + throw new UnsupportedOperationException("gendreau is not supported yet"); +// int iterations = moduleConfig.getInt("iterations"); +// double share = moduleConfig.getDouble("share"); +// String ruinName = moduleConfig.getString("ruin[@name]"); +// if(ruinName == null) throw new IllegalStateException("gendreau.ruin[@name] is missing. set it to \"radialRuin\" or \"randomRuin\""); +// String ruinId = moduleConfig.getString("ruin[@id]"); +// if(ruinId == null) ruinId = "noId"; +// ModKey ruinKey = makeKey(ruinName,ruinId); +// RuinStrategyKey stratKey = new RuinStrategyKey(ruinKey); +// RuinStrategy ruin = definedClasses.get(stratKey); +// if(ruin == null){ +// ruin = new RadialRuinStrategyFactory(0.3, new AvgJobDistance(vrp.getTransportCosts())).createStrategy(vrp); +// definedClasses.put(stratKey, ruin); +// } +// +// String insertionName = moduleConfig.getString("insertion[@name]"); +// if(insertionName == null) throw new IllegalStateException("gendreau.insertion[@name] is missing. set it to \"regretInsertion\" or \"bestInsertion\""); +// String insertionId = moduleConfig.getString("insertion[@id]"); +// if(insertionId == null) insertionId = "noId"; +// ModKey insertionKey = makeKey(insertionName,insertionId); +// InsertionStrategyKey insertionStrategyKey = new InsertionStrategyKey(insertionKey); +// InsertionStrategy insertion = definedClasses.get(insertionStrategyKey); +// if(insertion == null){ +// List insertionConfigs = moduleConfig.configurationsAt("insertion"); +// if(insertionConfigs.size() != 1) throw new IllegalStateException("this should be 1"); +// List prioListeners = new ArrayList(); +// insertion = createInsertionStrategy(insertionConfigs.get(0), vrp, vehicleFleetManager, routeStates, prioListeners, executorService, nuOfThreads, constraintManager); +// algorithmListeners.addAll(prioListeners); +// } +// Gendreau gendreau = new Gendreau(vrp, ruin, insertion, vehicleFleetManager); +// gendreau.setShareOfJobsToRuin(share); +// gendreau.setNuOfIterations(iterations); +// definedClasses.put(strategyModuleKey, gendreau); +// return gendreau; } throw new NullPointerException("no module found with moduleName=" + moduleName + "\n\tcheck config whether the correct names are used" + @@ -815,7 +882,7 @@ public class VehicleRoutingAlgorithms { RuinStrategyKey stratKey = new RuinStrategyKey(modKey); RuinStrategy ruin = definedClasses.get(stratKey); if(ruin == null){ - ruin = new RuinRadial(vrp, shareToRuin, jobDistance); + ruin = new RadialRuinStrategyFactory(shareToRuin, jobDistance).createStrategy(vrp); definedClasses.put(stratKey, ruin); } return ruin; @@ -825,7 +892,7 @@ public class VehicleRoutingAlgorithms { RuinStrategyKey stratKey = new RuinStrategyKey(modKey); RuinStrategy ruin = definedClasses.get(stratKey); if(ruin == null){ - ruin = new RuinRandom(vrp, shareToRuin); + ruin = new RandomRuinStrategyFactory(shareToRuin).createStrategy(vrp); definedClasses.put(stratKey, ruin); } return ruin; diff --git a/jsprit-core/src/main/java/basics/algo/AlgorithmEndsListener.java b/jsprit-core/src/main/java/jsprit/core/algorithm/listener/AlgorithmEndsListener.java similarity index 87% rename from jsprit-core/src/main/java/basics/algo/AlgorithmEndsListener.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/listener/AlgorithmEndsListener.java index 87142e9b..fc0a617b 100644 --- a/jsprit-core/src/main/java/basics/algo/AlgorithmEndsListener.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/listener/AlgorithmEndsListener.java @@ -14,12 +14,13 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.algo; +package jsprit.core.algorithm.listener; import java.util.Collection; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblemSolution; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; + diff --git a/jsprit-core/src/main/java/basics/algo/AlgorithmStartsListener.java b/jsprit-core/src/main/java/jsprit/core/algorithm/listener/AlgorithmStartsListener.java similarity index 84% rename from jsprit-core/src/main/java/basics/algo/AlgorithmStartsListener.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/listener/AlgorithmStartsListener.java index e244b9e3..9b917808 100644 --- a/jsprit-core/src/main/java/basics/algo/AlgorithmStartsListener.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/listener/AlgorithmStartsListener.java @@ -14,13 +14,14 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.algo; +package jsprit.core.algorithm.listener; import java.util.Collection; -import basics.VehicleRoutingAlgorithm; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblemSolution; +import jsprit.core.algorithm.VehicleRoutingAlgorithm; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; + diff --git a/jsprit-core/src/main/java/basics/algo/IterationEndsListener.java b/jsprit-core/src/main/java/jsprit/core/algorithm/listener/IterationEndsListener.java similarity index 87% rename from jsprit-core/src/main/java/basics/algo/IterationEndsListener.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/listener/IterationEndsListener.java index 7aaf6b9f..6c70c24f 100644 --- a/jsprit-core/src/main/java/basics/algo/IterationEndsListener.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/listener/IterationEndsListener.java @@ -14,12 +14,13 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.algo; +package jsprit.core.algorithm.listener; import java.util.Collection; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblemSolution; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; + diff --git a/jsprit-core/src/main/java/basics/algo/IterationStartsListener.java b/jsprit-core/src/main/java/jsprit/core/algorithm/listener/IterationStartsListener.java similarity index 87% rename from jsprit-core/src/main/java/basics/algo/IterationStartsListener.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/listener/IterationStartsListener.java index db7610fc..a8d492c1 100644 --- a/jsprit-core/src/main/java/basics/algo/IterationStartsListener.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/listener/IterationStartsListener.java @@ -14,12 +14,13 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.algo; +package jsprit.core.algorithm.listener; import java.util.Collection; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblemSolution; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; + diff --git a/jsprit-core/src/main/java/basics/algo/SearchStrategyListener.java b/jsprit-core/src/main/java/jsprit/core/algorithm/listener/SearchStrategyListener.java similarity index 96% rename from jsprit-core/src/main/java/basics/algo/SearchStrategyListener.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/listener/SearchStrategyListener.java index 0d47246b..d4983bb9 100644 --- a/jsprit-core/src/main/java/basics/algo/SearchStrategyListener.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/listener/SearchStrategyListener.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.algo; +package jsprit.core.algorithm.listener; public interface SearchStrategyListener extends VehicleRoutingAlgorithmListener{ diff --git a/jsprit-core/src/main/java/basics/algo/SearchStrategyModuleListener.java b/jsprit-core/src/main/java/jsprit/core/algorithm/listener/SearchStrategyModuleListener.java similarity index 96% rename from jsprit-core/src/main/java/basics/algo/SearchStrategyModuleListener.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/listener/SearchStrategyModuleListener.java index 925585f3..58f7e737 100644 --- a/jsprit-core/src/main/java/basics/algo/SearchStrategyModuleListener.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/listener/SearchStrategyModuleListener.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.algo; +package jsprit.core.algorithm.listener; public interface SearchStrategyModuleListener extends VehicleRoutingAlgorithmListener{ diff --git a/jsprit-core/src/main/java/basics/algo/StrategySelectedListener.java b/jsprit-core/src/main/java/jsprit/core/algorithm/listener/StrategySelectedListener.java similarity index 87% rename from jsprit-core/src/main/java/basics/algo/StrategySelectedListener.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/listener/StrategySelectedListener.java index 2046e6fc..79898d11 100644 --- a/jsprit-core/src/main/java/basics/algo/StrategySelectedListener.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/listener/StrategySelectedListener.java @@ -14,12 +14,13 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.algo; +package jsprit.core.algorithm.listener; import java.util.Collection; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblemSolution; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; + diff --git a/jsprit-core/src/main/java/basics/algo/VehicleRoutingAlgorithmListener.java b/jsprit-core/src/main/java/jsprit/core/algorithm/listener/VehicleRoutingAlgorithmListener.java similarity index 95% rename from jsprit-core/src/main/java/basics/algo/VehicleRoutingAlgorithmListener.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/listener/VehicleRoutingAlgorithmListener.java index 957527a6..c2eaef7f 100644 --- a/jsprit-core/src/main/java/basics/algo/VehicleRoutingAlgorithmListener.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/listener/VehicleRoutingAlgorithmListener.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.algo; +package jsprit.core.algorithm.listener; public interface VehicleRoutingAlgorithmListener { diff --git a/jsprit-core/src/main/java/basics/algo/VehicleRoutingAlgorithmListeners.java b/jsprit-core/src/main/java/jsprit/core/algorithm/listener/VehicleRoutingAlgorithmListeners.java similarity index 96% rename from jsprit-core/src/main/java/basics/algo/VehicleRoutingAlgorithmListeners.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/listener/VehicleRoutingAlgorithmListeners.java index 2ec3fdd8..9301c847 100644 --- a/jsprit-core/src/main/java/basics/algo/VehicleRoutingAlgorithmListeners.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/listener/VehicleRoutingAlgorithmListeners.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.algo; +package jsprit.core.algorithm.listener; import java.util.ArrayList; import java.util.Collection; @@ -23,9 +23,10 @@ import java.util.Comparator; import java.util.List; import java.util.TreeSet; -import basics.VehicleRoutingAlgorithm; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblemSolution; +import jsprit.core.algorithm.VehicleRoutingAlgorithm; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; + diff --git a/jsprit-core/src/main/java/jsprit/core/algorithm/module/Gendreau.java b/jsprit-core/src/main/java/jsprit/core/algorithm/module/Gendreau.java new file mode 100644 index 00000000..2a933c19 --- /dev/null +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/module/Gendreau.java @@ -0,0 +1,224 @@ +///******************************************************************************* +// * 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 . +// ******************************************************************************/ +//package jsprit.core.algorithm.module; +// +//import java.util.ArrayList; +//import java.util.Arrays; +//import java.util.Collection; +//import java.util.Collections; +//import java.util.HashSet; +//import java.util.List; +//import java.util.Random; +//import java.util.Set; +// +//import jsprit.core.algorithm.SearchStrategyModule; +//import jsprit.core.algorithm.listener.SearchStrategyModuleListener; +//import jsprit.core.algorithm.recreate.InsertionStrategy; +//import jsprit.core.algorithm.recreate.listener.InsertionListener; +//import jsprit.core.algorithm.recreate.listener.InsertionListeners; +//import jsprit.core.algorithm.ruin.RuinStrategy; +//import jsprit.core.algorithm.ruin.listener.RuinListener; +//import jsprit.core.problem.Job; +//import jsprit.core.problem.VehicleRoutingProblem; +//import jsprit.core.problem.VehicleRoutingProblemSolution; +//import jsprit.core.problem.route.TourActivity; +//import jsprit.core.problem.route.TourActivity.JobActivity; +//import jsprit.core.problem.route.VehicleFleetManager; +//import jsprit.core.problem.route.VehicleRoute; +//import jsprit.core.util.RandomNumberGeneration; +// +//import org.apache.log4j.Logger; +// +// +//final class Gendreau implements SearchStrategyModule{ +// +// private final static Logger log = Logger.getLogger(Gendreau.class); +// +// private final static String NAME = "gendreauPostOpt"; +// +// private final RuinStrategy ruin; +// +// private final VehicleRoutingProblem vrp; +// +// private final InsertionStrategy insertionStrategy; +// +// private VehicleFleetManager fleetManager; +// +// private Random random = RandomNumberGeneration.getRandom(); +// +// private int nOfIterations = 10; +// +// private double shareOfJobsToRuin = 0.15; +// +// public void setShareOfJobsToRuin(double shareOfJobsToRuin) { +// this.shareOfJobsToRuin = shareOfJobsToRuin; +// } +// +// public Gendreau(VehicleRoutingProblem vrp, RuinStrategy ruin, InsertionStrategy insertionStrategy, VehicleFleetManager vehicleFleetManager) { +// super(); +// InsertionListeners insertionListeners = new InsertionListeners(); +// insertionListeners.addAllListeners(insertionStrategy.getListeners()); +// new Inserter(insertionListeners); +// this.ruin = ruin; +// this.vrp = vrp; +// this.insertionStrategy = insertionStrategy; +// this.fleetManager = vehicleFleetManager; +// } +// +// @Override +// public String toString() { +// return "[name=gendreau][iterations="+nOfIterations+"][share2ruin="+shareOfJobsToRuin+"]"; +// } +// +// public void setRandom(Random random) { +// this.random = random; +// } +// +// +// public void setNuOfIterations(int nOfIterations) { +// this.nOfIterations = nOfIterations; +// } +// +//// public void setFleetManager(VehicleFleetManager vehicleFleetManager) { +//// this.fleetManager = vehicleFleetManager; +//// +//// } +// +// @Override +// public VehicleRoutingProblemSolution runAndGetSolution(VehicleRoutingProblemSolution vrpSolution) { +//// log.info("run gendreau postopt"); +// VehicleRoutingProblemSolution bestSolution = vrpSolution; +// int itersWithoutImprovement = 0; +// +// for(int i=0;i copiedRoutes = copyRoutes(bestSolution.getRoutes()); +// iniFleet(copiedRoutes); +// +// VehicleRoute route2split = pickRouteThatHasAtLeastTwoJobs(copiedRoutes); +// if(route2split == null) continue; +// List jobsInRoute = getJobs(route2split); +// Set unassignedJobs = new HashSet(); +// unassignedJobs.addAll(jobsInRoute); +// copiedRoutes.remove(route2split); +// +// Collections.shuffle(jobsInRoute,random); +// Job targetJob = jobsInRoute.get(0); +// int nOfJobs2BeRemovedAdditionally = (int) (shareOfJobsToRuin*(double)vrp.getJobs().size()); +// Collection unassignedJobsList = ruin.ruin(copiedRoutes, targetJob, nOfJobs2BeRemovedAdditionally); +// unassignedJobs.addAll(unassignedJobsList); +// +// VehicleRoute emptyRoute1 = VehicleRoute.emptyRoute(); +// copiedRoutes.add(emptyRoute1); +// insertionStrategy.insertJobs(Arrays.asList(emptyRoute1), Arrays.asList(targetJob)); +// +// unassignedJobs.remove(targetJob); +// +// VehicleRoute emptyRoute2 = VehicleRoute.emptyRoute(); +// copiedRoutes.add(emptyRoute2); +// Job job2 = jobsInRoute.get(1); +// insertionStrategy.insertJobs(Arrays.asList(emptyRoute2), Arrays.asList(job2)); +// +// unassignedJobs.remove(job2); +// +// insertionStrategy.insertJobs(copiedRoutes, unassignedJobs); +// double cost = getCost(copiedRoutes); +// +// if(cost < bestSolution.getCost()){ +//// log.info("BING - new: " + cost + " old: " + bestSolution.getCost()); +// bestSolution = new VehicleRoutingProblemSolution(copiedRoutes, cost); +// itersWithoutImprovement=0; +// } +// else{ +// itersWithoutImprovement++; +// if(itersWithoutImprovement > 200){ +//// log.info("BREAK i="+i); +// break; +// } +// } +// } +// return bestSolution; +// } +// +// private List copyRoutes(Collection routes) { +// List routeList = new ArrayList(); +// for(VehicleRoute r : routes){ +// routeList.add(VehicleRoute.copyOf(r)); +// } +// return routeList; +// } +// +// private void iniFleet(Collection routes) { +// fleetManager.unlockAll(); +// for(VehicleRoute route : routes){ +// if(!route.isEmpty()){ +// fleetManager.lock(route.getVehicle()); +// } +// } +// } +// +// private double getCost(Collection routes) { +// double c = 0.0; +// for(VehicleRoute r : routes){ +// c+=r.getCost(); +// } +// return c; +// } +// +// private List getJobs(VehicleRoute route2split) { +// Set jobs = new HashSet(); +// for(TourActivity act : route2split.getTourActivities().getActivities()){ +// if(act instanceof JobActivity){ +// jobs.add(((JobActivity) act).getJob()); +// } +// } +// return new ArrayList(jobs); +// } +// +// private VehicleRoute pickRouteThatHasAtLeastTwoJobs(Collection routeList) { +// List routes = new ArrayList(); +// for(VehicleRoute r : routeList){ +// if(getJobs(r).size() > 1){ +// routes.add(r); +// } +// } +// if(routes.isEmpty()) return null; +// Collections.shuffle(routes,random); +// return routes.get(0); +// } +// +// @Override +// public String getName() { +// return NAME; +// } +// +// @Override +// public void addModuleListener(SearchStrategyModuleListener moduleListener) { +// if(moduleListener instanceof InsertionListener){ +// InsertionListener iListener = (InsertionListener) moduleListener; +// if(!insertionStrategy.getListeners().contains(iListener)){ +// insertionStrategy.addListener(iListener); +// } +// } +// if(moduleListener instanceof RuinListener){ +// RuinListener rListener = (RuinListener) moduleListener; +// if(!ruin.getListeners().contains(rListener)){ +// ruin.addListener(rListener); +// } +// } +// +// } +//} diff --git a/jsprit-core/src/main/java/algorithms/RuinAndRecreateModule.java b/jsprit-core/src/main/java/jsprit/core/algorithm/module/RuinAndRecreateModule.java similarity index 81% rename from jsprit-core/src/main/java/algorithms/RuinAndRecreateModule.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/module/RuinAndRecreateModule.java index 53703592..29f79a1e 100644 --- a/jsprit-core/src/main/java/algorithms/RuinAndRecreateModule.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/module/RuinAndRecreateModule.java @@ -14,16 +14,19 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms; +package jsprit.core.algorithm.module; import java.util.Collection; -import basics.Job; -import basics.VehicleRoutingProblemSolution; -import basics.algo.InsertionListener; -import basics.algo.RuinListener; -import basics.algo.SearchStrategyModule; -import basics.algo.SearchStrategyModuleListener; +import jsprit.core.algorithm.SearchStrategyModule; +import jsprit.core.algorithm.listener.SearchStrategyModuleListener; +import jsprit.core.algorithm.recreate.InsertionStrategy; +import jsprit.core.algorithm.recreate.listener.InsertionListener; +import jsprit.core.algorithm.ruin.RuinStrategy; +import jsprit.core.algorithm.ruin.listener.RuinListener; +import jsprit.core.problem.job.Job; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; + public class RuinAndRecreateModule implements SearchStrategyModule{ diff --git a/jsprit-core/src/main/java/algorithms/ActivityInsertionCostsCalculator.java b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/ActivityInsertionCostsCalculator.java similarity index 83% rename from jsprit-core/src/main/java/algorithms/ActivityInsertionCostsCalculator.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/recreate/ActivityInsertionCostsCalculator.java index bed0a9c5..681c9366 100644 --- a/jsprit-core/src/main/java/algorithms/ActivityInsertionCostsCalculator.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/ActivityInsertionCostsCalculator.java @@ -18,9 +18,10 @@ * Contributors: * Stefan Schroeder - initial API and implementation ******************************************************************************/ -package algorithms; +package jsprit.core.algorithm.recreate; -import basics.route.TourActivity; +import jsprit.core.problem.misc.JobInsertionContext; +import jsprit.core.problem.solution.route.activity.TourActivity; public interface ActivityInsertionCostsCalculator { @@ -50,6 +51,6 @@ public interface ActivityInsertionCostsCalculator { } - public ActivityInsertionCosts getCosts(InsertionContext iContext, TourActivity prevAct, TourActivity nextAct, TourActivity newAct, double depTimeAtPrevAct); + public ActivityInsertionCosts getCosts(JobInsertionContext iContext, TourActivity prevAct, TourActivity nextAct, TourActivity newAct, double depTimeAtPrevAct); } diff --git a/jsprit-core/src/main/java/algorithms/AuxilliaryCostCalculator.java b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/AuxilliaryCostCalculator.java similarity index 92% rename from jsprit-core/src/main/java/algorithms/AuxilliaryCostCalculator.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/recreate/AuxilliaryCostCalculator.java index bbb1f091..2ff04582 100644 --- a/jsprit-core/src/main/java/algorithms/AuxilliaryCostCalculator.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/AuxilliaryCostCalculator.java @@ -14,16 +14,17 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms; +package jsprit.core.algorithm.recreate; import java.util.Iterator; import java.util.List; -import basics.costs.VehicleRoutingActivityCosts; -import basics.costs.VehicleRoutingTransportCosts; -import basics.route.Driver; -import basics.route.TourActivity; -import basics.route.Vehicle; +import jsprit.core.problem.cost.VehicleRoutingActivityCosts; +import jsprit.core.problem.cost.VehicleRoutingTransportCosts; +import jsprit.core.problem.driver.Driver; +import jsprit.core.problem.solution.route.activity.TourActivity; +import jsprit.core.problem.vehicle.Vehicle; + final class AuxilliaryCostCalculator { diff --git a/jsprit-core/src/main/java/algorithms/BestInsertion.java b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/BestInsertion.java similarity index 92% rename from jsprit-core/src/main/java/algorithms/BestInsertion.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/recreate/BestInsertion.java index f5e7b506..10cea48e 100644 --- a/jsprit-core/src/main/java/algorithms/BestInsertion.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/BestInsertion.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms; +package jsprit.core.algorithm.recreate; import java.util.ArrayList; import java.util.Collection; @@ -22,15 +22,17 @@ import java.util.Collections; import java.util.List; import java.util.Random; +import jsprit.core.algorithm.recreate.InsertionData.NoInsertionFound; +import jsprit.core.algorithm.recreate.listener.InsertionListener; +import jsprit.core.algorithm.recreate.listener.InsertionListeners; +import jsprit.core.problem.driver.Driver; +import jsprit.core.problem.job.Job; +import jsprit.core.problem.solution.route.VehicleRoute; +import jsprit.core.problem.vehicle.Vehicle; +import jsprit.core.util.RandomNumberGeneration; + import org.apache.log4j.Logger; -import util.RandomNumberGeneration; -import algorithms.InsertionData.NoInsertionFound; -import basics.Job; -import basics.algo.InsertionListener; -import basics.route.Driver; -import basics.route.Vehicle; -import basics.route.VehicleRoute; diff --git a/jsprit-core/src/main/java/algorithms/BestInsertionBuilder.java b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/BestInsertionBuilder.java similarity index 76% rename from jsprit-core/src/main/java/algorithms/BestInsertionBuilder.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/recreate/BestInsertionBuilder.java index 424acce7..5d115c69 100644 --- a/jsprit-core/src/main/java/algorithms/BestInsertionBuilder.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/BestInsertionBuilder.java @@ -1,13 +1,16 @@ -package algorithms; +package jsprit.core.algorithm.recreate; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutorService; -import basics.VehicleRoutingProblem; -import basics.algo.InsertionListener; -import basics.algo.VehicleRoutingAlgorithmListeners.PrioritizedVRAListener; -import basics.route.VehicleFleetManager; +import jsprit.core.algorithm.listener.VehicleRoutingAlgorithmListeners.PrioritizedVRAListener; +import jsprit.core.algorithm.recreate.listener.InsertionListener; +import jsprit.core.algorithm.state.StateManager; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.constraint.ConstraintManager; +import jsprit.core.problem.vehicle.VehicleFleetManager; + public class BestInsertionBuilder { @@ -34,6 +37,12 @@ public class BestInsertionBuilder { private ExecutorService executor; private int nuOfThreads; + + private double timeSlice; + + private int nNeighbors; + + private boolean timeScheduling=false; public BestInsertionBuilder(VehicleRoutingProblem vrp, VehicleFleetManager vehicleFleetManager, StateManager stateManager, ConstraintManager constraintManager) { super(); @@ -92,6 +101,9 @@ public class BestInsertionBuilder { if(considerFixedCosts) { calcBuilder.considerFixedCosts(weightOfFixedCosts); } + if(timeScheduling){ + calcBuilder.experimentalTimeScheduler(timeSlice, nNeighbors); + } JobInsertionCostsCalculator jobInsertions = calcBuilder.build(); InsertionStrategy bestInsertion; if(executor == null){ @@ -107,6 +119,18 @@ public class BestInsertionBuilder { return bestInsertion; } + /** + * @deprecated this is experimental and can disappear. + * @param parseDouble + * @param parseInt + */ + @Deprecated + public void experimentalTimeScheduler(double timeSlice, int nNeighbors) { + this.timeSlice=timeSlice; + this.nNeighbors=nNeighbors; + timeScheduling=true; + } + diff --git a/jsprit-core/src/main/java/algorithms/BestInsertionConcurrent.java b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/BestInsertionConcurrent.java similarity index 94% rename from jsprit-core/src/main/java/algorithms/BestInsertionConcurrent.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/recreate/BestInsertionConcurrent.java index afb37573..1cbf0113 100644 --- a/jsprit-core/src/main/java/algorithms/BestInsertionConcurrent.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/BestInsertionConcurrent.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms; +package jsprit.core.algorithm.recreate; import java.util.ArrayList; import java.util.Collection; @@ -27,15 +27,17 @@ import java.util.concurrent.ExecutorCompletionService; import java.util.concurrent.ExecutorService; import java.util.concurrent.Future; +import jsprit.core.algorithm.recreate.InsertionData.NoInsertionFound; +import jsprit.core.algorithm.recreate.listener.InsertionListener; +import jsprit.core.algorithm.recreate.listener.InsertionListeners; +import jsprit.core.problem.driver.Driver; +import jsprit.core.problem.job.Job; +import jsprit.core.problem.solution.route.VehicleRoute; +import jsprit.core.problem.vehicle.Vehicle; +import jsprit.core.util.RandomNumberGeneration; + import org.apache.log4j.Logger; -import util.RandomNumberGeneration; -import algorithms.InsertionData.NoInsertionFound; -import basics.Job; -import basics.algo.InsertionListener; -import basics.route.Driver; -import basics.route.Vehicle; -import basics.route.VehicleRoute; @@ -170,7 +172,7 @@ final class BestInsertionConcurrent implements InsertionStrategy{ bestInsertion = new Insertion(newRoute,newIData); bestInsertionCost = newIData.getInsertionCost(); vehicleRoutes.add(newRoute); - batches.get(0).routes.add(newRoute); + batches.get(random.nextInt(batches.size())).routes.add(newRoute); } } diff --git a/jsprit-core/src/main/java/algorithms/CalculatesServiceInsertionWithTimeScheduling.java b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/CalculatesServiceInsertionWithTimeScheduling.java similarity index 93% rename from jsprit-core/src/main/java/algorithms/CalculatesServiceInsertionWithTimeScheduling.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/recreate/CalculatesServiceInsertionWithTimeScheduling.java index 13ec9da2..a879fe06 100644 --- a/jsprit-core/src/main/java/algorithms/CalculatesServiceInsertionWithTimeScheduling.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/CalculatesServiceInsertionWithTimeScheduling.java @@ -14,18 +14,19 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms; +package jsprit.core.algorithm.recreate; import java.util.ArrayList; import java.util.List; import java.util.Random; +import jsprit.core.problem.driver.Driver; +import jsprit.core.problem.job.Job; +import jsprit.core.problem.solution.route.VehicleRoute; +import jsprit.core.problem.vehicle.Vehicle; + import org.apache.log4j.Logger; -import basics.Job; -import basics.route.Driver; -import basics.route.Vehicle; -import basics.route.VehicleRoute; class CalculatesServiceInsertionWithTimeScheduling implements JobInsertionCostsCalculator{ diff --git a/jsprit-core/src/main/java/algorithms/CalculatorBuilder.java b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/CalculatorBuilder.java similarity index 90% rename from jsprit-core/src/main/java/algorithms/CalculatorBuilder.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/recreate/CalculatorBuilder.java index b82b7d25..f078a338 100644 --- a/jsprit-core/src/main/java/algorithms/CalculatorBuilder.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/CalculatorBuilder.java @@ -14,20 +14,23 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms; +package jsprit.core.algorithm.recreate; import java.util.ArrayList; import java.util.List; -import basics.Delivery; -import basics.Job; -import basics.Pickup; -import basics.Service; -import basics.Shipment; -import basics.VehicleRoutingProblem; -import basics.algo.InsertionListener; -import basics.algo.VehicleRoutingAlgorithmListeners.PrioritizedVRAListener; -import basics.route.VehicleFleetManager; +import jsprit.core.algorithm.listener.VehicleRoutingAlgorithmListeners.PrioritizedVRAListener; +import jsprit.core.algorithm.recreate.listener.InsertionListener; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.constraint.ConstraintManager; +import jsprit.core.problem.job.Delivery; +import jsprit.core.problem.job.Job; +import jsprit.core.problem.job.Pickup; +import jsprit.core.problem.job.Service; +import jsprit.core.problem.job.Shipment; +import jsprit.core.problem.solution.route.state.RouteAndActivityStateGetter; +import jsprit.core.problem.vehicle.VehicleFleetManager; + @@ -64,7 +67,7 @@ class CalculatorBuilder { private VehicleRoutingProblem vrp; - private StateGetter states; + private RouteAndActivityStateGetter states; private boolean local = true; @@ -109,7 +112,7 @@ class CalculatorBuilder { * * @return */ - public CalculatorBuilder setStates(StateGetter states){ + public CalculatorBuilder setStates(RouteAndActivityStateGetter states){ this.states = states; return this; } @@ -235,7 +238,7 @@ class CalculatorBuilder { } } - private CalculatorPlusListeners createStandardLocal(VehicleRoutingProblem vrp, StateGetter statesManager){ + private CalculatorPlusListeners createStandardLocal(VehicleRoutingProblem vrp, RouteAndActivityStateGetter statesManager){ if(constraintManager == null) throw new IllegalStateException("constraint-manager is null"); @@ -263,7 +266,7 @@ class CalculatorBuilder { return calcPlusListeners; } - private CalculatorPlusListeners createCalculatorConsideringFixedCosts(VehicleRoutingProblem vrp, JobInsertionCostsCalculator baseCalculator, StateGetter activityStates2, double weightOfFixedCosts){ + private CalculatorPlusListeners createCalculatorConsideringFixedCosts(VehicleRoutingProblem vrp, JobInsertionCostsCalculator baseCalculator, RouteAndActivityStateGetter activityStates2, double weightOfFixedCosts){ final JobInsertionConsideringFixCostsCalculator withFixCost = new JobInsertionConsideringFixCostsCalculator(baseCalculator, activityStates2); withFixCost.setWeightOfFixCost(weightOfFixedCosts); CalculatorPlusListeners calcPlusListeners = new CalculatorPlusListeners(withFixCost); @@ -271,7 +274,7 @@ class CalculatorBuilder { return calcPlusListeners; } - private CalculatorPlusListeners createStandardRoute(VehicleRoutingProblem vrp, StateGetter activityStates2, int forwardLooking, int solutionMemory){ + private CalculatorPlusListeners createStandardRoute(VehicleRoutingProblem vrp, RouteAndActivityStateGetter activityStates2, int forwardLooking, int solutionMemory){ int after = forwardLooking; ActivityInsertionCostsCalculator routeLevelCostEstimator; if(activityInsertionCostCalculator == null){ @@ -289,7 +292,7 @@ class CalculatorBuilder { return calcPlusListener; } - private JobInsertionCostsCalculator createFinalInsertion(VehicleFleetManager fleetManager, JobInsertionCostsCalculator baseCalc, StateGetter activityStates2){ + private JobInsertionCostsCalculator createFinalInsertion(VehicleFleetManager fleetManager, JobInsertionCostsCalculator baseCalc, RouteAndActivityStateGetter activityStates2){ return new VehicleTypeDependentJobInsertionCalculator(fleetManager, baseCalc); } diff --git a/jsprit-core/src/main/java/algorithms/ConfigureFixCostCalculator.java b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/ConfigureFixCostCalculator.java similarity index 87% rename from jsprit-core/src/main/java/algorithms/ConfigureFixCostCalculator.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/recreate/ConfigureFixCostCalculator.java index ed9fb977..c0d3316a 100644 --- a/jsprit-core/src/main/java/algorithms/ConfigureFixCostCalculator.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/ConfigureFixCostCalculator.java @@ -14,18 +14,19 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms; +package jsprit.core.algorithm.recreate; import java.util.Collection; +import jsprit.core.algorithm.recreate.listener.InsertionStartsListener; +import jsprit.core.algorithm.recreate.listener.JobInsertedListener; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.job.Job; +import jsprit.core.problem.solution.route.VehicleRoute; + import org.apache.log4j.Logger; -import basics.Job; -import basics.VehicleRoutingProblem; -import basics.algo.InsertionStartsListener; -import basics.algo.JobInsertedListener; -import basics.route.VehicleRoute; diff --git a/jsprit-core/src/main/java/algorithms/Inserter.java b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/Inserter.java similarity index 86% rename from jsprit-core/src/main/java/algorithms/Inserter.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/recreate/Inserter.java index afe677ba..6e73e670 100644 --- a/jsprit-core/src/main/java/algorithms/Inserter.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/Inserter.java @@ -14,18 +14,19 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms; +package jsprit.core.algorithm.recreate; -import algorithms.InsertionData.NoInsertionFound; -import basics.Job; -import basics.Service; -import basics.Shipment; -import basics.route.DefaultShipmentActivityFactory; -import basics.route.DefaultTourActivityFactory; -import basics.route.TourActivity; -import basics.route.TourActivityFactory; -import basics.route.TourShipmentActivityFactory; -import basics.route.VehicleRoute; +import jsprit.core.algorithm.recreate.InsertionData.NoInsertionFound; +import jsprit.core.algorithm.recreate.listener.InsertionListeners; +import jsprit.core.problem.job.Job; +import jsprit.core.problem.job.Service; +import jsprit.core.problem.job.Shipment; +import jsprit.core.problem.solution.route.VehicleRoute; +import jsprit.core.problem.solution.route.activity.DefaultShipmentActivityFactory; +import jsprit.core.problem.solution.route.activity.DefaultTourActivityFactory; +import jsprit.core.problem.solution.route.activity.TourActivity; +import jsprit.core.problem.solution.route.activity.TourActivityFactory; +import jsprit.core.problem.solution.route.activity.TourShipmentActivityFactory; class Inserter { diff --git a/jsprit-core/src/main/java/algorithms/InsertionData.java b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/InsertionData.java similarity index 97% rename from jsprit-core/src/main/java/algorithms/InsertionData.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/recreate/InsertionData.java index e033684d..147eb80c 100644 --- a/jsprit-core/src/main/java/algorithms/InsertionData.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/InsertionData.java @@ -14,10 +14,10 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms; +package jsprit.core.algorithm.recreate; -import basics.route.Driver; -import basics.route.Vehicle; +import jsprit.core.problem.driver.Driver; +import jsprit.core.problem.vehicle.Vehicle; /** * Data object that collects insertion information. It collects insertionCosts, insertionIndeces, vehicle and driver to be employed diff --git a/jsprit-core/src/main/java/algorithms/InsertionStrategy.java b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/InsertionStrategy.java similarity index 87% rename from jsprit-core/src/main/java/algorithms/InsertionStrategy.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/recreate/InsertionStrategy.java index 17c84fad..b7f77521 100644 --- a/jsprit-core/src/main/java/algorithms/InsertionStrategy.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/InsertionStrategy.java @@ -14,13 +14,14 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms; +package jsprit.core.algorithm.recreate; import java.util.Collection; -import basics.Job; -import basics.algo.InsertionListener; -import basics.route.VehicleRoute; +import jsprit.core.algorithm.recreate.listener.InsertionListener; +import jsprit.core.problem.job.Job; +import jsprit.core.problem.solution.route.VehicleRoute; + diff --git a/jsprit-core/src/main/java/algorithms/InsertionStrategyFactory.java b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/InsertionStrategyFactory.java similarity index 91% rename from jsprit-core/src/main/java/algorithms/InsertionStrategyFactory.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/recreate/InsertionStrategyFactory.java index 024a8615..8c36e9a0 100644 --- a/jsprit-core/src/main/java/algorithms/InsertionStrategyFactory.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/InsertionStrategyFactory.java @@ -14,9 +14,9 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms; +package jsprit.core.algorithm.recreate; -import basics.VehicleRoutingProblem; +import jsprit.core.problem.VehicleRoutingProblem; public interface InsertionStrategyFactory { diff --git a/jsprit-core/src/main/java/algorithms/JobCalculatorSwitcher.java b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/JobCalculatorSwitcher.java similarity index 73% rename from jsprit-core/src/main/java/algorithms/JobCalculatorSwitcher.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/recreate/JobCalculatorSwitcher.java index da3485b8..a4858749 100644 --- a/jsprit-core/src/main/java/algorithms/JobCalculatorSwitcher.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/JobCalculatorSwitcher.java @@ -1,14 +1,15 @@ -package algorithms; +package jsprit.core.algorithm.recreate; import java.util.HashMap; import java.util.Map; -import basics.Job; -import basics.route.Driver; -import basics.route.Vehicle; -import basics.route.VehicleRoute; +import jsprit.core.problem.driver.Driver; +import jsprit.core.problem.job.Job; +import jsprit.core.problem.solution.route.VehicleRoute; +import jsprit.core.problem.vehicle.Vehicle; -public class JobCalculatorSwitcher implements JobInsertionCostsCalculator{ + +class JobCalculatorSwitcher implements JobInsertionCostsCalculator{ private Map,JobInsertionCostsCalculator> calcMap = new HashMap, JobInsertionCostsCalculator>(); diff --git a/jsprit-core/src/main/java/algorithms/JobInsertionConsideringFixCostsCalculator.java b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/JobInsertionConsideringFixCostsCalculator.java similarity index 87% rename from jsprit-core/src/main/java/algorithms/JobInsertionConsideringFixCostsCalculator.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/recreate/JobInsertionConsideringFixCostsCalculator.java index 87c70abb..5537649e 100644 --- a/jsprit-core/src/main/java/algorithms/JobInsertionConsideringFixCostsCalculator.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/JobInsertionConsideringFixCostsCalculator.java @@ -14,16 +14,19 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms; +package jsprit.core.algorithm.recreate; + +import jsprit.core.algorithm.recreate.InsertionData.NoInsertionFound; +import jsprit.core.problem.driver.Driver; +import jsprit.core.problem.job.Job; +import jsprit.core.problem.solution.route.VehicleRoute; +import jsprit.core.problem.solution.route.state.RouteAndActivityStateGetter; +import jsprit.core.problem.solution.route.state.StateFactory; +import jsprit.core.problem.vehicle.Vehicle; +import jsprit.core.problem.vehicle.VehicleImpl.NoVehicle; import org.apache.log4j.Logger; -import algorithms.InsertionData.NoInsertionFound; -import basics.Job; -import basics.route.Driver; -import basics.route.Vehicle; -import basics.route.VehicleImpl.NoVehicle; -import basics.route.VehicleRoute; @@ -37,9 +40,9 @@ final class JobInsertionConsideringFixCostsCalculator implements JobInsertionCos private double solution_completeness_ratio = 0.5; - private StateGetter stateGetter; + private RouteAndActivityStateGetter stateGetter; - public JobInsertionConsideringFixCostsCalculator(final JobInsertionCostsCalculator standardInsertionCalculator, StateGetter stateGetter) { + public JobInsertionConsideringFixCostsCalculator(final JobInsertionCostsCalculator standardInsertionCalculator, RouteAndActivityStateGetter stateGetter) { super(); this.standardServiceInsertion = standardInsertionCalculator; this.stateGetter = stateGetter; diff --git a/jsprit-core/src/main/java/algorithms/JobInsertionCostsCalculator.java b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/JobInsertionCostsCalculator.java similarity index 83% rename from jsprit-core/src/main/java/algorithms/JobInsertionCostsCalculator.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/recreate/JobInsertionCostsCalculator.java index 28f908dd..3d5599ac 100644 --- a/jsprit-core/src/main/java/algorithms/JobInsertionCostsCalculator.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/JobInsertionCostsCalculator.java @@ -14,12 +14,12 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms; +package jsprit.core.algorithm.recreate; -import basics.Job; -import basics.route.Driver; -import basics.route.Vehicle; -import basics.route.VehicleRoute; +import jsprit.core.problem.driver.Driver; +import jsprit.core.problem.job.Job; +import jsprit.core.problem.solution.route.VehicleRoute; +import jsprit.core.problem.vehicle.Vehicle; public interface JobInsertionCostsCalculator { diff --git a/jsprit-core/src/main/java/algorithms/LocalActivityInsertionCostsCalculator.java b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/LocalActivityInsertionCostsCalculator.java similarity index 89% rename from jsprit-core/src/main/java/algorithms/LocalActivityInsertionCostsCalculator.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/recreate/LocalActivityInsertionCostsCalculator.java index dd19a15c..92dacfb9 100644 --- a/jsprit-core/src/main/java/algorithms/LocalActivityInsertionCostsCalculator.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/LocalActivityInsertionCostsCalculator.java @@ -18,11 +18,13 @@ * Contributors: * Stefan Schroeder - initial API and implementation ******************************************************************************/ -package algorithms; +package jsprit.core.algorithm.recreate; -import basics.costs.VehicleRoutingActivityCosts; -import basics.costs.VehicleRoutingTransportCosts; -import basics.route.TourActivity; +import jsprit.core.problem.cost.VehicleRoutingActivityCosts; +import jsprit.core.problem.cost.VehicleRoutingTransportCosts; +import jsprit.core.problem.misc.JobInsertionContext; +import jsprit.core.problem.solution.route.activity.TourActivity; +import jsprit.core.util.CalculationUtils; /** * Calculates activity insertion costs locally, i.e. by comparing the additional costs of insertion the new activity k between @@ -34,7 +36,7 @@ import basics.route.TourActivity; * @author stefan * */ -public class LocalActivityInsertionCostsCalculator implements ActivityInsertionCostsCalculator{ +class LocalActivityInsertionCostsCalculator implements ActivityInsertionCostsCalculator{ private VehicleRoutingTransportCosts routingCosts; @@ -48,7 +50,7 @@ public class LocalActivityInsertionCostsCalculator implements ActivityInsertionC } @Override - public ActivityInsertionCosts getCosts(InsertionContext iFacts, TourActivity prevAct, TourActivity nextAct, TourActivity newAct, double depTimeAtPrevAct) { + public ActivityInsertionCosts getCosts(JobInsertionContext iFacts, TourActivity prevAct, TourActivity nextAct, TourActivity newAct, double depTimeAtPrevAct) { double tp_costs_prevAct_newAct = routingCosts.getTransportCost(prevAct.getLocationId(), newAct.getLocationId(), depTimeAtPrevAct, iFacts.getNewDriver(), iFacts.getNewVehicle()); double tp_time_prevAct_newAct = routingCosts.getTransportTime(prevAct.getLocationId(), newAct.getLocationId(), depTimeAtPrevAct, iFacts.getNewDriver(), iFacts.getNewVehicle()); diff --git a/jsprit-core/src/main/java/algorithms/ParRegretInsertion.java b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/ParRegretInsertion.java similarity index 99% rename from jsprit-core/src/main/java/algorithms/ParRegretInsertion.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/recreate/ParRegretInsertion.java index 2bcaf045..9d7fcafd 100644 --- a/jsprit-core/src/main/java/algorithms/ParRegretInsertion.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/ParRegretInsertion.java @@ -1,3 +1,4 @@ +package jsprit.core.algorithm.recreate; /******************************************************************************* * Copyright (C) 2013 Stefan Schroeder * diff --git a/jsprit-core/src/main/java/algorithms/RegretInsertion.java b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/RegretInsertion.java similarity index 99% rename from jsprit-core/src/main/java/algorithms/RegretInsertion.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/recreate/RegretInsertion.java index 300e6a6b..cbac3d07 100644 --- a/jsprit-core/src/main/java/algorithms/RegretInsertion.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/RegretInsertion.java @@ -1,3 +1,4 @@ +package jsprit.core.algorithm.recreate; /******************************************************************************* * Copyright (C) 2013 Stefan Schroeder * diff --git a/jsprit-core/src/main/java/algorithms/RouteLevelActivityInsertionCostsEstimator.java b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/RouteLevelActivityInsertionCostsEstimator.java similarity index 79% rename from jsprit-core/src/main/java/algorithms/RouteLevelActivityInsertionCostsEstimator.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/recreate/RouteLevelActivityInsertionCostsEstimator.java index adc9776f..b846979e 100644 --- a/jsprit-core/src/main/java/algorithms/RouteLevelActivityInsertionCostsEstimator.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/RouteLevelActivityInsertionCostsEstimator.java @@ -18,17 +18,21 @@ * Contributors: * Stefan Schroeder - initial API and implementation ******************************************************************************/ -package algorithms; +package jsprit.core.algorithm.recreate; import java.util.ArrayList; import java.util.List; -import basics.costs.VehicleRoutingActivityCosts; -import basics.costs.VehicleRoutingTransportCosts; -import basics.route.End; -import basics.route.Start; -import basics.route.TourActivity; -import basics.route.VehicleRoute; +import jsprit.core.problem.cost.VehicleRoutingActivityCosts; +import jsprit.core.problem.cost.VehicleRoutingTransportCosts; +import jsprit.core.problem.misc.JobInsertionContext; +import jsprit.core.problem.solution.route.VehicleRoute; +import jsprit.core.problem.solution.route.activity.End; +import jsprit.core.problem.solution.route.activity.Start; +import jsprit.core.problem.solution.route.activity.TourActivity; +import jsprit.core.problem.solution.route.state.RouteAndActivityStateGetter; +import jsprit.core.problem.solution.route.state.StateFactory; + class RouteLevelActivityInsertionCostsEstimator implements ActivityInsertionCostsCalculator{ @@ -36,11 +40,11 @@ class RouteLevelActivityInsertionCostsEstimator implements ActivityInsertionCost private AuxilliaryCostCalculator auxilliaryPathCostCalculator; - private StateGetter stateManager; + private RouteAndActivityStateGetter stateManager; private int nuOfActivities2LookForward = 0; - public RouteLevelActivityInsertionCostsEstimator(VehicleRoutingTransportCosts routingCosts, VehicleRoutingActivityCosts actCosts, StateGetter stateManager) { + public RouteLevelActivityInsertionCostsEstimator(VehicleRoutingTransportCosts routingCosts, VehicleRoutingActivityCosts actCosts, RouteAndActivityStateGetter stateManager) { super(); this.activityCosts = actCosts; this.stateManager = stateManager; @@ -48,7 +52,7 @@ class RouteLevelActivityInsertionCostsEstimator implements ActivityInsertionCost } @Override - public ActivityInsertionCosts getCosts(InsertionContext iFacts, TourActivity prevAct, TourActivity nextAct, TourActivity newAct, double depTimeAtPrevAct) { + public ActivityInsertionCosts getCosts(JobInsertionContext iFacts, TourActivity prevAct, TourActivity nextAct, TourActivity newAct, double depTimeAtPrevAct) { List path = new ArrayList(); path.add(prevAct); path.add(newAct); path.add(nextAct); int actIndex; diff --git a/jsprit-core/src/main/java/algorithms/ServiceInsertionCalculator.java b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/ServiceInsertionCalculator.java similarity index 80% rename from jsprit-core/src/main/java/algorithms/ServiceInsertionCalculator.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/recreate/ServiceInsertionCalculator.java index d8ea37f3..1a1ead9c 100644 --- a/jsprit-core/src/main/java/algorithms/ServiceInsertionCalculator.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/ServiceInsertionCalculator.java @@ -14,25 +14,30 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms; +package jsprit.core.algorithm.recreate; + +import jsprit.core.algorithm.recreate.ActivityInsertionCostsCalculator.ActivityInsertionCosts; +import jsprit.core.problem.constraint.HardActivityStateLevelConstraint; +import jsprit.core.problem.constraint.HardActivityStateLevelConstraint.ConstraintsStatus; +import jsprit.core.problem.constraint.HardRouteStateLevelConstraint; +import jsprit.core.problem.cost.VehicleRoutingTransportCosts; +import jsprit.core.problem.driver.Driver; +import jsprit.core.problem.job.Job; +import jsprit.core.problem.job.Service; +import jsprit.core.problem.misc.JobInsertionContext; +import jsprit.core.problem.solution.route.VehicleRoute; +import jsprit.core.problem.solution.route.activity.DefaultTourActivityFactory; +import jsprit.core.problem.solution.route.activity.End; +import jsprit.core.problem.solution.route.activity.Start; +import jsprit.core.problem.solution.route.activity.TourActivity; +import jsprit.core.problem.solution.route.activity.TourActivityFactory; +import jsprit.core.problem.vehicle.Vehicle; +import jsprit.core.problem.vehicle.VehicleImpl.NoVehicle; +import jsprit.core.util.CalculationUtils; +import jsprit.core.util.Neighborhood; import org.apache.log4j.Logger; -import util.Neighborhood; -import algorithms.ActivityInsertionCostsCalculator.ActivityInsertionCosts; -import algorithms.HardActivityStateLevelConstraint.ConstraintsStatus; -import basics.Job; -import basics.Service; -import basics.costs.VehicleRoutingTransportCosts; -import basics.route.DefaultTourActivityFactory; -import basics.route.Driver; -import basics.route.End; -import basics.route.Start; -import basics.route.TourActivity; -import basics.route.TourActivityFactory; -import basics.route.Vehicle; -import basics.route.VehicleImpl.NoVehicle; -import basics.route.VehicleRoute; @@ -89,7 +94,7 @@ final class ServiceInsertionCalculator implements JobInsertionCostsCalculator{ if(jobToInsert == null) throw new IllegalStateException("jobToInsert is missing."); if(newVehicle == null || newVehicle instanceof NoVehicle) throw new IllegalStateException("newVehicle is missing."); - InsertionContext insertionContext = new InsertionContext(currentRoute, jobToInsert, newVehicle, newDriver, newVehicleDepartureTime); + JobInsertionContext insertionContext = new JobInsertionContext(currentRoute, jobToInsert, newVehicle, newDriver, newVehicleDepartureTime); if(!hardRouteLevelConstraint.fulfilled(insertionContext)){ return InsertionData.createEmptyInsertionData(); } @@ -155,7 +160,7 @@ final class ServiceInsertionCalculator implements JobInsertionCostsCalculator{ return insertionData; } - public ActivityInsertionCosts calculate(InsertionContext iFacts, TourActivity prevAct, TourActivity nextAct, TourActivity newAct, double departureTimeAtPrevAct) { + public ActivityInsertionCosts calculate(JobInsertionContext iFacts, TourActivity prevAct, TourActivity nextAct, TourActivity newAct, double departureTimeAtPrevAct) { return activityInsertionCostsCalculator.getCosts(iFacts, prevAct, nextAct, newAct, departureTimeAtPrevAct); } } diff --git a/jsprit-core/src/main/java/algorithms/ServiceInsertionOnRouteLevelCalculator.java b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/ServiceInsertionOnRouteLevelCalculator.java similarity index 89% rename from jsprit-core/src/main/java/algorithms/ServiceInsertionOnRouteLevelCalculator.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/recreate/ServiceInsertionOnRouteLevelCalculator.java index 7b420ebd..f5dc6b79 100644 --- a/jsprit-core/src/main/java/algorithms/ServiceInsertionOnRouteLevelCalculator.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/ServiceInsertionOnRouteLevelCalculator.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms; +package jsprit.core.algorithm.recreate; import java.util.ArrayList; import java.util.Comparator; @@ -23,25 +23,31 @@ import java.util.List; import java.util.Map; import java.util.PriorityQueue; +import jsprit.core.algorithm.recreate.ActivityInsertionCostsCalculator.ActivityInsertionCosts; +import jsprit.core.problem.constraint.HardActivityStateLevelConstraint; +import jsprit.core.problem.constraint.HardActivityStateLevelConstraint.ConstraintsStatus; +import jsprit.core.problem.constraint.HardRouteStateLevelConstraint; +import jsprit.core.problem.cost.VehicleRoutingActivityCosts; +import jsprit.core.problem.cost.VehicleRoutingTransportCosts; +import jsprit.core.problem.driver.Driver; +import jsprit.core.problem.job.Job; +import jsprit.core.problem.job.Service; +import jsprit.core.problem.misc.JobInsertionContext; +import jsprit.core.problem.solution.route.VehicleRoute; +import jsprit.core.problem.solution.route.activity.DefaultTourActivityFactory; +import jsprit.core.problem.solution.route.activity.End; +import jsprit.core.problem.solution.route.activity.Start; +import jsprit.core.problem.solution.route.activity.TourActivities; +import jsprit.core.problem.solution.route.activity.TourActivity; +import jsprit.core.problem.solution.route.activity.TourActivityFactory; +import jsprit.core.problem.solution.route.state.RouteAndActivityStateGetter; +import jsprit.core.problem.solution.route.state.StateFactory; +import jsprit.core.problem.vehicle.Vehicle; +import jsprit.core.problem.vehicle.VehicleImpl.NoVehicle; +import jsprit.core.util.Neighborhood; + import org.apache.log4j.Logger; -import util.Neighborhood; -import algorithms.ActivityInsertionCostsCalculator.ActivityInsertionCosts; -import algorithms.HardActivityStateLevelConstraint.ConstraintsStatus; -import basics.Job; -import basics.Service; -import basics.costs.VehicleRoutingActivityCosts; -import basics.costs.VehicleRoutingTransportCosts; -import basics.route.DefaultTourActivityFactory; -import basics.route.Driver; -import basics.route.End; -import basics.route.Start; -import basics.route.TourActivities; -import basics.route.TourActivity; -import basics.route.TourActivityFactory; -import basics.route.Vehicle; -import basics.route.VehicleImpl.NoVehicle; -import basics.route.VehicleRoute; @@ -57,7 +63,7 @@ final class ServiceInsertionOnRouteLevelCalculator implements JobInsertionCostsC private TourActivityFactory tourActivityFactory = new DefaultTourActivityFactory(); - private StateGetter stateManager; + private RouteAndActivityStateGetter stateManager; private HardRouteStateLevelConstraint hardRouteLevelConstraint; @@ -108,7 +114,7 @@ final class ServiceInsertionOnRouteLevelCalculator implements JobInsertionCostsC } - public void setStates(StateGetter stateManager){ + public void setStates(RouteAndActivityStateGetter stateManager){ this.stateManager = stateManager; } @@ -135,7 +141,7 @@ final class ServiceInsertionOnRouteLevelCalculator implements JobInsertionCostsC if(jobToInsert == null) throw new IllegalStateException("job is null. cannot calculate the insertion of a null-job."); if(newVehicle == null || newVehicle instanceof NoVehicle) throw new IllegalStateException("no vehicle given. set para vehicle!"); - InsertionContext insertionContext = new InsertionContext(currentRoute, jobToInsert, newVehicle, newDriver, newVehicleDepartureTime); + JobInsertionContext insertionContext = new JobInsertionContext(currentRoute, jobToInsert, newVehicle, newDriver, newVehicleDepartureTime); if(!hardRouteLevelConstraint.fulfilled(insertionContext)){ return InsertionData.createEmptyInsertionData(); } diff --git a/jsprit-core/src/main/java/algorithms/ShipmentInsertionCalculator.java b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/ShipmentInsertionCalculator.java similarity index 87% rename from jsprit-core/src/main/java/algorithms/ShipmentInsertionCalculator.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/recreate/ShipmentInsertionCalculator.java index bd393852..67cba2ca 100644 --- a/jsprit-core/src/main/java/algorithms/ShipmentInsertionCalculator.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/ShipmentInsertionCalculator.java @@ -14,27 +14,32 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms; +package jsprit.core.algorithm.recreate; import java.util.List; +import jsprit.core.algorithm.recreate.ActivityInsertionCostsCalculator.ActivityInsertionCosts; +import jsprit.core.problem.constraint.HardActivityStateLevelConstraint; +import jsprit.core.problem.constraint.HardActivityStateLevelConstraint.ConstraintsStatus; +import jsprit.core.problem.constraint.HardRouteStateLevelConstraint; +import jsprit.core.problem.cost.VehicleRoutingTransportCosts; +import jsprit.core.problem.driver.Driver; +import jsprit.core.problem.job.Job; +import jsprit.core.problem.job.Shipment; +import jsprit.core.problem.misc.JobInsertionContext; +import jsprit.core.problem.solution.route.VehicleRoute; +import jsprit.core.problem.solution.route.activity.DefaultShipmentActivityFactory; +import jsprit.core.problem.solution.route.activity.End; +import jsprit.core.problem.solution.route.activity.Start; +import jsprit.core.problem.solution.route.activity.TourActivity; +import jsprit.core.problem.solution.route.activity.TourShipmentActivityFactory; +import jsprit.core.problem.vehicle.Vehicle; +import jsprit.core.problem.vehicle.VehicleImpl.NoVehicle; +import jsprit.core.util.CalculationUtils; +import jsprit.core.util.Neighborhood; + import org.apache.log4j.Logger; -import util.Neighborhood; -import algorithms.ActivityInsertionCostsCalculator.ActivityInsertionCosts; -import algorithms.HardActivityStateLevelConstraint.ConstraintsStatus; -import basics.Job; -import basics.Shipment; -import basics.costs.VehicleRoutingTransportCosts; -import basics.route.DefaultShipmentActivityFactory; -import basics.route.Driver; -import basics.route.End; -import basics.route.Start; -import basics.route.TourActivity; -import basics.route.TourShipmentActivityFactory; -import basics.route.Vehicle; -import basics.route.VehicleImpl.NoVehicle; -import basics.route.VehicleRoute; @@ -91,7 +96,7 @@ final class ShipmentInsertionCalculator implements JobInsertionCostsCalculator{ if(newVehicle == null || newVehicle instanceof NoVehicle) throw new IllegalStateException("newVehicle is missing."); if(!(jobToInsert instanceof Shipment)) throw new IllegalStateException("jobToInsert should be of type Shipment!"); - InsertionContext insertionContext = new InsertionContext(currentRoute, jobToInsert, newVehicle, newDriver, newVehicleDepartureTime); + JobInsertionContext insertionContext = new JobInsertionContext(currentRoute, jobToInsert, newVehicle, newDriver, newVehicleDepartureTime); if(!hardRouteLevelConstraint.fulfilled(insertionContext)){ return InsertionData.createEmptyInsertionData(); } @@ -201,7 +206,7 @@ final class ShipmentInsertionCalculator implements JobInsertionCostsCalculator{ return insertionData; } - private ActivityInsertionCosts calculate(InsertionContext iFacts, TourActivity prevAct, TourActivity newAct, TourActivity nextAct, double departureTimeAtPrevAct) { + private ActivityInsertionCosts calculate(JobInsertionContext iFacts, TourActivity prevAct, TourActivity newAct, TourActivity nextAct, double departureTimeAtPrevAct) { return activityInsertionCostsCalculator.getCosts(iFacts, prevAct, nextAct, newAct, departureTimeAtPrevAct); } diff --git a/jsprit-core/src/main/java/algorithms/VehicleSwitched.java b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/VehicleSwitched.java similarity index 74% rename from jsprit-core/src/main/java/algorithms/VehicleSwitched.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/recreate/VehicleSwitched.java index a9aa86bd..d368ce54 100644 --- a/jsprit-core/src/main/java/algorithms/VehicleSwitched.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/VehicleSwitched.java @@ -14,18 +14,19 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms; +package jsprit.core.algorithm.recreate; -import basics.route.Vehicle; -import basics.route.VehicleFleetManager; -import basics.route.VehicleRoute; +import jsprit.core.algorithm.recreate.listener.VehicleSwitchedListener; +import jsprit.core.problem.solution.route.VehicleRoute; +import jsprit.core.problem.vehicle.Vehicle; +import jsprit.core.problem.vehicle.VehicleFleetManager; -class VehicleSwitched implements VehicleSwitchedListener{ +public class VehicleSwitched implements VehicleSwitchedListener{ private VehicleFleetManager fleetManager; - VehicleSwitched(VehicleFleetManager fleetManager){ + public VehicleSwitched(VehicleFleetManager fleetManager){ this.fleetManager = fleetManager; } diff --git a/jsprit-core/src/main/java/algorithms/VehicleTypeDependentJobInsertionCalculator.java b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/VehicleTypeDependentJobInsertionCalculator.java similarity index 87% rename from jsprit-core/src/main/java/algorithms/VehicleTypeDependentJobInsertionCalculator.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/recreate/VehicleTypeDependentJobInsertionCalculator.java index b729b94a..8065ac43 100644 --- a/jsprit-core/src/main/java/algorithms/VehicleTypeDependentJobInsertionCalculator.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/VehicleTypeDependentJobInsertionCalculator.java @@ -14,20 +14,21 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms; +package jsprit.core.algorithm.recreate; import java.util.ArrayList; import java.util.Collection; +import jsprit.core.algorithm.recreate.InsertionData.NoInsertionFound; +import jsprit.core.problem.driver.Driver; +import jsprit.core.problem.job.Job; +import jsprit.core.problem.solution.route.VehicleRoute; +import jsprit.core.problem.vehicle.Vehicle; +import jsprit.core.problem.vehicle.VehicleFleetManager; +import jsprit.core.problem.vehicle.VehicleImpl.NoVehicle; + import org.apache.log4j.Logger; -import algorithms.InsertionData.NoInsertionFound; -import basics.Job; -import basics.route.Driver; -import basics.route.Vehicle; -import basics.route.VehicleFleetManager; -import basics.route.VehicleImpl.NoVehicle; -import basics.route.VehicleRoute; diff --git a/jsprit-core/src/main/java/algorithms/BeforeJobInsertionListener.java b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/listener/BeforeJobInsertionListener.java similarity index 84% rename from jsprit-core/src/main/java/algorithms/BeforeJobInsertionListener.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/recreate/listener/BeforeJobInsertionListener.java index 0ff16539..befbc0cf 100644 --- a/jsprit-core/src/main/java/algorithms/BeforeJobInsertionListener.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/listener/BeforeJobInsertionListener.java @@ -14,11 +14,11 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms; +package jsprit.core.algorithm.recreate.listener; -import basics.Job; -import basics.algo.InsertionListener; -import basics.route.VehicleRoute; +import jsprit.core.algorithm.recreate.InsertionData; +import jsprit.core.problem.job.Job; +import jsprit.core.problem.solution.route.VehicleRoute; interface BeforeJobInsertionListener extends InsertionListener{ diff --git a/jsprit-core/src/main/java/basics/algo/InsertionEndsListener.java b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/listener/InsertionEndsListener.java similarity index 90% rename from jsprit-core/src/main/java/basics/algo/InsertionEndsListener.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/recreate/listener/InsertionEndsListener.java index 58f64bc2..7420f1b2 100644 --- a/jsprit-core/src/main/java/basics/algo/InsertionEndsListener.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/listener/InsertionEndsListener.java @@ -14,11 +14,12 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.algo; +package jsprit.core.algorithm.recreate.listener; import java.util.Collection; -import basics.route.VehicleRoute; +import jsprit.core.problem.solution.route.VehicleRoute; + public interface InsertionEndsListener extends InsertionListener { diff --git a/jsprit-core/src/main/java/basics/algo/InsertionListener.java b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/listener/InsertionListener.java similarity index 89% rename from jsprit-core/src/main/java/basics/algo/InsertionListener.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/recreate/listener/InsertionListener.java index 6c75a5e7..eb32b31c 100644 --- a/jsprit-core/src/main/java/basics/algo/InsertionListener.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/listener/InsertionListener.java @@ -14,7 +14,9 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.algo; +package jsprit.core.algorithm.recreate.listener; + +import jsprit.core.algorithm.listener.SearchStrategyModuleListener; diff --git a/jsprit-core/src/main/java/algorithms/InsertionListeners.java b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/listener/InsertionListeners.java similarity index 90% rename from jsprit-core/src/main/java/algorithms/InsertionListeners.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/recreate/listener/InsertionListeners.java index 6997fccb..67443c46 100644 --- a/jsprit-core/src/main/java/algorithms/InsertionListeners.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/listener/InsertionListeners.java @@ -14,20 +14,18 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms; +package jsprit.core.algorithm.recreate.listener; import java.util.ArrayList; import java.util.Collection; -import basics.Job; -import basics.algo.InsertionEndsListener; -import basics.algo.InsertionListener; -import basics.algo.InsertionStartsListener; -import basics.algo.JobInsertedListener; -import basics.route.Vehicle; -import basics.route.VehicleRoute; +import jsprit.core.algorithm.recreate.InsertionData; +import jsprit.core.problem.job.Job; +import jsprit.core.problem.solution.route.VehicleRoute; +import jsprit.core.problem.vehicle.Vehicle; -class InsertionListeners { + +public class InsertionListeners { private Collection listeners = new ArrayList(); diff --git a/jsprit-core/src/main/java/basics/algo/InsertionStartsListener.java b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/listener/InsertionStartsListener.java similarity index 88% rename from jsprit-core/src/main/java/basics/algo/InsertionStartsListener.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/recreate/listener/InsertionStartsListener.java index 0923a02f..6751c422 100644 --- a/jsprit-core/src/main/java/basics/algo/InsertionStartsListener.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/listener/InsertionStartsListener.java @@ -14,12 +14,13 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.algo; +package jsprit.core.algorithm.recreate.listener; import java.util.Collection; -import basics.Job; -import basics.route.VehicleRoute; +import jsprit.core.problem.job.Job; +import jsprit.core.problem.solution.route.VehicleRoute; + public interface InsertionStartsListener extends InsertionListener { diff --git a/jsprit-core/src/main/java/basics/algo/JobInsertedListener.java b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/listener/JobInsertedListener.java similarity index 88% rename from jsprit-core/src/main/java/basics/algo/JobInsertedListener.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/recreate/listener/JobInsertedListener.java index c6c86924..dd2663d9 100644 --- a/jsprit-core/src/main/java/basics/algo/JobInsertedListener.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/listener/JobInsertedListener.java @@ -14,10 +14,10 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.algo; +package jsprit.core.algorithm.recreate.listener; -import basics.Job; -import basics.route.VehicleRoute; +import jsprit.core.problem.job.Job; +import jsprit.core.problem.solution.route.VehicleRoute; diff --git a/jsprit-core/src/main/java/algorithms/VehicleSwitchedListener.java b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/listener/VehicleSwitchedListener.java similarity index 81% rename from jsprit-core/src/main/java/algorithms/VehicleSwitchedListener.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/recreate/listener/VehicleSwitchedListener.java index edbd32ac..d57fa11e 100644 --- a/jsprit-core/src/main/java/algorithms/VehicleSwitchedListener.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/listener/VehicleSwitchedListener.java @@ -14,13 +14,12 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms; +package jsprit.core.algorithm.recreate.listener; -import basics.algo.InsertionListener; -import basics.route.Vehicle; -import basics.route.VehicleRoute; +import jsprit.core.problem.solution.route.VehicleRoute; +import jsprit.core.problem.vehicle.Vehicle; -interface VehicleSwitchedListener extends InsertionListener{ +public interface VehicleSwitchedListener extends InsertionListener{ public void vehicleSwitched(VehicleRoute vehicleRoute, Vehicle oldVehicle, Vehicle newVehicle); diff --git a/jsprit-core/src/main/java/algorithms/RadialRuinStrategyFactory.java b/jsprit-core/src/main/java/jsprit/core/algorithm/ruin/RadialRuinStrategyFactory.java similarity index 75% rename from jsprit-core/src/main/java/algorithms/RadialRuinStrategyFactory.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/ruin/RadialRuinStrategyFactory.java index c541c4c9..418fc956 100644 --- a/jsprit-core/src/main/java/algorithms/RadialRuinStrategyFactory.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/ruin/RadialRuinStrategyFactory.java @@ -1,6 +1,7 @@ -package algorithms; +package jsprit.core.algorithm.ruin; -import basics.VehicleRoutingProblem; +import jsprit.core.algorithm.ruin.distance.JobDistance; +import jsprit.core.problem.VehicleRoutingProblem; public class RadialRuinStrategyFactory implements RuinStrategyFactory{ diff --git a/jsprit-core/src/main/java/algorithms/RandomRuinStrategyFactory.java b/jsprit-core/src/main/java/jsprit/core/algorithm/ruin/RandomRuinStrategyFactory.java similarity index 78% rename from jsprit-core/src/main/java/algorithms/RandomRuinStrategyFactory.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/ruin/RandomRuinStrategyFactory.java index 5a32c9f2..b475cc03 100644 --- a/jsprit-core/src/main/java/algorithms/RandomRuinStrategyFactory.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/ruin/RandomRuinStrategyFactory.java @@ -1,6 +1,6 @@ -package algorithms; +package jsprit.core.algorithm.ruin; -import basics.VehicleRoutingProblem; +import jsprit.core.problem.VehicleRoutingProblem; public class RandomRuinStrategyFactory implements RuinStrategyFactory{ diff --git a/jsprit-core/src/main/java/algorithms/RuinRadial.java b/jsprit-core/src/main/java/jsprit/core/algorithm/ruin/RuinRadial.java similarity index 96% rename from jsprit-core/src/main/java/algorithms/RuinRadial.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/ruin/RuinRadial.java index b7a9f8b0..601a4b40 100644 --- a/jsprit-core/src/main/java/algorithms/RuinRadial.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/ruin/RuinRadial.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms; +package jsprit.core.algorithm.ruin; import java.util.ArrayList; import java.util.Collection; @@ -27,15 +27,17 @@ import java.util.Map; import java.util.Random; import java.util.TreeSet; +import jsprit.core.algorithm.ruin.distance.JobDistance; +import jsprit.core.algorithm.ruin.listener.RuinListener; +import jsprit.core.algorithm.ruin.listener.RuinListeners; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.job.Job; +import jsprit.core.problem.solution.route.VehicleRoute; +import jsprit.core.util.RandomNumberGeneration; +import jsprit.core.util.StopWatch; + import org.apache.log4j.Logger; -import util.RandomNumberGeneration; -import util.StopWatch; -import basics.Job; -import basics.VehicleRoutingProblem; -import basics.algo.RuinListener; -import basics.algo.RuinListeners; -import basics.route.VehicleRoute; /** diff --git a/jsprit-core/src/main/java/algorithms/RuinRandom.java b/jsprit-core/src/main/java/jsprit/core/algorithm/ruin/RuinRandom.java similarity index 93% rename from jsprit-core/src/main/java/algorithms/RuinRandom.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/ruin/RuinRandom.java index bbe1b2c6..f4762dee 100644 --- a/jsprit-core/src/main/java/algorithms/RuinRandom.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/ruin/RuinRandom.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms; +package jsprit.core.algorithm.ruin; import java.util.ArrayList; import java.util.Collection; @@ -22,14 +22,15 @@ import java.util.LinkedList; import java.util.List; import java.util.Random; +import jsprit.core.algorithm.ruin.listener.RuinListener; +import jsprit.core.algorithm.ruin.listener.RuinListeners; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.job.Job; +import jsprit.core.problem.solution.route.VehicleRoute; +import jsprit.core.util.RandomNumberGeneration; + import org.apache.log4j.Logger; -import util.RandomNumberGeneration; -import basics.Job; -import basics.VehicleRoutingProblem; -import basics.algo.RuinListener; -import basics.algo.RuinListeners; -import basics.route.VehicleRoute; /** diff --git a/jsprit-core/src/main/java/algorithms/RuinStrategy.java b/jsprit-core/src/main/java/jsprit/core/algorithm/ruin/RuinStrategy.java similarity index 90% rename from jsprit-core/src/main/java/algorithms/RuinStrategy.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/ruin/RuinStrategy.java index 3f03b5dc..2e485268 100644 --- a/jsprit-core/src/main/java/algorithms/RuinStrategy.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/ruin/RuinStrategy.java @@ -14,13 +14,14 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms; +package jsprit.core.algorithm.ruin; import java.util.Collection; -import basics.Job; -import basics.algo.RuinListener; -import basics.route.VehicleRoute; +import jsprit.core.algorithm.ruin.listener.RuinListener; +import jsprit.core.problem.job.Job; +import jsprit.core.problem.solution.route.VehicleRoute; + diff --git a/jsprit-core/src/main/java/algorithms/RuinStrategyFactory.java b/jsprit-core/src/main/java/jsprit/core/algorithm/ruin/RuinStrategyFactory.java similarity index 92% rename from jsprit-core/src/main/java/algorithms/RuinStrategyFactory.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/ruin/RuinStrategyFactory.java index 26cf1212..21c1f1cf 100644 --- a/jsprit-core/src/main/java/algorithms/RuinStrategyFactory.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/ruin/RuinStrategyFactory.java @@ -14,9 +14,9 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms; +package jsprit.core.algorithm.ruin; -import basics.VehicleRoutingProblem; +import jsprit.core.problem.VehicleRoutingProblem; public interface RuinStrategyFactory { diff --git a/jsprit-core/src/main/java/algorithms/AvgJobDistance.java b/jsprit-core/src/main/java/jsprit/core/algorithm/ruin/distance/AvgServiceAndShipmentDistance.java similarity index 86% rename from jsprit-core/src/main/java/algorithms/AvgJobDistance.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/ruin/distance/AvgServiceAndShipmentDistance.java index da4d68c0..bb380d7a 100644 --- a/jsprit-core/src/main/java/algorithms/AvgJobDistance.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/ruin/distance/AvgServiceAndShipmentDistance.java @@ -14,16 +14,17 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms; +package jsprit.core.algorithm.ruin.distance; + +import jsprit.core.problem.cost.VehicleRoutingTransportCosts; +import jsprit.core.problem.job.Job; +import jsprit.core.problem.job.Service; +import jsprit.core.problem.job.Shipment; +import jsprit.core.util.Coordinate; +import jsprit.core.util.EuclideanDistanceCalculator; import org.apache.log4j.Logger; -import util.Coordinate; -import util.EuclideanDistanceCalculator; -import basics.Job; -import basics.Service; -import basics.Shipment; -import basics.costs.VehicleRoutingTransportCosts; /** @@ -34,13 +35,13 @@ import basics.costs.VehicleRoutingTransportCosts; * @author stefan schroeder * */ -public class AvgJobDistance implements JobDistance { +public class AvgServiceAndShipmentDistance implements JobDistance { - private static Logger log = Logger.getLogger(AvgJobDistance.class); + private static Logger log = Logger.getLogger(AvgServiceAndShipmentDistance.class); private VehicleRoutingTransportCosts costs; - public AvgJobDistance(VehicleRoutingTransportCosts costs) { + public AvgServiceAndShipmentDistance(VehicleRoutingTransportCosts costs) { super(); this.costs = costs; diff --git a/jsprit-core/src/main/java/algorithms/JobDistanceAvgCosts.java b/jsprit-core/src/main/java/jsprit/core/algorithm/ruin/distance/AvgServiceDistance.java similarity index 84% rename from jsprit-core/src/main/java/algorithms/JobDistanceAvgCosts.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/ruin/distance/AvgServiceDistance.java index 38dcee47..4c41f656 100644 --- a/jsprit-core/src/main/java/algorithms/JobDistanceAvgCosts.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/ruin/distance/AvgServiceDistance.java @@ -14,13 +14,14 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms; +package jsprit.core.algorithm.ruin.distance; + +import jsprit.core.problem.cost.VehicleRoutingTransportCosts; +import jsprit.core.problem.job.Job; +import jsprit.core.problem.job.Service; import org.apache.log4j.Logger; -import basics.Job; -import basics.Service; -import basics.costs.VehicleRoutingTransportCosts; /** @@ -31,13 +32,13 @@ import basics.costs.VehicleRoutingTransportCosts; * @author stefan schroeder * */ -public class JobDistanceAvgCosts implements JobDistance { +public class AvgServiceDistance implements JobDistance { - private static Logger log = Logger.getLogger(JobDistanceAvgCosts.class); + private static Logger log = Logger.getLogger(AvgServiceDistance.class); private VehicleRoutingTransportCosts costs; - public JobDistanceAvgCosts(VehicleRoutingTransportCosts costs) { + public AvgServiceDistance(VehicleRoutingTransportCosts costs) { super(); this.costs = costs; @@ -61,7 +62,7 @@ public class JobDistanceAvgCosts implements JobDistance { } } else { throw new UnsupportedOperationException( - "currently, this class just works with shipments and services."); + "currently, this class just works services."); } return avgCost; } diff --git a/jsprit-core/src/main/java/algorithms/EuclideanServiceDistance.java b/jsprit-core/src/main/java/jsprit/core/algorithm/ruin/distance/EuclideanServiceDistance.java similarity index 87% rename from jsprit-core/src/main/java/algorithms/EuclideanServiceDistance.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/ruin/distance/EuclideanServiceDistance.java index 0f4641b3..2369e8d6 100644 --- a/jsprit-core/src/main/java/algorithms/EuclideanServiceDistance.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/ruin/distance/EuclideanServiceDistance.java @@ -14,13 +14,13 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms; +package jsprit.core.algorithm.ruin.distance; -import util.EuclideanDistanceCalculator; -import basics.Job; -import basics.Service; +import jsprit.core.problem.job.Job; +import jsprit.core.problem.job.Service; +import jsprit.core.util.EuclideanDistanceCalculator; -class EuclideanServiceDistance implements JobDistance { +public class EuclideanServiceDistance implements JobDistance { public EuclideanServiceDistance() { super(); diff --git a/jsprit-core/src/main/java/algorithms/JobDistance.java b/jsprit-core/src/main/java/jsprit/core/algorithm/ruin/distance/JobDistance.java similarity index 92% rename from jsprit-core/src/main/java/algorithms/JobDistance.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/ruin/distance/JobDistance.java index 3ac28dbe..45b4428b 100644 --- a/jsprit-core/src/main/java/algorithms/JobDistance.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/ruin/distance/JobDistance.java @@ -14,9 +14,9 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms; +package jsprit.core.algorithm.ruin.distance; -import basics.Job; +import jsprit.core.problem.job.Job; diff --git a/jsprit-core/src/main/java/basics/algo/RuinListener.java b/jsprit-core/src/main/java/jsprit/core/algorithm/ruin/listener/RuinListener.java similarity index 78% rename from jsprit-core/src/main/java/basics/algo/RuinListener.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/ruin/listener/RuinListener.java index bb75ca78..7fb0779e 100644 --- a/jsprit-core/src/main/java/basics/algo/RuinListener.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/ruin/listener/RuinListener.java @@ -1,9 +1,11 @@ -package basics.algo; +package jsprit.core.algorithm.ruin.listener; import java.util.Collection; -import basics.Job; -import basics.route.VehicleRoute; +import jsprit.core.algorithm.listener.SearchStrategyModuleListener; +import jsprit.core.problem.job.Job; +import jsprit.core.problem.solution.route.VehicleRoute; + /** * Listener that listens to the ruin-process. It informs whoever is interested about start, end and about a removal of a job. diff --git a/jsprit-core/src/main/java/basics/algo/RuinListeners.java b/jsprit-core/src/main/java/jsprit/core/algorithm/ruin/listener/RuinListeners.java similarity index 93% rename from jsprit-core/src/main/java/basics/algo/RuinListeners.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/ruin/listener/RuinListeners.java index fc442cc9..b5b49392 100644 --- a/jsprit-core/src/main/java/basics/algo/RuinListeners.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/ruin/listener/RuinListeners.java @@ -18,14 +18,15 @@ * Contributors: * Stefan Schroeder - initial API and implementation ******************************************************************************/ -package basics.algo; +package jsprit.core.algorithm.ruin.listener; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; -import basics.Job; -import basics.route.VehicleRoute; +import jsprit.core.problem.job.Job; +import jsprit.core.problem.solution.route.VehicleRoute; + public class RuinListeners { diff --git a/jsprit-core/src/main/java/algorithms/selectors/SelectBest.java b/jsprit-core/src/main/java/jsprit/core/algorithm/selector/SelectBest.java similarity index 94% rename from jsprit-core/src/main/java/algorithms/selectors/SelectBest.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/selector/SelectBest.java index 93fc29aa..e2db896e 100644 --- a/jsprit-core/src/main/java/algorithms/selectors/SelectBest.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/selector/SelectBest.java @@ -14,11 +14,12 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms.selectors; +package jsprit.core.algorithm.selector; import java.util.Collection; -import basics.VehicleRoutingProblemSolution; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; + diff --git a/jsprit-core/src/main/java/algorithms/selectors/SelectRandomly.java b/jsprit-core/src/main/java/jsprit/core/algorithm/selector/SelectRandomly.java similarity index 91% rename from jsprit-core/src/main/java/algorithms/selectors/SelectRandomly.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/selector/SelectRandomly.java index 97676297..09731749 100644 --- a/jsprit-core/src/main/java/algorithms/selectors/SelectRandomly.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/selector/SelectRandomly.java @@ -14,15 +14,16 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms.selectors; +package jsprit.core.algorithm.selector; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Random; -import util.RandomNumberGeneration; -import basics.VehicleRoutingProblemSolution; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; +import jsprit.core.util.RandomNumberGeneration; + diff --git a/jsprit-core/src/main/java/algorithms/selectors/SolutionSelector.java b/jsprit-core/src/main/java/jsprit/core/algorithm/selector/SolutionSelector.java similarity index 90% rename from jsprit-core/src/main/java/algorithms/selectors/SolutionSelector.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/selector/SolutionSelector.java index 48d26709..410a7a7a 100644 --- a/jsprit-core/src/main/java/algorithms/selectors/SolutionSelector.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/selector/SolutionSelector.java @@ -14,11 +14,12 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms.selectors; +package jsprit.core.algorithm.selector; import java.util.Collection; -import basics.VehicleRoutingProblemSolution; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; + public interface SolutionSelector { diff --git a/jsprit-core/src/main/java/algorithms/StateManager.java b/jsprit-core/src/main/java/jsprit/core/algorithm/state/StateManager.java similarity index 62% rename from jsprit-core/src/main/java/algorithms/StateManager.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/state/StateManager.java index 8f259060..16ebe471 100644 --- a/jsprit-core/src/main/java/algorithms/StateManager.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/state/StateManager.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms; +package jsprit.core.algorithm.state; import java.util.ArrayList; import java.util.Collection; @@ -22,64 +22,32 @@ import java.util.Collections; import java.util.HashMap; import java.util.Map; -import basics.Job; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblemSolution; -import basics.algo.InsertionEndsListener; -import basics.algo.InsertionListener; -import basics.algo.InsertionListeners; -import basics.algo.InsertionStartsListener; -import basics.algo.IterationStartsListener; -import basics.algo.JobInsertedListener; -import basics.algo.RuinListener; -import basics.algo.RuinListeners; -import basics.route.ActivityVisitor; -import basics.route.ReverseActivityVisitor; -import basics.route.ReverseRouteActivityVisitor; -import basics.route.RouteActivityVisitor; -import basics.route.RouteVisitor; -import basics.route.TourActivity; -import basics.route.VehicleRoute; +import jsprit.core.algorithm.listener.IterationStartsListener; +import jsprit.core.algorithm.recreate.listener.InsertionEndsListener; +import jsprit.core.algorithm.recreate.listener.InsertionListener; +import jsprit.core.algorithm.recreate.listener.InsertionListeners; +import jsprit.core.algorithm.recreate.listener.InsertionStartsListener; +import jsprit.core.algorithm.recreate.listener.JobInsertedListener; +import jsprit.core.algorithm.ruin.listener.RuinListener; +import jsprit.core.algorithm.ruin.listener.RuinListeners; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.job.Job; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; +import jsprit.core.problem.solution.route.ReverseRouteActivityVisitor; +import jsprit.core.problem.solution.route.RouteActivityVisitor; +import jsprit.core.problem.solution.route.RouteVisitor; +import jsprit.core.problem.solution.route.VehicleRoute; +import jsprit.core.problem.solution.route.activity.ActivityVisitor; +import jsprit.core.problem.solution.route.activity.ReverseActivityVisitor; +import jsprit.core.problem.solution.route.activity.TourActivity; +import jsprit.core.problem.solution.route.state.RouteAndActivityStateGetter; +import jsprit.core.problem.solution.route.state.StateFactory; +import jsprit.core.problem.solution.route.state.StateFactory.State; +import jsprit.core.problem.solution.route.state.StateFactory.StateId; +import jsprit.core.problem.solution.route.state.StateFactory.States; -public class StateManager implements StateGetter, IterationStartsListener, RuinListener, InsertionStartsListener, JobInsertedListener, InsertionEndsListener { - - - private interface States { - - State getState(StateId key); - - } - - static class StateImpl implements State{ - double state; - - public StateImpl(double state) { - super(); - this.state = state; - } - - @Override - public double toDouble() { - return state; - } - - } - - private static class StatesImpl implements States{ - - private Map states = new HashMap(); - - public void putState(StateId key, State state) { - states.put(key, state); - } - - @Override - public State getState(StateId key) { - return states.get(key); - } - - } +public class StateManager implements RouteAndActivityStateGetter, IterationStartsListener, RuinListener, InsertionStartsListener, JobInsertedListener, InsertionEndsListener { private Map vehicleRouteStates = new HashMap(); @@ -97,15 +65,24 @@ public class StateManager implements StateGetter, IterationStartsListener, RuinL private Collection updaters = new ArrayList(); - private Map defaultRouteStates = new HashMap(); + private Map defaultRouteStates = new HashMap(); private Map defaultActivityStates = new HashMap(); + private VehicleRoutingProblem vrp; + + public StateManager(VehicleRoutingProblem vrp) { + super(); + this.vrp = vrp; + } + public void addDefaultRouteState(StateId stateId, State defaultState){ + if(StateFactory.isReservedId(stateId)) StateFactory.throwReservedIdException(stateId.toString()); defaultRouteStates.put(stateId, defaultState); } public void addDefaultActivityState(StateId stateId, State defaultState){ + if(StateFactory.isReservedId(stateId)) StateFactory.throwReservedIdException(stateId.toString()); defaultActivityStates.put(stateId, defaultState); } @@ -119,7 +96,7 @@ public class StateManager implements StateGetter, IterationStartsListener, RuinL if(!activityStates.containsKey(act)){ return getDefaultActState(stateId,act); } - StatesImpl actStates = (StatesImpl) activityStates.get(act); + States actStates = activityStates.get(act); State state = actStates.getState(stateId); if(state == null){ return getDefaultActState(stateId,act); @@ -127,29 +104,38 @@ public class StateManager implements StateGetter, IterationStartsListener, RuinL return state; } - public void putActivityState(TourActivity act, StateId stateId, State state){ + void putInternalActivityState(TourActivity act, StateId stateId, State state){ if(!activityStates.containsKey(act)){ - activityStates.put(act, new StatesImpl()); + activityStates.put(act, StateFactory.createStates()); } - StatesImpl actStates = (StatesImpl) activityStates.get(act); + States actStates = activityStates.get(act); actStates.putState(stateId, state); } - - - public void putRouteState(VehicleRoute route, StateId stateId, State state){ + + public void putActivityState(TourActivity act, StateId stateId, State state){ + if(StateFactory.isReservedId(stateId)) StateFactory.throwReservedIdException(stateId.toString()); + putInternalActivityState(act, stateId, state); + } + + void putInternalRouteState(VehicleRoute route, StateId stateId, State state){ if(!vehicleRouteStates.containsKey(route)){ - vehicleRouteStates.put(route, new StatesImpl()); + vehicleRouteStates.put(route, StateFactory.createStates()); } - StatesImpl routeStates = (StatesImpl) vehicleRouteStates.get(route); + States routeStates = (States) vehicleRouteStates.get(route); routeStates.putState(stateId, state); } + public void putRouteState(VehicleRoute route, StateId stateId, State state){ + if(StateFactory.isReservedId(stateId)) StateFactory.throwReservedIdException(stateId.toString()); + putInternalRouteState(route, stateId, state); + } + @Override public State getRouteState(VehicleRoute route, StateId stateId) { if(!vehicleRouteStates.containsKey(route)){ return getDefaultRouteState(stateId,route); } - StatesImpl routeStates = (StatesImpl) vehicleRouteStates.get(route); + States routeStates = vehicleRouteStates.get(route); State state = routeStates.getState(stateId); if(state == null){ return getDefaultRouteState(stateId, route); @@ -225,31 +211,31 @@ public class StateManager implements StateGetter, IterationStartsListener, RuinL } private State getDefaultActState(StateId stateId, TourActivity act){ - if(stateId.equals(StateFactory.LOAD)) return new StateImpl(0); - if(stateId.equals(StateFactory.COSTS)) return new StateImpl(0); - if(stateId.equals(StateFactory.DURATION)) return new StateImpl(0); - if(stateId.equals(StateFactory.EARLIEST_OPERATION_START_TIME)) return new StateImpl(act.getTheoreticalEarliestOperationStartTime()); - if(stateId.equals(StateFactory.LATEST_OPERATION_START_TIME)) return new StateImpl(act.getTheoreticalLatestOperationStartTime()); - if(stateId.equals(StateFactory.FUTURE_PICKS)) return new StateImpl(0); - if(stateId.equals(StateFactory.PAST_DELIVERIES)) return new StateImpl(0); + if(stateId.equals(StateFactory.LOAD)) return StateFactory.createState(0); + if(stateId.equals(StateFactory.COSTS)) return StateFactory.createState(0); + if(stateId.equals(StateFactory.DURATION)) return StateFactory.createState(0); + if(stateId.equals(StateFactory.EARLIEST_OPERATION_START_TIME)) return StateFactory.createState(act.getTheoreticalEarliestOperationStartTime()); + if(stateId.equals(StateFactory.LATEST_OPERATION_START_TIME)) return StateFactory.createState(act.getTheoreticalLatestOperationStartTime()); + if(stateId.equals(StateFactory.FUTURE_MAXLOAD)) return StateFactory.createState(0); + if(stateId.equals(StateFactory.PAST_MAXLOAD)) return StateFactory.createState(0); if(defaultActivityStates.containsKey(stateId)) return defaultActivityStates.get(stateId); return null; } private State getDefaultRouteState(StateId stateId, VehicleRoute route){ - if(stateId.equals(StateFactory.MAXLOAD)) return new StateImpl(0); - if(stateId.equals(StateFactory.LOAD)) return new StateImpl(0); - if(stateId.equals(StateFactory.LOAD_AT_END)) return new StateImpl(0); - if(stateId.equals(StateFactory.LOAD_AT_BEGINNING)) return new StateImpl(0); - if(stateId.equals(StateFactory.COSTS)) return new StateImpl(0); - if(stateId.equals(StateFactory.DURATION)) return new StateImpl(0); + if(stateId.equals(StateFactory.MAXLOAD)) return StateFactory.createState(0); + if(stateId.equals(StateFactory.LOAD)) return StateFactory.createState(0); + if(stateId.equals(StateFactory.LOAD_AT_END)) return StateFactory.createState(0); + if(stateId.equals(StateFactory.LOAD_AT_BEGINNING)) return StateFactory.createState(0); + if(stateId.equals(StateFactory.COSTS)) return StateFactory.createState(0); + if(stateId.equals(StateFactory.DURATION)) return StateFactory.createState(0); if(defaultRouteStates.containsKey(stateId)) return defaultRouteStates.get(stateId); return null; } @Override public void informJobInserted(Job job2insert, VehicleRoute inRoute, double additionalCosts, double additionalTime) { - insertionListeners.jobInserted(job2insert, inRoute, additionalCosts, additionalTime); + insertionListeners.informJobInserted(job2insert, inRoute, additionalCosts, additionalTime); for(RouteVisitor v : routeVisitors){ v.visit(inRoute); } routeActivityVisitor.visit(inRoute); revRouteActivityVisitor.visit(inRoute); @@ -257,7 +243,7 @@ public class StateManager implements StateGetter, IterationStartsListener, RuinL @Override public void informInsertionStarts(Collection vehicleRoutes,Collection unassignedJobs) { - insertionListeners.insertionStarts(vehicleRoutes, unassignedJobs); + insertionListeners.informInsertionStarts(vehicleRoutes, unassignedJobs); for(VehicleRoute route : vehicleRoutes){ for(RouteVisitor v : routeVisitors){ v.visit(route); } routeActivityVisitor.visit(route); @@ -287,6 +273,19 @@ public class StateManager implements StateGetter, IterationStartsListener, RuinL @Override public void informInsertionEnds(Collection vehicleRoutes) { - insertionListeners.insertionEnds(vehicleRoutes); + insertionListeners.informInsertionEndsListeners(vehicleRoutes); } + + public void updateLoadStates() { + UpdateLoads updateLoads = new UpdateLoads(this); + addActivityVisitor(updateLoads); + addListener(updateLoads); + addActivityVisitor(new UpdatePrevMaxLoad(this)); + addActivityVisitor(new UpdateMaxLoad(this)); + addActivityVisitor(new UpdateMaxLoad_(this)); + } + + public void updateTimeWindowStates() { + addActivityVisitor(new UpdateTimeWindow(this, vrp.getTransportCosts())); + } } diff --git a/jsprit-core/src/main/java/jsprit/core/algorithm/state/StateUpdater.java b/jsprit-core/src/main/java/jsprit/core/algorithm/state/StateUpdater.java new file mode 100644 index 00000000..3d170794 --- /dev/null +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/state/StateUpdater.java @@ -0,0 +1,5 @@ +package jsprit.core.algorithm.state; + +public interface StateUpdater { + +} diff --git a/jsprit-core/src/main/java/algorithms/UpdateActivityTimes.java b/jsprit-core/src/main/java/jsprit/core/algorithm/state/UpdateActivityTimes.java similarity index 74% rename from jsprit-core/src/main/java/algorithms/UpdateActivityTimes.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/state/UpdateActivityTimes.java index 8d18d0c9..2698cc4a 100644 --- a/jsprit-core/src/main/java/algorithms/UpdateActivityTimes.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/state/UpdateActivityTimes.java @@ -1,12 +1,11 @@ -package algorithms; +package jsprit.core.algorithm.state; -import org.apache.log4j.Logger; +import jsprit.core.problem.cost.ForwardTransportTime; +import jsprit.core.problem.solution.route.VehicleRoute; +import jsprit.core.problem.solution.route.activity.ActivityVisitor; +import jsprit.core.problem.solution.route.activity.TourActivity; +import jsprit.core.util.ActivityTimeTracker; -import util.ActivityTimeTracker; -import basics.costs.ForwardTransportTime; -import basics.route.ActivityVisitor; -import basics.route.TourActivity; -import basics.route.VehicleRoute; /** * Updates arrival and end times of activities. @@ -16,10 +15,8 @@ import basics.route.VehicleRoute; * @author stefan * */ -class UpdateActivityTimes implements ActivityVisitor, StateUpdater{ +public class UpdateActivityTimes implements ActivityVisitor, StateUpdater{ - private Logger log = Logger.getLogger(UpdateActivityTimes.class); - private ActivityTimeTracker timeTracker; private VehicleRoute route; diff --git a/jsprit-core/src/main/java/jsprit/core/algorithm/state/UpdateEarliestStartTime.java b/jsprit-core/src/main/java/jsprit/core/algorithm/state/UpdateEarliestStartTime.java new file mode 100644 index 00000000..a62281d1 --- /dev/null +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/state/UpdateEarliestStartTime.java @@ -0,0 +1,37 @@ +package jsprit.core.algorithm.state; + +import jsprit.core.problem.cost.VehicleRoutingTransportCosts; +import jsprit.core.problem.solution.route.VehicleRoute; +import jsprit.core.problem.solution.route.activity.ActivityVisitor; +import jsprit.core.problem.solution.route.activity.TourActivity; +import jsprit.core.problem.solution.route.state.StateFactory; +import jsprit.core.util.ActivityTimeTracker; + +class UpdateEarliestStartTime implements ActivityVisitor,StateUpdater{ + + private StateManager states; + + private ActivityTimeTracker timeTracker; + + public UpdateEarliestStartTime(StateManager states, VehicleRoutingTransportCosts transportCosts) { + super(); + this.states = states; + timeTracker = new ActivityTimeTracker(transportCosts); + } + + @Override + public void begin(VehicleRoute route) { + timeTracker.begin(route); + } + + @Override + public void visit(TourActivity activity) { + timeTracker.visit(activity); + states.putInternalActivityState(activity, StateFactory.EARLIEST_OPERATION_START_TIME, StateFactory.createState(Math.max(timeTracker.getActArrTime(), activity.getTheoreticalEarliestOperationStartTime()))); + + } + + @Override + public void finish() {} + +} \ No newline at end of file diff --git a/jsprit-core/src/main/java/algorithms/UpdateLoads.java b/jsprit-core/src/main/java/jsprit/core/algorithm/state/UpdateLoads.java similarity index 70% rename from jsprit-core/src/main/java/algorithms/UpdateLoads.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/state/UpdateLoads.java index ebd6076d..6e9a6df5 100644 --- a/jsprit-core/src/main/java/algorithms/UpdateLoads.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/state/UpdateLoads.java @@ -1,18 +1,18 @@ -package algorithms; +package jsprit.core.algorithm.state; import java.util.Collection; -import org.apache.log4j.Logger; +import jsprit.core.algorithm.recreate.listener.InsertionStartsListener; +import jsprit.core.algorithm.recreate.listener.JobInsertedListener; +import jsprit.core.problem.job.Delivery; +import jsprit.core.problem.job.Job; +import jsprit.core.problem.job.Pickup; +import jsprit.core.problem.job.Service; +import jsprit.core.problem.solution.route.VehicleRoute; +import jsprit.core.problem.solution.route.activity.ActivityVisitor; +import jsprit.core.problem.solution.route.activity.TourActivity; +import jsprit.core.problem.solution.route.state.StateFactory; -import basics.Delivery; -import basics.Job; -import basics.Pickup; -import basics.Service; -import basics.algo.InsertionStartsListener; -import basics.algo.JobInsertedListener; -import basics.route.ActivityVisitor; -import basics.route.TourActivity; -import basics.route.VehicleRoute; /** * Updates load at activity level. @@ -29,8 +29,6 @@ class UpdateLoads implements ActivityVisitor, StateUpdater, InsertionStartsListe private StateManager stateManager; private int currentLoad = 0; private VehicleRoute route; - private static Logger log = Logger.getLogger(UpdateLoads.class); - /** * Updates load at activity level. * @@ -59,7 +57,7 @@ class UpdateLoads implements ActivityVisitor, StateUpdater, InsertionStartsListe @Override public void visit(TourActivity act) { currentLoad += act.getCapacityDemand(); - stateManager.putActivityState(act, StateFactory.LOAD, StateFactory.createState(currentLoad)); + stateManager.putInternalActivityState(act, StateFactory.LOAD, StateFactory.createState(currentLoad)); assert currentLoad <= route.getVehicle().getCapacity() : "currentLoad at activity must not be > vehicleCapacity"; assert currentLoad >= 0 : "currentLoad at act must not be < 0"; } @@ -81,8 +79,8 @@ class UpdateLoads implements ActivityVisitor, StateUpdater, InsertionStartsListe loadAtEnd += j.getCapacityDemand(); } } - stateManager.putRouteState(route, StateFactory.LOAD_AT_BEGINNING, StateFactory.createState(loadAtDepot)); - stateManager.putRouteState(route, StateFactory.LOAD_AT_END, StateFactory.createState(loadAtEnd)); + stateManager.putInternalRouteState(route, StateFactory.LOAD_AT_BEGINNING, StateFactory.createState(loadAtDepot)); + stateManager.putInternalRouteState(route, StateFactory.LOAD_AT_END, StateFactory.createState(loadAtEnd)); } @Override @@ -97,22 +95,14 @@ class UpdateLoads implements ActivityVisitor, StateUpdater, InsertionStartsListe if(job2insert instanceof Delivery){ int loadAtDepot = (int) stateManager.getRouteState(inRoute, StateFactory.LOAD_AT_BEGINNING).toDouble(); // log.info("loadAtDepot="+loadAtDepot); - stateManager.putRouteState(inRoute, StateFactory.LOAD_AT_BEGINNING, StateFactory.createState(loadAtDepot + job2insert.getCapacityDemand())); + stateManager.putInternalRouteState(inRoute, StateFactory.LOAD_AT_BEGINNING, StateFactory.createState(loadAtDepot + job2insert.getCapacityDemand())); } else if(job2insert instanceof Pickup || job2insert instanceof Service){ int loadAtEnd = (int) stateManager.getRouteState(inRoute, StateFactory.LOAD_AT_END).toDouble(); // log.info("loadAtEnd="+loadAtEnd); - stateManager.putRouteState(inRoute, StateFactory.LOAD_AT_END, StateFactory.createState(loadAtEnd + job2insert.getCapacityDemand())); + stateManager.putInternalRouteState(inRoute, StateFactory.LOAD_AT_END, StateFactory.createState(loadAtEnd + job2insert.getCapacityDemand())); } } -// private void log(VehicleRoute inRoute) { -// log.debug(inRoute.getStart()); -// for(TourActivity act : inRoute.getTourActivities().getActivities()){ -// log.debug(act); -// } -// log.debug(inRoute.getEnd()); -// -// } } \ No newline at end of file diff --git a/jsprit-core/src/main/java/algorithms/UpdateMaxLoad.java b/jsprit-core/src/main/java/jsprit/core/algorithm/state/UpdateMaxLoad.java similarity index 52% rename from jsprit-core/src/main/java/algorithms/UpdateMaxLoad.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/state/UpdateMaxLoad.java index 7f33bf3f..8ea51264 100644 --- a/jsprit-core/src/main/java/algorithms/UpdateMaxLoad.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/state/UpdateMaxLoad.java @@ -1,18 +1,15 @@ -package algorithms; +package jsprit.core.algorithm.state; -import org.apache.log4j.Logger; +import jsprit.core.problem.solution.route.VehicleRoute; +import jsprit.core.problem.solution.route.activity.ReverseActivityVisitor; +import jsprit.core.problem.solution.route.activity.TourActivity; +import jsprit.core.problem.solution.route.state.StateFactory; -import basics.route.ReverseActivityVisitor; -import basics.route.TourActivity; -import basics.route.VehicleRoute; class UpdateMaxLoad implements ReverseActivityVisitor, StateUpdater { - private static Logger log = Logger.getLogger(UpdateMaxLoad.class); private StateManager stateManager; private VehicleRoute route; private double maxLoad; - private double currLoad; - public UpdateMaxLoad(StateManager stateManager) { super(); this.stateManager = stateManager; @@ -22,23 +19,16 @@ class UpdateMaxLoad implements ReverseActivityVisitor, StateUpdater { public void begin(VehicleRoute route) { this.route = route; maxLoad = stateManager.getRouteState(route, StateFactory.LOAD_AT_END).toDouble(); -// currLoad = maxLoad; -// log.debug("maxLoad@end="+maxLoad); } @Override public void visit(TourActivity act) { maxLoad = Math.max(maxLoad, stateManager.getActivityState(act, StateFactory.LOAD).toDouble()); -// currLoad -= act.getCapacityDemand(); -// log.debug("maxLoad@"+act+"="+maxLoad); - stateManager.putActivityState(act, StateFactory.FUTURE_PICKS, StateFactory.createState(maxLoad)); + stateManager.putInternalActivityState(act, StateFactory.FUTURE_MAXLOAD, StateFactory.createState(maxLoad)); assert maxLoad <= route.getVehicle().getCapacity() : "maxLoad can never be bigger than vehicleCap"; assert maxLoad >= 0 : "maxLoad can never be smaller than 0"; } @Override - public void finish() { -// stateManager.putRouteState(route, StateFactory.MAXLOAD, StateFactory.createState(maxLoad)); -// log.debug("maxLoad@start="+maxLoad); - } + public void finish() {} } \ No newline at end of file diff --git a/jsprit-core/src/main/java/algorithms/UpdateMaxLoad_.java b/jsprit-core/src/main/java/jsprit/core/algorithm/state/UpdateMaxLoad_.java similarity index 81% rename from jsprit-core/src/main/java/algorithms/UpdateMaxLoad_.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/state/UpdateMaxLoad_.java index 382d4811..181ffa77 100644 --- a/jsprit-core/src/main/java/algorithms/UpdateMaxLoad_.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/state/UpdateMaxLoad_.java @@ -1,8 +1,9 @@ -package algorithms; +package jsprit.core.algorithm.state; -import basics.route.ActivityVisitor; -import basics.route.TourActivity; -import basics.route.VehicleRoute; +import jsprit.core.problem.solution.route.VehicleRoute; +import jsprit.core.problem.solution.route.activity.ActivityVisitor; +import jsprit.core.problem.solution.route.activity.TourActivity; +import jsprit.core.problem.solution.route.state.StateFactory; /** * Updates load at activity level. @@ -60,7 +61,7 @@ class UpdateMaxLoad_ implements ActivityVisitor, StateUpdater { @Override public void finish() { - stateManager.putRouteState(route, StateFactory.MAXLOAD, StateFactory.createState(maxLoad)); + stateManager.putInternalRouteState(route, StateFactory.MAXLOAD, StateFactory.createState(maxLoad)); currentLoad = 0; maxLoad = 0; } diff --git a/jsprit-core/src/main/java/algorithms/UpdatePrevMaxLoad.java b/jsprit-core/src/main/java/jsprit/core/algorithm/state/UpdatePrevMaxLoad.java similarity index 62% rename from jsprit-core/src/main/java/algorithms/UpdatePrevMaxLoad.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/state/UpdatePrevMaxLoad.java index 1536f1bb..ff87c2cd 100644 --- a/jsprit-core/src/main/java/algorithms/UpdatePrevMaxLoad.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/state/UpdatePrevMaxLoad.java @@ -1,13 +1,12 @@ -package algorithms; +package jsprit.core.algorithm.state; -import org.apache.log4j.Logger; +import jsprit.core.problem.solution.route.VehicleRoute; +import jsprit.core.problem.solution.route.activity.ActivityVisitor; +import jsprit.core.problem.solution.route.activity.TourActivity; +import jsprit.core.problem.solution.route.state.StateFactory; -import basics.route.ActivityVisitor; -import basics.route.TourActivity; -import basics.route.VehicleRoute; class UpdatePrevMaxLoad implements ActivityVisitor, StateUpdater { - private static Logger log = Logger.getLogger(UpdatePrevMaxLoad.class); private StateManager stateManager; private VehicleRoute route; private double currLoad; @@ -23,20 +22,16 @@ class UpdatePrevMaxLoad implements ActivityVisitor, StateUpdater { this.route = route; currLoad = stateManager.getRouteState(route, StateFactory.LOAD_AT_BEGINNING).toDouble(); prevMaxLoad = currLoad; -// log.debug("prevMaxLoad@start="+prevMaxLoad); } @Override public void visit(TourActivity act) { prevMaxLoad = Math.max(prevMaxLoad, stateManager.getActivityState(act, StateFactory.LOAD).toDouble()); -// log.debug("prevMaxLoad@"+act+"="+prevMaxLoad); - stateManager.putActivityState(act, StateFactory.PAST_DELIVERIES, StateFactory.createState(prevMaxLoad)); + stateManager.putInternalActivityState(act, StateFactory.PAST_MAXLOAD, StateFactory.createState(prevMaxLoad)); assert prevMaxLoad >= 0 : "maxLoad can never be smaller than 0"; assert prevMaxLoad <= route.getVehicle().getCapacity() : "maxLoad can never be bigger than vehicleCap"; } @Override - public void finish() { -// log.debug("prevMaxLoad@end="+prevMaxLoad); - } + public void finish() {} } \ No newline at end of file diff --git a/jsprit-core/src/main/java/algorithms/TimeWindowUpdater.java b/jsprit-core/src/main/java/jsprit/core/algorithm/state/UpdateTimeWindow.java similarity index 60% rename from jsprit-core/src/main/java/algorithms/TimeWindowUpdater.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/state/UpdateTimeWindow.java index e174e5e3..c74cc69a 100644 --- a/jsprit-core/src/main/java/algorithms/TimeWindowUpdater.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/state/UpdateTimeWindow.java @@ -1,17 +1,14 @@ -package algorithms; +package jsprit.core.algorithm.state; -import org.apache.log4j.Logger; +import jsprit.core.problem.cost.VehicleRoutingTransportCosts; +import jsprit.core.problem.solution.route.VehicleRoute; +import jsprit.core.problem.solution.route.activity.ReverseActivityVisitor; +import jsprit.core.problem.solution.route.activity.TourActivity; +import jsprit.core.problem.solution.route.state.StateFactory; -import algorithms.StateManager.StateImpl; -import basics.costs.VehicleRoutingTransportCosts; -import basics.route.ReverseActivityVisitor; -import basics.route.TourActivity; -import basics.route.VehicleRoute; -class TimeWindowUpdater implements ReverseActivityVisitor, StateUpdater{ +class UpdateTimeWindow implements ReverseActivityVisitor, StateUpdater{ - private static Logger log = Logger.getLogger(TimeWindowUpdater.class); - private StateManager states; private VehicleRoute route; @@ -22,7 +19,7 @@ class TimeWindowUpdater implements ReverseActivityVisitor, StateUpdater{ private TourActivity prevAct; - public TimeWindowUpdater(StateManager states, VehicleRoutingTransportCosts tpCosts) { + public UpdateTimeWindow(StateManager states, VehicleRoutingTransportCosts tpCosts) { super(); this.states = states; this.transportCosts = tpCosts; @@ -40,7 +37,7 @@ class TimeWindowUpdater implements ReverseActivityVisitor, StateUpdater{ double potentialLatestArrivalTimeAtCurrAct = latestArrTimeAtPrevAct - transportCosts.getBackwardTransportTime(activity.getLocationId(), prevAct.getLocationId(), latestArrTimeAtPrevAct, route.getDriver(),route.getVehicle()) - activity.getOperationTime(); double latestArrivalTime = Math.min(activity.getTheoreticalLatestOperationStartTime(), potentialLatestArrivalTimeAtCurrAct); - states.putActivityState(activity, StateFactory.LATEST_OPERATION_START_TIME, new StateImpl(latestArrivalTime)); + states.putInternalActivityState(activity, StateFactory.LATEST_OPERATION_START_TIME, StateFactory.createState(latestArrivalTime)); latestArrTimeAtPrevAct = latestArrivalTime; prevAct = activity; diff --git a/jsprit-core/src/main/java/algorithms/UpdateVariableCosts.java b/jsprit-core/src/main/java/jsprit/core/algorithm/state/UpdateVariableCosts.java similarity index 66% rename from jsprit-core/src/main/java/algorithms/UpdateVariableCosts.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/state/UpdateVariableCosts.java index f8383b50..391f090c 100644 --- a/jsprit-core/src/main/java/algorithms/UpdateVariableCosts.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/state/UpdateVariableCosts.java @@ -1,15 +1,16 @@ -package algorithms; +package jsprit.core.algorithm.state; + +import jsprit.core.problem.cost.ForwardTransportCost; +import jsprit.core.problem.cost.VehicleRoutingActivityCosts; +import jsprit.core.problem.cost.VehicleRoutingTransportCosts; +import jsprit.core.problem.solution.route.VehicleRoute; +import jsprit.core.problem.solution.route.activity.ActivityVisitor; +import jsprit.core.problem.solution.route.activity.TourActivity; +import jsprit.core.problem.solution.route.state.StateFactory; +import jsprit.core.util.ActivityTimeTracker; import org.apache.log4j.Logger; -import util.ActivityTimeTracker; -import algorithms.StateManager.StateImpl; -import basics.costs.ForwardTransportCost; -import basics.costs.VehicleRoutingActivityCosts; -import basics.costs.VehicleRoutingTransportCosts; -import basics.route.ActivityVisitor; -import basics.route.TourActivity; -import basics.route.VehicleRoute; /** * Updates total costs (i.e. transport and activity costs) at route and activity level. @@ -22,7 +23,7 @@ import basics.route.VehicleRoute; * @param transportCost * @param states */ -class UpdateVariableCosts implements ActivityVisitor,StateUpdater{ +public class UpdateVariableCosts implements ActivityVisitor,StateUpdater{ private static Logger log = Logger.getLogger(UpdateVariableCosts.class); @@ -64,7 +65,7 @@ class UpdateVariableCosts implements ActivityVisitor,StateUpdater{ @Override public void begin(VehicleRoute route) { vehicleRoute = route; - vehicleRoute.getVehicleRouteCostCalculator().reset(); +// vehicleRoute.getVehicleRouteCostCalculator().reset(); timeTracker.begin(route); prevAct = route.getStart(); startTimeAtPrevAct = timeTracker.getActEndTime(); @@ -77,13 +78,13 @@ class UpdateVariableCosts implements ActivityVisitor,StateUpdater{ double transportCost = this.transportCost.getTransportCost(prevAct.getLocationId(), act.getLocationId(), startTimeAtPrevAct, vehicleRoute.getDriver(), vehicleRoute.getVehicle()); double actCost = activityCost.getActivityCost(act, timeTracker.getActArrTime(), vehicleRoute.getDriver(), vehicleRoute.getVehicle()); - vehicleRoute.getVehicleRouteCostCalculator().addTransportCost(transportCost); - vehicleRoute.getVehicleRouteCostCalculator().addActivityCost(actCost); - +// vehicleRoute.getVehicleRouteCostCalculator().addTransportCost(transportCost); +// vehicleRoute.getVehicleRouteCostCalculator().addActivityCost(actCost); +// totalOperationCost += transportCost; totalOperationCost += actCost; - states.putActivityState(act, StateFactory.COSTS, new StateImpl(totalOperationCost)); + states.putInternalActivityState(act, StateFactory.COSTS, StateFactory.createState(totalOperationCost)); prevAct = act; startTimeAtPrevAct = timeTracker.getActEndTime(); @@ -95,19 +96,19 @@ class UpdateVariableCosts implements ActivityVisitor,StateUpdater{ double transportCost = this.transportCost.getTransportCost(prevAct.getLocationId(), vehicleRoute.getEnd().getLocationId(), startTimeAtPrevAct, vehicleRoute.getDriver(), vehicleRoute.getVehicle()); double actCost = activityCost.getActivityCost(vehicleRoute.getEnd(), timeTracker.getActEndTime(), vehicleRoute.getDriver(), vehicleRoute.getVehicle()); - vehicleRoute.getVehicleRouteCostCalculator().addTransportCost(transportCost); - vehicleRoute.getVehicleRouteCostCalculator().addActivityCost(actCost); - +// vehicleRoute.getVehicleRouteCostCalculator().addTransportCost(transportCost); +// vehicleRoute.getVehicleRouteCostCalculator().addActivityCost(actCost); +// totalOperationCost += transportCost; totalOperationCost += actCost; // totalOperationCost += getFixCosts(vehicleRoute.getVehicle()); - states.putRouteState(vehicleRoute, StateFactory.COSTS, new StateImpl(totalOperationCost)); + states.putInternalRouteState(vehicleRoute, StateFactory.COSTS, StateFactory.createState(totalOperationCost)); - //this is rather strange and likely to change - vehicleRoute.getVehicleRouteCostCalculator().price(vehicleRoute.getDriver()); - vehicleRoute.getVehicleRouteCostCalculator().price(vehicleRoute.getVehicle()); - vehicleRoute.getVehicleRouteCostCalculator().finish(); +// //this is rather strange and likely to change +// vehicleRoute.getVehicleRouteCostCalculator().price(vehicleRoute.getDriver()); +// vehicleRoute.getVehicleRouteCostCalculator().price(vehicleRoute.getVehicle()); +// vehicleRoute.getVehicleRouteCostCalculator().finish(); startTimeAtPrevAct = 0.0; prevAct = null; diff --git a/jsprit-core/src/main/java/basics/algo/IterationWithoutImprovementBreaker.java b/jsprit-core/src/main/java/jsprit/core/algorithm/termination/IterationWithoutImprovementTermination.java similarity index 83% rename from jsprit-core/src/main/java/basics/algo/IterationWithoutImprovementBreaker.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/termination/IterationWithoutImprovementTermination.java index 60478f93..dd14af26 100644 --- a/jsprit-core/src/main/java/basics/algo/IterationWithoutImprovementBreaker.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/termination/IterationWithoutImprovementTermination.java @@ -14,21 +14,22 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.algo; +package jsprit.core.algorithm.termination; + +import jsprit.core.algorithm.SearchStrategy.DiscoveredSolution; import org.apache.log4j.Logger; -import basics.algo.SearchStrategy.DiscoveredSolution; -public class IterationWithoutImprovementBreaker implements PrematureAlgorithmBreaker{ +public class IterationWithoutImprovementTermination implements PrematureAlgorithmTermination{ - private static Logger log = Logger.getLogger(IterationWithoutImprovementBreaker.class); + private static Logger log = Logger.getLogger(IterationWithoutImprovementTermination.class); private int nuOfIterationWithoutImprovement; private int iterationsWithoutImprovement = 0; - public IterationWithoutImprovementBreaker(int nuOfIterationsWithoutImprovement){ + public IterationWithoutImprovementTermination(int nuOfIterationsWithoutImprovement){ this.nuOfIterationWithoutImprovement=nuOfIterationsWithoutImprovement; log.info("initialise " + this); } diff --git a/jsprit-core/src/main/java/basics/algo/PrematureAlgorithmBreaker.java b/jsprit-core/src/main/java/jsprit/core/algorithm/termination/PrematureAlgorithmTermination.java similarity index 86% rename from jsprit-core/src/main/java/basics/algo/PrematureAlgorithmBreaker.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/termination/PrematureAlgorithmTermination.java index 0fe78f55..78d31e5d 100644 --- a/jsprit-core/src/main/java/basics/algo/PrematureAlgorithmBreaker.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/termination/PrematureAlgorithmTermination.java @@ -14,11 +14,11 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.algo; +package jsprit.core.algorithm.termination; -import basics.algo.SearchStrategy.DiscoveredSolution; +import jsprit.core.algorithm.SearchStrategy.DiscoveredSolution; -public interface PrematureAlgorithmBreaker { +public interface PrematureAlgorithmTermination { public boolean isPrematureBreak(DiscoveredSolution discoveredSolution); diff --git a/jsprit-core/src/main/java/basics/algo/TimeBreaker.java b/jsprit-core/src/main/java/jsprit/core/algorithm/termination/TimeTermination.java similarity index 78% rename from jsprit-core/src/main/java/basics/algo/TimeBreaker.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/termination/TimeTermination.java index 447f2f7b..641e3337 100644 --- a/jsprit-core/src/main/java/basics/algo/TimeBreaker.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/termination/TimeTermination.java @@ -14,16 +14,18 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.algo; +package jsprit.core.algorithm.termination; import java.util.Collection; +import jsprit.core.algorithm.SearchStrategy.DiscoveredSolution; +import jsprit.core.algorithm.VehicleRoutingAlgorithm; +import jsprit.core.algorithm.listener.AlgorithmStartsListener; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; + import org.apache.log4j.Logger; -import basics.VehicleRoutingAlgorithm; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblemSolution; -import basics.algo.SearchStrategy.DiscoveredSolution; /** * Breaks algorithm prematurely based on specified time. @@ -34,9 +36,9 @@ import basics.algo.SearchStrategy.DiscoveredSolution; * @author stefan * */ -public class TimeBreaker implements PrematureAlgorithmBreaker, AlgorithmStartsListener{ +public class TimeTermination implements PrematureAlgorithmTermination, AlgorithmStartsListener{ - private static Logger logger = Logger.getLogger(TimeBreaker.class); + private static Logger logger = Logger.getLogger(TimeTermination.class); private double timeThreshold; @@ -51,7 +53,7 @@ public class TimeBreaker implements PrematureAlgorithmBreaker, AlgorithmStartsLi * @author stefan * */ - public TimeBreaker(double time_in_seconds) { + public TimeTermination(double time_in_seconds) { super(); this.timeThreshold = time_in_seconds; logger.info("initialise " + this); diff --git a/jsprit-core/src/main/java/basics/algo/VariationCoefficientBreaker.java b/jsprit-core/src/main/java/jsprit/core/algorithm/termination/VariationCoefficientTermination.java similarity index 83% rename from jsprit-core/src/main/java/basics/algo/VariationCoefficientBreaker.java rename to jsprit-core/src/main/java/jsprit/core/algorithm/termination/VariationCoefficientTermination.java index f3c75691..f5fe144f 100644 --- a/jsprit-core/src/main/java/basics/algo/VariationCoefficientBreaker.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/termination/VariationCoefficientTermination.java @@ -14,19 +14,23 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.algo; +package jsprit.core.algorithm.termination; import java.util.Collection; +import jsprit.core.algorithm.SearchStrategy.DiscoveredSolution; +import jsprit.core.algorithm.VehicleRoutingAlgorithm; +import jsprit.core.algorithm.listener.AlgorithmStartsListener; +import jsprit.core.algorithm.listener.IterationEndsListener; +import jsprit.core.algorithm.listener.IterationStartsListener; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; +import jsprit.core.util.Solutions; + import org.apache.commons.math.stat.StatUtils; import org.apache.commons.math.stat.descriptive.moment.StandardDeviation; import org.apache.log4j.Logger; -import util.Solutions; -import basics.VehicleRoutingAlgorithm; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblemSolution; -import basics.algo.SearchStrategy.DiscoveredSolution; /** * Breaks algorithm prematurely based on variationCoefficient. @@ -38,9 +42,9 @@ import basics.algo.SearchStrategy.DiscoveredSolution; * @author stefan * */ -public class VariationCoefficientBreaker implements PrematureAlgorithmBreaker, IterationStartsListener, AlgorithmStartsListener, IterationEndsListener{ +public class VariationCoefficientTermination implements PrematureAlgorithmTermination, IterationStartsListener, AlgorithmStartsListener, IterationEndsListener{ - private static Logger logger = Logger.getLogger(VariationCoefficientBreaker.class); + private static Logger logger = Logger.getLogger(VariationCoefficientTermination.class); private int nuOfIterations; @@ -62,7 +66,7 @@ public class VariationCoefficientBreaker implements PrematureAlgorithmBreaker, I * @author stefan * */ - public VariationCoefficientBreaker(int nuOfIterations, double variationCoefficientThreshold) { + public VariationCoefficientTermination(int nuOfIterations, double variationCoefficientThreshold) { super(); this.nuOfIterations = nuOfIterations; this.variationCoefficientThreshold = variationCoefficientThreshold; diff --git a/jsprit-core/src/main/java/basics/VehicleRoutingProblem.java b/jsprit-core/src/main/java/jsprit/core/problem/VehicleRoutingProblem.java similarity index 92% rename from jsprit-core/src/main/java/basics/VehicleRoutingProblem.java rename to jsprit-core/src/main/java/jsprit/core/problem/VehicleRoutingProblem.java index 076ed956..321a122e 100644 --- a/jsprit-core/src/main/java/basics/VehicleRoutingProblem.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/VehicleRoutingProblem.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics; +package jsprit.core.problem; import java.util.ArrayList; import java.util.Collection; @@ -22,18 +22,23 @@ import java.util.Collections; import java.util.HashMap; import java.util.Map; +import jsprit.core.problem.cost.VehicleRoutingActivityCosts; +import jsprit.core.problem.cost.VehicleRoutingTransportCosts; +import jsprit.core.problem.driver.Driver; +import jsprit.core.problem.job.Job; +import jsprit.core.problem.job.Service; +import jsprit.core.problem.job.Shipment; +import jsprit.core.problem.solution.route.activity.TourActivity; +import jsprit.core.problem.vehicle.Vehicle; +import jsprit.core.problem.vehicle.VehicleType; +import jsprit.core.problem.vehicle.VehicleTypeImpl; +import jsprit.core.util.Coordinate; +import jsprit.core.util.CrowFlyCosts; +import jsprit.core.util.Locations; +import jsprit.core.util.Neighborhood; + import org.apache.log4j.Logger; -import util.Coordinate; -import util.CrowFlyCosts; -import util.Locations; -import util.Neighborhood; -import basics.costs.DefaultVehicleRoutingActivityCosts; -import basics.costs.VehicleRoutingActivityCosts; -import basics.costs.VehicleRoutingTransportCosts; -import basics.route.Vehicle; -import basics.route.VehicleType; -import basics.route.VehicleTypeImpl; /** * Contains and describes the vehicle routing problem. @@ -81,7 +86,19 @@ public class VehicleRoutingProblem { private VehicleRoutingTransportCosts transportCosts; - private VehicleRoutingActivityCosts activityCosts = new DefaultVehicleRoutingActivityCosts(); + private VehicleRoutingActivityCosts activityCosts = new VehicleRoutingActivityCosts() { + + @Override + public double getActivityCost(TourActivity tourAct, double arrivalTime, Driver driver, Vehicle vehicle) { + return 0; + } + + @Override + public String toString() { + return "[name=defaultActivityCosts]"; + } + + }; private Map jobs; @@ -201,9 +218,11 @@ public class VehicleRoutingProblem { * *

FleetComposition is either FleetComposition.HETEROGENEOUS or FleetComposition.HOMOGENEOUS * + * @deprecated has no effect * @param fleetComposition * @return */ + @Deprecated public Builder setFleetComposition(FleetComposition fleetComposition){ this.fleetComposition = fleetComposition; return this; @@ -398,6 +417,7 @@ public class VehicleRoutingProblem { * @author sschroeder * */ + @Deprecated public static enum FleetComposition { HETEROGENEOUS, HOMOGENEOUS; } diff --git a/jsprit-core/src/main/java/algorithms/ConstraintManager.java b/jsprit-core/src/main/java/jsprit/core/problem/constraint/ConstraintManager.java similarity index 63% rename from jsprit-core/src/main/java/algorithms/ConstraintManager.java rename to jsprit-core/src/main/java/jsprit/core/problem/constraint/ConstraintManager.java index e13be088..68677b2a 100644 --- a/jsprit-core/src/main/java/algorithms/ConstraintManager.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/constraint/ConstraintManager.java @@ -1,8 +1,10 @@ -package algorithms; +package jsprit.core.problem.constraint; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblem.Constraint; -import basics.route.TourActivity; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.VehicleRoutingProblem.Constraint; +import jsprit.core.problem.misc.JobInsertionContext; +import jsprit.core.problem.solution.route.activity.TourActivity; +import jsprit.core.problem.solution.route.state.RouteAndActivityStateGetter; public class ConstraintManager implements HardActivityStateLevelConstraint, HardRouteStateLevelConstraint{ @@ -16,13 +18,13 @@ public class ConstraintManager implements HardActivityStateLevelConstraint, Hard private VehicleRoutingProblem vrp; - private StateManager stateManager; + private RouteAndActivityStateGetter stateManager; private boolean loadConstraintsSet = false; private boolean timeWindowConstraintsSet = false; - public ConstraintManager(VehicleRoutingProblem vrp, StateManager stateManager) { + public ConstraintManager(VehicleRoutingProblem vrp, RouteAndActivityStateGetter stateManager) { this.vrp = vrp; this.stateManager = stateManager; } @@ -30,7 +32,6 @@ public class ConstraintManager implements HardActivityStateLevelConstraint, Hard public void addTimeWindowConstraint(){ if(!timeWindowConstraintsSet){ addConstraint(new TimeWindowConstraint(stateManager, vrp.getTransportCosts()),Priority.HIGH); - stateManager.addActivityVisitor(new TimeWindowUpdater(stateManager, vrp.getTransportCosts())); timeWindowConstraintsSet = true; } } @@ -38,17 +39,11 @@ public class ConstraintManager implements HardActivityStateLevelConstraint, Hard public void addLoadConstraint(){ if(!loadConstraintsSet){ if(vrp.getProblemConstraints().contains(Constraint.DELIVERIES_FIRST)){ - addConstraint(new ServiceBackhaulConstraint(),Priority.HIGH); + addConstraint(new ServiceDeliveriesFirstConstraint(),Priority.HIGH); } addConstraint(new PickupAndDeliverShipmentLoadActivityLevelConstraint(stateManager),Priority.CRITICAL); addConstraint(new ServiceLoadRouteLevelConstraint(stateManager)); addConstraint(new ServiceLoadActivityLevelConstraint(stateManager),Priority.LOW); - UpdateLoads updateLoads = new UpdateLoads(stateManager); - stateManager.addActivityVisitor(updateLoads); - stateManager.addListener(updateLoads); - stateManager.addActivityVisitor(new UpdateMaxLoad(stateManager)); - stateManager.addActivityVisitor(new UpdateMaxLoad_(stateManager)); - stateManager.addActivityVisitor(new UpdatePrevMaxLoad(stateManager)); loadConstraintsSet=true; } } @@ -62,12 +57,12 @@ public class ConstraintManager implements HardActivityStateLevelConstraint, Hard } @Override - public boolean fulfilled(InsertionContext insertionContext) { + public boolean fulfilled(JobInsertionContext insertionContext) { return routeLevelConstraintManager.fulfilled(insertionContext); } @Override - public ConstraintsStatus fulfilled(InsertionContext iFacts, TourActivity prevAct,TourActivity newAct, TourActivity nextAct, double prevActDepTime) { + public ConstraintsStatus fulfilled(JobInsertionContext iFacts, TourActivity prevAct,TourActivity newAct, TourActivity nextAct, double prevActDepTime) { return actLevelConstraintManager.fulfilled(iFacts, prevAct, newAct, nextAct, prevActDepTime); } diff --git a/jsprit-core/src/main/java/algorithms/HardActivityLevelConstraintManager.java b/jsprit-core/src/main/java/jsprit/core/problem/constraint/HardActivityLevelConstraintManager.java similarity index 84% rename from jsprit-core/src/main/java/algorithms/HardActivityLevelConstraintManager.java rename to jsprit-core/src/main/java/jsprit/core/problem/constraint/HardActivityLevelConstraintManager.java index c69ef325..1cad4e3f 100644 --- a/jsprit-core/src/main/java/algorithms/HardActivityLevelConstraintManager.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/constraint/HardActivityLevelConstraintManager.java @@ -1,10 +1,12 @@ -package algorithms; +package jsprit.core.problem.constraint; import java.util.ArrayList; import java.util.Collection; -import algorithms.ConstraintManager.Priority; -import basics.route.TourActivity; +import jsprit.core.problem.constraint.ConstraintManager.Priority; +import jsprit.core.problem.misc.JobInsertionContext; +import jsprit.core.problem.solution.route.activity.TourActivity; + class HardActivityLevelConstraintManager implements HardActivityStateLevelConstraint { @@ -27,7 +29,7 @@ class HardActivityLevelConstraintManager implements HardActivityStateLevelConstr } @Override - public ConstraintsStatus fulfilled(InsertionContext iFacts, TourActivity prevAct, TourActivity newAct, TourActivity nextAct, double prevActDepTime) { + public ConstraintsStatus fulfilled(JobInsertionContext iFacts, TourActivity prevAct, TourActivity newAct, TourActivity nextAct, double prevActDepTime) { ConstraintsStatus notFulfilled = null; for(HardActivityStateLevelConstraint c : criticalConstraints){ ConstraintsStatus status = c.fulfilled(iFacts, prevAct, newAct, nextAct, prevActDepTime); diff --git a/jsprit-core/src/main/java/jsprit/core/problem/constraint/HardActivityStateLevelConstraint.java b/jsprit-core/src/main/java/jsprit/core/problem/constraint/HardActivityStateLevelConstraint.java new file mode 100644 index 00000000..5e77ba3a --- /dev/null +++ b/jsprit-core/src/main/java/jsprit/core/problem/constraint/HardActivityStateLevelConstraint.java @@ -0,0 +1,16 @@ +package jsprit.core.problem.constraint; + +import jsprit.core.problem.misc.JobInsertionContext; +import jsprit.core.problem.solution.route.activity.TourActivity; + +public interface HardActivityStateLevelConstraint { + + static enum ConstraintsStatus { + + NOT_FULFILLED_BREAK, NOT_FULFILLED, FULFILLED; + + } + + public ConstraintsStatus fulfilled(JobInsertionContext iFacts, TourActivity prevAct, TourActivity newAct, TourActivity nextAct, double prevActDepTime); + +} \ No newline at end of file diff --git a/jsprit-core/src/main/java/algorithms/HardRouteLevelConstraintManager.java b/jsprit-core/src/main/java/jsprit/core/problem/constraint/HardRouteLevelConstraintManager.java similarity index 77% rename from jsprit-core/src/main/java/algorithms/HardRouteLevelConstraintManager.java rename to jsprit-core/src/main/java/jsprit/core/problem/constraint/HardRouteLevelConstraintManager.java index 6da5aad8..8aa485a6 100644 --- a/jsprit-core/src/main/java/algorithms/HardRouteLevelConstraintManager.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/constraint/HardRouteLevelConstraintManager.java @@ -1,8 +1,10 @@ -package algorithms; +package jsprit.core.problem.constraint; import java.util.ArrayList; import java.util.Collection; +import jsprit.core.problem.misc.JobInsertionContext; + class HardRouteLevelConstraintManager implements HardRouteStateLevelConstraint { @@ -13,7 +15,7 @@ class HardRouteLevelConstraintManager implements HardRouteStateLevelConstraint { } @Override - public boolean fulfilled(InsertionContext insertionContext) { + public boolean fulfilled(JobInsertionContext insertionContext) { for(HardRouteStateLevelConstraint constraint : hardConstraints){ if(!constraint.fulfilled(insertionContext)){ return false; diff --git a/jsprit-core/src/main/java/jsprit/core/problem/constraint/HardRouteStateLevelConstraint.java b/jsprit-core/src/main/java/jsprit/core/problem/constraint/HardRouteStateLevelConstraint.java new file mode 100644 index 00000000..b0fa1398 --- /dev/null +++ b/jsprit-core/src/main/java/jsprit/core/problem/constraint/HardRouteStateLevelConstraint.java @@ -0,0 +1,10 @@ +package jsprit.core.problem.constraint; + +import jsprit.core.problem.misc.JobInsertionContext; + + +public interface HardRouteStateLevelConstraint { + + public boolean fulfilled(JobInsertionContext insertionContext); + +} \ No newline at end of file diff --git a/jsprit-core/src/main/java/algorithms/PickupAndDeliverShipmentLoadActivityLevelConstraint.java b/jsprit-core/src/main/java/jsprit/core/problem/constraint/PickupAndDeliverShipmentLoadActivityLevelConstraint.java similarity index 69% rename from jsprit-core/src/main/java/algorithms/PickupAndDeliverShipmentLoadActivityLevelConstraint.java rename to jsprit-core/src/main/java/jsprit/core/problem/constraint/PickupAndDeliverShipmentLoadActivityLevelConstraint.java index d54653ff..9e495a56 100644 --- a/jsprit-core/src/main/java/algorithms/PickupAndDeliverShipmentLoadActivityLevelConstraint.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/constraint/PickupAndDeliverShipmentLoadActivityLevelConstraint.java @@ -1,11 +1,15 @@ -package algorithms; +package jsprit.core.problem.constraint; + +import jsprit.core.problem.misc.JobInsertionContext; +import jsprit.core.problem.solution.route.activity.DeliverShipment; +import jsprit.core.problem.solution.route.activity.PickupShipment; +import jsprit.core.problem.solution.route.activity.Start; +import jsprit.core.problem.solution.route.activity.TourActivity; +import jsprit.core.problem.solution.route.state.RouteAndActivityStateGetter; +import jsprit.core.problem.solution.route.state.StateFactory; import org.apache.log4j.Logger; -import basics.route.DeliverShipment; -import basics.route.PickupShipment; -import basics.route.Start; -import basics.route.TourActivity; /** * Constraint that ensures capacity constraint at each activity. @@ -20,7 +24,7 @@ public class PickupAndDeliverShipmentLoadActivityLevelConstraint implements Hard private static Logger logger = Logger.getLogger(PickupAndDeliverShipmentLoadActivityLevelConstraint.class); - private StateManager stateManager; + private RouteAndActivityStateGetter stateManager; /** * Constructs the constraint ensuring capacity constraint at each activity. @@ -31,13 +35,13 @@ public class PickupAndDeliverShipmentLoadActivityLevelConstraint implements Hard * * @param stateManager */ - public PickupAndDeliverShipmentLoadActivityLevelConstraint(StateManager stateManager) { + public PickupAndDeliverShipmentLoadActivityLevelConstraint(RouteAndActivityStateGetter stateManager) { super(); this.stateManager = stateManager; } @Override - public ConstraintsStatus fulfilled(InsertionContext iFacts, TourActivity prevAct, TourActivity newAct, TourActivity nextAct, double prevActDepTime) { + public ConstraintsStatus fulfilled(JobInsertionContext iFacts, TourActivity prevAct, TourActivity newAct, TourActivity nextAct, double prevActDepTime) { if(!(newAct instanceof PickupShipment) && !(newAct instanceof DeliverShipment)){ return ConstraintsStatus.FULFILLED; } diff --git a/jsprit-core/src/main/java/algorithms/ServiceBackhaulConstraint.java b/jsprit-core/src/main/java/jsprit/core/problem/constraint/ServiceDeliveriesFirstConstraint.java similarity index 58% rename from jsprit-core/src/main/java/algorithms/ServiceBackhaulConstraint.java rename to jsprit-core/src/main/java/jsprit/core/problem/constraint/ServiceDeliveriesFirstConstraint.java index 539a28fb..2cc0a952 100644 --- a/jsprit-core/src/main/java/algorithms/ServiceBackhaulConstraint.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/constraint/ServiceDeliveriesFirstConstraint.java @@ -1,16 +1,17 @@ -package algorithms; +package jsprit.core.problem.constraint; -import basics.route.DeliverService; -import basics.route.DeliverShipment; -import basics.route.PickupService; -import basics.route.PickupShipment; -import basics.route.ServiceActivity; -import basics.route.TourActivity; +import jsprit.core.problem.misc.JobInsertionContext; +import jsprit.core.problem.solution.route.activity.DeliverService; +import jsprit.core.problem.solution.route.activity.DeliverShipment; +import jsprit.core.problem.solution.route.activity.PickupService; +import jsprit.core.problem.solution.route.activity.PickupShipment; +import jsprit.core.problem.solution.route.activity.ServiceActivity; +import jsprit.core.problem.solution.route.activity.TourActivity; -public class ServiceBackhaulConstraint implements HardActivityStateLevelConstraint { +public class ServiceDeliveriesFirstConstraint implements HardActivityStateLevelConstraint { @Override - public ConstraintsStatus fulfilled(InsertionContext iFacts, TourActivity prevAct, TourActivity newAct, TourActivity nextAct, double prevActDepTime) { + public ConstraintsStatus fulfilled(JobInsertionContext iFacts, TourActivity prevAct, TourActivity newAct, TourActivity nextAct, double prevActDepTime) { if(newAct instanceof PickupService && nextAct instanceof DeliverService){ return ConstraintsStatus.NOT_FULFILLED; } if(newAct instanceof ServiceActivity && nextAct instanceof DeliverService){ return ConstraintsStatus.NOT_FULFILLED; } if(newAct instanceof DeliverService && prevAct instanceof PickupService){ return ConstraintsStatus.NOT_FULFILLED_BREAK; } diff --git a/jsprit-core/src/main/java/algorithms/ServiceLoadActivityLevelConstraint.java b/jsprit-core/src/main/java/jsprit/core/problem/constraint/ServiceLoadActivityLevelConstraint.java similarity index 63% rename from jsprit-core/src/main/java/algorithms/ServiceLoadActivityLevelConstraint.java rename to jsprit-core/src/main/java/jsprit/core/problem/constraint/ServiceLoadActivityLevelConstraint.java index 65ede0ec..41e5a6ce 100644 --- a/jsprit-core/src/main/java/algorithms/ServiceLoadActivityLevelConstraint.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/constraint/ServiceLoadActivityLevelConstraint.java @@ -1,12 +1,16 @@ -package algorithms; +package jsprit.core.problem.constraint; + +import jsprit.core.problem.misc.JobInsertionContext; +import jsprit.core.problem.solution.route.activity.DeliverService; +import jsprit.core.problem.solution.route.activity.PickupService; +import jsprit.core.problem.solution.route.activity.ServiceActivity; +import jsprit.core.problem.solution.route.activity.Start; +import jsprit.core.problem.solution.route.activity.TourActivity; +import jsprit.core.problem.solution.route.state.RouteAndActivityStateGetter; +import jsprit.core.problem.solution.route.state.StateFactory; import org.apache.log4j.Logger; -import basics.route.DeliverService; -import basics.route.PickupService; -import basics.route.ServiceActivity; -import basics.route.Start; -import basics.route.TourActivity; /** * Ensures load constraint for inserting ServiceActivity. @@ -21,15 +25,15 @@ class ServiceLoadActivityLevelConstraint implements HardActivityStateLevelConstr private static Logger log = Logger.getLogger(ServiceLoadActivityLevelConstraint.class); - private StateGetter stateManager; + private RouteAndActivityStateGetter stateManager; - public ServiceLoadActivityLevelConstraint(StateGetter stateManager) { + public ServiceLoadActivityLevelConstraint(RouteAndActivityStateGetter stateManager) { super(); this.stateManager = stateManager; } @Override - public ConstraintsStatus fulfilled(InsertionContext iFacts, TourActivity prevAct, TourActivity newAct, TourActivity nextAct, double prevActDepTime) { + public ConstraintsStatus fulfilled(JobInsertionContext iFacts, TourActivity prevAct, TourActivity newAct, TourActivity nextAct, double prevActDepTime) { int futureMaxLoad; int prevMaxLoad; if(prevAct instanceof Start){ @@ -37,8 +41,8 @@ class ServiceLoadActivityLevelConstraint implements HardActivityStateLevelConstr prevMaxLoad = (int)stateManager.getRouteState(iFacts.getRoute(), StateFactory.LOAD_AT_BEGINNING).toDouble(); } else{ - futureMaxLoad = (int) stateManager.getActivityState(prevAct, StateFactory.FUTURE_PICKS).toDouble(); - prevMaxLoad = (int) stateManager.getActivityState(prevAct, StateFactory.PAST_DELIVERIES).toDouble(); + futureMaxLoad = (int) stateManager.getActivityState(prevAct, StateFactory.FUTURE_MAXLOAD).toDouble(); + prevMaxLoad = (int) stateManager.getActivityState(prevAct, StateFactory.PAST_MAXLOAD).toDouble(); } if(newAct instanceof PickupService || newAct instanceof ServiceActivity){ diff --git a/jsprit-core/src/main/java/algorithms/ServiceLoadRouteLevelConstraint.java b/jsprit-core/src/main/java/jsprit/core/problem/constraint/ServiceLoadRouteLevelConstraint.java similarity index 62% rename from jsprit-core/src/main/java/algorithms/ServiceLoadRouteLevelConstraint.java rename to jsprit-core/src/main/java/jsprit/core/problem/constraint/ServiceLoadRouteLevelConstraint.java index f6ede2f7..2a06c2f5 100644 --- a/jsprit-core/src/main/java/algorithms/ServiceLoadRouteLevelConstraint.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/constraint/ServiceLoadRouteLevelConstraint.java @@ -1,8 +1,11 @@ -package algorithms; +package jsprit.core.problem.constraint; -import basics.Delivery; -import basics.Pickup; -import basics.Service; +import jsprit.core.problem.job.Delivery; +import jsprit.core.problem.job.Pickup; +import jsprit.core.problem.job.Service; +import jsprit.core.problem.misc.JobInsertionContext; +import jsprit.core.problem.solution.route.state.RouteAndActivityStateGetter; +import jsprit.core.problem.solution.route.state.StateFactory; /** * lsjdfjsdlfjsa @@ -12,15 +15,15 @@ import basics.Service; */ class ServiceLoadRouteLevelConstraint implements HardRouteStateLevelConstraint { - private StateGetter stateManager; + private RouteAndActivityStateGetter stateManager; - public ServiceLoadRouteLevelConstraint(StateGetter stateManager) { + public ServiceLoadRouteLevelConstraint(RouteAndActivityStateGetter stateManager) { super(); this.stateManager = stateManager; } @Override - public boolean fulfilled(InsertionContext insertionContext) { + public boolean fulfilled(JobInsertionContext insertionContext) { if(insertionContext.getJob() instanceof Delivery){ int loadAtDepot = (int) stateManager.getRouteState(insertionContext.getRoute(), StateFactory.LOAD_AT_BEGINNING).toDouble(); if(loadAtDepot + insertionContext.getJob().getCapacityDemand() > insertionContext.getNewVehicle().getCapacity()){ diff --git a/jsprit-core/src/main/java/jsprit/core/problem/constraint/ShipmentPickupsFirstConstraint.java b/jsprit-core/src/main/java/jsprit/core/problem/constraint/ShipmentPickupsFirstConstraint.java new file mode 100644 index 00000000..c2f334d6 --- /dev/null +++ b/jsprit-core/src/main/java/jsprit/core/problem/constraint/ShipmentPickupsFirstConstraint.java @@ -0,0 +1,17 @@ +package jsprit.core.problem.constraint; + +import jsprit.core.problem.misc.JobInsertionContext; +import jsprit.core.problem.solution.route.activity.DeliverShipment; +import jsprit.core.problem.solution.route.activity.PickupShipment; +import jsprit.core.problem.solution.route.activity.TourActivity; + +public class ShipmentPickupsFirstConstraint implements HardActivityStateLevelConstraint { + + @Override + public ConstraintsStatus fulfilled(JobInsertionContext iFacts, TourActivity prevAct, TourActivity newAct, TourActivity nextAct, double prevActDepTime) { + if(newAct instanceof DeliverShipment && nextAct instanceof PickupShipment){ return ConstraintsStatus.NOT_FULFILLED; } + if(newAct instanceof PickupShipment && prevAct instanceof DeliverShipment){ return ConstraintsStatus.NOT_FULFILLED_BREAK; } + return ConstraintsStatus.FULFILLED; + } + +} \ No newline at end of file diff --git a/jsprit-core/src/main/java/algorithms/TimeWindowConstraint.java b/jsprit-core/src/main/java/jsprit/core/problem/constraint/TimeWindowConstraint.java similarity index 72% rename from jsprit-core/src/main/java/algorithms/TimeWindowConstraint.java rename to jsprit-core/src/main/java/jsprit/core/problem/constraint/TimeWindowConstraint.java index fa159a6f..b5a2266a 100644 --- a/jsprit-core/src/main/java/algorithms/TimeWindowConstraint.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/constraint/TimeWindowConstraint.java @@ -1,9 +1,14 @@ -package algorithms; +package jsprit.core.problem.constraint; + +import jsprit.core.problem.cost.VehicleRoutingTransportCosts; +import jsprit.core.problem.misc.JobInsertionContext; +import jsprit.core.problem.solution.route.activity.TourActivity; +import jsprit.core.problem.solution.route.state.RouteAndActivityStateGetter; +import jsprit.core.problem.solution.route.state.StateFactory; +import jsprit.core.util.CalculationUtils; import org.apache.log4j.Logger; -import basics.costs.VehicleRoutingTransportCosts; -import basics.route.TourActivity; /** * ljsljslfjs @@ -14,18 +19,18 @@ import basics.route.TourActivity; private static Logger log = Logger.getLogger(TimeWindowConstraint.class); - private StateGetter states; + private RouteAndActivityStateGetter states; private VehicleRoutingTransportCosts routingCosts; - public TimeWindowConstraint(StateGetter states, VehicleRoutingTransportCosts routingCosts) { + public TimeWindowConstraint(RouteAndActivityStateGetter states, VehicleRoutingTransportCosts routingCosts) { super(); this.states = states; this.routingCosts = routingCosts; } @Override - public ConstraintsStatus fulfilled(InsertionContext iFacts, TourActivity prevAct, TourActivity newAct, TourActivity nextAct, double prevActDepTime) { + public ConstraintsStatus fulfilled(JobInsertionContext iFacts, TourActivity prevAct, TourActivity newAct, TourActivity nextAct, double prevActDepTime) { if(newAct.getTheoreticalLatestOperationStartTime() < prevAct.getTheoreticalEarliestOperationStartTime()){ return ConstraintsStatus.NOT_FULFILLED_BREAK; } diff --git a/jsprit-core/src/main/java/basics/costs/BackwardTransportCost.java b/jsprit-core/src/main/java/jsprit/core/problem/cost/BackwardTransportCost.java similarity index 89% rename from jsprit-core/src/main/java/basics/costs/BackwardTransportCost.java rename to jsprit-core/src/main/java/jsprit/core/problem/cost/BackwardTransportCost.java index 6cc76840..c9fbe8aa 100644 --- a/jsprit-core/src/main/java/basics/costs/BackwardTransportCost.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/cost/BackwardTransportCost.java @@ -14,10 +14,10 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.costs; +package jsprit.core.problem.cost; -import basics.route.Driver; -import basics.route.Vehicle; +import jsprit.core.problem.driver.Driver; +import jsprit.core.problem.vehicle.Vehicle; public interface BackwardTransportCost { diff --git a/jsprit-core/src/main/java/basics/costs/BackwardTransportTime.java b/jsprit-core/src/main/java/jsprit/core/problem/cost/BackwardTransportTime.java similarity index 89% rename from jsprit-core/src/main/java/basics/costs/BackwardTransportTime.java rename to jsprit-core/src/main/java/jsprit/core/problem/cost/BackwardTransportTime.java index 59160318..d5b81ffc 100644 --- a/jsprit-core/src/main/java/basics/costs/BackwardTransportTime.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/cost/BackwardTransportTime.java @@ -14,10 +14,10 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.costs; +package jsprit.core.problem.cost; -import basics.route.Driver; -import basics.route.Vehicle; +import jsprit.core.problem.driver.Driver; +import jsprit.core.problem.vehicle.Vehicle; public interface BackwardTransportTime { diff --git a/jsprit-core/src/main/java/basics/costs/ForwardTransportCost.java b/jsprit-core/src/main/java/jsprit/core/problem/cost/ForwardTransportCost.java similarity index 89% rename from jsprit-core/src/main/java/basics/costs/ForwardTransportCost.java rename to jsprit-core/src/main/java/jsprit/core/problem/cost/ForwardTransportCost.java index cea96390..9bc1b9e3 100644 --- a/jsprit-core/src/main/java/basics/costs/ForwardTransportCost.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/cost/ForwardTransportCost.java @@ -14,10 +14,10 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.costs; +package jsprit.core.problem.cost; -import basics.route.Driver; -import basics.route.Vehicle; +import jsprit.core.problem.driver.Driver; +import jsprit.core.problem.vehicle.Vehicle; public interface ForwardTransportCost { diff --git a/jsprit-core/src/main/java/basics/costs/ForwardTransportTime.java b/jsprit-core/src/main/java/jsprit/core/problem/cost/ForwardTransportTime.java similarity index 89% rename from jsprit-core/src/main/java/basics/costs/ForwardTransportTime.java rename to jsprit-core/src/main/java/jsprit/core/problem/cost/ForwardTransportTime.java index ab277e15..01c02cb1 100644 --- a/jsprit-core/src/main/java/basics/costs/ForwardTransportTime.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/cost/ForwardTransportTime.java @@ -14,10 +14,10 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.costs; +package jsprit.core.problem.cost; -import basics.route.Driver; -import basics.route.Vehicle; +import jsprit.core.problem.driver.Driver; +import jsprit.core.problem.vehicle.Vehicle; public interface ForwardTransportTime { diff --git a/jsprit-core/src/main/java/basics/costs/TransportCost.java b/jsprit-core/src/main/java/jsprit/core/problem/cost/TransportCost.java similarity index 96% rename from jsprit-core/src/main/java/basics/costs/TransportCost.java rename to jsprit-core/src/main/java/jsprit/core/problem/cost/TransportCost.java index 011a7599..fedf31c6 100644 --- a/jsprit-core/src/main/java/basics/costs/TransportCost.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/cost/TransportCost.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.costs; +package jsprit.core.problem.cost; public interface TransportCost extends ForwardTransportCost, BackwardTransportCost{ diff --git a/jsprit-core/src/main/java/basics/costs/TransportTime.java b/jsprit-core/src/main/java/jsprit/core/problem/cost/TransportTime.java similarity index 96% rename from jsprit-core/src/main/java/basics/costs/TransportTime.java rename to jsprit-core/src/main/java/jsprit/core/problem/cost/TransportTime.java index 741df692..fdc70e29 100644 --- a/jsprit-core/src/main/java/basics/costs/TransportTime.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/cost/TransportTime.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.costs; +package jsprit.core.problem.cost; public interface TransportTime extends ForwardTransportTime, BackwardTransportTime{ diff --git a/jsprit-core/src/main/java/basics/costs/VehicleRoutingActivityCosts.java b/jsprit-core/src/main/java/jsprit/core/problem/cost/VehicleRoutingActivityCosts.java similarity index 92% rename from jsprit-core/src/main/java/basics/costs/VehicleRoutingActivityCosts.java rename to jsprit-core/src/main/java/jsprit/core/problem/cost/VehicleRoutingActivityCosts.java index 5b14793b..cd043f37 100644 --- a/jsprit-core/src/main/java/basics/costs/VehicleRoutingActivityCosts.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/cost/VehicleRoutingActivityCosts.java @@ -14,11 +14,11 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.costs; +package jsprit.core.problem.cost; -import basics.route.Driver; -import basics.route.TourActivity; -import basics.route.Vehicle; +import jsprit.core.problem.driver.Driver; +import jsprit.core.problem.solution.route.activity.TourActivity; +import jsprit.core.problem.vehicle.Vehicle; /** * Interface for overall routing and operation costs. diff --git a/jsprit-core/src/main/java/basics/costs/VehicleRoutingTransportCosts.java b/jsprit-core/src/main/java/jsprit/core/problem/cost/VehicleRoutingTransportCosts.java similarity index 97% rename from jsprit-core/src/main/java/basics/costs/VehicleRoutingTransportCosts.java rename to jsprit-core/src/main/java/jsprit/core/problem/cost/VehicleRoutingTransportCosts.java index e4e5f5b0..60a2c2b3 100644 --- a/jsprit-core/src/main/java/basics/costs/VehicleRoutingTransportCosts.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/cost/VehicleRoutingTransportCosts.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.costs; +package jsprit.core.problem.cost; /** diff --git a/jsprit-core/src/main/java/basics/route/Driver.java b/jsprit-core/src/main/java/jsprit/core/problem/driver/Driver.java similarity index 96% rename from jsprit-core/src/main/java/basics/route/Driver.java rename to jsprit-core/src/main/java/jsprit/core/problem/driver/Driver.java index 216327ca..c64f4d39 100644 --- a/jsprit-core/src/main/java/basics/route/Driver.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/driver/Driver.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.route; +package jsprit.core.problem.driver; public interface Driver { diff --git a/jsprit-core/src/main/java/basics/route/DriverImpl.java b/jsprit-core/src/main/java/jsprit/core/problem/driver/DriverImpl.java similarity index 98% rename from jsprit-core/src/main/java/basics/route/DriverImpl.java rename to jsprit-core/src/main/java/jsprit/core/problem/driver/DriverImpl.java index 30743d02..a4787ac5 100644 --- a/jsprit-core/src/main/java/basics/route/DriverImpl.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/driver/DriverImpl.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.route; +package jsprit.core.problem.driver; public class DriverImpl implements Driver { diff --git a/jsprit-core/src/main/java/basics/io/Schema.java b/jsprit-core/src/main/java/jsprit/core/problem/io/Schema.java similarity index 98% rename from jsprit-core/src/main/java/basics/io/Schema.java rename to jsprit-core/src/main/java/jsprit/core/problem/io/Schema.java index 6457e1de..9bbdbb7b 100644 --- a/jsprit-core/src/main/java/basics/io/Schema.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/io/Schema.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.io; +package jsprit.core.problem.io; final class Schema { diff --git a/jsprit-core/src/main/java/basics/io/VrpXMLReader.java b/jsprit-core/src/main/java/jsprit/core/problem/io/VrpXMLReader.java similarity index 92% rename from jsprit-core/src/main/java/basics/io/VrpXMLReader.java rename to jsprit-core/src/main/java/jsprit/core/problem/io/VrpXMLReader.java index 86e07809..b6e15ab6 100644 --- a/jsprit-core/src/main/java/basics/io/VrpXMLReader.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/io/VrpXMLReader.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.io; +package jsprit.core.problem.io; import java.io.IOException; import java.io.InputStream; @@ -24,6 +24,28 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.VehicleRoutingProblem.FleetComposition; +import jsprit.core.problem.VehicleRoutingProblem.FleetSize; +import jsprit.core.problem.driver.Driver; +import jsprit.core.problem.driver.DriverImpl; +import jsprit.core.problem.job.Delivery; +import jsprit.core.problem.job.Pickup; +import jsprit.core.problem.job.Service; +import jsprit.core.problem.job.Shipment; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; +import jsprit.core.problem.solution.route.VehicleRoute; +import jsprit.core.problem.solution.route.activity.End; +import jsprit.core.problem.solution.route.activity.Start; +import jsprit.core.problem.solution.route.activity.TimeWindow; +import jsprit.core.problem.solution.route.activity.TourActivityFactory; +import jsprit.core.problem.vehicle.Vehicle; +import jsprit.core.problem.vehicle.VehicleImpl; +import jsprit.core.problem.vehicle.VehicleImpl.Builder; +import jsprit.core.problem.vehicle.VehicleTypeImpl; +import jsprit.core.util.Coordinate; +import jsprit.core.util.Resource; + import org.apache.commons.configuration.ConfigurationException; import org.apache.commons.configuration.HierarchicalConfiguration; import org.apache.commons.configuration.XMLConfiguration; @@ -32,28 +54,6 @@ import org.xml.sax.EntityResolver; import org.xml.sax.InputSource; import org.xml.sax.SAXException; -import util.Coordinate; -import util.Resource; -import basics.Delivery; -import basics.Pickup; -import basics.Service; -import basics.Shipment; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblem.FleetComposition; -import basics.VehicleRoutingProblem.FleetSize; -import basics.VehicleRoutingProblemSolution; -import basics.route.Driver; -import basics.route.DriverImpl; -import basics.route.End; -import basics.route.Start; -import basics.route.TimeWindow; -import basics.route.TourActivityFactory; -import basics.route.Vehicle; -import basics.route.VehicleImpl; -import basics.route.VehicleImpl.Builder; -import basics.route.VehicleRoute; -import basics.route.VehicleRouteBuilder; -import basics.route.VehicleTypeImpl; public class VrpXMLReader{ @@ -64,7 +64,7 @@ public class VrpXMLReader{ static class DefaultServiceBuilderFactory implements ServiceBuilderFactory{ @Override - public basics.Service.Builder createBuilder(String serviceType, String id, int size) { + public jsprit.core.problem.job.Service.Builder createBuilder(String serviceType, String id, int size) { if(serviceType.equals("pickup")){ return Pickup.Builder.newInstance(id, size); } @@ -86,7 +86,7 @@ public class VrpXMLReader{ VehicleRoutingProblem.Builder vrpBuilder; - public ServiceConfigReader(basics.VehicleRoutingProblem.Builder vrpBuilder) { + public ServiceConfigReader(jsprit.core.problem.VehicleRoutingProblem.Builder vrpBuilder) { super(); this.vrpBuilder = vrpBuilder; } @@ -103,7 +103,7 @@ public class VrpXMLReader{ VehicleRoutingProblem.Builder vrpBuilder; - public ShipmentConfigReader(basics.VehicleRoutingProblem.Builder vrpBuilder) { + public ShipmentConfigReader(jsprit.core.problem.VehicleRoutingProblem.Builder vrpBuilder) { super(); this.vrpBuilder = vrpBuilder; } @@ -237,7 +237,7 @@ public class VrpXMLReader{ End endAct = End.newInstance(vehicle.getLocationId(), vehicle.getEarliestDeparture(), vehicle.getLatestArrival()); endAct.setArrTime(Double.parseDouble(end)); - VehicleRouteBuilder routeBuilder = new VehicleRouteBuilder(vehicle, driver); + VehicleRoute.Builder routeBuilder = VehicleRoute.Builder.newInstance(vehicle, driver); List actConfigs = routeConfig.configurationsAt("act"); for(HierarchicalConfiguration actConfig : actConfigs){ String type = actConfig.getString("[@type]"); diff --git a/jsprit-core/src/main/java/basics/io/VrpXMLWriter.java b/jsprit-core/src/main/java/jsprit/core/problem/io/VrpXMLWriter.java similarity index 93% rename from jsprit-core/src/main/java/basics/io/VrpXMLWriter.java rename to jsprit-core/src/main/java/jsprit/core/problem/io/VrpXMLWriter.java index f9f3bf67..6167b29f 100644 --- a/jsprit-core/src/main/java/basics/io/VrpXMLWriter.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/io/VrpXMLWriter.java @@ -14,13 +14,24 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.io; +package jsprit.core.problem.io; import java.io.FileWriter; import java.io.IOException; import java.io.Writer; import java.util.Collection; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.job.Job; +import jsprit.core.problem.job.Service; +import jsprit.core.problem.job.Shipment; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; +import jsprit.core.problem.solution.route.VehicleRoute; +import jsprit.core.problem.solution.route.activity.TourActivity; +import jsprit.core.problem.solution.route.activity.TourActivity.JobActivity; +import jsprit.core.problem.vehicle.Vehicle; +import jsprit.core.problem.vehicle.VehicleType; + import org.apache.commons.configuration.ConfigurationException; import org.apache.commons.configuration.XMLConfiguration; import org.apache.log4j.Logger; @@ -29,16 +40,6 @@ import org.apache.xml.serialize.XMLSerializer; import org.w3c.dom.Document; import org.w3c.dom.Element; -import basics.Job; -import basics.Service; -import basics.Shipment; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblemSolution; -import basics.route.TourActivity; -import basics.route.TourActivity.JobActivity; -import basics.route.Vehicle; -import basics.route.VehicleRoute; -import basics.route.VehicleType; public class VrpXMLWriter { @@ -70,6 +71,7 @@ public class VrpXMLWriter { private static Logger logger = Logger.getLogger(VrpXMLWriter.class); public void write(String filename){ + if(!filename.endsWith(".xml")) filename+=".xml"; log.info("write vrp to " + filename); XMLConf xmlConfig = new XMLConf(); xmlConfig.setFileName(filename); @@ -123,7 +125,7 @@ public class VrpXMLWriter { xmlConfig.setProperty(solutionPath + "(" + counter + ").cost", solution.getCost()); int routeCounter = 0; for(VehicleRoute route : solution.getRoutes()){ - xmlConfig.setProperty(solutionPath + "(" + counter + ").routes.route(" + routeCounter + ").cost", route.getCost()); +// xmlConfig.setProperty(solutionPath + "(" + counter + ").routes.route(" + routeCounter + ").cost", route.getCost()); xmlConfig.setProperty(solutionPath + "(" + counter + ").routes.route(" + routeCounter + ").driverId", route.getDriver().getId()); xmlConfig.setProperty(solutionPath + "(" + counter + ").routes.route(" + routeCounter + ").vehicleId", route.getVehicle().getId()); xmlConfig.setProperty(solutionPath + "(" + counter + ").routes.route(" + routeCounter + ").start", route.getStart().getEndTime()); diff --git a/jsprit-core/src/main/java/basics/Delivery.java b/jsprit-core/src/main/java/jsprit/core/problem/job/Delivery.java similarity index 97% rename from jsprit-core/src/main/java/basics/Delivery.java rename to jsprit-core/src/main/java/jsprit/core/problem/job/Delivery.java index 7799dcac..cad46ce9 100644 --- a/jsprit-core/src/main/java/basics/Delivery.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/job/Delivery.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics; +package jsprit.core.problem.job; public final class Delivery extends Service{ diff --git a/jsprit-core/src/main/java/basics/Job.java b/jsprit-core/src/main/java/jsprit/core/problem/job/Job.java similarity index 96% rename from jsprit-core/src/main/java/basics/Job.java rename to jsprit-core/src/main/java/jsprit/core/problem/job/Job.java index 87249a36..50aec2bb 100644 --- a/jsprit-core/src/main/java/basics/Job.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/job/Job.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics; +package jsprit.core.problem.job; public interface Job { diff --git a/jsprit-core/src/main/java/basics/Pickup.java b/jsprit-core/src/main/java/jsprit/core/problem/job/Pickup.java similarity index 97% rename from jsprit-core/src/main/java/basics/Pickup.java rename to jsprit-core/src/main/java/jsprit/core/problem/job/Pickup.java index 34c167a4..96faa6b4 100644 --- a/jsprit-core/src/main/java/basics/Pickup.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/job/Pickup.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics; +package jsprit.core.problem.job; public final class Pickup extends Service { diff --git a/jsprit-core/src/main/java/basics/Service.java b/jsprit-core/src/main/java/jsprit/core/problem/job/Service.java similarity index 96% rename from jsprit-core/src/main/java/basics/Service.java rename to jsprit-core/src/main/java/jsprit/core/problem/job/Service.java index 82c781f2..69e2e6c0 100644 --- a/jsprit-core/src/main/java/basics/Service.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/job/Service.java @@ -14,10 +14,10 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics; +package jsprit.core.problem.job; -import util.Coordinate; -import basics.route.TimeWindow; +import jsprit.core.problem.solution.route.activity.TimeWindow; +import jsprit.core.util.Coordinate; public class Service implements Job { diff --git a/jsprit-core/src/main/java/basics/Shipment.java b/jsprit-core/src/main/java/jsprit/core/problem/job/Shipment.java similarity index 97% rename from jsprit-core/src/main/java/basics/Shipment.java rename to jsprit-core/src/main/java/jsprit/core/problem/job/Shipment.java index d312401f..6168aa98 100644 --- a/jsprit-core/src/main/java/basics/Shipment.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/job/Shipment.java @@ -1,7 +1,7 @@ -package basics; +package jsprit.core.problem.job; -import util.Coordinate; -import basics.route.TimeWindow; +import jsprit.core.problem.solution.route.activity.TimeWindow; +import jsprit.core.util.Coordinate; public class Shipment implements Job{ diff --git a/jsprit-core/src/main/java/algorithms/InsertionContext.java b/jsprit-core/src/main/java/jsprit/core/problem/misc/JobInsertionContext.java similarity index 83% rename from jsprit-core/src/main/java/algorithms/InsertionContext.java rename to jsprit-core/src/main/java/jsprit/core/problem/misc/JobInsertionContext.java index 16c5c377..08734530 100644 --- a/jsprit-core/src/main/java/algorithms/InsertionContext.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/misc/JobInsertionContext.java @@ -14,14 +14,14 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms; +package jsprit.core.problem.misc; -import basics.Job; -import basics.route.Driver; -import basics.route.Vehicle; -import basics.route.VehicleRoute; +import jsprit.core.problem.driver.Driver; +import jsprit.core.problem.job.Job; +import jsprit.core.problem.solution.route.VehicleRoute; +import jsprit.core.problem.vehicle.Vehicle; -public class InsertionContext { +public class JobInsertionContext { private VehicleRoute route; private Job job; @@ -64,7 +64,7 @@ public class InsertionContext { return newDepTime; } - public InsertionContext(VehicleRoute route, Job job, Vehicle newVehicle, + public JobInsertionContext(VehicleRoute route, Job job, Vehicle newVehicle, Driver newDriver, double newDepTime) { super(); this.route = route; diff --git a/jsprit-core/src/main/java/algorithms/InitialSolutionFactory.java b/jsprit-core/src/main/java/jsprit/core/problem/solution/InitialSolutionFactory.java similarity index 90% rename from jsprit-core/src/main/java/algorithms/InitialSolutionFactory.java rename to jsprit-core/src/main/java/jsprit/core/problem/solution/InitialSolutionFactory.java index 0942bddd..96fa7f82 100644 --- a/jsprit-core/src/main/java/algorithms/InitialSolutionFactory.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/solution/InitialSolutionFactory.java @@ -14,10 +14,9 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms; +package jsprit.core.problem.solution; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblemSolution; +import jsprit.core.problem.VehicleRoutingProblem; diff --git a/jsprit-core/src/main/java/basics/algo/SolutionCostCalculator.java b/jsprit-core/src/main/java/jsprit/core/problem/solution/SolutionCostCalculator.java similarity index 94% rename from jsprit-core/src/main/java/basics/algo/SolutionCostCalculator.java rename to jsprit-core/src/main/java/jsprit/core/problem/solution/SolutionCostCalculator.java index db67b2ca..92c226cf 100644 --- a/jsprit-core/src/main/java/basics/algo/SolutionCostCalculator.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/solution/SolutionCostCalculator.java @@ -14,9 +14,8 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.algo; +package jsprit.core.problem.solution; -import basics.VehicleRoutingProblemSolution; public interface SolutionCostCalculator { diff --git a/jsprit-core/src/main/java/basics/VehicleRoutingProblemSolution.java b/jsprit-core/src/main/java/jsprit/core/problem/solution/VehicleRoutingProblemSolution.java similarity index 95% rename from jsprit-core/src/main/java/basics/VehicleRoutingProblemSolution.java rename to jsprit-core/src/main/java/jsprit/core/problem/solution/VehicleRoutingProblemSolution.java index 4bf61585..c5c9ed86 100644 --- a/jsprit-core/src/main/java/basics/VehicleRoutingProblemSolution.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/solution/VehicleRoutingProblemSolution.java @@ -14,12 +14,13 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics; +package jsprit.core.problem.solution; import java.util.ArrayList; import java.util.Collection; -import basics.route.VehicleRoute; +import jsprit.core.problem.solution.route.VehicleRoute; + /** * Contains the solution of a vehicle routing problem and its corresponding costs. diff --git a/jsprit-core/src/main/java/basics/route/ReverseRouteActivityVisitor.java b/jsprit-core/src/main/java/jsprit/core/problem/solution/route/ReverseRouteActivityVisitor.java similarity index 91% rename from jsprit-core/src/main/java/basics/route/ReverseRouteActivityVisitor.java rename to jsprit-core/src/main/java/jsprit/core/problem/solution/route/ReverseRouteActivityVisitor.java index 0f9be0ee..dc678c1e 100644 --- a/jsprit-core/src/main/java/basics/route/ReverseRouteActivityVisitor.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/solution/route/ReverseRouteActivityVisitor.java @@ -14,12 +14,15 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.route; +package jsprit.core.problem.solution.route; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; +import jsprit.core.problem.solution.route.activity.ReverseActivityVisitor; +import jsprit.core.problem.solution.route.activity.TourActivity; + public class ReverseRouteActivityVisitor implements RouteVisitor{ diff --git a/jsprit-core/src/main/java/basics/route/RouteActivityVisitor.java b/jsprit-core/src/main/java/jsprit/core/problem/solution/route/RouteActivityVisitor.java similarity index 91% rename from jsprit-core/src/main/java/basics/route/RouteActivityVisitor.java rename to jsprit-core/src/main/java/jsprit/core/problem/solution/route/RouteActivityVisitor.java index 2ac45a03..5c9db156 100644 --- a/jsprit-core/src/main/java/basics/route/RouteActivityVisitor.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/solution/route/RouteActivityVisitor.java @@ -14,11 +14,14 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.route; +package jsprit.core.problem.solution.route; import java.util.ArrayList; import java.util.Collection; +import jsprit.core.problem.solution.route.activity.ActivityVisitor; +import jsprit.core.problem.solution.route.activity.TourActivity; + public class RouteActivityVisitor implements RouteVisitor{ diff --git a/jsprit-core/src/main/java/basics/route/RouteVisitor.java b/jsprit-core/src/main/java/jsprit/core/problem/solution/route/RouteVisitor.java similarity index 95% rename from jsprit-core/src/main/java/basics/route/RouteVisitor.java rename to jsprit-core/src/main/java/jsprit/core/problem/solution/route/RouteVisitor.java index df7669c8..8fdc412c 100644 --- a/jsprit-core/src/main/java/basics/route/RouteVisitor.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/solution/route/RouteVisitor.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.route; +package jsprit.core.problem.solution.route; public interface RouteVisitor { diff --git a/jsprit-core/src/main/java/jsprit/core/problem/solution/route/VehicleRoute.java b/jsprit-core/src/main/java/jsprit/core/problem/solution/route/VehicleRoute.java new file mode 100644 index 00000000..22695b9d --- /dev/null +++ b/jsprit-core/src/main/java/jsprit/core/problem/solution/route/VehicleRoute.java @@ -0,0 +1,300 @@ +/******************************************************************************* + * 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 . + ******************************************************************************/ +package jsprit.core.problem.solution.route; + +import java.util.HashSet; +import java.util.Set; + +import jsprit.core.problem.driver.Driver; +import jsprit.core.problem.driver.DriverImpl; +import jsprit.core.problem.job.Service; +import jsprit.core.problem.job.Shipment; +import jsprit.core.problem.solution.route.activity.DefaultShipmentActivityFactory; +import jsprit.core.problem.solution.route.activity.DefaultTourActivityFactory; +import jsprit.core.problem.solution.route.activity.End; +import jsprit.core.problem.solution.route.activity.Start; +import jsprit.core.problem.solution.route.activity.TourActivities; +import jsprit.core.problem.solution.route.activity.TourActivity; +import jsprit.core.problem.solution.route.activity.TourActivityFactory; +import jsprit.core.problem.solution.route.activity.TourShipmentActivityFactory; +import jsprit.core.problem.vehicle.Vehicle; +import jsprit.core.problem.vehicle.VehicleImpl; +import jsprit.core.problem.vehicle.VehicleImpl.NoVehicle; + +public class VehicleRoute { + + public static VehicleRoute copyOf(VehicleRoute route) { + return new VehicleRoute(route); + } + + public static VehicleRoute newInstance(TourActivities tour, Driver driver, Vehicle vehicle) { + return new VehicleRoute(tour,driver,vehicle); + } + + public static VehicleRoute emptyRoute() { + return new VehicleRoute(TourActivities.emptyTour(), DriverImpl.noDriver(), VehicleImpl.noVehicle()); + } + + public static class Builder { + + public static Builder newInstance(Vehicle vehicle, Driver driver){ + return new Builder(vehicle,driver); + } + + private Vehicle vehicle; + + private Driver driver; + + private Start start; + + private TourActivities tourActivities = new TourActivities(); + + private TourActivityFactory serviceActivityFactory = new DefaultTourActivityFactory(); + + private TourShipmentActivityFactory shipmentActivityFactory = new DefaultShipmentActivityFactory(); + + private Set openShipments = new HashSet(); + + public void setServiceActivityFactory(TourActivityFactory serviceActivityFactory) { + this.serviceActivityFactory = serviceActivityFactory; + } + + public void setShipmentActivityFactory(TourShipmentActivityFactory shipmentActivityFactory) { + this.shipmentActivityFactory = shipmentActivityFactory; + } + + /** + * Constructs the route-builder. + * @param vehicle + * @param driver + */ + private Builder(Vehicle vehicle, Driver driver) { + super(); + this.vehicle = vehicle; + this.driver = driver; + start = Start.newInstance(vehicle.getLocationId(), vehicle.getEarliestDeparture(), vehicle.getLatestArrival()); + start.setEndTime(vehicle.getEarliestDeparture()); + End.newInstance(vehicle.getLocationId(), vehicle.getEarliestDeparture(), vehicle.getLatestArrival()); + } + + /** + * Sets the departure-time of the route. + * + * @param departureTime + * @return + */ + public Builder setDepartureTime(double departureTime){ + start.setEndTime(departureTime); + return this; + } + + public Builder addService(Service service){ + addService(service,0.0,0.0); + return this; + } + + public Builder addService(Service service, double arrTime, double endTime){ + TourActivity act = serviceActivityFactory.createActivity(service); + act.setArrTime(arrTime); + act.setEndTime(endTime); + tourActivities.addActivity(act); + return this; + } + + /** + * Adds a the pickup of the specified shipment. + * + * @param shipment + * @throws IllegalStateException if method has already been called with the specified shipment. + * @return + */ + public Builder addPickup(Shipment shipment){ + addPickup(shipment,0.0,0.0); + return this; + } + + /** + * Adds a the pickup of the specified shipment at specified arrival and end-time. + * + * @param shipment + * @throws IllegalStateException if method has already been called with the specified shipment. + * @return + */ + public Builder addPickup(Shipment shipment, double arrTime, double endTime){ + if(openShipments.contains(shipment)) throw new IllegalStateException("shipment has already been added. cannot add it twice."); + TourActivity act = shipmentActivityFactory.createPickup(shipment); + act.setArrTime(arrTime); + act.setEndTime(endTime); + tourActivities.addActivity(act); + openShipments.add(shipment); + return this; + } + + /** + * Adds a the delivery of the specified shipment. + * + * @param shipment + * @throws IllegalStateException if specified shipment has not been picked up yet (i.e. method addPickup(shipment) has not been called yet). + * @return + */ + public Builder addDelivery(Shipment shipment){ + addDelivery(shipment,0.0,0.0); + return this; + } + + /** + * Adds a the delivery of the specified shipment at a specified arrival and endTime. + * + * @param shipment + * @throws IllegalStateException if specified shipment has not been picked up yet (i.e. method addPickup(shipment) has not been called yet). + * @return + */ + public Builder addDelivery(Shipment shipment, double arrTime, double endTime){ + if(openShipments.contains(shipment)){ + TourActivity act = shipmentActivityFactory.createDelivery(shipment); + act.setArrTime(arrTime); + act.setEndTime(endTime); + tourActivities.addActivity(act); + openShipments.remove(shipment); + } + else{ throw new IllegalStateException("cannot deliver shipment. shipment " + shipment + " needs to be picked up first."); } + return this; + } + + /** + * Builds the route. + * + * @return {@link VehicleRoute} + * @throws IllegalStateException if there are still shipments that have been picked up though but not delivery. + */ + public VehicleRoute build(){ + if(!openShipments.isEmpty()){ + throw new IllegalStateException("there are still shipments that have not been delivered yet."); + } + VehicleRoute route = VehicleRoute.newInstance(tourActivities, driver, vehicle); + return route; + } + + } + + private TourActivities tourActivities; + + private Vehicle vehicle; + + private Driver driver; + + private Start start; + + private End end; + + private VehicleRoute(VehicleRoute route){ + this.start = Start.copyOf(route.getStart()); + this.end = End.copyOf(route.getEnd()); + this.tourActivities = TourActivities.copyOf(route.getTourActivities()); + this.vehicle = route.getVehicle(); + this.driver = route.getDriver(); + } + + private VehicleRoute(TourActivities tour, Driver driver, Vehicle vehicle) { + super(); + verify(tour, driver, vehicle); + this.tourActivities = tour; + this.vehicle = vehicle; + this.driver = driver; + setStartAndEnd(vehicle, vehicle.getEarliestDeparture()); + } + +// private VehicleRoute(Builder builder){ +// this.tourActivities = builder.tour; +// this.vehicle = builder.vehicle; +// this.driver = builder.driver; +// this.start = builder.start; +// this.end = builder.end; +// } + + private void verify(TourActivities tour, Driver driver, Vehicle vehicle) { + if(tour == null || driver == null || vehicle == null) throw new IllegalStateException("null is not allowed for tour, driver or vehicle. use emptyRoute. use Tour.emptyTour, DriverImpl.noDriver() and VehicleImpl.noVehicle() instead." + + "\n\tor make it easier and use VehicleRoute.emptyRoute()"); + if(!tour.isEmpty() && vehicle instanceof NoVehicle){ + throw new IllegalStateException("if tour is not empty. there must be a vehicle for this tour, but there is no vehicle."); + } + } + + public TourActivities getTourActivities() { + return tourActivities; + } + + + public Vehicle getVehicle() { + return vehicle; + } + + public Driver getDriver() { + return driver; + } + + public void setVehicle(Vehicle vehicle, double vehicleDepTime){ + this.vehicle = vehicle; + setStartAndEnd(vehicle, vehicleDepTime); + } + + public void setDepartureTime(double vehicleDepTime){ + if(start == null) throw new IllegalStateException("cannot set departureTime without having a vehicle on this route. use setVehicle(vehicle,departureTime) instead."); + start.setEndTime(vehicleDepTime); + } + + public double getDepartureTime(){ + if(start == null) throw new IllegalStateException("cannot get departureTime without having a vehicle on this route. use setVehicle(vehicle,departureTime) instead."); + return start.getEndTime(); + } + + private void setStartAndEnd(Vehicle vehicle, double vehicleDepTime) { + if(!(vehicle instanceof NoVehicle)){ + if(start == null && end == null){ + start = Start.newInstance(vehicle.getLocationId(), vehicle.getEarliestDeparture(), vehicle.getLatestArrival()); + end = End.newInstance(vehicle.getLocationId(), vehicle.getEarliestDeparture(), vehicle.getLatestArrival()); + } + start.setEndTime(vehicleDepTime); + start.setTheoreticalEarliestOperationStartTime(vehicle.getEarliestDeparture()); + start.setTheoreticalLatestOperationStartTime(vehicle.getLatestArrival()); + start.setLocationId(vehicle.getLocationId()); + end.setLocationId(vehicle.getLocationId()); + end.setTheoreticalEarliestOperationStartTime(vehicle.getEarliestDeparture()); + end.setTheoreticalLatestOperationStartTime(vehicle.getLatestArrival()); + } + + } + + + public boolean isEmpty() { + return tourActivities.isEmpty(); + } + + public Start getStart() { + return start; + } + + public End getEnd() { + return end; + } + + @Override + public String toString() { + return "[start="+start+"][end=" + end + "][departureTime=" + start.getEndTime() + "][vehicle=" + vehicle + "][driver=" + driver + "][nuOfActs="+tourActivities.getActivities().size()+"]"; + } + +} diff --git a/jsprit-core/src/main/java/basics/route/ActivityVisitor.java b/jsprit-core/src/main/java/jsprit/core/problem/solution/route/activity/ActivityVisitor.java similarity index 90% rename from jsprit-core/src/main/java/basics/route/ActivityVisitor.java rename to jsprit-core/src/main/java/jsprit/core/problem/solution/route/activity/ActivityVisitor.java index 6ad321f3..d85d3465 100644 --- a/jsprit-core/src/main/java/basics/route/ActivityVisitor.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/solution/route/activity/ActivityVisitor.java @@ -14,7 +14,9 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.route; +package jsprit.core.problem.solution.route.activity; + +import jsprit.core.problem.solution.route.VehicleRoute; public interface ActivityVisitor { diff --git a/jsprit-core/src/main/java/basics/route/DefaultShipmentActivityFactory.java b/jsprit-core/src/main/java/jsprit/core/problem/solution/route/activity/DefaultShipmentActivityFactory.java similarity index 76% rename from jsprit-core/src/main/java/basics/route/DefaultShipmentActivityFactory.java rename to jsprit-core/src/main/java/jsprit/core/problem/solution/route/activity/DefaultShipmentActivityFactory.java index c07d0992..040f322e 100644 --- a/jsprit-core/src/main/java/basics/route/DefaultShipmentActivityFactory.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/solution/route/activity/DefaultShipmentActivityFactory.java @@ -1,6 +1,6 @@ -package basics.route; +package jsprit.core.problem.solution.route.activity; -import basics.Shipment; +import jsprit.core.problem.job.Shipment; public class DefaultShipmentActivityFactory implements TourShipmentActivityFactory{ diff --git a/jsprit-core/src/main/java/basics/route/DefaultTourActivityFactory.java b/jsprit-core/src/main/java/jsprit/core/problem/solution/route/activity/DefaultTourActivityFactory.java similarity index 88% rename from jsprit-core/src/main/java/basics/route/DefaultTourActivityFactory.java rename to jsprit-core/src/main/java/jsprit/core/problem/solution/route/activity/DefaultTourActivityFactory.java index 85b2257b..188d7e97 100644 --- a/jsprit-core/src/main/java/basics/route/DefaultTourActivityFactory.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/solution/route/activity/DefaultTourActivityFactory.java @@ -14,11 +14,11 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.route; +package jsprit.core.problem.solution.route.activity; -import basics.Delivery; -import basics.Pickup; -import basics.Service; +import jsprit.core.problem.job.Delivery; +import jsprit.core.problem.job.Pickup; +import jsprit.core.problem.job.Service; public class DefaultTourActivityFactory implements TourActivityFactory{ diff --git a/jsprit-core/src/main/java/basics/route/DeliverService.java b/jsprit-core/src/main/java/jsprit/core/problem/solution/route/activity/DeliverService.java similarity index 94% rename from jsprit-core/src/main/java/basics/route/DeliverService.java rename to jsprit-core/src/main/java/jsprit/core/problem/solution/route/activity/DeliverService.java index 92ce6148..67fad82f 100644 --- a/jsprit-core/src/main/java/basics/route/DeliverService.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/solution/route/activity/DeliverService.java @@ -1,6 +1,6 @@ -package basics.route; +package jsprit.core.problem.solution.route.activity; -import basics.Delivery; +import jsprit.core.problem.job.Delivery; public final class DeliverService implements DeliveryActivity{ diff --git a/jsprit-core/src/main/java/basics/route/DeliverShipment.java b/jsprit-core/src/main/java/jsprit/core/problem/solution/route/activity/DeliverShipment.java similarity index 92% rename from jsprit-core/src/main/java/basics/route/DeliverShipment.java rename to jsprit-core/src/main/java/jsprit/core/problem/solution/route/activity/DeliverShipment.java index 43f8cb97..41e44095 100644 --- a/jsprit-core/src/main/java/basics/route/DeliverShipment.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/solution/route/activity/DeliverShipment.java @@ -1,7 +1,7 @@ -package basics.route; +package jsprit.core.problem.solution.route.activity; -import basics.Job; -import basics.Shipment; +import jsprit.core.problem.job.Job; +import jsprit.core.problem.job.Shipment; public final class DeliverShipment implements DeliveryActivity{ diff --git a/jsprit-core/src/main/java/basics/route/DeliveryActivity.java b/jsprit-core/src/main/java/jsprit/core/problem/solution/route/activity/DeliveryActivity.java similarity index 87% rename from jsprit-core/src/main/java/basics/route/DeliveryActivity.java rename to jsprit-core/src/main/java/jsprit/core/problem/solution/route/activity/DeliveryActivity.java index 4c49f0fc..f845c7a1 100644 --- a/jsprit-core/src/main/java/basics/route/DeliveryActivity.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/solution/route/activity/DeliveryActivity.java @@ -14,9 +14,9 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.route; +package jsprit.core.problem.solution.route.activity; -import basics.route.TourActivity.JobActivity; +import jsprit.core.problem.solution.route.activity.TourActivity.JobActivity; public interface DeliveryActivity extends JobActivity{ diff --git a/jsprit-core/src/main/java/basics/route/End.java b/jsprit-core/src/main/java/jsprit/core/problem/solution/route/activity/End.java similarity index 97% rename from jsprit-core/src/main/java/basics/route/End.java rename to jsprit-core/src/main/java/jsprit/core/problem/solution/route/activity/End.java index 1b399556..beacc9ad 100644 --- a/jsprit-core/src/main/java/basics/route/End.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/solution/route/activity/End.java @@ -14,9 +14,9 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.route; +package jsprit.core.problem.solution.route.activity; -import util.Coordinate; +import jsprit.core.util.Coordinate; public final class End implements TourActivity { diff --git a/jsprit-core/src/main/java/basics/route/PickupActivity.java b/jsprit-core/src/main/java/jsprit/core/problem/solution/route/activity/PickupActivity.java similarity index 87% rename from jsprit-core/src/main/java/basics/route/PickupActivity.java rename to jsprit-core/src/main/java/jsprit/core/problem/solution/route/activity/PickupActivity.java index 49293807..64ed2595 100644 --- a/jsprit-core/src/main/java/basics/route/PickupActivity.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/solution/route/activity/PickupActivity.java @@ -14,9 +14,9 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.route; +package jsprit.core.problem.solution.route.activity; -import basics.route.TourActivity.JobActivity; +import jsprit.core.problem.solution.route.activity.TourActivity.JobActivity; public interface PickupActivity extends JobActivity{ diff --git a/jsprit-core/src/main/java/basics/route/PickupService.java b/jsprit-core/src/main/java/jsprit/core/problem/solution/route/activity/PickupService.java similarity index 92% rename from jsprit-core/src/main/java/basics/route/PickupService.java rename to jsprit-core/src/main/java/jsprit/core/problem/solution/route/activity/PickupService.java index 200cd7bf..856e9087 100644 --- a/jsprit-core/src/main/java/basics/route/PickupService.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/solution/route/activity/PickupService.java @@ -1,7 +1,7 @@ -package basics.route; +package jsprit.core.problem.solution.route.activity; -import basics.Pickup; -import basics.Service; +import jsprit.core.problem.job.Pickup; +import jsprit.core.problem.job.Service; public final class PickupService implements PickupActivity{ diff --git a/jsprit-core/src/main/java/basics/route/PickupShipment.java b/jsprit-core/src/main/java/jsprit/core/problem/solution/route/activity/PickupShipment.java similarity index 92% rename from jsprit-core/src/main/java/basics/route/PickupShipment.java rename to jsprit-core/src/main/java/jsprit/core/problem/solution/route/activity/PickupShipment.java index 66601758..eb0451d1 100644 --- a/jsprit-core/src/main/java/basics/route/PickupShipment.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/solution/route/activity/PickupShipment.java @@ -1,7 +1,7 @@ -package basics.route; +package jsprit.core.problem.solution.route.activity; -import basics.Job; -import basics.Shipment; +import jsprit.core.problem.job.Job; +import jsprit.core.problem.job.Shipment; public final class PickupShipment implements PickupActivity{ diff --git a/jsprit-core/src/main/java/basics/route/ReverseActivityVisitor.java b/jsprit-core/src/main/java/jsprit/core/problem/solution/route/activity/ReverseActivityVisitor.java similarity index 90% rename from jsprit-core/src/main/java/basics/route/ReverseActivityVisitor.java rename to jsprit-core/src/main/java/jsprit/core/problem/solution/route/activity/ReverseActivityVisitor.java index 90896cd0..ec1c3fc5 100644 --- a/jsprit-core/src/main/java/basics/route/ReverseActivityVisitor.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/solution/route/activity/ReverseActivityVisitor.java @@ -14,7 +14,9 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.route; +package jsprit.core.problem.solution.route.activity; + +import jsprit.core.problem.solution.route.VehicleRoute; public interface ReverseActivityVisitor { diff --git a/jsprit-core/src/main/java/basics/route/ServiceActivity.java b/jsprit-core/src/main/java/jsprit/core/problem/solution/route/activity/ServiceActivity.java similarity index 95% rename from jsprit-core/src/main/java/basics/route/ServiceActivity.java rename to jsprit-core/src/main/java/jsprit/core/problem/solution/route/activity/ServiceActivity.java index e9f454e8..97ddd134 100644 --- a/jsprit-core/src/main/java/basics/route/ServiceActivity.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/solution/route/activity/ServiceActivity.java @@ -14,10 +14,10 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.route; +package jsprit.core.problem.solution.route.activity; -import basics.Service; -import basics.route.TourActivity.JobActivity; +import jsprit.core.problem.job.Service; +import jsprit.core.problem.solution.route.activity.TourActivity.JobActivity; public class ServiceActivity implements JobActivity{ diff --git a/jsprit-core/src/main/java/basics/route/Start.java b/jsprit-core/src/main/java/jsprit/core/problem/solution/route/activity/Start.java similarity index 97% rename from jsprit-core/src/main/java/basics/route/Start.java rename to jsprit-core/src/main/java/jsprit/core/problem/solution/route/activity/Start.java index 94f09008..13067feb 100644 --- a/jsprit-core/src/main/java/basics/route/Start.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/solution/route/activity/Start.java @@ -14,9 +14,9 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.route; +package jsprit.core.problem.solution.route.activity; -import util.Coordinate; +import jsprit.core.util.Coordinate; public final class Start implements TourActivity { diff --git a/jsprit-core/src/main/java/basics/route/TimeWindow.java b/jsprit-core/src/main/java/jsprit/core/problem/solution/route/activity/TimeWindow.java similarity index 97% rename from jsprit-core/src/main/java/basics/route/TimeWindow.java rename to jsprit-core/src/main/java/jsprit/core/problem/solution/route/activity/TimeWindow.java index a00a5e5c..a78a3a60 100644 --- a/jsprit-core/src/main/java/basics/route/TimeWindow.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/solution/route/activity/TimeWindow.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.route; +package jsprit.core.problem.solution.route.activity; /** * diff --git a/jsprit-core/src/main/java/basics/route/TourActivities.java b/jsprit-core/src/main/java/jsprit/core/problem/solution/route/activity/TourActivities.java similarity index 97% rename from jsprit-core/src/main/java/basics/route/TourActivities.java rename to jsprit-core/src/main/java/jsprit/core/problem/solution/route/activity/TourActivities.java index 00c01f3f..33161cc2 100644 --- a/jsprit-core/src/main/java/basics/route/TourActivities.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/solution/route/activity/TourActivities.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.route; +package jsprit.core.problem.solution.route.activity; import java.util.ArrayList; import java.util.Collection; @@ -24,8 +24,9 @@ import java.util.Iterator; import java.util.List; import java.util.Set; -import basics.Job; -import basics.route.TourActivity.JobActivity; +import jsprit.core.problem.job.Job; +import jsprit.core.problem.solution.route.activity.TourActivity.JobActivity; + /** diff --git a/jsprit-core/src/main/java/basics/route/TourActivity.java b/jsprit-core/src/main/java/jsprit/core/problem/solution/route/activity/TourActivity.java similarity index 94% rename from jsprit-core/src/main/java/basics/route/TourActivity.java rename to jsprit-core/src/main/java/jsprit/core/problem/solution/route/activity/TourActivity.java index 6c4532ac..56b28972 100644 --- a/jsprit-core/src/main/java/basics/route/TourActivity.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/solution/route/activity/TourActivity.java @@ -14,9 +14,9 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.route; +package jsprit.core.problem.solution.route.activity; -import basics.Job; +import jsprit.core.problem.job.Job; public interface TourActivity { diff --git a/jsprit-core/src/main/java/basics/route/TourActivityFactory.java b/jsprit-core/src/main/java/jsprit/core/problem/solution/route/activity/TourActivityFactory.java similarity index 91% rename from jsprit-core/src/main/java/basics/route/TourActivityFactory.java rename to jsprit-core/src/main/java/jsprit/core/problem/solution/route/activity/TourActivityFactory.java index f8dd44c1..11e90a2e 100644 --- a/jsprit-core/src/main/java/basics/route/TourActivityFactory.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/solution/route/activity/TourActivityFactory.java @@ -14,9 +14,9 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.route; +package jsprit.core.problem.solution.route.activity; -import basics.Service; +import jsprit.core.problem.job.Service; public interface TourActivityFactory { diff --git a/jsprit-core/src/main/java/basics/route/TourShipmentActivityFactory.java b/jsprit-core/src/main/java/jsprit/core/problem/solution/route/activity/TourShipmentActivityFactory.java similarity index 63% rename from jsprit-core/src/main/java/basics/route/TourShipmentActivityFactory.java rename to jsprit-core/src/main/java/jsprit/core/problem/solution/route/activity/TourShipmentActivityFactory.java index 66a1f400..2c1ff9c9 100644 --- a/jsprit-core/src/main/java/basics/route/TourShipmentActivityFactory.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/solution/route/activity/TourShipmentActivityFactory.java @@ -1,6 +1,6 @@ -package basics.route; +package jsprit.core.problem.solution.route.activity; -import basics.Shipment; +import jsprit.core.problem.job.Shipment; public interface TourShipmentActivityFactory { diff --git a/jsprit-core/src/main/java/algorithms/StateGetter.java b/jsprit-core/src/main/java/jsprit/core/problem/solution/route/state/RouteAndActivityStateGetter.java similarity index 64% rename from jsprit-core/src/main/java/algorithms/StateGetter.java rename to jsprit-core/src/main/java/jsprit/core/problem/solution/route/state/RouteAndActivityStateGetter.java index 32a88e0e..7de0f4f5 100644 --- a/jsprit-core/src/main/java/algorithms/StateGetter.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/solution/route/state/RouteAndActivityStateGetter.java @@ -14,25 +14,18 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms; +package jsprit.core.problem.solution.route.state; -import basics.route.TourActivity; -import basics.route.VehicleRoute; +import jsprit.core.problem.solution.route.VehicleRoute; +import jsprit.core.problem.solution.route.activity.TourActivity; +import jsprit.core.problem.solution.route.state.StateFactory.State; +import jsprit.core.problem.solution.route.state.StateFactory.StateId; -public interface StateGetter { - - public interface StateId { - - } - - public interface State { - double toDouble(); - } - +public interface RouteAndActivityStateGetter { - State getActivityState(TourActivity act, StateId stateId); + public State getActivityState(TourActivity act, StateId stateId); - State getRouteState(VehicleRoute route, StateId stateId); + public State getRouteState(VehicleRoute route, StateId stateId); } diff --git a/jsprit-core/src/main/java/algorithms/StateFactory.java b/jsprit-core/src/main/java/jsprit/core/problem/solution/route/state/StateFactory.java similarity index 54% rename from jsprit-core/src/main/java/algorithms/StateFactory.java rename to jsprit-core/src/main/java/jsprit/core/problem/solution/route/state/StateFactory.java index dc2fb84f..bdd337e1 100644 --- a/jsprit-core/src/main/java/algorithms/StateFactory.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/solution/route/state/StateFactory.java @@ -18,51 +18,113 @@ * Contributors: * Stefan Schroeder - initial API and implementation ******************************************************************************/ -package algorithms; +package jsprit.core.problem.solution.route.state; import java.util.Arrays; +import java.util.HashMap; import java.util.List; +import java.util.Map; -import algorithms.StateGetter.State; -import algorithms.StateGetter.StateId; -import algorithms.StateManager.StateImpl; public class StateFactory { - final static StateId MAXLOAD = new StateIdImpl("maxload"); - final static StateId LOAD = new StateIdImpl("load"); + public interface StateId { + + } - final static StateId COSTS = new StateIdImpl("costs"); + public interface State { + double toDouble(); + } - final static StateId LOAD_AT_BEGINNING = new StateIdImpl("loadAtBeginning"); + - final static StateId LOAD_AT_END = new StateIdImpl("loadAtEnd"); + public interface States { + + State getState(StateId key); + + void putState(StateId id, State state); + + } - final static StateId DURATION = new StateIdImpl("duration"); + static class StateImpl implements State{ + double state; + + public StateImpl(double state) { + super(); + this.state = state; + } + + @Override + public double toDouble() { + return state; + } + + } - final static StateId LATEST_OPERATION_START_TIME = new StateIdImpl("latestOST"); + static class StatesImpl implements States{ + + private Map states = new HashMap(); + + public void putState(StateId key, State state) { + states.put(key, state); + } + + @Override + public State getState(StateId key) { + return states.get(key); + } + + } - final static StateId EARLIEST_OPERATION_START_TIME = new StateIdImpl("earliestOST"); + public final static StateId MAXLOAD = new StateIdImpl("maxload"); - final static StateId FUTURE_PICKS = new StateIdImpl("futurePicks"); + public final static StateId LOAD = new StateIdImpl("load"); - final static StateId PAST_DELIVERIES = new StateIdImpl("pastDeliveries"); + public final static StateId COSTS = new StateIdImpl("costs"); + + public final static StateId LOAD_AT_BEGINNING = new StateIdImpl("loadAtBeginning"); + + public final static StateId LOAD_AT_END = new StateIdImpl("loadAtEnd"); + + public final static StateId DURATION = new StateIdImpl("duration"); + + public final static StateId LATEST_OPERATION_START_TIME = new StateIdImpl("latestOST"); + + public final static StateId EARLIEST_OPERATION_START_TIME = new StateIdImpl("earliestOST"); + + public final static StateId FUTURE_MAXLOAD = new StateIdImpl("futureMaxload"); + + public final static StateId PAST_MAXLOAD = new StateIdImpl("pastMaxload"); final static List reservedIds = Arrays.asList("maxload","load","costs","loadAtBeginning","loadAtEnd","duration","latestOST","earliestOST" - ,"futurePicks","pastDeliveries"); + ,"futureMaxload","pastMaxload"); + public static States createStates(){ + return new StatesImpl(); + } + public static StateId createId(String name){ - if(reservedIds.contains(name)){ throwException(name); } + if(reservedIds.contains(name)){ throwReservedIdException(name); } return new StateIdImpl(name); } public static State createState(double value){ return new StateImpl(value); } + + public static boolean isReservedId(String stateId){ + if(reservedIds.contains(stateId)) return true; + return false; + } - private static void throwException(String name) { + public static boolean isReservedId(StateId stateId){ + if(reservedIds.contains(stateId.toString())) return true; + return false; + } + + public static void throwReservedIdException(String name) { throw new IllegalStateException("state-id with name '" + name + "' cannot be created. it is already reserved internally."); } diff --git a/jsprit-core/src/main/java/basics/route/FiniteFleetManagerFactory.java b/jsprit-core/src/main/java/jsprit/core/problem/vehicle/FiniteFleetManagerFactory.java similarity index 91% rename from jsprit-core/src/main/java/basics/route/FiniteFleetManagerFactory.java rename to jsprit-core/src/main/java/jsprit/core/problem/vehicle/FiniteFleetManagerFactory.java index 05c01461..29358743 100644 --- a/jsprit-core/src/main/java/basics/route/FiniteFleetManagerFactory.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/vehicle/FiniteFleetManagerFactory.java @@ -1,4 +1,4 @@ -package basics.route; +package jsprit.core.problem.vehicle; import java.util.Collection; diff --git a/jsprit-core/src/main/java/basics/route/InfiniteFleetManagerFactory.java b/jsprit-core/src/main/java/jsprit/core/problem/vehicle/InfiniteFleetManagerFactory.java similarity index 90% rename from jsprit-core/src/main/java/basics/route/InfiniteFleetManagerFactory.java rename to jsprit-core/src/main/java/jsprit/core/problem/vehicle/InfiniteFleetManagerFactory.java index f4345b8a..458571e0 100644 --- a/jsprit-core/src/main/java/basics/route/InfiniteFleetManagerFactory.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/vehicle/InfiniteFleetManagerFactory.java @@ -1,4 +1,4 @@ -package basics.route; +package jsprit.core.problem.vehicle; import java.util.Collection; diff --git a/jsprit-core/src/main/java/basics/route/InfiniteVehicles.java b/jsprit-core/src/main/java/jsprit/core/problem/vehicle/InfiniteVehicles.java similarity index 98% rename from jsprit-core/src/main/java/basics/route/InfiniteVehicles.java rename to jsprit-core/src/main/java/jsprit/core/problem/vehicle/InfiniteVehicles.java index 41470de7..6cba846f 100644 --- a/jsprit-core/src/main/java/basics/route/InfiniteVehicles.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/vehicle/InfiniteVehicles.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.route; +package jsprit.core.problem.vehicle; import java.util.ArrayList; import java.util.Collection; diff --git a/jsprit-core/src/main/java/basics/route/PenaltyVehicleType.java b/jsprit-core/src/main/java/jsprit/core/problem/vehicle/PenaltyVehicleType.java similarity index 92% rename from jsprit-core/src/main/java/basics/route/PenaltyVehicleType.java rename to jsprit-core/src/main/java/jsprit/core/problem/vehicle/PenaltyVehicleType.java index 06aeac67..b26e01ba 100644 --- a/jsprit-core/src/main/java/basics/route/PenaltyVehicleType.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/vehicle/PenaltyVehicleType.java @@ -14,9 +14,9 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.route; +package jsprit.core.problem.vehicle; -import basics.route.VehicleTypeImpl.VehicleCostParams; +import jsprit.core.problem.vehicle.VehicleTypeImpl.VehicleCostParams; public class PenaltyVehicleType implements VehicleType{ diff --git a/jsprit-core/src/main/java/basics/route/Vehicle.java b/jsprit-core/src/main/java/jsprit/core/problem/vehicle/Vehicle.java similarity index 94% rename from jsprit-core/src/main/java/basics/route/Vehicle.java rename to jsprit-core/src/main/java/jsprit/core/problem/vehicle/Vehicle.java index e306da24..0d178938 100644 --- a/jsprit-core/src/main/java/basics/route/Vehicle.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/vehicle/Vehicle.java @@ -14,9 +14,9 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.route; +package jsprit.core.problem.vehicle; -import util.Coordinate; +import jsprit.core.util.Coordinate; diff --git a/jsprit-core/src/main/java/basics/route/VehicleFleetManager.java b/jsprit-core/src/main/java/jsprit/core/problem/vehicle/VehicleFleetManager.java similarity index 97% rename from jsprit-core/src/main/java/basics/route/VehicleFleetManager.java rename to jsprit-core/src/main/java/jsprit/core/problem/vehicle/VehicleFleetManager.java index d71d2f7b..6d545e42 100644 --- a/jsprit-core/src/main/java/basics/route/VehicleFleetManager.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/vehicle/VehicleFleetManager.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.route; +package jsprit.core.problem.vehicle; import java.util.Collection; diff --git a/jsprit-core/src/main/java/basics/route/VehicleFleetManagerFactory.java b/jsprit-core/src/main/java/jsprit/core/problem/vehicle/VehicleFleetManagerFactory.java similarity index 73% rename from jsprit-core/src/main/java/basics/route/VehicleFleetManagerFactory.java rename to jsprit-core/src/main/java/jsprit/core/problem/vehicle/VehicleFleetManagerFactory.java index 29a3980a..9a45154d 100644 --- a/jsprit-core/src/main/java/basics/route/VehicleFleetManagerFactory.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/vehicle/VehicleFleetManagerFactory.java @@ -1,4 +1,4 @@ -package basics.route; +package jsprit.core.problem.vehicle; public interface VehicleFleetManagerFactory { diff --git a/jsprit-core/src/main/java/basics/route/VehicleFleetManagerImpl.java b/jsprit-core/src/main/java/jsprit/core/problem/vehicle/VehicleFleetManagerImpl.java similarity index 98% rename from jsprit-core/src/main/java/basics/route/VehicleFleetManagerImpl.java rename to jsprit-core/src/main/java/jsprit/core/problem/vehicle/VehicleFleetManagerImpl.java index f3d8569b..a7931eae 100644 --- a/jsprit-core/src/main/java/basics/route/VehicleFleetManagerImpl.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/vehicle/VehicleFleetManagerImpl.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.route; +package jsprit.core.problem.vehicle; import java.util.ArrayList; import java.util.Collection; @@ -25,9 +25,10 @@ import java.util.List; import java.util.Map; import java.util.Set; +import jsprit.core.problem.vehicle.VehicleImpl.NoVehicle; + import org.apache.log4j.Logger; -import basics.route.VehicleImpl.NoVehicle; diff --git a/jsprit-core/src/main/java/basics/route/VehicleImpl.java b/jsprit-core/src/main/java/jsprit/core/problem/vehicle/VehicleImpl.java similarity index 98% rename from jsprit-core/src/main/java/basics/route/VehicleImpl.java rename to jsprit-core/src/main/java/jsprit/core/problem/vehicle/VehicleImpl.java index 74bd2f32..b7d53c1a 100644 --- a/jsprit-core/src/main/java/basics/route/VehicleImpl.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/vehicle/VehicleImpl.java @@ -14,11 +14,12 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.route; +package jsprit.core.problem.vehicle; + +import jsprit.core.util.Coordinate; import org.apache.log4j.Logger; -import util.Coordinate; /** * diff --git a/jsprit-core/src/main/java/basics/route/VehicleType.java b/jsprit-core/src/main/java/jsprit/core/problem/vehicle/VehicleType.java similarity index 90% rename from jsprit-core/src/main/java/basics/route/VehicleType.java rename to jsprit-core/src/main/java/jsprit/core/problem/vehicle/VehicleType.java index 030b8620..1f6da049 100644 --- a/jsprit-core/src/main/java/basics/route/VehicleType.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/vehicle/VehicleType.java @@ -14,9 +14,9 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.route; +package jsprit.core.problem.vehicle; -import basics.route.VehicleTypeImpl.VehicleCostParams; +import jsprit.core.problem.vehicle.VehicleTypeImpl.VehicleCostParams; public interface VehicleType { diff --git a/jsprit-core/src/main/java/basics/route/VehicleTypeImpl.java b/jsprit-core/src/main/java/jsprit/core/problem/vehicle/VehicleTypeImpl.java similarity index 99% rename from jsprit-core/src/main/java/basics/route/VehicleTypeImpl.java rename to jsprit-core/src/main/java/jsprit/core/problem/vehicle/VehicleTypeImpl.java index ed64d3b2..828f3058 100644 --- a/jsprit-core/src/main/java/basics/route/VehicleTypeImpl.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/vehicle/VehicleTypeImpl.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.route; +package jsprit.core.problem.vehicle; public class VehicleTypeImpl implements VehicleType { diff --git a/jsprit-core/src/main/java/basics/route/VehicleTypeKey.java b/jsprit-core/src/main/java/jsprit/core/problem/vehicle/VehicleTypeKey.java similarity index 96% rename from jsprit-core/src/main/java/basics/route/VehicleTypeKey.java rename to jsprit-core/src/main/java/jsprit/core/problem/vehicle/VehicleTypeKey.java index 56dae41c..a39907df 100644 --- a/jsprit-core/src/main/java/basics/route/VehicleTypeKey.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/vehicle/VehicleTypeKey.java @@ -1,4 +1,4 @@ -package basics.route; +package jsprit.core.problem.vehicle; class VehicleTypeKey { diff --git a/jsprit-core/src/main/java/util/ActivityTimeTracker.java b/jsprit-core/src/main/java/jsprit/core/util/ActivityTimeTracker.java similarity index 91% rename from jsprit-core/src/main/java/util/ActivityTimeTracker.java rename to jsprit-core/src/main/java/jsprit/core/util/ActivityTimeTracker.java index 6c0a7361..6c349300 100644 --- a/jsprit-core/src/main/java/util/ActivityTimeTracker.java +++ b/jsprit-core/src/main/java/jsprit/core/util/ActivityTimeTracker.java @@ -14,12 +14,12 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package util; +package jsprit.core.util; -import basics.costs.ForwardTransportTime; -import basics.route.ActivityVisitor; -import basics.route.TourActivity; -import basics.route.VehicleRoute; +import jsprit.core.problem.cost.ForwardTransportTime; +import jsprit.core.problem.solution.route.VehicleRoute; +import jsprit.core.problem.solution.route.activity.ActivityVisitor; +import jsprit.core.problem.solution.route.activity.TourActivity; public class ActivityTimeTracker implements ActivityVisitor{ diff --git a/jsprit-core/src/main/java/util/ArrayUtils.java b/jsprit-core/src/main/java/jsprit/core/util/ArrayUtils.java similarity index 97% rename from jsprit-core/src/main/java/util/ArrayUtils.java rename to jsprit-core/src/main/java/jsprit/core/util/ArrayUtils.java index 6d5145ef..31e03ef5 100644 --- a/jsprit-core/src/main/java/util/ArrayUtils.java +++ b/jsprit-core/src/main/java/jsprit/core/util/ArrayUtils.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package util; +package jsprit.core.util; import java.util.List; diff --git a/jsprit-core/src/main/java/util/BenchmarkInstance.java b/jsprit-core/src/main/java/jsprit/core/util/BenchmarkInstance.java similarity index 94% rename from jsprit-core/src/main/java/util/BenchmarkInstance.java rename to jsprit-core/src/main/java/jsprit/core/util/BenchmarkInstance.java index 7cd6ae94..02279bda 100644 --- a/jsprit-core/src/main/java/util/BenchmarkInstance.java +++ b/jsprit-core/src/main/java/jsprit/core/util/BenchmarkInstance.java @@ -14,9 +14,9 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package util; +package jsprit.core.util; -import basics.VehicleRoutingProblem; +import jsprit.core.problem.VehicleRoutingProblem; public class BenchmarkInstance { public final String name; diff --git a/jsprit-core/src/main/java/util/BenchmarkResult.java b/jsprit-core/src/main/java/jsprit/core/util/BenchmarkResult.java similarity index 98% rename from jsprit-core/src/main/java/util/BenchmarkResult.java rename to jsprit-core/src/main/java/jsprit/core/util/BenchmarkResult.java index ea5f8258..6192db4e 100644 --- a/jsprit-core/src/main/java/util/BenchmarkResult.java +++ b/jsprit-core/src/main/java/jsprit/core/util/BenchmarkResult.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package util; +package jsprit.core.util; import org.apache.commons.math.stat.descriptive.DescriptiveStatistics; diff --git a/jsprit-core/src/main/java/algorithms/CalculationUtils.java b/jsprit-core/src/main/java/jsprit/core/util/CalculationUtils.java similarity index 91% rename from jsprit-core/src/main/java/algorithms/CalculationUtils.java rename to jsprit-core/src/main/java/jsprit/core/util/CalculationUtils.java index d584578c..f8acf221 100644 --- a/jsprit-core/src/main/java/algorithms/CalculationUtils.java +++ b/jsprit-core/src/main/java/jsprit/core/util/CalculationUtils.java @@ -18,11 +18,11 @@ * Contributors: * Stefan Schroeder - initial API and implementation ******************************************************************************/ -package algorithms; +package jsprit.core.util; -import basics.route.TourActivity; +import jsprit.core.problem.solution.route.activity.TourActivity; -class CalculationUtils { +public class CalculationUtils { /** diff --git a/jsprit-core/src/main/java/util/Coordinate.java b/jsprit-core/src/main/java/jsprit/core/util/Coordinate.java similarity index 98% rename from jsprit-core/src/main/java/util/Coordinate.java rename to jsprit-core/src/main/java/jsprit/core/util/Coordinate.java index d6b874b2..03d87ec9 100644 --- a/jsprit-core/src/main/java/util/Coordinate.java +++ b/jsprit-core/src/main/java/jsprit/core/util/Coordinate.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package util; +package jsprit.core.util; public class Coordinate { diff --git a/jsprit-core/src/main/java/util/CrowFlyCosts.java b/jsprit-core/src/main/java/jsprit/core/util/CrowFlyCosts.java similarity index 94% rename from jsprit-core/src/main/java/util/CrowFlyCosts.java rename to jsprit-core/src/main/java/jsprit/core/util/CrowFlyCosts.java index 3c06a1a8..6bc21c72 100644 --- a/jsprit-core/src/main/java/util/CrowFlyCosts.java +++ b/jsprit-core/src/main/java/jsprit/core/util/CrowFlyCosts.java @@ -17,13 +17,14 @@ /** * */ -package util; +package jsprit.core.util; + +import jsprit.core.problem.cost.VehicleRoutingTransportCosts; +import jsprit.core.problem.driver.Driver; +import jsprit.core.problem.vehicle.Vehicle; import org.apache.log4j.Logger; -import basics.costs.VehicleRoutingTransportCosts; -import basics.route.Driver; -import basics.route.Vehicle; /** diff --git a/jsprit-core/src/main/java/util/EuclideanDistanceCalculator.java b/jsprit-core/src/main/java/jsprit/core/util/EuclideanDistanceCalculator.java similarity index 97% rename from jsprit-core/src/main/java/util/EuclideanDistanceCalculator.java rename to jsprit-core/src/main/java/jsprit/core/util/EuclideanDistanceCalculator.java index d7d36167..a5419d99 100644 --- a/jsprit-core/src/main/java/util/EuclideanDistanceCalculator.java +++ b/jsprit-core/src/main/java/jsprit/core/util/EuclideanDistanceCalculator.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package util; +package jsprit.core.util; diff --git a/jsprit-core/src/main/java/util/Locations.java b/jsprit-core/src/main/java/jsprit/core/util/Locations.java similarity index 97% rename from jsprit-core/src/main/java/util/Locations.java rename to jsprit-core/src/main/java/jsprit/core/util/Locations.java index 25e21717..739fb824 100644 --- a/jsprit-core/src/main/java/util/Locations.java +++ b/jsprit-core/src/main/java/jsprit/core/util/Locations.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package util; +package jsprit.core.util; diff --git a/jsprit-core/src/main/java/util/ManhattanCosts.java b/jsprit-core/src/main/java/jsprit/core/util/ManhattanCosts.java similarity index 92% rename from jsprit-core/src/main/java/util/ManhattanCosts.java rename to jsprit-core/src/main/java/jsprit/core/util/ManhattanCosts.java index 2abc9ca7..df40a2b8 100644 --- a/jsprit-core/src/main/java/util/ManhattanCosts.java +++ b/jsprit-core/src/main/java/jsprit/core/util/ManhattanCosts.java @@ -14,13 +14,13 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package util; +package jsprit.core.util; -import basics.costs.VehicleRoutingTransportCosts; -import basics.route.Driver; -import basics.route.Vehicle; +import jsprit.core.problem.cost.VehicleRoutingTransportCosts; +import jsprit.core.problem.driver.Driver; +import jsprit.core.problem.vehicle.Vehicle; /** * diff --git a/jsprit-core/src/main/java/util/ManhattanDistanceCalculator.java b/jsprit-core/src/main/java/jsprit/core/util/ManhattanDistanceCalculator.java similarity index 97% rename from jsprit-core/src/main/java/util/ManhattanDistanceCalculator.java rename to jsprit-core/src/main/java/jsprit/core/util/ManhattanDistanceCalculator.java index dbb46162..7059bdba 100644 --- a/jsprit-core/src/main/java/util/ManhattanDistanceCalculator.java +++ b/jsprit-core/src/main/java/jsprit/core/util/ManhattanDistanceCalculator.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package util; +package jsprit.core.util; diff --git a/jsprit-core/src/main/java/util/Neighborhood.java b/jsprit-core/src/main/java/jsprit/core/util/Neighborhood.java similarity index 97% rename from jsprit-core/src/main/java/util/Neighborhood.java rename to jsprit-core/src/main/java/jsprit/core/util/Neighborhood.java index 5470edd9..bba5975b 100644 --- a/jsprit-core/src/main/java/util/Neighborhood.java +++ b/jsprit-core/src/main/java/jsprit/core/util/Neighborhood.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package util; +package jsprit.core.util; public interface Neighborhood { diff --git a/jsprit-core/src/main/java/util/NeighborhoodImpl.java b/jsprit-core/src/main/java/jsprit/core/util/NeighborhoodImpl.java similarity index 96% rename from jsprit-core/src/main/java/util/NeighborhoodImpl.java rename to jsprit-core/src/main/java/jsprit/core/util/NeighborhoodImpl.java index 55cafb3b..393289dc 100644 --- a/jsprit-core/src/main/java/util/NeighborhoodImpl.java +++ b/jsprit-core/src/main/java/jsprit/core/util/NeighborhoodImpl.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package util; +package jsprit.core.util; import java.util.Collection; import java.util.HashMap; @@ -22,10 +22,11 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; +import jsprit.core.problem.job.Service; +import jsprit.core.problem.vehicle.Vehicle; + import org.apache.log4j.Logger; -import basics.Service; -import basics.route.Vehicle; diff --git a/jsprit-core/src/main/java/util/RandomNumberGeneration.java b/jsprit-core/src/main/java/jsprit/core/util/RandomNumberGeneration.java similarity index 97% rename from jsprit-core/src/main/java/util/RandomNumberGeneration.java rename to jsprit-core/src/main/java/jsprit/core/util/RandomNumberGeneration.java index ff9ca1dc..abff7c96 100644 --- a/jsprit-core/src/main/java/util/RandomNumberGeneration.java +++ b/jsprit-core/src/main/java/jsprit/core/util/RandomNumberGeneration.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package util; +package jsprit.core.util; import java.util.Random; diff --git a/jsprit-core/src/main/java/util/Resource.java b/jsprit-core/src/main/java/jsprit/core/util/Resource.java similarity index 98% rename from jsprit-core/src/main/java/util/Resource.java rename to jsprit-core/src/main/java/jsprit/core/util/Resource.java index 456bc557..63e1d4d0 100644 --- a/jsprit-core/src/main/java/util/Resource.java +++ b/jsprit-core/src/main/java/jsprit/core/util/Resource.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package util; +package jsprit.core.util; import java.io.File; import java.io.FileInputStream; diff --git a/jsprit-core/src/main/java/algorithms/SolutionVerifier.java b/jsprit-core/src/main/java/jsprit/core/util/SolutionVerifier.java similarity index 81% rename from jsprit-core/src/main/java/algorithms/SolutionVerifier.java rename to jsprit-core/src/main/java/jsprit/core/util/SolutionVerifier.java index 93812abe..e62e2c81 100644 --- a/jsprit-core/src/main/java/algorithms/SolutionVerifier.java +++ b/jsprit-core/src/main/java/jsprit/core/util/SolutionVerifier.java @@ -14,19 +14,20 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms; +package jsprit.core.util; import java.util.Collection; import java.util.HashSet; import java.util.Set; -import basics.Job; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblemSolution; -import basics.algo.AlgorithmEndsListener; -import basics.route.VehicleRoute; +import jsprit.core.algorithm.listener.AlgorithmEndsListener; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.job.Job; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; +import jsprit.core.problem.solution.route.VehicleRoute; -class SolutionVerifier implements AlgorithmEndsListener{ + +public class SolutionVerifier implements AlgorithmEndsListener{ @Override public void informAlgorithmEnds(VehicleRoutingProblem problem, Collection solutions) { diff --git a/jsprit-core/src/main/java/util/Solutions.java b/jsprit-core/src/main/java/jsprit/core/util/Solutions.java similarity index 94% rename from jsprit-core/src/main/java/util/Solutions.java rename to jsprit-core/src/main/java/jsprit/core/util/Solutions.java index 9da4b645..5243af98 100644 --- a/jsprit-core/src/main/java/util/Solutions.java +++ b/jsprit-core/src/main/java/jsprit/core/util/Solutions.java @@ -14,11 +14,12 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package util; +package jsprit.core.util; import java.util.Collection; -import basics.VehicleRoutingProblemSolution; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; + public class Solutions { diff --git a/jsprit-core/src/main/java/util/StopWatch.java b/jsprit-core/src/main/java/jsprit/core/util/StopWatch.java similarity index 98% rename from jsprit-core/src/main/java/util/StopWatch.java rename to jsprit-core/src/main/java/jsprit/core/util/StopWatch.java index 123c6f7d..e0d1e32f 100644 --- a/jsprit-core/src/main/java/util/StopWatch.java +++ b/jsprit-core/src/main/java/jsprit/core/util/StopWatch.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package util; +package jsprit.core.util; import org.apache.log4j.Logger; diff --git a/jsprit-core/src/main/java/util/VehicleRoutingTransportCostsMatrix.java b/jsprit-core/src/main/java/jsprit/core/util/VehicleRoutingTransportCostsMatrix.java similarity index 96% rename from jsprit-core/src/main/java/util/VehicleRoutingTransportCostsMatrix.java rename to jsprit-core/src/main/java/jsprit/core/util/VehicleRoutingTransportCostsMatrix.java index d820641b..ae12bbb6 100644 --- a/jsprit-core/src/main/java/util/VehicleRoutingTransportCostsMatrix.java +++ b/jsprit-core/src/main/java/jsprit/core/util/VehicleRoutingTransportCostsMatrix.java @@ -14,18 +14,19 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package util; +package jsprit.core.util; import java.util.HashMap; import java.util.Map; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.cost.VehicleRoutingTransportCosts; +import jsprit.core.problem.driver.Driver; +import jsprit.core.problem.vehicle.Vehicle; +import jsprit.core.problem.vehicle.VehicleTypeImpl.VehicleCostParams; + import org.apache.log4j.Logger; -import basics.VehicleRoutingProblem; -import basics.costs.VehicleRoutingTransportCosts; -import basics.route.Driver; -import basics.route.Vehicle; -import basics.route.VehicleTypeImpl.VehicleCostParams; /** * CostMatrix that allows pre-compiled time and distance-matrices to be considered as {@link VehicleRoutingRoutingCosts} diff --git a/jsprit-core/src/main/java/util/VrpVerifier.java b/jsprit-core/src/main/java/jsprit/core/util/VrpVerifier.java similarity index 89% rename from jsprit-core/src/main/java/util/VrpVerifier.java rename to jsprit-core/src/main/java/jsprit/core/util/VrpVerifier.java index 6767670d..45cbbb70 100644 --- a/jsprit-core/src/main/java/util/VrpVerifier.java +++ b/jsprit-core/src/main/java/jsprit/core/util/VrpVerifier.java @@ -14,20 +14,21 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package util; +package jsprit.core.util; import java.util.Collection; +import jsprit.core.algorithm.VehicleRoutingAlgorithm; +import jsprit.core.algorithm.listener.AlgorithmStartsListener; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.driver.DriverImpl; +import jsprit.core.problem.job.Job; +import jsprit.core.problem.job.Service; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; +import jsprit.core.problem.vehicle.Vehicle; + import org.apache.log4j.Logger; -import basics.Job; -import basics.Service; -import basics.VehicleRoutingAlgorithm; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblemSolution; -import basics.algo.AlgorithmStartsListener; -import basics.route.DriverImpl; -import basics.route.Vehicle; public class VrpVerifier implements AlgorithmStartsListener{ diff --git a/jsprit-core/src/main/java/util/Counter.java b/jsprit-core/src/main/java/util/Counter.java deleted file mode 100644 index b24f6aee..00000000 --- a/jsprit-core/src/main/java/util/Counter.java +++ /dev/null @@ -1,69 +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 . - ******************************************************************************/ -package util; - -import java.util.concurrent.atomic.AtomicLong; - -import org.apache.log4j.Logger; - - -/** - * Counter which is a copy of Counter.java at package org.matsim.core.utils.misc (www.matsim.org); - * - * @author Schroeder - * - */ - - -public final class Counter { - private final String prefix; - private AtomicLong counter = new AtomicLong(0); - private AtomicLong nextCounter = new AtomicLong(1); - private static final Logger log = Logger.getLogger(Counter.class); - - /** - * @param prefix Some text that is output just before the counter-value. - */ - public Counter(final String prefix) { - this.prefix = prefix; - } - - public void incCounter() { - long i = this.counter.incrementAndGet(); - long n = this.nextCounter.get(); - if (i >= n) { - if (this.nextCounter.compareAndSet(n, n*2)) { - log.info(this.prefix + n); - } - } - } - - public void printCounter() { - log.info(this.prefix + this.counter.get()); - } - - public long getCounter() { - return this.counter.get(); - } - - public void reset() { - this.counter.set(0); - this.nextCounter.set(1); - } -} - - diff --git a/jsprit-core/src/main/java/util/RouteUtils.java b/jsprit-core/src/main/java/util/RouteUtils.java deleted file mode 100644 index 3fc91bb3..00000000 --- a/jsprit-core/src/main/java/util/RouteUtils.java +++ /dev/null @@ -1,98 +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 . - ******************************************************************************/ -package util; - -import java.util.Collection; - -import basics.route.TourActivity; -import basics.route.VehicleRoute; - - - - -public class RouteUtils { - -// public static double getTransportCosts(Collection routes) { -// double cost = 0.0; -// for (VehicleRoute r : routes) { -// if(r.getTour().isEmpty()){ -// continue; -// } -// cost += r.getTour().tourData.transportCosts; -// } -// return cost; -// } -// -// public static double getTransportTime(Collection routes) { -// double time = 0.0; -// for (VehicleRoute r : routes) { -// if(r.getTour().isEmpty()){ -// continue; -// } -// time += r.getTour().tourData.transportTime; -// } -// return time; -// } - - public static double getTotalCost(Collection routes){ - double total = 0.0; - for (VehicleRoute r : routes) { - if(r.isEmpty()) { - total += 0.0; - } - else total += r.getCost(); - } - return total; - } - - - public static double getTotalServiceTime(Collection routes){ - double total = 0.0; - for (VehicleRoute r : routes) { - if(r.getTourActivities().isEmpty()){ - continue; - } - for(TourActivity act : r.getTourActivities().getActivities()){ - total += act.getOperationTime(); - } - } - return total; - } - - - public static double getTotalFixCost(Collection routes){ - double total = 0.0; - for (VehicleRoute r : routes) { - if(r.getTourActivities().isEmpty()){ - continue; - } - total += r.getVehicle().getType().getVehicleCostParams().fix; - } - return total; - } - - public static int getNuOfActiveRoutes(Collection routes){ - int count = 0; - for (VehicleRoute r : routes) { - if(r.isEmpty()){ - continue; - } - count++; - } - return count; - } -} diff --git a/jsprit-core/src/main/resources/algorithm_schema.xsd b/jsprit-core/src/main/resources/algorithm_schema.xsd index 66b1582b..050f12db 100644 --- a/jsprit-core/src/main/resources/algorithm_schema.xsd +++ b/jsprit-core/src/main/resources/algorithm_schema.xsd @@ -99,7 +99,10 @@ + + + diff --git a/jsprit-core/src/main/resources/vrp_xml_schema.xsd b/jsprit-core/src/main/resources/vrp_xml_schema.xsd index 637ed6ed..04edd787 100644 --- a/jsprit-core/src/main/resources/vrp_xml_schema.xsd +++ b/jsprit-core/src/main/resources/vrp_xml_schema.xsd @@ -173,7 +173,7 @@ - + diff --git a/jsprit-core/src/test/java/algorithms/AlgorithmsSuite.java b/jsprit-core/src/test/java/algorithms/AlgorithmsSuite.java deleted file mode 100644 index f3cfe643..00000000 --- a/jsprit-core/src/test/java/algorithms/AlgorithmsSuite.java +++ /dev/null @@ -1,48 +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 . - ******************************************************************************/ -package algorithms; - -import org.junit.runner.RunWith; -import org.junit.runners.Suite; - -import algorithms.acceptors.AcceptNewRemoveWorstTest; -import algorithms.selectors.SelectBestTest; -import algorithms.selectors.SelectRandomlyTest; - - - -@RunWith(Suite.class) -@Suite.SuiteClasses({ - CalcVehicleTypeDependentServiceInsertionTest.class, -// FindCheaperVehicleTest.class, - GendreauPostOptTest.class, - TestAlgorithmReader.class, -// TestAux.class, - TestCalculatesServiceInsertion.class, - TestCalculatesServiceInsertionOnRouteLevel.class, - TestSchrimpf.class, - - TestJobDistanceAvgCosts.class, - TestTourStateUpdaterWithService.class, - - SelectBestTest.class, - SelectRandomlyTest.class, - AcceptNewRemoveWorstTest.class, -// TestUpdateTourStatesForwardInTime.class - -}) -public class AlgorithmsSuite {} diff --git a/jsprit-core/src/test/java/algorithms/BuildCVRPAlgoFromScratchTest.java b/jsprit-core/src/test/java/algorithms/BuildCVRPAlgoFromScratchTest.java deleted file mode 100644 index deec88b4..00000000 --- a/jsprit-core/src/test/java/algorithms/BuildCVRPAlgoFromScratchTest.java +++ /dev/null @@ -1,137 +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 . - ******************************************************************************/ -package algorithms; - -import static org.junit.Assert.assertEquals; - -import java.util.Collection; - -import org.junit.Before; -import org.junit.Test; - -import util.Solutions; -import algorithms.acceptors.AcceptNewIfBetterThanWorst; -import algorithms.selectors.SelectBest; -import basics.VehicleRoutingAlgorithm; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblemSolution; -import basics.algo.IterationStartsListener; -import basics.algo.SearchStrategy; -import basics.algo.SearchStrategyManager; -import basics.algo.SolutionCostCalculator; -import basics.io.VrpXMLReader; -import basics.route.InfiniteFleetManagerFactory; -import basics.route.TourActivity; -import basics.route.VehicleFleetManager; -import basics.route.VehicleRoute; - -public class BuildCVRPAlgoFromScratchTest { - - VehicleRoutingProblem vrp; - - VehicleRoutingAlgorithm vra; - - @Before - public void setup(){ - VehicleRoutingProblem.Builder builder = VehicleRoutingProblem.Builder.newInstance(); - new VrpXMLReader(builder).read("src/test/resources/vrpnc1-jsprit.xml"); - vrp = builder.build(); - - final StateManager stateManager = new StateManager(); - HardActivityStateLevelConstraint hardActLevelConstraint = new HardActivityStateLevelConstraint() { - - @Override - public ConstraintsStatus fulfilled(InsertionContext iFacts, TourActivity prevAct, TourActivity newAct, TourActivity nextAct, double prevActDepTime) { - return ConstraintsStatus.FULFILLED; - } - }; - - - ActivityInsertionCostsCalculator marginalCalculus = new LocalActivityInsertionCostsCalculator(vrp.getTransportCosts(), vrp.getActivityCosts()); - - ServiceInsertionCalculator serviceInsertion = new ServiceInsertionCalculator(vrp.getTransportCosts(), marginalCalculus, new LoadConstraint(stateManager), hardActLevelConstraint); - - - - VehicleFleetManager fleetManager = new InfiniteFleetManagerFactory(vrp.getVehicles()).createFleetManager(); - JobInsertionCostsCalculator finalServiceInsertion = new VehicleTypeDependentJobInsertionCalculator(fleetManager, serviceInsertion); - - BestInsertion bestInsertion = new BestInsertion(finalServiceInsertion); - - RuinRadial radial = new RuinRadial(vrp, 0.15, new JobDistanceAvgCosts(vrp.getTransportCosts())); - RuinRandom random = new RuinRandom(vrp, 0.25); - - SolutionCostCalculator solutionCostCalculator = new SolutionCostCalculator() { - - @Override - public double getCosts(VehicleRoutingProblemSolution solution) { - double costs = 0.0; - for(VehicleRoute route : solution.getRoutes()){ - costs += stateManager.getRouteState(route, StateFactory.COSTS).toDouble(); - } - return costs; - } - }; - - SearchStrategy randomStrategy = new SearchStrategy(new SelectBest(), new AcceptNewIfBetterThanWorst(1), solutionCostCalculator); - RuinAndRecreateModule randomModule = new RuinAndRecreateModule("randomRuin_bestInsertion", bestInsertion, random); - randomStrategy.addModule(randomModule); - - SearchStrategy radialStrategy = new SearchStrategy(new SelectBest(), new AcceptNewIfBetterThanWorst(1), solutionCostCalculator); - RuinAndRecreateModule radialModule = new RuinAndRecreateModule("radialRuin_bestInsertion", bestInsertion, radial); - radialStrategy.addModule(radialModule); - - SearchStrategyManager strategyManager = new SearchStrategyManager(); - strategyManager.addStrategy(radialStrategy, 0.5); - strategyManager.addStrategy(randomStrategy, 0.5); - - vra = new VehicleRoutingAlgorithm(vrp, strategyManager); - - //listeners - IterationStartsListener clearStateManager = new IterationStartsListener() { - - @Override - public void informIterationStarts(int i, VehicleRoutingProblem problem, Collection solutions) { - stateManager.clear(); - } - }; - vra.getAlgorithmListeners().addListener(clearStateManager); - vra.getSearchStrategyManager().addSearchStrategyModuleListener(new RemoveEmptyVehicles(fleetManager)); - - vra.getSearchStrategyManager().addSearchStrategyModuleListener(new UpdateCostsAtRouteLevel(stateManager, vrp.getTransportCosts(), vrp.getActivityCosts())); - vra.getSearchStrategyManager().addSearchStrategyModuleListener(new UpdateLoadAtRouteLevel(stateManager)); - - - VehicleRoutingProblemSolution iniSolution = new InsertionInitialSolutionFactory(bestInsertion, solutionCostCalculator).createSolution(vrp); - -// System.out.println("ini: costs="+iniSolution.getCost()+";#routes="+iniSolution.getRoutes().size()); - vra.addInitialSolution(iniSolution); - - vra.setNuOfIterations(2000); -// vra.setPrematureBreak(200); - - } - - @Test - public void testVRA(){ - Collection solutions = vra.searchSolutions(); - System.out.println("costs="+Solutions.getBest(solutions).getCost()+";#routes="+Solutions.getBest(solutions).getRoutes().size()); - assertEquals(530.0, Solutions.getBest(solutions).getCost(),15.0); - assertEquals(5, Solutions.getBest(solutions).getRoutes().size()); - } - -} diff --git a/jsprit-core/src/test/java/algorithms/BuildPDVRPWithShipmentsAlgoFromScratchTest.java b/jsprit-core/src/test/java/algorithms/BuildPDVRPWithShipmentsAlgoFromScratchTest.java deleted file mode 100644 index 2e3acc9e..00000000 --- a/jsprit-core/src/test/java/algorithms/BuildPDVRPWithShipmentsAlgoFromScratchTest.java +++ /dev/null @@ -1,262 +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 . - ******************************************************************************/ -package algorithms; - -import java.util.Collection; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -import org.apache.log4j.Logger; -import org.junit.Before; -import org.junit.Test; - -import util.Solutions; -import algorithms.acceptors.AcceptNewIfBetterThanWorst; -import algorithms.selectors.SelectBest; -import basics.Job; -import basics.Service; -import basics.Shipment; -import basics.VehicleRoutingAlgorithm; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblemSolution; -import basics.algo.InsertionStartsListener; -import basics.algo.JobInsertedListener; -import basics.algo.SearchStrategy; -import basics.algo.SearchStrategyManager; -import basics.algo.SolutionCostCalculator; -import basics.io.VrpXMLReader; -import basics.io.VrpXMLWriter; -import basics.route.InfiniteFleetManagerFactory; -import basics.route.ReverseRouteActivityVisitor; -import basics.route.RouteActivityVisitor; -import basics.route.VehicleFleetManager; -import basics.route.VehicleRoute; - -public class BuildPDVRPWithShipmentsAlgoFromScratchTest { - - VehicleRoutingProblem vrp; - - VehicleRoutingAlgorithm vra; - - static Logger log = Logger.getLogger(BuildPDVRPWithShipmentsAlgoFromScratchTest.class); - - ExecutorService executorService; - - @Before - public void setup(){ - - VehicleRoutingProblem.Builder builder = VehicleRoutingProblem.Builder.newInstance(); - new VrpXMLReader(builder).read("src/test/resources/pdp.xml"); -// VehicleType type = VehicleTypeImpl.Builder.newInstance("t", 2).setCostPerDistance(1.0).build(); -// Vehicle v = VehicleImpl.Builder.newInstance("v").setLocationCoord(Coordinate.newInstance(-1, -1)).setType(type).build(); -// -// Shipment s1 = Shipment.Builder.newInstance("s1", 1).setPickupCoord(Coordinate.newInstance(0, 0)).setDeliveryCoord(Coordinate.newInstance(10, 10)).build(); -// Shipment s2 = Shipment.Builder.newInstance("s2", 1).setPickupCoord(Coordinate.newInstance(1, 1)).setDeliveryCoord(Coordinate.newInstance(10, 10)).build(); -// -// Service serv1 = Service.Builder.newInstance("serv1", 1).setCoord(Coordinate.newInstance(0, 5)).build(); -// Service serv2 = Service.Builder.newInstance("serv2", 1).setCoord(Coordinate.newInstance(5, 0)).build(); -// -// builder.addJob(s1).addJob(s2).addJob(serv1).addJob(serv2); -// builder.addVehicle(v); - - vrp = builder.build(); - - final StateManager stateManager = new StateManager(); - - ConstraintManager constraintManager = new ConstraintManager(vrp,stateManager); - constraintManager.addTimeWindowConstraint(); - constraintManager.addLoadConstraint(); -// constraintManager.addConstraint(new HardPickupAndDeliveryShipmentActivityLevelConstraint(stateManager)); - - VehicleFleetManager fleetManager = new InfiniteFleetManagerFactory(vrp.getVehicles()).createFleetManager(); - - int nuOfThreads = 10; - executorService = Executors.newFixedThreadPool(nuOfThreads); - - BestInsertionBuilder bestIBuilder = new BestInsertionBuilder(vrp, fleetManager, stateManager,constraintManager); - - bestIBuilder.setConcurrentMode(executorService, nuOfThreads); - InsertionStrategy bestInsertion = bestIBuilder.build(); - -// bestIBuilder. - -// ActivityInsertionCostsCalculator marginalCalculus = new LocalActivityInsertionCostsCalculator(vrp.getTransportCosts(), vrp.getActivityCosts()); -// -// ShipmentInsertionCalculator shipmentInsertion = new ShipmentInsertionCalculator(vrp.getTransportCosts(), marginalCalculus, constraintManager, constraintManager); -// -// ServiceInsertionCalculator serviceInsertion = new ServiceInsertionCalculator(vrp.getTransportCosts(), marginalCalculus, constraintManager, constraintManager); -// -// JobCalculatorSwitcher switcher = new JobCalculatorSwitcher(); -// switcher.put(Shipment.class, shipmentInsertion); -// switcher.put(Service.class, serviceInsertion); -// -// -// JobInsertionCostsCalculator finalServiceInsertion = new VehicleTypeDependentJobInsertionCalculator(fleetManager, switcher); -// -// BestInsertion bestInsertion = new BestInsertion(finalServiceInsertion); - - -// BestInsertionConc bestInsertion = new BestInsertionConc(finalServiceInsertion, executorService, 2); - - RuinRadial radial = new RuinRadial(vrp, 0.3, new AvgJobDistance(vrp.getTransportCosts())); - RuinRandom random = new RuinRandom(vrp, 0.5); - - SolutionCostCalculator solutionCostCalculator = new SolutionCostCalculator() { - - @Override - public double getCosts(VehicleRoutingProblemSolution solution) { - double costs = 0.0; - for(VehicleRoute route : solution.getRoutes()){ - costs += stateManager.getRouteState(route, StateFactory.COSTS).toDouble(); - } - return costs; - } - }; - - SearchStrategy randomStrategy = new SearchStrategy(new SelectBest(), new AcceptNewIfBetterThanWorst(1), solutionCostCalculator); - RuinAndRecreateModule randomModule = new RuinAndRecreateModule("randomRuin_bestInsertion", bestInsertion, random); - randomStrategy.addModule(randomModule); - - SearchStrategy radialStrategy = new SearchStrategy(new SelectBest(), new AcceptNewIfBetterThanWorst(1), solutionCostCalculator); - RuinAndRecreateModule radialModule = new RuinAndRecreateModule("radialRuin_bestInsertion", bestInsertion, radial); - radialStrategy.addModule(radialModule); - - SearchStrategyManager strategyManager = new SearchStrategyManager(); - strategyManager.addStrategy(radialStrategy, 0.5); - strategyManager.addStrategy(randomStrategy, 0.5); - - vra = new VehicleRoutingAlgorithmFactoryImpl(strategyManager, stateManager, fleetManager).createAlgorithm(vrp); -// -//// vra.getAlgorithmListeners().addListener(stateManager); -// -//// final RouteActivityVisitor iterateForward = new RouteActivityVisitor(); -// -//// iterateForward.addActivityVisitor(new UpdateActivityTimes(vrp.getTransportCosts())); -//// iterateForward.addActivityVisitor(new UpdateVariableCosts(vrp.getActivityCosts(), vrp.getTransportCosts(), stateManager)); -//// -//// iterateForward.addActivityVisitor(new UpdateOccuredDeliveries(stateManager)); -//// iterateForward.addActivityVisitor(new UpdateLoads(stateManager)); -//// -//// final ReverseRouteActivityVisitor iterateBackward = new ReverseRouteActivityVisitor(); -//// iterateBackward.addActivityVisitor(new TimeWindowUpdater(stateManager, vrp.getTransportCosts())); -//// iterateBackward.addActivityVisitor(new UpdateFuturePickups(stateManager)); -//// -//// JobInsertedListener updateWhenJobHasBeenInserted = new JobInsertedListener() { -//// -//// @Override -//// public void informJobInserted(Job job2insert, VehicleRoute inRoute, double additionalCosts, double additionalTime) { -//// iterateForward.visit(inRoute); -//// iterateBackward.visit(inRoute); -//// } -//// -//// }; -//// -//// InsertionStartsListener updateRoutesWhenInsertionStarts = new InsertionStartsListener() { -//// -//// @Override -//// public void informInsertionStarts(Collection vehicleRoutes, Collection unassignedJobs) { -//// for(VehicleRoute route : vehicleRoutes){ -//// iterateForward.visit(route); -//// iterateBackward.visit(route); -//// } -//// -//// } -//// }; -// -//<<<<<<< HEAD -//// vra.getSearchStrategyManager().addSearchStrategyModuleListener(new RemoveEmptyVehicles(fleetManager)); -//======= -// iterateForward.addActivityVisitor(new UpdatePrevMaxLoad(stateManager)); -// iterateForward.addActivityVisitor(new UpdateLoads(stateManager)); -//>>>>>>> branch 'PickupAndDelivery' of https://github.com/jsprit/jsprit.git -// -//<<<<<<< HEAD -//// bestInsertion.addListener(new UpdateLoads(stateManager)); -//// bestInsertion.addListener(updateWhenJobHasBeenInserted); -//// bestInsertion.addListener(updateRoutesWhenInsertionStarts); -//======= -// final ReverseRouteActivityVisitor iterateBackward = new ReverseRouteActivityVisitor(); -// iterateBackward.addActivityVisitor(new TimeWindowUpdater(stateManager, vrp.getTransportCosts())); -// iterateBackward.addActivityVisitor(new UpdateMaxLoad(stateManager)); -// -// JobInsertedListener updateWhenJobHasBeenInserted = new JobInsertedListener() { -// -// @Override -// public void informJobInserted(Job job2insert, VehicleRoute inRoute, double additionalCosts, double additionalTime) { -// iterateForward.visit(inRoute); -// iterateBackward.visit(inRoute); -// } -// -// }; -// -// InsertionStartsListener updateRoutesWhenInsertionStarts = new InsertionStartsListener() { -// -// @Override -// public void informInsertionStarts(Collection vehicleRoutes, Collection unassignedJobs) { -// for(VehicleRoute route : vehicleRoutes){ -// iterateForward.visit(route); -// iterateBackward.visit(route); -// } -// -// } -// }; -// -// vra.getSearchStrategyManager().addSearchStrategyModuleListener(new RemoveEmptyVehicles(fleetManager)); -// -// bestInsertion.addListener(new UpdateLoads(stateManager)); -// bestInsertion.addListener(updateWhenJobHasBeenInserted); -// bestInsertion.addListener(updateRoutesWhenInsertionStarts); -//>>>>>>> branch 'PickupAndDelivery' of https://github.com/jsprit/jsprit.git -// - VehicleRoutingProblemSolution iniSolution = new InsertionInitialSolutionFactory(bestInsertion, solutionCostCalculator).createSolution(vrp); -// System.out.println("ini: costs="+iniSolution.getCost()+";#routes="+iniSolution.getRoutes().size()); - vra.addInitialSolution(iniSolution); - - vra.setNuOfIterations(10); -// vra.setPrematureBreak(500); - - } - - @Test - public void test(){ - Collection solutions = vra.searchSolutions(); - VehicleRoutingProblemSolution best = Solutions.getBest(solutions); - - executorService.shutdown(); - // Wait until all threads are finish -// executorService.awaitTermination(); - -// for(VehicleRoute r : best.getRoutes()){ -// System.out.println(r); -// System.out.println("#jobs="+r.getTourActivities().jobSize()); -// System.out.println(r.getStart()); -// for(TourActivity act : r.getTourActivities().getActivities()){ -// System.out.println(act); -// } -// System.out.println(r.getEnd()); -// } -// - System.out.println("total="+best.getCost()); - System.out.println("#routes="+best.getRoutes().size()); - -// for() - - new VrpXMLWriter(vrp, solutions).write("src/test/resources/pdp_sol.xml"); - - } - -} diff --git a/jsprit-core/src/test/java/algorithms/GendreauPostOptTest.java b/jsprit-core/src/test/java/algorithms/GendreauPostOptTest.java deleted file mode 100644 index 2c06480d..00000000 --- a/jsprit-core/src/test/java/algorithms/GendreauPostOptTest.java +++ /dev/null @@ -1,290 +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 . - ******************************************************************************/ -package algorithms; - -import static org.junit.Assert.assertEquals; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; - -import org.junit.Before; -import org.junit.Test; - -import util.Coordinate; -import util.ManhattanDistanceCalculator; -import util.RouteUtils; -import basics.Job; -import basics.Service; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblemSolution; -import basics.costs.VehicleRoutingActivityCosts; -import basics.costs.VehicleRoutingTransportCosts; -import basics.route.Driver; -import basics.route.DriverImpl; -import basics.route.FiniteFleetManagerFactory; -import basics.route.ServiceActivity; -import basics.route.TimeWindow; -import basics.route.TourActivities; -import basics.route.Vehicle; -import basics.route.VehicleFleetManager; -import basics.route.VehicleImpl; -import basics.route.VehicleRoute; -import basics.route.VehicleTypeImpl; - -public class GendreauPostOptTest { - - TourActivities tour; - - Vehicle heavyVehicle; - - Vehicle lightVehicle1; - - Vehicle lightVehicle2; - - VehicleRoutingTransportCosts cost; - - VehicleRoutingActivityCosts activityCosts; - - VehicleRoutingProblem vrp; - - Service job1; - - Service job2; - - Service job3; - - private StateManager states; - - private List vehicles; - - private VehicleFleetManager fleetManager; - - private JobInsertionCostsCalculator insertionCalc; - - @Before - public void setUp(){ - - cost = new VehicleRoutingTransportCosts() { - - @Override - public double getBackwardTransportTime(String fromId, String toId, - double arrivalTime, Driver driver, Vehicle vehicle) { - // TODO Auto-generated method stub - return 0; - } - - @Override - public double getBackwardTransportCost(String fromId, String toId, - double arrivalTime, Driver driver, Vehicle vehicle) { - // TODO Auto-generated method stub - return 0; - } - - @Override - public double getTransportCost(String fromId, String toId, double departureTime, Driver driver, Vehicle vehicle) { - - String[] fromTokens = fromId.split(","); - String[] toTokens = toId.split(","); - double fromX = Double.parseDouble(fromTokens[0]); - double fromY = Double.parseDouble(fromTokens[1]); - - double toX = Double.parseDouble(toTokens[0]); - double toY = Double.parseDouble(toTokens[1]); - - double costPerDistanceUnit; - if(vehicle != null){ - costPerDistanceUnit = vehicle.getType().getVehicleCostParams().perDistanceUnit; - } - else{ - costPerDistanceUnit = 1; - } - - return costPerDistanceUnit*ManhattanDistanceCalculator.calculateDistance(new Coordinate(fromX, fromY), new Coordinate(toX, toY)); - } - - @Override - public double getTransportTime(String fromId, String toId, double departureTime, Driver driver, Vehicle vehicle) { - return 0; - } - }; - - VehicleTypeImpl lightType = VehicleTypeImpl.Builder.newInstance("light", 10).setFixedCost(10).setCostPerDistance(1.0).build(); - VehicleTypeImpl heavyType = VehicleTypeImpl.Builder.newInstance("heavy", 10).setFixedCost(30).setCostPerDistance(2.0).build(); - - lightVehicle1 = VehicleImpl.Builder.newInstance("light").setLocationId("0,0").setType(lightType).build(); - lightVehicle2 = VehicleImpl.Builder.newInstance("light2").setLocationId("0,0").setType(lightType).build(); - heavyVehicle = VehicleImpl.Builder.newInstance("heavy").setLocationId("0,0").setType(heavyType).build(); - - - job1 = getService("10,0"); - job2 = getService("10,10"); - job3 = getService("0,10"); - - Collection jobs = new ArrayList(); - jobs.add(job1); - jobs.add(job2); - jobs.add(job3); - - vehicles = Arrays.asList(lightVehicle1,lightVehicle2, heavyVehicle); - -// Collection vehicles = Arrays.asList(lightVehicle1,lightVehicle2, heavyVehicle); - fleetManager = new FiniteFleetManagerFactory(vehicles).createFleetManager(); - states = new StateManager(); - - activityCosts = new ExampleActivityCostFunction(); - - - ServiceInsertionCalculator standardServiceInsertion = new ServiceInsertionCalculator(cost, new LocalActivityInsertionCostsCalculator(cost, activityCosts), new LoadConstraint(states), new TimeWindowConstraint(states, cost)); - - - - - JobInsertionConsideringFixCostsCalculator withFixCost = new JobInsertionConsideringFixCostsCalculator(standardServiceInsertion, states); - withFixCost.setWeightOfFixCost(1.2); - - insertionCalc = new VehicleTypeDependentJobInsertionCalculator(fleetManager, withFixCost); - -// updater = new TourStateUpdater(states, cost, activityCosts); - - } - - @Test - public void whenPostOpt_splitsTour_oneActiveTourBecomeTwoSeperateActiveTours(){ - Collection jobs = new ArrayList(); - jobs.add(job1); - jobs.add(job2); - - vrp = VehicleRoutingProblem.Builder.newInstance().addAllJobs(jobs).addAllVehicles(vehicles).setRoutingCost(cost).build(); - - TourActivities tour = new TourActivities(); - tour.addActivity(ServiceActivity.newInstance(job1)); - tour.addActivity(ServiceActivity.newInstance(job2)); - - VehicleRoute route = VehicleRoute.newInstance(tour,DriverImpl.noDriver(),heavyVehicle); - - fleetManager.lock(heavyVehicle); - - UpdateStates stateUpdater = new UpdateStates(states, vrp.getTransportCosts(), vrp.getActivityCosts()); - stateUpdater.update(route); - - Collection routes = new ArrayList(); - routes.add(route); -// routes.add(new VehicleRoute(getEmptyTour(),getDriver(),getNoVehicle())); -// routes.add(new VehicleRoute(getEmptyTour(),getDriver(),getNoVehicle())); - - - VehicleRoutingProblemSolution sol = new VehicleRoutingProblemSolution(routes, states.getRouteState(route, StateFactory.COSTS).toDouble() + getFixedCosts(routes)); - - - assertEquals(110.0, sol.getCost(), 0.5); - - - RuinRadial radialRuin = new RuinRadial(vrp, 0.2, new JobDistanceAvgCosts(vrp.getTransportCosts())); -// radialRuin.addListener(stateUpdater); - - InsertionStrategy insertionStrategy = new BestInsertion(insertionCalc); - insertionStrategy.addListener(stateUpdater); - insertionStrategy.addListener(new VehicleSwitched(fleetManager)); - Gendreau postOpt = new Gendreau(vrp, radialRuin, insertionStrategy, fleetManager); - - VehicleRoutingProblemSolution newSolution = postOpt.runAndGetSolution(sol); - newSolution.setCost(getCosts(newSolution,states)); - - assertEquals(2,RouteUtils.getNuOfActiveRoutes(newSolution.getRoutes())); - assertEquals(2,newSolution.getRoutes().size()); - assertEquals(80.0,newSolution.getCost(),0.5); - } - - private double getFixedCosts(Collection routes) { - double c = 0.0; - for(VehicleRoute r : routes){ c += r.getVehicle().getType().getVehicleCostParams().fix; } - return c; - } - - private double getCosts(VehicleRoutingProblemSolution newSolution, StateManager states) { - double c = 0.0; - for(VehicleRoute r : newSolution.getRoutes()){ - - c += states.getRouteState(r, StateFactory.COSTS).toDouble() + r.getVehicle().getType().getVehicleCostParams().fix; - - } - return c; - } - - @Test - public void whenPostOpt_optsRoutesWithMoreThanTwoJobs_oneRouteBecomesTwoRoutes(){ - Collection jobs = new ArrayList(); - jobs.add(job1); - jobs.add(job2); - jobs.add(job3); - - vrp = VehicleRoutingProblem.Builder.newInstance().addAllJobs(jobs).addAllVehicles(vehicles).setRoutingCost(cost).build(); - - TourActivities tour = new TourActivities(); - tour.addActivity(ServiceActivity.newInstance(job1)); - tour.addActivity(ServiceActivity.newInstance(job2)); - tour.addActivity(ServiceActivity.newInstance(job3)); - - VehicleRoute route = VehicleRoute.newInstance(tour,DriverImpl.noDriver(),heavyVehicle); - - UpdateStates stateUpdater = new UpdateStates(states, vrp.getTransportCosts(), vrp.getActivityCosts()); - stateUpdater.update(route); - - fleetManager.lock(heavyVehicle); - - Collection routes = new ArrayList(); - routes.add(route); - - VehicleRoutingProblemSolution sol = new VehicleRoutingProblemSolution(routes, route.getCost()); - sol.setCost(getCosts(sol,states)); - - assertEquals(110.0, sol.getCost(), 0.5); - - RuinRadial radialRuin = new RuinRadial(vrp, 0.2, new JobDistanceAvgCosts(vrp.getTransportCosts())); - InsertionStrategy insertionStrategy = new BestInsertion(insertionCalc); - insertionStrategy.addListener(stateUpdater); - insertionStrategy.addListener(new VehicleSwitched(fleetManager)); - Gendreau postOpt = new Gendreau(vrp, radialRuin, insertionStrategy, fleetManager); - postOpt.setShareOfJobsToRuin(1.0); - postOpt.setNuOfIterations(1); - -// postOpt.setWithFix(withFixCost); - VehicleRoutingProblemSolution newSolution = postOpt.runAndGetSolution(sol); - newSolution.setCost(getCosts(newSolution,states)); - - assertEquals(2,RouteUtils.getNuOfActiveRoutes(newSolution.getRoutes())); - assertEquals(2,newSolution.getRoutes().size()); - assertEquals(80.0,newSolution.getCost(),0.5); - } - - private Service getService(String to, double serviceTime) { - Service s = Service.Builder.newInstance(to, 0).setLocationId(to).setServiceTime(serviceTime).setTimeWindow(TimeWindow.newInstance(0.0, 20.0)).build(); - - return s; - } - - private Service getService(String to) { - Service s = getService(to, 0.0); - return s; - } - - - - -} diff --git a/jsprit-core/src/test/java/algorithms/LoadConstraint.java b/jsprit-core/src/test/java/algorithms/LoadConstraint.java deleted file mode 100644 index 967743e1..00000000 --- a/jsprit-core/src/test/java/algorithms/LoadConstraint.java +++ /dev/null @@ -1,23 +0,0 @@ -package algorithms; - -import basics.Service; - -class LoadConstraint implements HardRouteStateLevelConstraint{ - - private StateGetter states; - - public LoadConstraint(StateGetter states) { - super(); - this.states = states; - } - - @Override - public boolean fulfilled(InsertionContext insertionContext) { - int currentLoad = (int) states.getRouteState(insertionContext.getRoute(), StateFactory.LOAD).toDouble(); - Service service = (Service) insertionContext.getJob(); - if(currentLoad + service.getCapacityDemand() > insertionContext.getNewVehicle().getCapacity()){ - return false; - } - return true; - } -} \ No newline at end of file diff --git a/jsprit-core/src/test/java/algorithms/StateUpdates.java b/jsprit-core/src/test/java/algorithms/StateUpdates.java deleted file mode 100644 index 64041cf2..00000000 --- a/jsprit-core/src/test/java/algorithms/StateUpdates.java +++ /dev/null @@ -1,80 +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 . - ******************************************************************************/ -package algorithms; - -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.List; - -import basics.Job; -import basics.algo.InsertionStartsListener; -import basics.algo.JobInsertedListener; -import basics.costs.VehicleRoutingActivityCosts; -import basics.costs.VehicleRoutingTransportCosts; -import basics.route.ReverseRouteActivityVisitor; -import basics.route.RouteActivityVisitor; -import basics.route.VehicleRoute; - - - -class UpdateStates implements JobInsertedListener, InsertionStartsListener{ - - private RouteActivityVisitor routeActivityVisitor; - - private ReverseRouteActivityVisitor revRouteActivityVisitor; - - private InsertionListeners insertionListeners = new InsertionListeners(); - - public UpdateStates(StateManager states, VehicleRoutingTransportCosts routingCosts, VehicleRoutingActivityCosts activityCosts) { - routeActivityVisitor = new RouteActivityVisitor(); - routeActivityVisitor.addActivityVisitor(new UpdateActivityTimes(routingCosts)); - routeActivityVisitor.addActivityVisitor(new UpdateVariableCosts(activityCosts, routingCosts, states)); - routeActivityVisitor.addActivityVisitor(new UpdateLoads(states)); - routeActivityVisitor.addActivityVisitor(new UpdateMaxLoad_(states)); - revRouteActivityVisitor = new ReverseRouteActivityVisitor(); - revRouteActivityVisitor.addActivityVisitor(new TimeWindowUpdater(states, routingCosts)); - insertionListeners.addListener(new UpdateLoads(states)); -// insertionListeners.addListener(new UpdateLoadsAtStartAndEndOfRouteWhenJobHasBeenInserted(states)); - } - - public void update(VehicleRoute route){ - List routes = Arrays.asList(route); - insertionListeners.informInsertionStarts(routes, Collections.EMPTY_LIST); - routeActivityVisitor.visit(route); - revRouteActivityVisitor.visit(route); - } - - @Override - public void informJobInserted(Job job2insert, VehicleRoute inRoute, double additionalCosts, double additionalTime) { - insertionListeners.informJobInserted(job2insert, inRoute, additionalCosts, additionalTime); - routeActivityVisitor.visit(inRoute); - revRouteActivityVisitor.visit(inRoute); - } - - @Override - public void informInsertionStarts(Collection vehicleRoutes,Collection unassignedJobs) { - insertionListeners.informInsertionStarts(vehicleRoutes, unassignedJobs); - for(VehicleRoute route : vehicleRoutes) { - routeActivityVisitor.visit(route); - revRouteActivityVisitor.visit(route); - } - } - - } - - diff --git a/jsprit-core/src/test/java/algorithms/UpdateCostsAtRouteLevel.java b/jsprit-core/src/test/java/algorithms/UpdateCostsAtRouteLevel.java deleted file mode 100644 index 247f095a..00000000 --- a/jsprit-core/src/test/java/algorithms/UpdateCostsAtRouteLevel.java +++ /dev/null @@ -1,63 +0,0 @@ -package algorithms; - -import java.util.Collection; - -import algorithms.StateManager.StateImpl; -import basics.Job; -import basics.algo.InsertionEndsListener; -import basics.algo.InsertionStartsListener; -import basics.algo.JobInsertedListener; -import basics.costs.VehicleRoutingActivityCosts; -import basics.costs.VehicleRoutingTransportCosts; -import basics.route.RouteActivityVisitor; -import basics.route.VehicleRoute; - -class UpdateCostsAtRouteLevel implements StateUpdater,JobInsertedListener, InsertionStartsListener, InsertionEndsListener{ - - private StateManager states; - - private VehicleRoutingTransportCosts tpCosts; - - private VehicleRoutingActivityCosts actCosts; - - public UpdateCostsAtRouteLevel(StateManager states, VehicleRoutingTransportCosts tpCosts, VehicleRoutingActivityCosts actCosts) { - super(); - this.states = states; - this.tpCosts = tpCosts; - this.actCosts = actCosts; - } - - @Override - public void informJobInserted(Job job2insert, VehicleRoute inRoute, double additionalCosts, double additionalTime) { -// inRoute.getVehicleRouteCostCalculator().addTransportCost(additionalCosts); - double oldCosts = states.getRouteState(inRoute, StateFactory.COSTS).toDouble(); - oldCosts += additionalCosts; - states.putRouteState(inRoute, StateFactory.COSTS, new StateImpl(oldCosts)); - } - - @Override - public void informInsertionStarts(Collection vehicleRoutes, Collection unassignedJobs) { - RouteActivityVisitor forwardInTime = new RouteActivityVisitor(); - forwardInTime.addActivityVisitor(new UpdateVariableCosts(actCosts, tpCosts, states)); - for(VehicleRoute route : vehicleRoutes){ - forwardInTime.visit(route); - } - - } - - @Override - public void informInsertionEnds(Collection vehicleRoutes) { - -// IterateRouteForwardInTime forwardInTime = new IterateRouteForwardInTime(tpCosts); -// forwardInTime.addListener(new UpdateCostsAtAllLevels(actCosts, tpCosts, states)); - for(VehicleRoute route : vehicleRoutes){ - if(route.isEmpty()) continue; - route.getVehicleRouteCostCalculator().reset(); - route.getVehicleRouteCostCalculator().addOtherCost(states.getRouteState(route, StateFactory.COSTS).toDouble()); - route.getVehicleRouteCostCalculator().price(route.getVehicle()); -// forwardInTime.iterate(route); - } - - } - - } \ No newline at end of file diff --git a/jsprit-core/src/test/java/algorithms/UpdateLoadAtRouteLevel.java b/jsprit-core/src/test/java/algorithms/UpdateLoadAtRouteLevel.java deleted file mode 100644 index a80130af..00000000 --- a/jsprit-core/src/test/java/algorithms/UpdateLoadAtRouteLevel.java +++ /dev/null @@ -1,54 +0,0 @@ -package algorithms; - -import java.util.Collection; - -import algorithms.StateManager.StateImpl; -import basics.Job; -import basics.Service; -import basics.algo.InsertionStartsListener; -import basics.algo.JobInsertedListener; -import basics.route.VehicleRoute; - -/** - * Updates load at route level, i.e. modifies StateTypes.LOAD for each route. - * - * @author stefan - * - */ -class UpdateLoadAtRouteLevel implements JobInsertedListener, InsertionStartsListener, StateUpdater{ - - private StateManager states; - - /** - * Updates load at route level, i.e. modifies StateTypes.LOAD for each route. - * - * @author stefan - * - */ - public UpdateLoadAtRouteLevel(StateManager states) { - super(); - this.states = states; - } - - @Override - public void informJobInserted(Job job2insert, VehicleRoute inRoute, double additionalCosts, double additionalTime) { - if(!(job2insert instanceof Service)){ - return; - } - double oldLoad = states.getRouteState(inRoute, StateFactory.LOAD).toDouble(); - states.putRouteState(inRoute, StateFactory.LOAD, StateFactory.createState(oldLoad + job2insert.getCapacityDemand())); - } - - @Override - public void informInsertionStarts(Collection vehicleRoutes, Collection unassignedJobs) { - for(VehicleRoute route : vehicleRoutes){ - int load = 0; - for(Job j : route.getTourActivities().getJobs()){ - load += j.getCapacityDemand(); - } - states.putRouteState(route, StateFactory.LOAD, new StateImpl(load)); - } - - } - -} \ No newline at end of file diff --git a/jsprit-core/src/test/java/allsuites/AllTests.java b/jsprit-core/src/test/java/allsuites/AllTests.java deleted file mode 100644 index e330551f..00000000 --- a/jsprit-core/src/test/java/allsuites/AllTests.java +++ /dev/null @@ -1,35 +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 . - ******************************************************************************/ -package allsuites; - -import org.junit.runner.RunWith; -import org.junit.runners.Suite; - -import algorithms.AlgorithmsSuite; -import basics.BasicsSuite; - - - -@RunWith(Suite.class) -@Suite.SuiteClasses({ - AlgorithmsSuite.class, - BasicsSuite.class -}) -public class AllTests {} - - - diff --git a/jsprit-core/src/test/java/basics/BasicsSuite.java b/jsprit-core/src/test/java/basics/BasicsSuite.java deleted file mode 100644 index 5f0d8aef..00000000 --- a/jsprit-core/src/test/java/basics/BasicsSuite.java +++ /dev/null @@ -1,50 +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 . - ******************************************************************************/ -package basics; - -import org.junit.runner.RunWith; -import org.junit.runners.Suite; - -import algorithms.TestVehicleFleetManager; -import basics.algo.SearchStrategyManagerTest; -import basics.algo.SearchStrategyTest; -import basics.io.VrpReaderV2Test; -import basics.io.VrpWriterV2Test; -import basics.io.VrpWriterV3Test; -import basics.route.ServiceActTest; -import basics.route.TestTour; -import basics.route.TestVehicleRoute; - - - - -@RunWith(Suite.class) -@Suite.SuiteClasses({ - SearchStrategyManagerTest.class, - SearchStrategyTest.class, - TestTour.class, - TestVehicleFleetManager.class, - TestVehicleRoute.class, - ServiceActTest.class, - ServiceTest.class, - VehicleRoutingProblemBuilderTest.class, - VrpReaderV2Test.class, - VrpWriterV2Test.class, - VrpWriterV3Test.class - -}) -public class BasicsSuite {} diff --git a/jsprit-core/src/test/java/basics/io/VrpWriterV3Test.java b/jsprit-core/src/test/java/basics/io/VrpWriterV3Test.java deleted file mode 100644 index 9790f92c..00000000 --- a/jsprit-core/src/test/java/basics/io/VrpWriterV3Test.java +++ /dev/null @@ -1,98 +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 . - ******************************************************************************/ -package basics.io; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; - -import org.junit.Before; -import org.junit.Test; - -import basics.Service; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblem.FleetComposition; -import basics.VehicleRoutingProblem.FleetSize; -import basics.VehicleRoutingProblemSolution; -import basics.route.End; -import basics.route.ServiceActivity; -import basics.route.Start; -import basics.route.Vehicle; -import basics.route.VehicleImpl; -import basics.route.VehicleRoute; -import basics.route.VehicleTypeImpl; - -public class VrpWriterV3Test { - - private String infileName; - - @Before - public void doBefore(){ - infileName = "src/test/resources/infiniteWriterV2Test.xml"; - } - - @Test - public void whenWritingSolutions_itWritesThemCorrectly(){ - VehicleRoutingProblem.Builder builder = VehicleRoutingProblem.Builder.newInstance(); - builder.setFleetComposition(FleetComposition.HETEROGENEOUS); - builder.setFleetSize(FleetSize.FINITE); - VehicleTypeImpl type1 = VehicleTypeImpl.Builder.newInstance("vehType", 20).build(); - VehicleTypeImpl type2 = VehicleTypeImpl.Builder.newInstance("vehType2", 200).build(); - Vehicle v1 = VehicleImpl.Builder.newInstance("v1").setLocationId("loc").setType(type1).build(); - Vehicle v2 = VehicleImpl.Builder.newInstance("v2").setLocationId("loc").setType(type2).build(); - builder.addVehicleType(type1); - builder.addVehicleType(type2); - builder.addVehicle(v1); - builder.addVehicle(v2); - - Service s1 = Service.Builder.newInstance("1", 1).setLocationId("loc").setServiceTime(2.0).build(); - Service s2 = Service.Builder.newInstance("2", 1).setLocationId("loc2").setServiceTime(4.0).build(); - builder.addService(s1).addService(s2); - - VehicleRoutingProblem vrp = builder.build(); - - Collection routes = new ArrayList(); - Start start = Start.newInstance("start", 0.0, Double.MAX_VALUE); - start.setEndTime(10.0); - End end = End.newInstance("end", 0.0, Double.MAX_VALUE); - end.setArrTime(100); - VehicleRoute.Builder routebuilder = VehicleRoute.Builder.newInstance(start, end); - - ServiceActivity act1 = ServiceActivity.newInstance(s1); - ServiceActivity act2 = ServiceActivity.newInstance(s2); - act1.setArrTime(20.0); - act1.setEndTime(30.0); - - act2.setArrTime(40.0); - act2.setEndTime(80.0); - - routebuilder.addActivity(act1).addActivity(act2).setVehicle(v1); - VehicleRoute route = routebuilder.build(); - routes.add(route); - - VehicleRoutingProblemSolution solution = new VehicleRoutingProblemSolution(routes, 100); - - new VrpXMLWriter(vrp, Arrays.asList(solution)).write(infileName); - - VehicleRoutingProblem.Builder vrpToReadBuilder = VehicleRoutingProblem.Builder.newInstance(); - Collection solutions = new ArrayList(); - new VrpXMLReader(vrpToReadBuilder, solutions).read(infileName); - VehicleRoutingProblem readVrp = vrpToReadBuilder.build(); - - } - -} diff --git a/jsprit-core/src/test/java/jsprit/core/algorithm/BuildCVRPAlgoFromScratch_IT.java b/jsprit-core/src/test/java/jsprit/core/algorithm/BuildCVRPAlgoFromScratch_IT.java new file mode 100644 index 00000000..54a20f73 --- /dev/null +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/BuildCVRPAlgoFromScratch_IT.java @@ -0,0 +1,127 @@ +/******************************************************************************* + * 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 . + ******************************************************************************/ +package jsprit.core.algorithm; + +import static org.junit.Assert.assertEquals; + +import java.util.Collection; + +import jsprit.core.algorithm.acceptor.GreedyAcceptance; +import jsprit.core.algorithm.listener.IterationStartsListener; +import jsprit.core.algorithm.module.RuinAndRecreateModule; +import jsprit.core.algorithm.recreate.BestInsertionBuilder; +import jsprit.core.algorithm.recreate.InsertionStrategy; +import jsprit.core.algorithm.ruin.RadialRuinStrategyFactory; +import jsprit.core.algorithm.ruin.RandomRuinStrategyFactory; +import jsprit.core.algorithm.ruin.RuinStrategy; +import jsprit.core.algorithm.ruin.distance.AvgServiceDistance; +import jsprit.core.algorithm.selector.SelectBest; +import jsprit.core.algorithm.state.StateManager; +import jsprit.core.algorithm.state.UpdateVariableCosts; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.constraint.ConstraintManager; +import jsprit.core.problem.io.VrpXMLReader; +import jsprit.core.problem.solution.SolutionCostCalculator; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; +import jsprit.core.problem.solution.route.VehicleRoute; +import jsprit.core.problem.solution.route.state.StateFactory; +import jsprit.core.problem.vehicle.InfiniteFleetManagerFactory; +import jsprit.core.problem.vehicle.VehicleFleetManager; +import jsprit.core.util.Solutions; + +import org.junit.Before; +import org.junit.Test; + + +public class BuildCVRPAlgoFromScratch_IT { + + VehicleRoutingProblem vrp; + + VehicleRoutingAlgorithm vra; + + @Before + public void setup(){ + VehicleRoutingProblem.Builder builder = VehicleRoutingProblem.Builder.newInstance(); + new VrpXMLReader(builder).read("src/test/resources/vrpnc1-jsprit.xml"); + vrp = builder.build(); + + final StateManager stateManager = new StateManager(vrp); + stateManager.updateLoadStates(); + stateManager.updateTimeWindowStates(); + stateManager.addStateUpdater(new UpdateVariableCosts(vrp.getActivityCosts(), vrp.getTransportCosts(), stateManager)); + + + ConstraintManager cManager = new ConstraintManager(vrp, stateManager); + cManager.addLoadConstraint(); + cManager.addTimeWindowConstraint(); + + VehicleFleetManager fleetManager = new InfiniteFleetManagerFactory(vrp.getVehicles()).createFleetManager(); + + InsertionStrategy bestInsertion = new BestInsertionBuilder(vrp, fleetManager, stateManager, cManager).build(); + + RuinStrategy radial = new RadialRuinStrategyFactory(0.15, new AvgServiceDistance(vrp.getTransportCosts())).createStrategy(vrp); + RuinStrategy random = new RandomRuinStrategyFactory(0.25).createStrategy(vrp); + + SolutionCostCalculator solutionCostCalculator = new SolutionCostCalculator() { + + @Override + public double getCosts(VehicleRoutingProblemSolution solution) { + double costs = 0.0; + for(VehicleRoute route : solution.getRoutes()){ + costs += stateManager.getRouteState(route, StateFactory.COSTS).toDouble(); + } + return costs; + } + }; + + SearchStrategy randomStrategy = new SearchStrategy(new SelectBest(), new GreedyAcceptance(1), solutionCostCalculator); + RuinAndRecreateModule randomModule = new RuinAndRecreateModule("randomRuin_bestInsertion", bestInsertion, random); + randomStrategy.addModule(randomModule); + + SearchStrategy radialStrategy = new SearchStrategy(new SelectBest(), new GreedyAcceptance(1), solutionCostCalculator); + RuinAndRecreateModule radialModule = new RuinAndRecreateModule("radialRuin_bestInsertion", bestInsertion, radial); + radialStrategy.addModule(radialModule); + + SearchStrategyManager strategyManager = new SearchStrategyManager(); + strategyManager.addStrategy(radialStrategy, 0.5); + strategyManager.addStrategy(randomStrategy, 0.5); + + vra = new VehicleRoutingAlgorithm(vrp, strategyManager); + vra.addListener(stateManager); + vra.addListener(new RemoveEmptyVehicles(fleetManager)); + +// vra.getAlgorithmListeners().addListener(stateManager); +// vra.getSearchStrategyManager().addSearchStrategyModuleListener(stateManager); +// vra.getSearchStrategyManager().addSearchStrategyModuleListener(new RemoveEmptyVehicles(fleetManager)); + + VehicleRoutingProblemSolution iniSolution = new InsertionInitialSolutionFactory(bestInsertion, solutionCostCalculator).createSolution(vrp); + + vra.addInitialSolution(iniSolution); + + vra.setNuOfIterations(2000); + + } + + @Test + public void testVRA(){ + Collection solutions = vra.searchSolutions(); + System.out.println("costs="+Solutions.bestOf(solutions).getCost()+";#routes="+Solutions.bestOf(solutions).getRoutes().size()); + assertEquals(530.0, Solutions.bestOf(solutions).getCost(),15.0); + assertEquals(5, Solutions.bestOf(solutions).getRoutes().size()); + } + +} diff --git a/jsprit-core/src/test/java/algorithms/BuildPDVRPAlgoFromScratchTest.java b/jsprit-core/src/test/java/jsprit/core/algorithm/BuildPDVRPAlgoFromScratch_IT.java similarity index 63% rename from jsprit-core/src/test/java/algorithms/BuildPDVRPAlgoFromScratchTest.java rename to jsprit-core/src/test/java/jsprit/core/algorithm/BuildPDVRPAlgoFromScratch_IT.java index 02076ca1..fcf13379 100644 --- a/jsprit-core/src/test/java/algorithms/BuildPDVRPAlgoFromScratchTest.java +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/BuildPDVRPAlgoFromScratch_IT.java @@ -14,35 +14,43 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms; +package jsprit.core.algorithm; import java.util.Collection; +import jsprit.core.algorithm.acceptor.GreedyAcceptance; +import jsprit.core.algorithm.module.RuinAndRecreateModule; +import jsprit.core.algorithm.recreate.BestInsertionBuilder; +import jsprit.core.algorithm.recreate.InsertionStrategy; +import jsprit.core.algorithm.ruin.RadialRuinStrategyFactory; +import jsprit.core.algorithm.ruin.RandomRuinStrategyFactory; +import jsprit.core.algorithm.ruin.RuinStrategy; +import jsprit.core.algorithm.ruin.distance.AvgServiceDistance; +import jsprit.core.algorithm.selector.SelectBest; +import jsprit.core.algorithm.state.StateManager; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.constraint.ConstraintManager; +import jsprit.core.problem.io.VrpXMLReader; +import jsprit.core.problem.solution.SolutionCostCalculator; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; +import jsprit.core.problem.solution.route.VehicleRoute; +import jsprit.core.problem.solution.route.state.StateFactory; +import jsprit.core.problem.vehicle.InfiniteFleetManagerFactory; +import jsprit.core.problem.vehicle.VehicleFleetManager; +import jsprit.core.util.Solutions; + import org.apache.log4j.Logger; import org.junit.Before; import org.junit.Test; -import util.Solutions; -import algorithms.acceptors.AcceptNewIfBetterThanWorst; -import algorithms.selectors.SelectBest; -import basics.VehicleRoutingAlgorithm; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblemSolution; -import basics.algo.SearchStrategy; -import basics.algo.SearchStrategyManager; -import basics.algo.SolutionCostCalculator; -import basics.io.VrpXMLReader; -import basics.route.InfiniteFleetManagerFactory; -import basics.route.VehicleFleetManager; -import basics.route.VehicleRoute; -public class BuildPDVRPAlgoFromScratchTest { +public class BuildPDVRPAlgoFromScratch_IT { VehicleRoutingProblem vrp; VehicleRoutingAlgorithm vra; - static Logger log = Logger.getLogger(BuildPDVRPAlgoFromScratchTest.class); + static Logger log = Logger.getLogger(BuildPDVRPAlgoFromScratch_IT.class); @Before public void setup(){ @@ -51,7 +59,7 @@ public class BuildPDVRPAlgoFromScratchTest { new VrpXMLReader(builder).read("src/test/resources/pd_solomon_r101.xml"); vrp = builder.build(); - final StateManager stateManager = new StateManager(); + final StateManager stateManager = new StateManager(vrp); ConstraintManager constraintManager = new ConstraintManager(vrp,stateManager); constraintManager.addTimeWindowConstraint(); @@ -63,8 +71,8 @@ public class BuildPDVRPAlgoFromScratchTest { // iBuilder.setConstraintManager(constraintManger); InsertionStrategy bestInsertion = iBuilder.build(); - RuinRadial radial = new RuinRadial(vrp, 0.15, new JobDistanceAvgCosts(vrp.getTransportCosts())); - RuinRandom random = new RuinRandom(vrp, 0.25); + RuinStrategy radial = new RadialRuinStrategyFactory( 0.15, new AvgServiceDistance(vrp.getTransportCosts())).createStrategy(vrp); + RuinStrategy random = new RandomRuinStrategyFactory(0.25).createStrategy(vrp); SolutionCostCalculator solutionCostCalculator = new SolutionCostCalculator() { @@ -78,11 +86,11 @@ public class BuildPDVRPAlgoFromScratchTest { } }; - SearchStrategy randomStrategy = new SearchStrategy(new SelectBest(), new AcceptNewIfBetterThanWorst(1), solutionCostCalculator); + SearchStrategy randomStrategy = new SearchStrategy(new SelectBest(), new GreedyAcceptance(1), solutionCostCalculator); RuinAndRecreateModule randomModule = new RuinAndRecreateModule("randomRuin_bestInsertion", bestInsertion, random); randomStrategy.addModule(randomModule); - SearchStrategy radialStrategy = new SearchStrategy(new SelectBest(), new AcceptNewIfBetterThanWorst(1), solutionCostCalculator); + SearchStrategy radialStrategy = new SearchStrategy(new SelectBest(), new GreedyAcceptance(1), solutionCostCalculator); RuinAndRecreateModule radialModule = new RuinAndRecreateModule("radialRuin_bestInsertion", bestInsertion, radial); radialStrategy.addModule(radialModule); @@ -90,11 +98,12 @@ public class BuildPDVRPAlgoFromScratchTest { strategyManager.addStrategy(radialStrategy, 0.5); strategyManager.addStrategy(randomStrategy, 0.5); - vra = new VehicleRoutingAlgorithmFactoryImpl(strategyManager, stateManager, fleetManager).createAlgorithm(vrp); + vra = new VehicleRoutingAlgorithm(vrp, strategyManager); + vra.addListener(stateManager); + vra.addListener(new RemoveEmptyVehicles(fleetManager)); VehicleRoutingProblemSolution iniSolution = new InsertionInitialSolutionFactory(bestInsertion, solutionCostCalculator).createSolution(vrp); -// System.out.println("ini: costs="+iniSolution.getCost()+";#routes="+iniSolution.getRoutes().size()); vra.addInitialSolution(iniSolution); vra.setNuOfIterations(1000); vra.setPrematureBreak(100); @@ -104,9 +113,7 @@ public class BuildPDVRPAlgoFromScratchTest { @Test public void test(){ Collection solutions = vra.searchSolutions(); - System.out.println(Solutions.getBest(solutions).getCost()); -// new VrpXMLWriter(vrp, solutions).write("output/pd_solomon_r101.xml"); - + System.out.println(Solutions.bestOf(solutions).getCost()); } } diff --git a/jsprit-core/src/test/java/jsprit/core/algorithm/BuildPDVRPWithShipmentsAlgoFromScratch_IT.java b/jsprit-core/src/test/java/jsprit/core/algorithm/BuildPDVRPWithShipmentsAlgoFromScratch_IT.java new file mode 100644 index 00000000..32c8e9ae --- /dev/null +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/BuildPDVRPWithShipmentsAlgoFromScratch_IT.java @@ -0,0 +1,125 @@ +/******************************************************************************* + * 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 . + ******************************************************************************/ +package jsprit.core.algorithm; + +import java.util.Collection; + +import jsprit.core.algorithm.acceptor.GreedyAcceptance; +import jsprit.core.algorithm.module.RuinAndRecreateModule; +import jsprit.core.algorithm.recreate.BestInsertionBuilder; +import jsprit.core.algorithm.recreate.InsertionStrategy; +import jsprit.core.algorithm.ruin.RadialRuinStrategyFactory; +import jsprit.core.algorithm.ruin.RandomRuinStrategyFactory; +import jsprit.core.algorithm.ruin.RuinStrategy; +import jsprit.core.algorithm.ruin.distance.AvgServiceAndShipmentDistance; +import jsprit.core.algorithm.selector.SelectBest; +import jsprit.core.algorithm.state.StateManager; +import jsprit.core.algorithm.state.UpdateVariableCosts; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.constraint.ConstraintManager; +import jsprit.core.problem.io.VrpXMLReader; +import jsprit.core.problem.solution.SolutionCostCalculator; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; +import jsprit.core.problem.solution.route.VehicleRoute; +import jsprit.core.problem.solution.route.state.StateFactory; +import jsprit.core.problem.vehicle.InfiniteFleetManagerFactory; +import jsprit.core.problem.vehicle.VehicleFleetManager; +import jsprit.core.util.Solutions; + +import org.apache.log4j.Logger; +import org.junit.Before; +import org.junit.Test; + + +public class BuildPDVRPWithShipmentsAlgoFromScratch_IT { + + VehicleRoutingProblem vrp; + + VehicleRoutingAlgorithm vra; + + static Logger log = Logger.getLogger(BuildPDVRPWithShipmentsAlgoFromScratch_IT.class); + + @Before + public void setup(){ + + VehicleRoutingProblem.Builder builder = VehicleRoutingProblem.Builder.newInstance(); + new VrpXMLReader(builder).read("src/test/resources/pdp.xml"); + + vrp = builder.build(); + + final StateManager stateManager = new StateManager(vrp); + stateManager.updateLoadStates(); + stateManager.updateTimeWindowStates(); + stateManager.addStateUpdater(new UpdateVariableCosts(vrp.getActivityCosts(), vrp.getTransportCosts(), stateManager)); + + ConstraintManager constraintManager = new ConstraintManager(vrp,stateManager); + constraintManager.addTimeWindowConstraint(); + constraintManager.addLoadConstraint(); + + VehicleFleetManager fleetManager = new InfiniteFleetManagerFactory(vrp.getVehicles()).createFleetManager(); + + BestInsertionBuilder bestIBuilder = new BestInsertionBuilder(vrp, fleetManager, stateManager,constraintManager); + InsertionStrategy bestInsertion = bestIBuilder.build(); + + + RuinStrategy radial = new RadialRuinStrategyFactory( 0.3, new AvgServiceAndShipmentDistance(vrp.getTransportCosts())).createStrategy(vrp); + RuinStrategy random = new RandomRuinStrategyFactory(0.5).createStrategy(vrp); + + + SolutionCostCalculator solutionCostCalculator = new SolutionCostCalculator() { + + @Override + public double getCosts(VehicleRoutingProblemSolution solution) { + double costs = 0.0; + for(VehicleRoute route : solution.getRoutes()){ + costs += stateManager.getRouteState(route, StateFactory.COSTS).toDouble(); + } + return costs; + } + }; + + SearchStrategy randomStrategy = new SearchStrategy(new SelectBest(), new GreedyAcceptance(1), solutionCostCalculator); + RuinAndRecreateModule randomModule = new RuinAndRecreateModule("randomRuin_bestInsertion", bestInsertion, random); + randomStrategy.addModule(randomModule); + + SearchStrategy radialStrategy = new SearchStrategy(new SelectBest(), new GreedyAcceptance(1), solutionCostCalculator); + RuinAndRecreateModule radialModule = new RuinAndRecreateModule("radialRuin_bestInsertion", bestInsertion, radial); + radialStrategy.addModule(radialModule); + + SearchStrategyManager strategyManager = new SearchStrategyManager(); + strategyManager.addStrategy(radialStrategy, 0.5); + strategyManager.addStrategy(randomStrategy, 0.5); + + vra = new VehicleRoutingAlgorithm(vrp, strategyManager); + vra.addListener(stateManager); + vra.addListener(new RemoveEmptyVehicles(fleetManager)); + + VehicleRoutingProblemSolution iniSolution = new InsertionInitialSolutionFactory(bestInsertion, solutionCostCalculator).createSolution(vrp); + vra.addInitialSolution(iniSolution); + + vra.setNuOfIterations(3); +// vra.setPrematureBreak(500); + + } + + @Test + public void test(){ + Collection solutions = vra.searchSolutions(); + VehicleRoutingProblemSolution best = Solutions.bestOf(solutions); + } + +} diff --git a/jsprit-core/src/test/java/algorithms/ExampleActivityCostFunction.java b/jsprit-core/src/test/java/jsprit/core/algorithm/ExampleActivityCostFunction.java similarity index 85% rename from jsprit-core/src/test/java/algorithms/ExampleActivityCostFunction.java rename to jsprit-core/src/test/java/jsprit/core/algorithm/ExampleActivityCostFunction.java index b69fb16a..ddd29449 100644 --- a/jsprit-core/src/test/java/algorithms/ExampleActivityCostFunction.java +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/ExampleActivityCostFunction.java @@ -14,13 +14,13 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms; +package jsprit.core.algorithm; -import basics.costs.VehicleRoutingActivityCosts; -import basics.route.Driver; -import basics.route.TourActivity; -import basics.route.TourActivity.JobActivity; -import basics.route.Vehicle; +import jsprit.core.problem.cost.VehicleRoutingActivityCosts; +import jsprit.core.problem.driver.Driver; +import jsprit.core.problem.solution.route.activity.TourActivity; +import jsprit.core.problem.solution.route.activity.TourActivity.JobActivity; +import jsprit.core.problem.vehicle.Vehicle; public class ExampleActivityCostFunction implements VehicleRoutingActivityCosts{ diff --git a/jsprit-core/src/test/java/algorithms/FindCheaperVehicleTest.java b/jsprit-core/src/test/java/jsprit/core/algorithm/FindCheaperVehicleTest.java similarity index 99% rename from jsprit-core/src/test/java/algorithms/FindCheaperVehicleTest.java rename to jsprit-core/src/test/java/jsprit/core/algorithm/FindCheaperVehicleTest.java index 9a7da1a9..2146984c 100644 --- a/jsprit-core/src/test/java/algorithms/FindCheaperVehicleTest.java +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/FindCheaperVehicleTest.java @@ -1,3 +1,4 @@ +package jsprit.core.algorithm; /******************************************************************************* * Copyright (C) 2013 Stefan Schroeder * diff --git a/jsprit-core/src/test/java/jsprit/core/algorithm/GendreauPostOptTest.java b/jsprit-core/src/test/java/jsprit/core/algorithm/GendreauPostOptTest.java new file mode 100644 index 00000000..c96ccf38 --- /dev/null +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/GendreauPostOptTest.java @@ -0,0 +1,305 @@ +///******************************************************************************* +// * 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 . +// ******************************************************************************/ +//package jsprit.core.algorithm; +// +//import static org.junit.Assert.assertEquals; +// +//import java.util.ArrayList; +//import java.util.Arrays; +//import java.util.Collection; +//import java.util.List; +// +//import jsprit.core.algorithm.module.Gendreau; +//import jsprit.core.algorithm.recreate.BestInsertion; +//import jsprit.core.algorithm.recreate.InsertionStrategy; +//import jsprit.core.algorithm.recreate.JobInsertionConsideringFixCostsCalculator; +//import jsprit.core.algorithm.recreate.JobInsertionCostsCalculator; +//import jsprit.core.algorithm.recreate.LocalActivityInsertionCostsCalculator; +//import jsprit.core.algorithm.recreate.ServiceInsertionCalculator; +//import jsprit.core.algorithm.recreate.VehicleSwitched; +//import jsprit.core.algorithm.recreate.VehicleTypeDependentJobInsertionCalculator; +//import jsprit.core.algorithm.ruin.RuinRadial; +//import jsprit.core.algorithm.ruin.distance.JobDistanceAvgCosts; +//import jsprit.core.algorithm.state.StateFactory; +//import jsprit.core.algorithm.state.StateManager; +//import jsprit.core.problem.VehicleRoutingProblem; +//import jsprit.core.problem.constraint.TimeWindowConstraint; +//import jsprit.core.problem.cost.VehicleRoutingActivityCosts; +//import jsprit.core.problem.cost.VehicleRoutingTransportCosts; +//import jsprit.core.problem.driver.Driver; +//import jsprit.core.problem.driver.DriverImpl; +//import jsprit.core.problem.job.Job; +//import jsprit.core.problem.job.Service; +//import jsprit.core.problem.solution.VehicleRoutingProblemSolution; +//import jsprit.core.problem.solution.route.VehicleRoute; +//import jsprit.core.problem.solution.route.activity.ServiceActivity; +//import jsprit.core.problem.solution.route.activity.TimeWindow; +//import jsprit.core.problem.solution.route.activity.TourActivities; +//import jsprit.core.problem.vehicle.FiniteFleetManagerFactory; +//import jsprit.core.problem.vehicle.Vehicle; +//import jsprit.core.problem.vehicle.VehicleFleetManager; +//import jsprit.core.problem.vehicle.VehicleImpl; +//import jsprit.core.problem.vehicle.VehicleTypeImpl; +//import jsprit.core.util.Coordinate; +//import jsprit.core.util.ManhattanDistanceCalculator; +//import jsprit.core.util.RouteUtils; +// +//import org.junit.Before; +//import org.junit.Test; +// +// +//public class GendreauPostOptTest { +// +// TourActivities tour; +// +// Vehicle heavyVehicle; +// +// Vehicle lightVehicle1; +// +// Vehicle lightVehicle2; +// +// VehicleRoutingTransportCosts cost; +// +// VehicleRoutingActivityCosts activityCosts; +// +// VehicleRoutingProblem vrp; +// +// Service job1; +// +// Service job2; +// +// Service job3; +// +// private StateManager states; +// +// private List vehicles; +// +// private VehicleFleetManager fleetManager; +// +// private JobInsertionCostsCalculator insertionCalc; +// +// @Before +// public void setUp(){ +// +// cost = new VehicleRoutingTransportCosts() { +// +// @Override +// public double getBackwardTransportTime(String fromId, String toId, +// double arrivalTime, Driver driver, Vehicle vehicle) { +// // TODO Auto-generated method stub +// return 0; +// } +// +// @Override +// public double getBackwardTransportCost(String fromId, String toId, +// double arrivalTime, Driver driver, Vehicle vehicle) { +// // TODO Auto-generated method stub +// return 0; +// } +// +// @Override +// public double getTransportCost(String fromId, String toId, double departureTime, Driver driver, Vehicle vehicle) { +// +// String[] fromTokens = fromId.split(","); +// String[] toTokens = toId.split(","); +// double fromX = Double.parseDouble(fromTokens[0]); +// double fromY = Double.parseDouble(fromTokens[1]); +// +// double toX = Double.parseDouble(toTokens[0]); +// double toY = Double.parseDouble(toTokens[1]); +// +// double costPerDistanceUnit; +// if(vehicle != null){ +// costPerDistanceUnit = vehicle.getType().getVehicleCostParams().perDistanceUnit; +// } +// else{ +// costPerDistanceUnit = 1; +// } +// +// return costPerDistanceUnit*ManhattanDistanceCalculator.calculateDistance(new Coordinate(fromX, fromY), new Coordinate(toX, toY)); +// } +// +// @Override +// public double getTransportTime(String fromId, String toId, double departureTime, Driver driver, Vehicle vehicle) { +// return 0; +// } +// }; +// +// VehicleTypeImpl lightType = VehicleTypeImpl.Builder.newInstance("light", 10).setFixedCost(10).setCostPerDistance(1.0).build(); +// VehicleTypeImpl heavyType = VehicleTypeImpl.Builder.newInstance("heavy", 10).setFixedCost(30).setCostPerDistance(2.0).build(); +// +// lightVehicle1 = VehicleImpl.Builder.newInstance("light").setLocationId("0,0").setType(lightType).build(); +// lightVehicle2 = VehicleImpl.Builder.newInstance("light2").setLocationId("0,0").setType(lightType).build(); +// heavyVehicle = VehicleImpl.Builder.newInstance("heavy").setLocationId("0,0").setType(heavyType).build(); +// +// +// job1 = getService("10,0"); +// job2 = getService("10,10"); +// job3 = getService("0,10"); +// +// Collection jobs = new ArrayList(); +// jobs.add(job1); +// jobs.add(job2); +// jobs.add(job3); +// +// vehicles = Arrays.asList(lightVehicle1,lightVehicle2, heavyVehicle); +// +//// Collection vehicles = Arrays.asList(lightVehicle1,lightVehicle2, heavyVehicle); +// fleetManager = new FiniteFleetManagerFactory(vehicles).createFleetManager(); +// states = new StateManager(); +// +// activityCosts = new ExampleActivityCostFunction(); +// +// +// ServiceInsertionCalculator standardServiceInsertion = new ServiceInsertionCalculator(cost, new LocalActivityInsertionCostsCalculator(cost, activityCosts), new LoadConstraint(states), new TimeWindowConstraint(states, cost)); +// +// +// +// +// JobInsertionConsideringFixCostsCalculator withFixCost = new JobInsertionConsideringFixCostsCalculator(standardServiceInsertion, states); +// withFixCost.setWeightOfFixCost(1.2); +// +// insertionCalc = new VehicleTypeDependentJobInsertionCalculator(fleetManager, withFixCost); +// +//// updater = new TourStateUpdater(states, cost, activityCosts); +// +// } +// +// @Test +// public void whenPostOpt_splitsTour_oneActiveTourBecomeTwoSeperateActiveTours(){ +// Collection jobs = new ArrayList(); +// jobs.add(job1); +// jobs.add(job2); +// +// vrp = VehicleRoutingProblem.Builder.newInstance().addAllJobs(jobs).addAllVehicles(vehicles).setRoutingCost(cost).build(); +// +// TourActivities tour = new TourActivities(); +// tour.addActivity(ServiceActivity.newInstance(job1)); +// tour.addActivity(ServiceActivity.newInstance(job2)); +// +// VehicleRoute route = VehicleRoute.newInstance(tour,DriverImpl.noDriver(),heavyVehicle); +// +// fleetManager.lock(heavyVehicle); +// +// UpdateStates stateUpdater = new UpdateStates(states, vrp.getTransportCosts(), vrp.getActivityCosts()); +// stateUpdater.update(route); +// +// Collection routes = new ArrayList(); +// routes.add(route); +//// routes.add(new VehicleRoute(getEmptyTour(),getDriver(),getNoVehicle())); +//// routes.add(new VehicleRoute(getEmptyTour(),getDriver(),getNoVehicle())); +// +// +// VehicleRoutingProblemSolution sol = new VehicleRoutingProblemSolution(routes, states.getRouteState(route, StateFactory.COSTS).toDouble() + getFixedCosts(routes)); +// +// +// assertEquals(110.0, sol.getCost(), 0.5); +// +// +// RuinRadial radialRuin = new RuinRadial(vrp, 0.2, new JobDistanceAvgCosts(vrp.getTransportCosts())); +//// radialRuin.addListener(stateUpdater); +// +// InsertionStrategy insertionStrategy = new BestInsertion(insertionCalc); +// insertionStrategy.addListener(stateUpdater); +// insertionStrategy.addListener(new VehicleSwitched(fleetManager)); +// Gendreau postOpt = new Gendreau(vrp, radialRuin, insertionStrategy, fleetManager); +// +// VehicleRoutingProblemSolution newSolution = postOpt.runAndGetSolution(sol); +// newSolution.setCost(getCosts(newSolution,states)); +// +// assertEquals(2,RouteUtils.getNuOfActiveRoutes(newSolution.getRoutes())); +// assertEquals(2,newSolution.getRoutes().size()); +// assertEquals(80.0,newSolution.getCost(),0.5); +// } +// +// private double getFixedCosts(Collection routes) { +// double c = 0.0; +// for(VehicleRoute r : routes){ c += r.getVehicle().getType().getVehicleCostParams().fix; } +// return c; +// } +// +// private double getCosts(VehicleRoutingProblemSolution newSolution, StateManager states) { +// double c = 0.0; +// for(VehicleRoute r : newSolution.getRoutes()){ +// +// c += states.getRouteState(r, StateFactory.COSTS).toDouble() + r.getVehicle().getType().getVehicleCostParams().fix; +// +// } +// return c; +// } +// +// @Test +// public void whenPostOpt_optsRoutesWithMoreThanTwoJobs_oneRouteBecomesTwoRoutes(){ +// Collection jobs = new ArrayList(); +// jobs.add(job1); +// jobs.add(job2); +// jobs.add(job3); +// +// vrp = VehicleRoutingProblem.Builder.newInstance().addAllJobs(jobs).addAllVehicles(vehicles).setRoutingCost(cost).build(); +// +// TourActivities tour = new TourActivities(); +// tour.addActivity(ServiceActivity.newInstance(job1)); +// tour.addActivity(ServiceActivity.newInstance(job2)); +// tour.addActivity(ServiceActivity.newInstance(job3)); +// +// VehicleRoute route = VehicleRoute.newInstance(tour,DriverImpl.noDriver(),heavyVehicle); +// +// UpdateStates stateUpdater = new UpdateStates(states, vrp.getTransportCosts(), vrp.getActivityCosts()); +// stateUpdater.update(route); +// +// fleetManager.lock(heavyVehicle); +// +// Collection routes = new ArrayList(); +// routes.add(route); +// +// VehicleRoutingProblemSolution sol = new VehicleRoutingProblemSolution(routes, route.getCost()); +// sol.setCost(getCosts(sol,states)); +// +// assertEquals(110.0, sol.getCost(), 0.5); +// +// RuinRadial radialRuin = new RuinRadial(vrp, 0.2, new JobDistanceAvgCosts(vrp.getTransportCosts())); +// InsertionStrategy insertionStrategy = new BestInsertion(insertionCalc); +// insertionStrategy.addListener(stateUpdater); +// insertionStrategy.addListener(new VehicleSwitched(fleetManager)); +// Gendreau postOpt = new Gendreau(vrp, radialRuin, insertionStrategy, fleetManager); +// postOpt.setShareOfJobsToRuin(1.0); +// postOpt.setNuOfIterations(1); +// +//// postOpt.setWithFix(withFixCost); +// VehicleRoutingProblemSolution newSolution = postOpt.runAndGetSolution(sol); +// newSolution.setCost(getCosts(newSolution,states)); +// +// assertEquals(2,RouteUtils.getNuOfActiveRoutes(newSolution.getRoutes())); +// assertEquals(2,newSolution.getRoutes().size()); +// assertEquals(80.0,newSolution.getCost(),0.5); +// } +// +// private Service getService(String to, double serviceTime) { +// Service s = Service.Builder.newInstance(to, 0).setLocationId(to).setServiceTime(serviceTime).setTimeWindow(TimeWindow.newInstance(0.0, 20.0)).build(); +// +// return s; +// } +// +// private Service getService(String to) { +// Service s = getService(to, 0.0); +// return s; +// } +// +// +// +// +//} diff --git a/jsprit-core/src/test/java/algorithms/RefuseCollectionTest.java b/jsprit-core/src/test/java/jsprit/core/algorithm/RefuseCollection_IT.java similarity index 89% rename from jsprit-core/src/test/java/algorithms/RefuseCollectionTest.java rename to jsprit-core/src/test/java/jsprit/core/algorithm/RefuseCollection_IT.java index 7af0822c..82d87901 100644 --- a/jsprit-core/src/test/java/algorithms/RefuseCollectionTest.java +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/RefuseCollection_IT.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms; +package jsprit.core.algorithm; import static org.junit.Assert.assertEquals; @@ -26,24 +26,25 @@ import java.io.IOException; import java.util.Collection; import java.util.Map; +import jsprit.core.algorithm.box.GreedySchrimpfFactory; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.VehicleRoutingProblem.FleetSize; +import jsprit.core.problem.cost.VehicleRoutingTransportCosts; +import jsprit.core.problem.driver.Driver; +import jsprit.core.problem.job.Service; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; +import jsprit.core.problem.vehicle.Vehicle; +import jsprit.core.problem.vehicle.VehicleImpl; +import jsprit.core.problem.vehicle.VehicleTypeImpl; +import jsprit.core.util.Solutions; +import jsprit.core.util.VehicleRoutingTransportCostsMatrix; +import jsprit.core.util.VehicleRoutingTransportCostsMatrix.Builder; + import org.junit.Test; -import util.Solutions; -import util.VehicleRoutingTransportCostsMatrix; -import util.VehicleRoutingTransportCostsMatrix.Builder; -import basics.Service; -import basics.VehicleRoutingAlgorithm; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblem.FleetSize; -import basics.VehicleRoutingProblemSolution; -import basics.costs.VehicleRoutingTransportCosts; -import basics.route.Driver; -import basics.route.Vehicle; -import basics.route.VehicleImpl; -import basics.route.VehicleTypeImpl; -public class RefuseCollectionTest { +public class RefuseCollection_IT { static class RelationKey { diff --git a/jsprit-core/src/test/java/basics/algo/SearchStrategyManagerTest.java b/jsprit-core/src/test/java/jsprit/core/algorithm/SearchStrategyManagerTest.java similarity index 97% rename from jsprit-core/src/test/java/basics/algo/SearchStrategyManagerTest.java rename to jsprit-core/src/test/java/jsprit/core/algorithm/SearchStrategyManagerTest.java index f3549c1a..daa426f4 100644 --- a/jsprit-core/src/test/java/basics/algo/SearchStrategyManagerTest.java +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/SearchStrategyManagerTest.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.algo; +package jsprit.core.algorithm; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; @@ -25,6 +25,9 @@ import static org.mockito.Mockito.when; import java.util.Random; +import jsprit.core.algorithm.SearchStrategy; +import jsprit.core.algorithm.SearchStrategyManager; + import org.junit.Test; diff --git a/jsprit-core/src/test/java/basics/algo/SearchStrategyTest.java b/jsprit-core/src/test/java/jsprit/core/algorithm/SearchStrategyTest.java similarity index 93% rename from jsprit-core/src/test/java/basics/algo/SearchStrategyTest.java rename to jsprit-core/src/test/java/jsprit/core/algorithm/SearchStrategyTest.java index 40d0536c..24e59e69 100644 --- a/jsprit-core/src/test/java/basics/algo/SearchStrategyTest.java +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/SearchStrategyTest.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.algo; +package jsprit.core.algorithm; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.mock; @@ -24,12 +24,17 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Random; +import jsprit.core.algorithm.SearchStrategy; +import jsprit.core.algorithm.SearchStrategyModule; +import jsprit.core.algorithm.acceptor.SolutionAcceptor; +import jsprit.core.algorithm.listener.SearchStrategyModuleListener; +import jsprit.core.algorithm.selector.SolutionSelector; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.solution.SolutionCostCalculator; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; + import org.junit.Test; -import algorithms.acceptors.SolutionAcceptor; -import algorithms.selectors.SolutionSelector; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblemSolution; diff --git a/jsprit-core/src/test/java/algorithms/acceptors/AcceptNewRemoveWorstTest.java b/jsprit-core/src/test/java/jsprit/core/algorithm/acceptor/AcceptNewRemoveWorstTest.java similarity index 87% rename from jsprit-core/src/test/java/algorithms/acceptors/AcceptNewRemoveWorstTest.java rename to jsprit-core/src/test/java/jsprit/core/algorithm/acceptor/AcceptNewRemoveWorstTest.java index 9c201f47..2e822285 100644 --- a/jsprit-core/src/test/java/algorithms/acceptors/AcceptNewRemoveWorstTest.java +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/acceptor/AcceptNewRemoveWorstTest.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms.acceptors; +package jsprit.core.algorithm.acceptor; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertEquals; @@ -25,10 +25,12 @@ import static org.mockito.Mockito.when; import java.util.ArrayList; import java.util.List; +import jsprit.core.algorithm.acceptor.GreedyAcceptance; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; + import org.junit.Test; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblemSolution; @@ -49,7 +51,7 @@ public class AcceptNewRemoveWorstTest { VehicleRoutingProblemSolution sol3 = mock(VehicleRoutingProblemSolution.class); - new AcceptNewIfBetterThanWorst(2).acceptSolution(solList, sol3); + new GreedyAcceptance(2).acceptSolution(solList, sol3); assertEquals(2,solList.size()); assertThat(sol3,is(solList.get(1))); diff --git a/jsprit-core/src/test/java/algorithms/TestSchrimpf.java b/jsprit-core/src/test/java/jsprit/core/algorithm/box/TestSchrimpf.java similarity index 85% rename from jsprit-core/src/test/java/algorithms/TestSchrimpf.java rename to jsprit-core/src/test/java/jsprit/core/algorithm/box/TestSchrimpf.java index dce96476..7dd16624 100644 --- a/jsprit-core/src/test/java/algorithms/TestSchrimpf.java +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/box/TestSchrimpf.java @@ -14,12 +14,14 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms; +package jsprit.core.algorithm.box; + +import jsprit.core.algorithm.VehicleRoutingAlgorithm; +import jsprit.core.algorithm.box.SchrimpfFactory; +import jsprit.core.problem.VehicleRoutingProblem; import org.junit.Test; -import basics.VehicleRoutingAlgorithm; -import basics.VehicleRoutingProblem; public class TestSchrimpf { diff --git a/jsprit-core/src/test/java/algorithms/TestAlgorithmReader.java b/jsprit-core/src/test/java/jsprit/core/algorithm/io/TestAlgorithmReader.java similarity index 76% rename from jsprit-core/src/test/java/algorithms/TestAlgorithmReader.java rename to jsprit-core/src/test/java/jsprit/core/algorithm/io/TestAlgorithmReader.java index 95ee0f54..d8c2fd3c 100644 --- a/jsprit-core/src/test/java/algorithms/TestAlgorithmReader.java +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/io/TestAlgorithmReader.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms; +package jsprit.core.algorithm.io; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -22,30 +22,33 @@ import static org.junit.Assert.assertTrue; import java.util.ArrayList; import java.util.Collection; +import jsprit.core.algorithm.SearchStrategy; +import jsprit.core.algorithm.SearchStrategyModule; +import jsprit.core.algorithm.VehicleRoutingAlgorithm; +import jsprit.core.algorithm.acceptor.GreedyAcceptance; +import jsprit.core.algorithm.acceptor.SolutionAcceptor; +import jsprit.core.algorithm.io.VehicleRoutingAlgorithms; +import jsprit.core.algorithm.io.VehicleRoutingAlgorithms.ModKey; +import jsprit.core.algorithm.io.VehicleRoutingAlgorithms.TypedMap.AcceptorKey; +import jsprit.core.algorithm.io.VehicleRoutingAlgorithms.TypedMap.RuinStrategyKey; +import jsprit.core.algorithm.io.VehicleRoutingAlgorithms.TypedMap.SelectorKey; +import jsprit.core.algorithm.io.VehicleRoutingAlgorithms.TypedMap.StrategyModuleKey; +import jsprit.core.algorithm.listener.SearchStrategyModuleListener; +import jsprit.core.algorithm.ruin.RuinStrategy; +import jsprit.core.algorithm.ruin.listener.RuinListener; +import jsprit.core.algorithm.selector.SelectBest; +import jsprit.core.algorithm.selector.SolutionSelector; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.io.VrpXMLReader; +import jsprit.core.problem.job.Job; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; +import jsprit.core.problem.solution.route.VehicleRoute; + import org.apache.commons.configuration.ConfigurationException; import org.apache.commons.configuration.XMLConfiguration; import org.junit.Before; import org.junit.Test; -import algorithms.VehicleRoutingAlgorithms.ModKey; -import algorithms.VehicleRoutingAlgorithms.TypedMap.AcceptorKey; -import algorithms.VehicleRoutingAlgorithms.TypedMap.RuinStrategyKey; -import algorithms.VehicleRoutingAlgorithms.TypedMap.SelectorKey; -import algorithms.VehicleRoutingAlgorithms.TypedMap.StrategyModuleKey; -import algorithms.acceptors.AcceptNewIfBetterThanWorst; -import algorithms.acceptors.SolutionAcceptor; -import algorithms.selectors.SelectBest; -import algorithms.selectors.SolutionSelector; -import basics.Job; -import basics.VehicleRoutingAlgorithm; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblemSolution; -import basics.algo.RuinListener; -import basics.algo.SearchStrategy; -import basics.algo.SearchStrategyModule; -import basics.algo.SearchStrategyModuleListener; -import basics.io.VrpXMLReader; -import basics.route.VehicleRoute; public class TestAlgorithmReader { @@ -66,7 +69,7 @@ public class TestAlgorithmReader { @Test public void testTypedMap(){ - algorithms.VehicleRoutingAlgorithms.TypedMap typedMap = new algorithms.VehicleRoutingAlgorithms.TypedMap(); + jsprit.core.algorithm.io.VehicleRoutingAlgorithms.TypedMap typedMap = new jsprit.core.algorithm.io.VehicleRoutingAlgorithms.TypedMap(); String acceptorName = "acceptor"; String acceptorId = "acceptorId"; @@ -74,7 +77,7 @@ public class TestAlgorithmReader { ModKey key = new ModKey(acceptorName,acceptorId); AcceptorKey accKey = new AcceptorKey(key); - SolutionAcceptor acceptor = new AcceptNewIfBetterThanWorst(1); + SolutionAcceptor acceptor = new GreedyAcceptance(1); typedMap.put(accKey, acceptor); @@ -84,7 +87,7 @@ public class TestAlgorithmReader { @Test public void testTypedMap2(){ - algorithms.VehicleRoutingAlgorithms.TypedMap typedMap = new algorithms.VehicleRoutingAlgorithms.TypedMap(); + jsprit.core.algorithm.io.VehicleRoutingAlgorithms.TypedMap typedMap = new jsprit.core.algorithm.io.VehicleRoutingAlgorithms.TypedMap(); String acceptorName = "acceptor"; String acceptorId = "acceptorId"; @@ -94,7 +97,7 @@ public class TestAlgorithmReader { ModKey key = new ModKey(acceptorName,acceptorId); AcceptorKey accKey = new AcceptorKey(key); - SolutionAcceptor acceptor = new AcceptNewIfBetterThanWorst(1); + SolutionAcceptor acceptor = new GreedyAcceptance(1); SelectorKey selKey = new SelectorKey(new ModKey(selectorName,selectorId)); SolutionSelector selector = new SelectBest(); @@ -108,7 +111,7 @@ public class TestAlgorithmReader { @Test public void testTypedMap3(){ - algorithms.VehicleRoutingAlgorithms.TypedMap typedMap = new algorithms.VehicleRoutingAlgorithms.TypedMap(); + jsprit.core.algorithm.io.VehicleRoutingAlgorithms.TypedMap typedMap = new jsprit.core.algorithm.io.VehicleRoutingAlgorithms.TypedMap(); String acceptorName = "acceptor"; String acceptorId = "acceptorId"; @@ -121,13 +124,13 @@ public class TestAlgorithmReader { ModKey key = new ModKey(acceptorName,acceptorId); AcceptorKey accKey = new AcceptorKey(key); - SolutionAcceptor acceptor = new AcceptNewIfBetterThanWorst(1); + SolutionAcceptor acceptor = new GreedyAcceptance(1); SelectorKey selKey = new SelectorKey(new ModKey(selectorName,selectorId)); SolutionSelector selector = new SelectBest(); AcceptorKey accKey2 = new AcceptorKey(new ModKey(acceptorName2,acceptorId2)); - SolutionAcceptor acceptor2 = new AcceptNewIfBetterThanWorst(1); + SolutionAcceptor acceptor2 = new GreedyAcceptance(1); typedMap.put(accKey, acceptor); typedMap.put(selKey, selector); @@ -140,7 +143,7 @@ public class TestAlgorithmReader { @Test public void testTypedMap4(){ - algorithms.VehicleRoutingAlgorithms.TypedMap typedMap = new algorithms.VehicleRoutingAlgorithms.TypedMap(); + jsprit.core.algorithm.io.VehicleRoutingAlgorithms.TypedMap typedMap = new jsprit.core.algorithm.io.VehicleRoutingAlgorithms.TypedMap(); String acceptorName = "acceptor"; String acceptorId = "acceptorId"; diff --git a/jsprit-core/src/test/java/algorithms/CalcVehicleTypeDependentServiceInsertionTest.java b/jsprit-core/src/test/java/jsprit/core/algorithm/recreate/CalcVehicleTypeDependentServiceInsertionTest.java similarity index 91% rename from jsprit-core/src/test/java/algorithms/CalcVehicleTypeDependentServiceInsertionTest.java rename to jsprit-core/src/test/java/jsprit/core/algorithm/recreate/CalcVehicleTypeDependentServiceInsertionTest.java index 8a6cbd27..b7d775ab 100644 --- a/jsprit-core/src/test/java/algorithms/CalcVehicleTypeDependentServiceInsertionTest.java +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/recreate/CalcVehicleTypeDependentServiceInsertionTest.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms; +package jsprit.core.algorithm.recreate; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; @@ -23,16 +23,17 @@ import static org.mockito.Mockito.when; import java.util.Arrays; +import jsprit.core.problem.job.Service; +import jsprit.core.problem.solution.route.VehicleRoute; +import jsprit.core.problem.solution.route.activity.TimeWindow; +import jsprit.core.problem.vehicle.Vehicle; +import jsprit.core.problem.vehicle.VehicleFleetManager; +import jsprit.core.problem.vehicle.VehicleImpl; +import jsprit.core.problem.vehicle.VehicleTypeImpl; + import org.junit.Before; import org.junit.Test; -import basics.Service; -import basics.route.TimeWindow; -import basics.route.Vehicle; -import basics.route.VehicleFleetManager; -import basics.route.VehicleImpl; -import basics.route.VehicleRoute; -import basics.route.VehicleTypeImpl; diff --git a/jsprit-core/src/test/java/algorithms/CalcWithTimeSchedulingTest.java b/jsprit-core/src/test/java/jsprit/core/algorithm/recreate/CalcWithTimeSchedulingTest.java similarity index 81% rename from jsprit-core/src/test/java/algorithms/CalcWithTimeSchedulingTest.java rename to jsprit-core/src/test/java/jsprit/core/algorithm/recreate/CalcWithTimeSchedulingTest.java index e29f7d8c..84c0294a 100644 --- a/jsprit-core/src/test/java/algorithms/CalcWithTimeSchedulingTest.java +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/recreate/CalcWithTimeSchedulingTest.java @@ -14,26 +14,28 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms; +package jsprit.core.algorithm.recreate; import static org.junit.Assert.assertEquals; import java.util.Collection; -import util.Coordinate; -import util.CrowFlyCosts; -import util.Solutions; -import basics.Service; -import basics.VehicleRoutingAlgorithm; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblem.FleetSize; -import basics.VehicleRoutingProblemSolution; -import basics.costs.VehicleRoutingTransportCosts; -import basics.route.Driver; -import basics.route.Vehicle; -import basics.route.VehicleImpl; -import basics.route.VehicleRoute; -import basics.route.VehicleTypeImpl; +import jsprit.core.algorithm.VehicleRoutingAlgorithm; +import jsprit.core.algorithm.io.VehicleRoutingAlgorithms; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.VehicleRoutingProblem.FleetSize; +import jsprit.core.problem.cost.VehicleRoutingTransportCosts; +import jsprit.core.problem.driver.Driver; +import jsprit.core.problem.job.Service; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; +import jsprit.core.problem.solution.route.VehicleRoute; +import jsprit.core.problem.vehicle.Vehicle; +import jsprit.core.problem.vehicle.VehicleImpl; +import jsprit.core.problem.vehicle.VehicleTypeImpl; +import jsprit.core.util.Coordinate; +import jsprit.core.util.CrowFlyCosts; +import jsprit.core.util.Solutions; + public class CalcWithTimeSchedulingTest { diff --git a/jsprit-core/src/test/java/algorithms/ServiceInsertionAndLoadConstraintsTest.java b/jsprit-core/src/test/java/jsprit/core/algorithm/recreate/ServiceInsertionAndLoadConstraintsTest.java similarity index 69% rename from jsprit-core/src/test/java/algorithms/ServiceInsertionAndLoadConstraintsTest.java rename to jsprit-core/src/test/java/jsprit/core/algorithm/recreate/ServiceInsertionAndLoadConstraintsTest.java index 31af1b45..20093453 100644 --- a/jsprit-core/src/test/java/algorithms/ServiceInsertionAndLoadConstraintsTest.java +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/recreate/ServiceInsertionAndLoadConstraintsTest.java @@ -1,30 +1,44 @@ -package algorithms; +package jsprit.core.algorithm.recreate; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.mock; import java.util.Arrays; +import jsprit.core.algorithm.recreate.ActivityInsertionCostsCalculator; +import jsprit.core.algorithm.recreate.Inserter; +import jsprit.core.algorithm.recreate.InsertionData; +import jsprit.core.algorithm.recreate.JobCalculatorSwitcher; +import jsprit.core.algorithm.recreate.LocalActivityInsertionCostsCalculator; +import jsprit.core.algorithm.recreate.ServiceInsertionCalculator; +import jsprit.core.algorithm.recreate.ShipmentInsertionCalculator; +import jsprit.core.algorithm.recreate.listener.InsertionListeners; +import jsprit.core.algorithm.state.StateManager; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.constraint.ConstraintManager; +import jsprit.core.problem.constraint.HardActivityStateLevelConstraint; +import jsprit.core.problem.constraint.HardRouteStateLevelConstraint; +import jsprit.core.problem.cost.VehicleRoutingActivityCosts; +import jsprit.core.problem.cost.VehicleRoutingTransportCosts; +import jsprit.core.problem.driver.Driver; +import jsprit.core.problem.driver.DriverImpl; +import jsprit.core.problem.job.Delivery; +import jsprit.core.problem.job.Pickup; +import jsprit.core.problem.job.Shipment; +import jsprit.core.problem.misc.JobInsertionContext; +import jsprit.core.problem.solution.route.VehicleRoute; +import jsprit.core.problem.solution.route.activity.TourActivity; +import jsprit.core.problem.vehicle.Vehicle; +import jsprit.core.problem.vehicle.VehicleImpl; +import jsprit.core.problem.vehicle.VehicleType; +import jsprit.core.problem.vehicle.VehicleTypeImpl; +import jsprit.core.util.Coordinate; +import jsprit.core.util.Locations; +import jsprit.core.util.ManhattanCosts; + import org.junit.Before; import org.junit.Test; -import util.Coordinate; -import util.Locations; -import util.ManhattanCosts; -import basics.Delivery; -import basics.Pickup; -import basics.Shipment; -import basics.VehicleRoutingProblem; -import basics.costs.VehicleRoutingActivityCosts; -import basics.costs.VehicleRoutingTransportCosts; -import basics.route.Driver; -import basics.route.DriverImpl; -import basics.route.TourActivity; -import basics.route.Vehicle; -import basics.route.VehicleImpl; -import basics.route.VehicleRoute; -import basics.route.VehicleType; -import basics.route.VehicleTypeImpl; public class ServiceInsertionAndLoadConstraintsTest { @@ -42,7 +56,7 @@ public class ServiceInsertionAndLoadConstraintsTest { HardActivityStateLevelConstraint hardActivityLevelConstraint = new HardActivityStateLevelConstraint() { @Override - public ConstraintsStatus fulfilled(InsertionContext iFacts, TourActivity prevAct,TourActivity newAct, TourActivity nextAct, double prevActDepTime) { + public ConstraintsStatus fulfilled(JobInsertionContext iFacts, TourActivity prevAct,TourActivity newAct, TourActivity nextAct, double prevActDepTime) { return ConstraintsStatus.FULFILLED; } }; @@ -50,7 +64,7 @@ public class ServiceInsertionAndLoadConstraintsTest { HardRouteStateLevelConstraint hardRouteLevelConstraint = new HardRouteStateLevelConstraint(){ @Override - public boolean fulfilled(InsertionContext insertionContext) { + public boolean fulfilled(JobInsertionContext insertionContext) { return true; } @@ -103,7 +117,7 @@ public class ServiceInsertionAndLoadConstraintsTest { // inserter.insertJob(shipment2, new InsertionData(0,1,2,vehicle,null), route); // inserter.insertJob(shipment2, new InsertionData(0,1,2,vehicle,null), route); - StateManager stateManager = new StateManager(); + // RouteActivityVisitor routeActVisitor = new RouteActivityVisitor(); // routeActVisitor.addActivityVisitor(new UpdateLoads(stateManager)); @@ -111,6 +125,9 @@ public class ServiceInsertionAndLoadConstraintsTest { VehicleRoutingProblem vrp = mock(VehicleRoutingProblem.class); + StateManager stateManager = new StateManager(vrp); + stateManager.updateLoadStates(); + ConstraintManager constraintManager = new ConstraintManager(vrp,stateManager); constraintManager.addLoadConstraint(); // constraintManager.addConstraint(new PickupAndDeliverShipmentLoadActivityLevelConstraint(stateManager),Priority.CRITICAL); diff --git a/jsprit-core/src/test/java/algorithms/ShipmentInsertionCalculatorTest.java b/jsprit-core/src/test/java/jsprit/core/algorithm/recreate/ShipmentInsertionCalculatorTest.java similarity index 82% rename from jsprit-core/src/test/java/algorithms/ShipmentInsertionCalculatorTest.java rename to jsprit-core/src/test/java/jsprit/core/algorithm/recreate/ShipmentInsertionCalculatorTest.java index 46a5912a..8a4b5e94 100644 --- a/jsprit-core/src/test/java/algorithms/ShipmentInsertionCalculatorTest.java +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/recreate/ShipmentInsertionCalculatorTest.java @@ -1,4 +1,4 @@ -package algorithms; +package jsprit.core.algorithm.recreate; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -6,27 +6,36 @@ import static org.mockito.Mockito.mock; import java.util.Arrays; +import jsprit.core.algorithm.recreate.listener.InsertionListeners; +import jsprit.core.algorithm.state.StateManager; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.constraint.ConstraintManager; +import jsprit.core.problem.constraint.ConstraintManager.Priority; +import jsprit.core.problem.constraint.HardActivityStateLevelConstraint; +import jsprit.core.problem.constraint.HardRouteStateLevelConstraint; +import jsprit.core.problem.constraint.PickupAndDeliverShipmentLoadActivityLevelConstraint; +import jsprit.core.problem.constraint.ShipmentPickupsFirstConstraint; +import jsprit.core.problem.cost.VehicleRoutingActivityCosts; +import jsprit.core.problem.cost.VehicleRoutingTransportCosts; +import jsprit.core.problem.driver.Driver; +import jsprit.core.problem.driver.DriverImpl; +import jsprit.core.problem.job.Pickup; +import jsprit.core.problem.job.Shipment; +import jsprit.core.problem.misc.JobInsertionContext; +import jsprit.core.problem.solution.route.RouteActivityVisitor; +import jsprit.core.problem.solution.route.VehicleRoute; +import jsprit.core.problem.solution.route.activity.TourActivity; +import jsprit.core.problem.vehicle.Vehicle; +import jsprit.core.problem.vehicle.VehicleImpl; +import jsprit.core.problem.vehicle.VehicleType; +import jsprit.core.problem.vehicle.VehicleTypeImpl; +import jsprit.core.util.Coordinate; +import jsprit.core.util.Locations; +import jsprit.core.util.ManhattanCosts; + import org.junit.Before; import org.junit.Test; -import util.Coordinate; -import util.Locations; -import util.ManhattanCosts; -import algorithms.ConstraintManager.Priority; -import basics.Pickup; -import basics.Shipment; -import basics.VehicleRoutingProblem; -import basics.costs.VehicleRoutingActivityCosts; -import basics.costs.VehicleRoutingTransportCosts; -import basics.route.Driver; -import basics.route.DriverImpl; -import basics.route.RouteActivityVisitor; -import basics.route.TourActivity; -import basics.route.Vehicle; -import basics.route.VehicleImpl; -import basics.route.VehicleRoute; -import basics.route.VehicleType; -import basics.route.VehicleTypeImpl; public class ShipmentInsertionCalculatorTest { @@ -44,7 +53,7 @@ public class ShipmentInsertionCalculatorTest { HardActivityStateLevelConstraint hardActivityLevelConstraint = new HardActivityStateLevelConstraint() { @Override - public ConstraintsStatus fulfilled(InsertionContext iFacts, TourActivity prevAct,TourActivity newAct, TourActivity nextAct, double prevActDepTime) { + public ConstraintsStatus fulfilled(JobInsertionContext iFacts, TourActivity prevAct,TourActivity newAct, TourActivity nextAct, double prevActDepTime) { return ConstraintsStatus.FULFILLED; } }; @@ -52,7 +61,7 @@ public class ShipmentInsertionCalculatorTest { HardRouteStateLevelConstraint hardRouteLevelConstraint = new HardRouteStateLevelConstraint(){ @Override - public boolean fulfilled(InsertionContext insertionContext) { + public boolean fulfilled(JobInsertionContext insertionContext) { return true; } @@ -119,7 +128,7 @@ public class ShipmentInsertionCalculatorTest { createInsertionCalculator(new HardRouteStateLevelConstraint() { @Override - public boolean fulfilled(InsertionContext insertionContext) { + public boolean fulfilled(JobInsertionContext insertionContext) { return false; } @@ -180,14 +189,12 @@ public class ShipmentInsertionCalculatorTest { inserter.insertJob(shipment, new InsertionData(0,0,0,vehicle,null), route); inserter.insertJob(shipment2, new InsertionData(0,1,2,vehicle,null), route); - StateManager stateManager = new StateManager(); - - RouteActivityVisitor routeActVisitor = new RouteActivityVisitor(); - routeActVisitor.addActivityVisitor(new UpdateLoads(stateManager)); - routeActVisitor.visit(route); - VehicleRoutingProblem vrp = mock(VehicleRoutingProblem.class); + StateManager stateManager = new StateManager(vrp); + stateManager.updateLoadStates(); + stateManager.informInsertionStarts(Arrays.asList(route), null); + ConstraintManager constraintManager = new ConstraintManager(vrp,stateManager); constraintManager.addConstraint(new PickupAndDeliverShipmentLoadActivityLevelConstraint(stateManager),Priority.CRITICAL); constraintManager.addConstraint(new ShipmentPickupsFirstConstraint(),Priority.CRITICAL); @@ -216,13 +223,17 @@ public class ShipmentInsertionCalculatorTest { inserter.insertJob(shipment2, new InsertionData(0,1,2,vehicle,null), route); // inserter.insertJob(shipment2, new InsertionData(0,1,2,vehicle,null), route); - StateManager stateManager = new StateManager(); + VehicleRoutingProblem vrp = mock(VehicleRoutingProblem.class); + + StateManager stateManager = new StateManager(vrp); + stateManager.updateLoadStates(); + stateManager.informInsertionStarts(Arrays.asList(route), null); // RouteActivityVisitor routeActVisitor = new RouteActivityVisitor(); // routeActVisitor.addActivityVisitor(new UpdateLoads(stateManager)); // routeActVisitor.visit(route); - VehicleRoutingProblem vrp = mock(VehicleRoutingProblem.class); + ConstraintManager constraintManager = new ConstraintManager(vrp,stateManager); constraintManager.addLoadConstraint(); diff --git a/jsprit-core/src/test/java/algorithms/TestAuxilliaryCostCalculatorWithServices.java b/jsprit-core/src/test/java/jsprit/core/algorithm/recreate/TestAuxilliaryCostCalculatorWithServices.java similarity index 99% rename from jsprit-core/src/test/java/algorithms/TestAuxilliaryCostCalculatorWithServices.java rename to jsprit-core/src/test/java/jsprit/core/algorithm/recreate/TestAuxilliaryCostCalculatorWithServices.java index 38a57531..4f332cd4 100644 --- a/jsprit-core/src/test/java/algorithms/TestAuxilliaryCostCalculatorWithServices.java +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/recreate/TestAuxilliaryCostCalculatorWithServices.java @@ -1,3 +1,4 @@ +package jsprit.core.algorithm.recreate; /******************************************************************************* * Copyright (C) 2013 Stefan Schroeder * diff --git a/jsprit-core/src/test/java/algorithms/TestCalculatesServiceInsertion.java b/jsprit-core/src/test/java/jsprit/core/algorithm/recreate/TestCalculatesServiceInsertion.java similarity index 85% rename from jsprit-core/src/test/java/algorithms/TestCalculatesServiceInsertion.java rename to jsprit-core/src/test/java/jsprit/core/algorithm/recreate/TestCalculatesServiceInsertion.java index 2eac75ed..5ee1abf7 100644 --- a/jsprit-core/src/test/java/algorithms/TestCalculatesServiceInsertion.java +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/recreate/TestCalculatesServiceInsertion.java @@ -14,31 +14,37 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms; +package jsprit.core.algorithm.recreate; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; +import jsprit.core.algorithm.ExampleActivityCostFunction; +import jsprit.core.algorithm.state.StateManager; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.constraint.ConstraintManager; +import jsprit.core.problem.cost.VehicleRoutingTransportCosts; +import jsprit.core.problem.driver.DriverImpl; +import jsprit.core.problem.driver.DriverImpl.NoDriver; +import jsprit.core.problem.job.Job; +import jsprit.core.problem.job.Service; +import jsprit.core.problem.solution.route.VehicleRoute; +import jsprit.core.problem.solution.route.activity.ServiceActivity; +import jsprit.core.problem.solution.route.activity.TimeWindow; +import jsprit.core.problem.solution.route.activity.TourActivities; +import jsprit.core.problem.solution.route.activity.TourActivity; +import jsprit.core.problem.vehicle.Vehicle; + import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.junit.Before; import org.junit.Test; -import basics.Job; -import basics.Service; -import basics.costs.VehicleRoutingTransportCosts; -import basics.route.DriverImpl; -import basics.route.DriverImpl.NoDriver; -import basics.route.ServiceActivity; -import basics.route.TimeWindow; -import basics.route.TourActivities; -import basics.route.TourActivity; -import basics.route.Vehicle; -import basics.route.VehicleRoute; @@ -62,7 +68,7 @@ public class TestCalculatesServiceInsertion { private NoDriver driver; - private UpdateStates stateUpdater; +// private UpdateStates stateUpdater; @Before public void setup(){ @@ -148,15 +154,23 @@ public class TestCalculatesServiceInsertion { jobs.add(second); jobs.add(third); - states = new StateManager(); + VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance().addAllJobs(jobs).addVehicle(vehicle).setRoutingCost(costs).build(); + + states = new StateManager(vrp); + states.updateLoadStates(); + states.updateTimeWindowStates(); + + ConstraintManager cManager = new ConstraintManager(vrp,states); + cManager.addLoadConstraint(); + cManager.addTimeWindowConstraint(); ExampleActivityCostFunction activityCosts = new ExampleActivityCostFunction(); - serviceInsertion = new ServiceInsertionCalculator(costs, new LocalActivityInsertionCostsCalculator(costs, activityCosts), new LoadConstraint(states), new TimeWindowConstraint(states, costs)); + serviceInsertion = new ServiceInsertionCalculator(costs, new LocalActivityInsertionCostsCalculator(costs, activityCosts), cManager, cManager); - stateUpdater = new UpdateStates(states, costs, activityCosts); +// stateUpdater = new UpdateStates(states, costs, activityCosts); } @@ -171,7 +185,8 @@ public class TestCalculatesServiceInsertion { TourActivities tour = new TourActivities(); VehicleRoute route = VehicleRoute.newInstance(tour,driver,vehicle); - stateUpdater.update(route); + states.informInsertionStarts(Arrays.asList(route), null); +// stateUpdater.update(route); InsertionData iData = serviceInsertion.getInsertionData(route, first, vehicle, vehicle.getEarliestDeparture(), null, Double.MAX_VALUE); assertEquals(20.0, iData.getInsertionCost(), 0.2); @@ -184,7 +199,7 @@ public class TestCalculatesServiceInsertion { tour.addActivity(ServiceActivity.newInstance(first)); VehicleRoute route = VehicleRoute.newInstance(tour,driver,vehicle); - stateUpdater.update(route); + states.informInsertionStarts(Arrays.asList(route), null); InsertionData iData = serviceInsertion.getInsertionData(route, second, vehicle, vehicle.getEarliestDeparture(), null, Double.MAX_VALUE); assertEquals(20.0, iData.getInsertionCost(), 0.2); @@ -198,8 +213,7 @@ public class TestCalculatesServiceInsertion { tour.addActivity(ServiceActivity.newInstance(second)); VehicleRoute route = VehicleRoute.newInstance(tour,driver,vehicle); - - stateUpdater.update(route); + states.informInsertionStarts(Arrays.asList(route), null); InsertionData iData = serviceInsertion.getInsertionData(route, third, vehicle, vehicle.getEarliestDeparture(), null, Double.MAX_VALUE); assertEquals(0.0, iData.getInsertionCost(), 0.2); @@ -213,8 +227,7 @@ public class TestCalculatesServiceInsertion { tour.addActivity(ServiceActivity.newInstance(second)); VehicleRoute route = VehicleRoute.newInstance(tour,driver,vehicle); - - stateUpdater.update(route); + states.informInsertionStarts(Arrays.asList(route), null); InsertionData iData = serviceInsertion.getInsertionData(route, third, newVehicle, newVehicle.getEarliestDeparture(), null, Double.MAX_VALUE); assertEquals(20.0, iData.getInsertionCost(), 0.2); @@ -228,7 +241,7 @@ public class TestCalculatesServiceInsertion { tour.addActivity(ServiceActivity.newInstance(third)); VehicleRoute route = VehicleRoute.newInstance(tour,driver,vehicle); - stateUpdater.update(route); + states.informInsertionStarts(Arrays.asList(route), null); InsertionData iData = serviceInsertion.getInsertionData(route, second, vehicle, vehicle.getEarliestDeparture(), null, Double.MAX_VALUE); assertEquals(0.0, iData.getInsertionCost(), 0.2); @@ -244,7 +257,7 @@ public class TestCalculatesServiceInsertion { VehicleRoute route = VehicleRoute.newInstance(tour,driver,vehicle); // route.addActivity(states.getActivity(first,true)); // route.addActivity(states.getActivity(third,true)); - stateUpdater.update(route); + states.informInsertionStarts(Arrays.asList(route), null); InsertionData iData = serviceInsertion.getInsertionData(route, second, newVehicle, newVehicle.getEarliestDeparture(), null, Double.MAX_VALUE); assertEquals(20.0, iData.getInsertionCost(), 0.2); diff --git a/jsprit-core/src/test/java/algorithms/TestCalculatesServiceInsertionOnRouteLevel.java b/jsprit-core/src/test/java/jsprit/core/algorithm/recreate/TestCalculatesServiceInsertionOnRouteLevel.java similarity index 79% rename from jsprit-core/src/test/java/algorithms/TestCalculatesServiceInsertionOnRouteLevel.java rename to jsprit-core/src/test/java/jsprit/core/algorithm/recreate/TestCalculatesServiceInsertionOnRouteLevel.java index 96b09292..46e7f430 100644 --- a/jsprit-core/src/test/java/algorithms/TestCalculatesServiceInsertionOnRouteLevel.java +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/recreate/TestCalculatesServiceInsertionOnRouteLevel.java @@ -14,34 +14,41 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms; +package jsprit.core.algorithm.recreate; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; +import jsprit.core.algorithm.ExampleActivityCostFunction; +import jsprit.core.algorithm.state.StateManager; +import jsprit.core.algorithm.state.UpdateVariableCosts; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.constraint.ConstraintManager; +import jsprit.core.problem.cost.VehicleRoutingTransportCosts; +import jsprit.core.problem.driver.Driver; +import jsprit.core.problem.driver.DriverImpl; +import jsprit.core.problem.driver.DriverImpl.NoDriver; +import jsprit.core.problem.job.Job; +import jsprit.core.problem.job.Service; +import jsprit.core.problem.solution.route.VehicleRoute; +import jsprit.core.problem.solution.route.activity.ServiceActivity; +import jsprit.core.problem.solution.route.activity.TimeWindow; +import jsprit.core.problem.solution.route.activity.TourActivities; +import jsprit.core.problem.solution.route.activity.TourActivity; +import jsprit.core.problem.vehicle.Vehicle; +import jsprit.core.util.Coordinate; +import jsprit.core.util.ManhattanDistanceCalculator; + import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.junit.Before; import org.junit.Test; -import util.Coordinate; -import util.ManhattanDistanceCalculator; -import basics.Job; -import basics.Service; -import basics.costs.VehicleRoutingTransportCosts; -import basics.route.Driver; -import basics.route.DriverImpl; -import basics.route.DriverImpl.NoDriver; -import basics.route.ServiceActivity; -import basics.route.TimeWindow; -import basics.route.TourActivities; -import basics.route.TourActivity; -import basics.route.Vehicle; -import basics.route.VehicleRoute; @@ -65,8 +72,6 @@ public class TestCalculatesServiceInsertionOnRouteLevel { private NoDriver driver; - private UpdateStates updateStates; - @Before public void setup(){ Logger.getRootLogger().setLevel(Level.DEBUG); @@ -139,15 +144,24 @@ public class TestCalculatesServiceInsertionOnRouteLevel { jobs.add(second); jobs.add(third); - states = new StateManager(); + VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance().addAllJobs(jobs).addVehicle(vehicle).addVehicle(newVehicle).setRoutingCost(costs).build(); + + states = new StateManager(vrp); + states.updateLoadStates(); + states.updateTimeWindowStates(); + states.addStateUpdater(new UpdateVariableCosts(vrp.getActivityCosts(), vrp.getTransportCosts(), states)); + + ConstraintManager cManager = new ConstraintManager(vrp,states); + cManager.addLoadConstraint(); + cManager.addTimeWindowConstraint(); + ExampleActivityCostFunction activityCosts = new ExampleActivityCostFunction(); ActivityInsertionCostsCalculator actInsertionCostCalculator = new RouteLevelActivityInsertionCostsEstimator(costs, activityCosts, states); - serviceInsertion = new ServiceInsertionOnRouteLevelCalculator(costs,activityCosts, actInsertionCostCalculator, new LoadConstraint(states), new TimeWindowConstraint(states, costs)); + serviceInsertion = new ServiceInsertionOnRouteLevelCalculator(costs,activityCosts, actInsertionCostCalculator, cManager, cManager); serviceInsertion.setNuOfActsForwardLooking(4); serviceInsertion.setStates(states); - updateStates = new UpdateStates(states, costs, activityCosts); } @@ -162,7 +176,7 @@ public class TestCalculatesServiceInsertionOnRouteLevel { TourActivities tour = new TourActivities(); VehicleRoute route = VehicleRoute.newInstance(tour,driver,vehicle); - updateStates.update(route); + states.informInsertionStarts(Arrays.asList(route), null); InsertionData iData = serviceInsertion.getInsertionData(route, first, vehicle, vehicle.getEarliestDeparture(), null, Double.MAX_VALUE); assertEquals(20.0, iData.getInsertionCost(), 0.2); @@ -176,7 +190,7 @@ public class TestCalculatesServiceInsertionOnRouteLevel { tour.addActivity(ServiceActivity.newInstance(second)); VehicleRoute route = VehicleRoute.newInstance(tour,driver,vehicle); - updateStates.update(route); + states.informInsertionStarts(Arrays.asList(route), null); InsertionData iData = serviceInsertion.getInsertionData(route, third, vehicle, vehicle.getEarliestDeparture(), null, Double.MAX_VALUE); assertEquals(0.0, iData.getInsertionCost(), 0.2); @@ -190,7 +204,7 @@ public class TestCalculatesServiceInsertionOnRouteLevel { tour.addActivity(ServiceActivity.newInstance(second)); VehicleRoute route = VehicleRoute.newInstance(tour,driver,vehicle); - updateStates.update(route); + states.informInsertionStarts(Arrays.asList(route), null); InsertionData iData = serviceInsertion.getInsertionData(route, third, newVehicle, vehicle.getEarliestDeparture(), null, Double.MAX_VALUE); assertEquals(40.0, iData.getInsertionCost(), 0.2); @@ -204,7 +218,7 @@ public class TestCalculatesServiceInsertionOnRouteLevel { tour.addActivity(ServiceActivity.newInstance(third)); VehicleRoute route = VehicleRoute.newInstance(tour,driver,vehicle); - updateStates.update(route); + states.informInsertionStarts(Arrays.asList(route), null); InsertionData iData = serviceInsertion.getInsertionData(route, second, vehicle, vehicle.getEarliestDeparture(), null, Double.MAX_VALUE); assertEquals(0.0, iData.getInsertionCost(), 0.2); @@ -218,7 +232,7 @@ public class TestCalculatesServiceInsertionOnRouteLevel { tour.addActivity(ServiceActivity.newInstance(third)); VehicleRoute route = VehicleRoute.newInstance(tour,driver,vehicle); - updateStates.update(route); + states.informInsertionStarts(Arrays.asList(route), null); InsertionData iData = serviceInsertion.getInsertionData(route, second, newVehicle, vehicle.getEarliestDeparture(), null, Double.MAX_VALUE); assertEquals(40.0, iData.getInsertionCost(), 0.2); diff --git a/jsprit-core/src/test/java/algorithms/TestDepartureTimeOpt.java b/jsprit-core/src/test/java/jsprit/core/algorithm/recreate/TestDepartureTimeOpt.java similarity index 92% rename from jsprit-core/src/test/java/algorithms/TestDepartureTimeOpt.java rename to jsprit-core/src/test/java/jsprit/core/algorithm/recreate/TestDepartureTimeOpt.java index 3db1f258..b4d25061 100644 --- a/jsprit-core/src/test/java/algorithms/TestDepartureTimeOpt.java +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/recreate/TestDepartureTimeOpt.java @@ -14,30 +14,32 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms; +package jsprit.core.algorithm.recreate; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.mock; import java.util.Collection; +import jsprit.core.algorithm.VehicleRoutingAlgorithm; +import jsprit.core.algorithm.io.VehicleRoutingAlgorithms; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.VehicleRoutingProblem.Builder; +import jsprit.core.problem.cost.VehicleRoutingActivityCosts; +import jsprit.core.problem.driver.Driver; +import jsprit.core.problem.job.Service; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; +import jsprit.core.problem.solution.route.activity.TimeWindow; +import jsprit.core.problem.solution.route.activity.TourActivity; +import jsprit.core.problem.vehicle.Vehicle; +import jsprit.core.problem.vehicle.VehicleImpl; +import jsprit.core.problem.vehicle.VehicleType; +import jsprit.core.problem.vehicle.VehicleTypeImpl; +import jsprit.core.util.Coordinate; +import jsprit.core.util.Solutions; + import org.junit.Test; -import util.Coordinate; -import util.Solutions; -import basics.Service; -import basics.VehicleRoutingAlgorithm; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblem.Builder; -import basics.VehicleRoutingProblemSolution; -import basics.costs.VehicleRoutingActivityCosts; -import basics.route.Driver; -import basics.route.TimeWindow; -import basics.route.TourActivity; -import basics.route.Vehicle; -import basics.route.VehicleImpl; -import basics.route.VehicleType; -import basics.route.VehicleTypeImpl; public class TestDepartureTimeOpt { diff --git a/jsprit-core/src/test/java/algorithms/TestMixedServiceAndShipmentsProblemOnRouteLevel.java b/jsprit-core/src/test/java/jsprit/core/algorithm/recreate/TestMixedServiceAndShipmentsProblemOnRouteLevel.java similarity index 86% rename from jsprit-core/src/test/java/algorithms/TestMixedServiceAndShipmentsProblemOnRouteLevel.java rename to jsprit-core/src/test/java/jsprit/core/algorithm/recreate/TestMixedServiceAndShipmentsProblemOnRouteLevel.java index a5b94b63..cf68c88e 100644 --- a/jsprit-core/src/test/java/algorithms/TestMixedServiceAndShipmentsProblemOnRouteLevel.java +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/recreate/TestMixedServiceAndShipmentsProblemOnRouteLevel.java @@ -1,22 +1,26 @@ -package algorithms; +package jsprit.core.algorithm.recreate; import static org.junit.Assert.*; +import jsprit.core.algorithm.VehicleRoutingAlgorithm; +import jsprit.core.algorithm.recreate.BestInsertionBuilder; +import jsprit.core.algorithm.recreate.InsertionStrategy; +import jsprit.core.algorithm.state.StateManager; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.constraint.ConstraintManager; +import jsprit.core.problem.job.Delivery; +import jsprit.core.problem.job.Shipment; +import jsprit.core.problem.vehicle.InfiniteFleetManagerFactory; +import jsprit.core.problem.vehicle.Vehicle; +import jsprit.core.problem.vehicle.VehicleFleetManager; +import jsprit.core.problem.vehicle.VehicleImpl; +import jsprit.core.problem.vehicle.VehicleType; +import jsprit.core.problem.vehicle.VehicleTypeImpl; +import jsprit.core.problem.vehicle.VehicleImpl.Builder; +import jsprit.core.util.Coordinate; import org.junit.Before; import org.junit.Test; -import util.Coordinate; -import basics.Delivery; -import basics.Shipment; -import basics.VehicleRoutingAlgorithm; -import basics.VehicleRoutingProblem; -import basics.route.InfiniteFleetManagerFactory; -import basics.route.Vehicle; -import basics.route.VehicleFleetManager; -import basics.route.VehicleImpl; -import basics.route.VehicleImpl.Builder; -import basics.route.VehicleType; -import basics.route.VehicleTypeImpl; public class TestMixedServiceAndShipmentsProblemOnRouteLevel { @@ -76,7 +80,8 @@ public class TestMixedServiceAndShipmentsProblemOnRouteLevel { VehicleRoutingAlgorithm vra; - final StateManager stateManager = new StateManager(); + final StateManager stateManager = new StateManager(vrp); + ConstraintManager constraintManager = new ConstraintManager(vrp,stateManager); constraintManager.addLoadConstraint(); @@ -141,7 +146,7 @@ public class TestMixedServiceAndShipmentsProblemOnRouteLevel { VehicleRoutingAlgorithm vra; - final StateManager stateManager = new StateManager(); + final StateManager stateManager = new StateManager(vrp); ConstraintManager constraintManager = new ConstraintManager(vrp,stateManager); constraintManager.addLoadConstraint(); diff --git a/jsprit-core/src/test/java/algorithms/JobNeighborhoodsImplTest.java b/jsprit-core/src/test/java/jsprit/core/algorithm/ruin/JobNeighborhoodsImplTest.java similarity index 88% rename from jsprit-core/src/test/java/algorithms/JobNeighborhoodsImplTest.java rename to jsprit-core/src/test/java/jsprit/core/algorithm/ruin/JobNeighborhoodsImplTest.java index 9ba678b6..722b9de1 100644 --- a/jsprit-core/src/test/java/algorithms/JobNeighborhoodsImplTest.java +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/ruin/JobNeighborhoodsImplTest.java @@ -1,20 +1,23 @@ -package algorithms; +package jsprit.core.algorithm.ruin; -import static org.junit.Assert.*; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import jsprit.core.algorithm.ruin.RuinRadial.JobNeighborhoodsImpl; +import jsprit.core.algorithm.ruin.distance.EuclideanServiceDistance; +import jsprit.core.algorithm.ruin.distance.JobDistance; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.job.Job; +import jsprit.core.problem.job.Service; +import jsprit.core.util.Coordinate; + import org.junit.Before; import org.junit.Test; -import util.Coordinate; -import algorithms.RuinRadial.JobNeighborhoodsImpl; -import basics.Job; -import basics.Service; -import basics.VehicleRoutingProblem; public class JobNeighborhoodsImplTest { diff --git a/jsprit-core/src/test/java/algorithms/JobNeighborhoodsWithCapRestrictionImplTest.java b/jsprit-core/src/test/java/jsprit/core/algorithm/ruin/JobNeighborhoodsWithCapRestrictionImplTest.java similarity index 88% rename from jsprit-core/src/test/java/algorithms/JobNeighborhoodsWithCapRestrictionImplTest.java rename to jsprit-core/src/test/java/jsprit/core/algorithm/ruin/JobNeighborhoodsWithCapRestrictionImplTest.java index 8f4bbc28..07a0121d 100644 --- a/jsprit-core/src/test/java/algorithms/JobNeighborhoodsWithCapRestrictionImplTest.java +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/ruin/JobNeighborhoodsWithCapRestrictionImplTest.java @@ -1,4 +1,4 @@ -package algorithms; +package jsprit.core.algorithm.ruin; import static org.junit.Assert.*; import static org.junit.Assert.assertEquals; @@ -7,15 +7,18 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import jsprit.core.algorithm.ruin.RuinRadial.JobNeighborhoodsImpl; +import jsprit.core.algorithm.ruin.RuinRadial.JobNeighborhoodsImplWithCapRestriction; +import jsprit.core.algorithm.ruin.distance.EuclideanServiceDistance; +import jsprit.core.algorithm.ruin.distance.JobDistance; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.job.Job; +import jsprit.core.problem.job.Service; +import jsprit.core.util.Coordinate; + import org.junit.Before; import org.junit.Test; -import util.Coordinate; -import algorithms.RuinRadial.JobNeighborhoodsImpl; -import algorithms.RuinRadial.JobNeighborhoodsImplWithCapRestriction; -import basics.Job; -import basics.Service; -import basics.VehicleRoutingProblem; public class JobNeighborhoodsWithCapRestrictionImplTest { diff --git a/jsprit-core/src/test/java/algorithms/AverageJobDistanceTest.java b/jsprit-core/src/test/java/jsprit/core/algorithm/ruin/distance/AverageJobDistanceTest.java similarity index 73% rename from jsprit-core/src/test/java/algorithms/AverageJobDistanceTest.java rename to jsprit-core/src/test/java/jsprit/core/algorithm/ruin/distance/AverageJobDistanceTest.java index 6b74d857..6a427519 100644 --- a/jsprit-core/src/test/java/algorithms/AverageJobDistanceTest.java +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/ruin/distance/AverageJobDistanceTest.java @@ -1,16 +1,17 @@ -package algorithms; +package jsprit.core.algorithm.ruin.distance; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; +import jsprit.core.algorithm.ruin.distance.AvgServiceAndShipmentDistance; +import jsprit.core.problem.job.Service; +import jsprit.core.problem.job.Shipment; +import jsprit.core.util.Coordinate; +import jsprit.core.util.CrowFlyCosts; +import jsprit.core.util.Locations; import org.junit.Before; import org.junit.Test; -import util.Coordinate; -import util.CrowFlyCosts; -import util.Locations; -import basics.Service; -import basics.Shipment; public class AverageJobDistanceTest { @@ -39,13 +40,13 @@ public class AverageJobDistanceTest { Shipment s1 = Shipment.Builder.newInstance("s1", 1).setPickupLocation("0,0").setDeliveryLocation("10,10").build(); Shipment s2 = Shipment.Builder.newInstance("s2", 1).setPickupLocation("0,0").setDeliveryLocation("10,10").build(); - double dist = new AvgJobDistance(routingCosts).getDistance(s1, s2); + double dist = new AvgServiceAndShipmentDistance(routingCosts).getDistance(s1, s2); for(int i=0;i<10;i++){ for(int j=0;j<10;j++){ Shipment other1 = Shipment.Builder.newInstance("s1", 1).setPickupLocation("0,0").setDeliveryLocation(i+","+j).build(); Shipment other2 = Shipment.Builder.newInstance("s2", 1).setPickupLocation("0,0").setDeliveryLocation("10,10").build(); - double dist2 = new AvgJobDistance(routingCosts).getDistance(other1, other2); + double dist2 = new AvgServiceAndShipmentDistance(routingCosts).getDistance(other1, other2); System.out.println("("+i+","+j+"), dist=" + dist + ", dist2=" + dist2); assertTrue(dist<=dist2+dist2*0.001); } @@ -59,7 +60,7 @@ public class AverageJobDistanceTest { Service s1 = Service.Builder.newInstance("s1", 1).setLocationId("10,0").build(); Service s2 = Service.Builder.newInstance("s2", 1).setLocationId("10,0").build(); - double dist = new AvgJobDistance(routingCosts).getDistance(s1, s2); + double dist = new AvgServiceAndShipmentDistance(routingCosts).getDistance(s1, s2); assertEquals(0.0,dist,0.01); } } diff --git a/jsprit-core/src/test/java/algorithms/TestJobDistanceAvgCosts.java b/jsprit-core/src/test/java/jsprit/core/algorithm/ruin/distance/TestJobDistanceAvgCosts.java similarity index 88% rename from jsprit-core/src/test/java/algorithms/TestJobDistanceAvgCosts.java rename to jsprit-core/src/test/java/jsprit/core/algorithm/ruin/distance/TestJobDistanceAvgCosts.java index c4caa271..14f4237f 100644 --- a/jsprit-core/src/test/java/algorithms/TestJobDistanceAvgCosts.java +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/ruin/distance/TestJobDistanceAvgCosts.java @@ -14,14 +14,16 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms; +package jsprit.core.algorithm.ruin.distance; + +import jsprit.core.algorithm.ruin.distance.AvgServiceDistance; +import jsprit.core.problem.cost.VehicleRoutingTransportCosts; +import jsprit.core.problem.driver.Driver; +import jsprit.core.problem.job.Service; +import jsprit.core.problem.vehicle.Vehicle; import org.junit.Test; -import basics.Service; -import basics.costs.VehicleRoutingTransportCosts; -import basics.route.Driver; -import basics.route.Vehicle; public class TestJobDistanceAvgCosts { @@ -55,7 +57,7 @@ public class TestJobDistanceAvgCosts { return 0; } }; - JobDistanceAvgCosts c = new JobDistanceAvgCosts(costs); + AvgServiceDistance c = new AvgServiceDistance(costs); c.getDistance(Service.Builder.newInstance("1", 1).setLocationId("foo").build(), Service.Builder.newInstance("2", 2).setLocationId("foo").build()); } @@ -91,7 +93,7 @@ public class TestJobDistanceAvgCosts { return 0; } }; - JobDistanceAvgCosts c = new JobDistanceAvgCosts(costs); + AvgServiceDistance c = new AvgServiceDistance(costs); c.getDistance(Service.Builder.newInstance("1", 1).setLocationId("loc").build(), Service.Builder.newInstance("2", 2).setLocationId("loc").build()); } diff --git a/jsprit-core/src/test/java/algorithms/selectors/SelectBestTest.java b/jsprit-core/src/test/java/jsprit/core/algorithm/selector/SelectBestTest.java similarity index 92% rename from jsprit-core/src/test/java/algorithms/selectors/SelectBestTest.java rename to jsprit-core/src/test/java/jsprit/core/algorithm/selector/SelectBestTest.java index 4500c56d..005e046f 100644 --- a/jsprit-core/src/test/java/algorithms/selectors/SelectBestTest.java +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/selector/SelectBestTest.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms.selectors; +package jsprit.core.algorithm.selector; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertNull; @@ -25,9 +25,11 @@ import static org.mockito.Mockito.when; import java.util.Arrays; import java.util.Collections; +import jsprit.core.algorithm.selector.SelectBest; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; + import org.junit.Test; -import basics.VehicleRoutingProblemSolution; diff --git a/jsprit-core/src/test/java/algorithms/selectors/SelectRandomlyTest.java b/jsprit-core/src/test/java/jsprit/core/algorithm/selector/SelectRandomlyTest.java similarity index 94% rename from jsprit-core/src/test/java/algorithms/selectors/SelectRandomlyTest.java rename to jsprit-core/src/test/java/jsprit/core/algorithm/selector/SelectRandomlyTest.java index 1b25aa11..d65c67ef 100644 --- a/jsprit-core/src/test/java/algorithms/selectors/SelectRandomlyTest.java +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/selector/SelectRandomlyTest.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms.selectors; +package jsprit.core.algorithm.selector; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertNull; @@ -26,9 +26,11 @@ import java.util.Arrays; import java.util.Collections; import java.util.Random; +import jsprit.core.algorithm.selector.SelectRandomly; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; + import org.junit.Test; -import basics.VehicleRoutingProblemSolution; public class SelectRandomlyTest { diff --git a/jsprit-core/src/test/java/algorithms/HardPickupAndDeliveryShipmentActivityConstraintTest.java b/jsprit-core/src/test/java/jsprit/core/algorithm/state/HardPickupAndDeliveryShipmentActivityConstraintTest.java similarity index 64% rename from jsprit-core/src/test/java/algorithms/HardPickupAndDeliveryShipmentActivityConstraintTest.java rename to jsprit-core/src/test/java/jsprit/core/algorithm/state/HardPickupAndDeliveryShipmentActivityConstraintTest.java index 9c5d86c6..4ab35777 100644 --- a/jsprit-core/src/test/java/algorithms/HardPickupAndDeliveryShipmentActivityConstraintTest.java +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/state/HardPickupAndDeliveryShipmentActivityConstraintTest.java @@ -1,19 +1,24 @@ -package algorithms; +package jsprit.core.algorithm.state; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import jsprit.core.algorithm.state.StateManager; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.constraint.PickupAndDeliverShipmentLoadActivityLevelConstraint; +import jsprit.core.problem.constraint.HardActivityStateLevelConstraint.ConstraintsStatus; +import jsprit.core.problem.job.Service; +import jsprit.core.problem.job.Shipment; +import jsprit.core.problem.misc.JobInsertionContext; +import jsprit.core.problem.solution.route.activity.DeliverShipment; +import jsprit.core.problem.solution.route.activity.PickupService; +import jsprit.core.problem.solution.route.activity.PickupShipment; +import jsprit.core.problem.solution.route.state.StateFactory; +import jsprit.core.problem.vehicle.Vehicle; import org.junit.Before; import org.junit.Test; -import algorithms.HardActivityStateLevelConstraint.ConstraintsStatus; -import basics.Service; -import basics.Shipment; -import basics.route.DeliverShipment; -import basics.route.PickupService; -import basics.route.PickupShipment; -import basics.route.Vehicle; public class HardPickupAndDeliveryShipmentActivityConstraintTest { @@ -25,16 +30,16 @@ public class HardPickupAndDeliveryShipmentActivityConstraintTest { PickupAndDeliverShipmentLoadActivityLevelConstraint constraint; - InsertionContext iFacts; + JobInsertionContext iFacts; @Before public void doBefore(){ vehicle = mock(Vehicle.class); when(vehicle.getCapacity()).thenReturn(2); - stateManager = new StateManager(); + stateManager = new StateManager(mock(VehicleRoutingProblem.class)); shipment = mock(Shipment.class); when(shipment.getCapacityDemand()).thenReturn(1); - iFacts = new InsertionContext(null, null, vehicle, null, 0.0); + iFacts = new JobInsertionContext(null, null, vehicle, null, 0.0); constraint = new PickupAndDeliverShipmentLoadActivityLevelConstraint(stateManager); } @@ -53,7 +58,8 @@ public class HardPickupAndDeliveryShipmentActivityConstraintTest { PickupService anotherService = new PickupService(mock(Service.class)); PickupShipment pickupShipment = new PickupShipment(shipment); - stateManager.putActivityState(pickupService, StateFactory.LOAD, StateFactory.createState(2)); + stateManager.putInternalActivityState(pickupService, StateFactory.LOAD, StateFactory.createState(2)); +// when(stateManager.getActivityState(pickupService, StateFactory.LOAD)).thenReturn(StateFactory.createState(2.0)); assertEquals(ConstraintsStatus.NOT_FULFILLED,constraint.fulfilled(iFacts, pickupService, pickupShipment, anotherService, 0.0)); } @@ -63,7 +69,7 @@ public class HardPickupAndDeliveryShipmentActivityConstraintTest { PickupService anotherService = new PickupService(mock(Service.class)); DeliverShipment pickupShipment = new DeliverShipment(shipment); - stateManager.putActivityState(pickupService, StateFactory.LOAD, StateFactory.createState(2)); + stateManager.putInternalActivityState(pickupService, StateFactory.LOAD, StateFactory.createState(2)); assertEquals(ConstraintsStatus.NOT_FULFILLED_BREAK,constraint.fulfilled(iFacts, pickupService, pickupShipment, anotherService, 0.0)); } @@ -73,7 +79,7 @@ public class HardPickupAndDeliveryShipmentActivityConstraintTest { PickupService anotherService = new PickupService(mock(Service.class)); DeliverShipment pickupShipment = new DeliverShipment(shipment); - stateManager.putActivityState(pickupService, StateFactory.LOAD, StateFactory.createState(1)); + stateManager.putInternalActivityState(pickupService, StateFactory.LOAD, StateFactory.createState(1)); assertEquals(ConstraintsStatus.FULFILLED,constraint.fulfilled(iFacts, pickupService, pickupShipment, anotherService, 0.0)); } diff --git a/jsprit-core/src/test/java/algorithms/TestTourStateUpdaterWithService.java b/jsprit-core/src/test/java/jsprit/core/algorithm/state/TestTourStateUpdaterWithService.java similarity index 77% rename from jsprit-core/src/test/java/algorithms/TestTourStateUpdaterWithService.java rename to jsprit-core/src/test/java/jsprit/core/algorithm/state/TestTourStateUpdaterWithService.java index e19bab8f..83ec3285 100644 --- a/jsprit-core/src/test/java/algorithms/TestTourStateUpdaterWithService.java +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/state/TestTourStateUpdaterWithService.java @@ -14,30 +14,34 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms; +package jsprit.core.algorithm.state; import static org.junit.Assert.assertEquals; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.cost.VehicleRoutingTransportCosts; +import jsprit.core.problem.driver.Driver; +import jsprit.core.problem.driver.DriverImpl; +import jsprit.core.problem.job.Job; +import jsprit.core.problem.job.Service; +import jsprit.core.problem.solution.route.VehicleRoute; +import jsprit.core.problem.solution.route.activity.ServiceActivity; +import jsprit.core.problem.solution.route.activity.TimeWindow; +import jsprit.core.problem.solution.route.activity.TourActivities; +import jsprit.core.problem.solution.route.state.StateFactory; +import jsprit.core.problem.vehicle.Vehicle; +import jsprit.core.problem.vehicle.VehicleImpl; +import jsprit.core.problem.vehicle.VehicleTypeImpl; +import jsprit.core.util.Coordinate; +import jsprit.core.util.ManhattanDistanceCalculator; + import org.junit.Before; import org.junit.Test; -import util.Coordinate; -import util.ManhattanDistanceCalculator; -import basics.Job; -import basics.Service; -import basics.costs.VehicleRoutingTransportCosts; -import basics.route.Driver; -import basics.route.DriverImpl; -import basics.route.ServiceActivity; -import basics.route.TimeWindow; -import basics.route.TourActivities; -import basics.route.Vehicle; -import basics.route.VehicleImpl; -import basics.route.VehicleRoute; -import basics.route.VehicleTypeImpl; public class TestTourStateUpdaterWithService { @@ -50,7 +54,6 @@ public class TestTourStateUpdaterWithService { TourActivities anotherTour; - UpdateStates updateStates; StateManager states; @@ -99,32 +102,36 @@ public class TestTourStateUpdaterWithService { services.add(firstService); services.add(secondService); - states = new StateManager(); - VehicleTypeImpl type = VehicleTypeImpl.Builder.newInstance("test", 10).build(); vehicle = VehicleImpl.Builder.newInstance("testvehicle").setType(type).setLocationId("0,0") .setEarliestStart(0.0).setLatestArrival(50.0).build(); + + VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance().addAllJobs(services).addVehicle(vehicle).setRoutingCost(cost).build(); + + states = new StateManager(vrp); + states.updateLoadStates(); + states.updateTimeWindowStates(); + states.addStateUpdater(new UpdateVariableCosts(vrp.getActivityCosts(), vrp.getTransportCosts(), states)); + states.addStateUpdater(new UpdateActivityTimes(vrp.getTransportCosts())); + tour = new TourActivities(); tour.addActivity(ServiceActivity.newInstance(firstService)); tour.addActivity(ServiceActivity.newInstance(secondService)); - - updateStates = new UpdateStates(states, cost, new ExampleActivityCostFunction()); - vehicleRoute = VehicleRoute.newInstance(tour,DriverImpl.noDriver(),vehicle); } @Test public void testCalculatedCost() { - updateStates.update(vehicleRoute); + states.informInsertionStarts(Arrays.asList(vehicleRoute), null); assertEquals(40.0, states.getRouteState(vehicleRoute,StateFactory.COSTS).toDouble(), 0.05); assertEquals(10, states.getRouteState(vehicleRoute, StateFactory.LOAD_AT_END).toDouble(), 0.05); } @Test public void testStatesOfAct0(){ - updateStates.update(vehicleRoute); + states.informInsertionStarts(Arrays.asList(vehicleRoute), null); assertEquals(0.0, vehicleRoute.getStart().getEndTime(),0.05); assertEquals(vehicleRoute.getVehicle().getLocationId(), vehicleRoute.getStart().getLocationId()); assertEquals(vehicleRoute.getVehicle().getEarliestDeparture(), vehicleRoute.getStart().getTheoreticalEarliestOperationStartTime(),0.05); @@ -134,7 +141,7 @@ public class TestTourStateUpdaterWithService { @Test public void testStatesOfAct1(){ - updateStates.update(vehicleRoute); + states.informInsertionStarts(Arrays.asList(vehicleRoute), null); assertEquals(10.0, states.getActivityState(tour.getActivities().get(0), StateFactory.COSTS).toDouble(),0.05); assertEquals(5.0, states.getActivityState(tour.getActivities().get(0), StateFactory.LOAD).toDouble(),0.05); // assertEquals(10.0, states.getActivityState(tour.getActivities().get(0), StateTypes.EARLIEST_OPERATION_START_TIME).toDouble(),0.05); @@ -143,7 +150,7 @@ public class TestTourStateUpdaterWithService { @Test public void testStatesOfAct2(){ - updateStates.update(vehicleRoute); + states.informInsertionStarts(Arrays.asList(vehicleRoute), null); assertEquals(30.0, states.getActivityState(tour.getActivities().get(1), StateFactory.COSTS).toDouble(),0.05); assertEquals(10.0, states.getActivityState(tour.getActivities().get(1), StateFactory.LOAD).toDouble(),0.05); @@ -153,8 +160,7 @@ public class TestTourStateUpdaterWithService { @Test public void testStatesOfAct3(){ - updateStates.update(vehicleRoute); - + states.informInsertionStarts(Arrays.asList(vehicleRoute), null); assertEquals(40.0, states.getRouteState(vehicleRoute, StateFactory.COSTS).toDouble(), 0.05); assertEquals(40.0, vehicleRoute.getEnd().getArrTime(),0.05); assertEquals(50.0, vehicleRoute.getEnd().getTheoreticalLatestOperationStartTime(),0.05); diff --git a/jsprit-core/src/test/java/basics/VehicleRoutingProblemBuilderTest.java b/jsprit-core/src/test/java/jsprit/core/problem/VehicleRoutingProblemBuilderTest.java similarity index 90% rename from jsprit-core/src/test/java/basics/VehicleRoutingProblemBuilderTest.java rename to jsprit-core/src/test/java/jsprit/core/problem/VehicleRoutingProblemBuilderTest.java index dc712f1e..71467722 100644 --- a/jsprit-core/src/test/java/basics/VehicleRoutingProblemBuilderTest.java +++ b/jsprit-core/src/test/java/jsprit/core/problem/VehicleRoutingProblemBuilderTest.java @@ -14,16 +14,19 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics; +package jsprit.core.problem; import static org.junit.Assert.assertEquals; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.VehicleRoutingProblem.FleetSize; +import jsprit.core.problem.job.Job; +import jsprit.core.problem.job.Shipment; +import jsprit.core.problem.vehicle.Vehicle; +import jsprit.core.problem.vehicle.VehicleImpl; +import jsprit.core.problem.vehicle.VehicleTypeImpl; import org.junit.Test; -import basics.VehicleRoutingProblem.FleetSize; -import basics.route.Vehicle; -import basics.route.VehicleImpl; -import basics.route.VehicleTypeImpl; public class VehicleRoutingProblemBuilderTest { diff --git a/jsprit-core/src/test/java/basics/io/AlgorithmReaderTest.java b/jsprit-core/src/test/java/jsprit/core/problem/io/AlgorithmReaderTest.java similarity index 91% rename from jsprit-core/src/test/java/basics/io/AlgorithmReaderTest.java rename to jsprit-core/src/test/java/jsprit/core/problem/io/AlgorithmReaderTest.java index 4d802a54..24beca4b 100644 --- a/jsprit-core/src/test/java/basics/io/AlgorithmReaderTest.java +++ b/jsprit-core/src/test/java/jsprit/core/problem/io/AlgorithmReaderTest.java @@ -14,7 +14,10 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.io; +package jsprit.core.problem.io; + +import jsprit.core.algorithm.io.AlgorithmConfig; +import jsprit.core.algorithm.io.AlgorithmConfigXmlReader; import org.junit.Test; diff --git a/jsprit-core/src/test/java/basics/io/ReaderTest.java b/jsprit-core/src/test/java/jsprit/core/problem/io/ReaderTest.java similarity index 81% rename from jsprit-core/src/test/java/basics/io/ReaderTest.java rename to jsprit-core/src/test/java/jsprit/core/problem/io/ReaderTest.java index 50db3f43..ead80b60 100644 --- a/jsprit-core/src/test/java/basics/io/ReaderTest.java +++ b/jsprit-core/src/test/java/jsprit/core/problem/io/ReaderTest.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.io; +package jsprit.core.problem.io; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -22,15 +22,17 @@ import static org.junit.Assert.assertTrue; import java.util.ArrayList; import java.util.List; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.VehicleRoutingProblem.Builder; +import jsprit.core.problem.io.VrpXMLReader; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; +import jsprit.core.problem.solution.route.activity.DeliverShipment; +import jsprit.core.problem.solution.route.activity.PickupService; +import jsprit.core.problem.solution.route.activity.PickupShipment; +import jsprit.core.problem.solution.route.activity.TourActivity; + import org.junit.Test; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblem.Builder; -import basics.VehicleRoutingProblemSolution; -import basics.route.DeliverShipment; -import basics.route.PickupService; -import basics.route.PickupShipment; -import basics.route.TourActivity; public class ReaderTest { diff --git a/jsprit-core/src/test/java/basics/io/VrpReaderV2Test.java b/jsprit-core/src/test/java/jsprit/core/problem/io/VrpReaderV2Test.java similarity index 92% rename from jsprit-core/src/test/java/basics/io/VrpReaderV2Test.java rename to jsprit-core/src/test/java/jsprit/core/problem/io/VrpReaderV2Test.java index 40e69433..7d97b6ea 100644 --- a/jsprit-core/src/test/java/basics/io/VrpReaderV2Test.java +++ b/jsprit-core/src/test/java/jsprit/core/problem/io/VrpReaderV2Test.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.io; +package jsprit.core.problem.io; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @@ -25,16 +25,18 @@ import java.util.Arrays; import java.util.Collection; import java.util.List; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.VehicleRoutingProblem.FleetComposition; +import jsprit.core.problem.VehicleRoutingProblem.FleetSize; +import jsprit.core.problem.io.VrpXMLReader; +import jsprit.core.problem.job.Job; +import jsprit.core.problem.job.Service; +import jsprit.core.problem.job.Shipment; +import jsprit.core.problem.vehicle.Vehicle; + import org.junit.Before; import org.junit.Test; -import basics.Job; -import basics.Service; -import basics.Shipment; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblem.FleetComposition; -import basics.VehicleRoutingProblem.FleetSize; -import basics.route.Vehicle; public class VrpReaderV2Test { diff --git a/jsprit-core/src/test/java/basics/io/VrpWriterV2Test.java b/jsprit-core/src/test/java/jsprit/core/problem/io/VrpWriterV2Test.java similarity index 67% rename from jsprit-core/src/test/java/basics/io/VrpWriterV2Test.java rename to jsprit-core/src/test/java/jsprit/core/problem/io/VrpWriterV2Test.java index 97ac82f1..9866bcfb 100644 --- a/jsprit-core/src/test/java/basics/io/VrpWriterV2Test.java +++ b/jsprit-core/src/test/java/jsprit/core/problem/io/VrpWriterV2Test.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.io; +package jsprit.core.problem.io; import static org.junit.Assert.assertEquals; @@ -22,22 +22,25 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.VehicleRoutingProblem.Builder; +import jsprit.core.problem.VehicleRoutingProblem.FleetComposition; +import jsprit.core.problem.VehicleRoutingProblem.FleetSize; +import jsprit.core.problem.io.VrpXMLReader; +import jsprit.core.problem.io.VrpXMLWriter; +import jsprit.core.problem.job.Service; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; +import jsprit.core.problem.solution.route.VehicleRoute; +import jsprit.core.problem.solution.route.activity.End; +import jsprit.core.problem.solution.route.activity.ServiceActivity; +import jsprit.core.problem.solution.route.activity.Start; +import jsprit.core.problem.vehicle.Vehicle; +import jsprit.core.problem.vehicle.VehicleImpl; +import jsprit.core.problem.vehicle.VehicleTypeImpl; + import org.junit.Before; import org.junit.Test; -import basics.Service; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblem.Builder; -import basics.VehicleRoutingProblem.FleetComposition; -import basics.VehicleRoutingProblem.FleetSize; -import basics.VehicleRoutingProblemSolution; -import basics.route.End; -import basics.route.ServiceActivity; -import basics.route.Start; -import basics.route.Vehicle; -import basics.route.VehicleImpl; -import basics.route.VehicleRoute; -import basics.route.VehicleTypeImpl; public class VrpWriterV2Test { @@ -141,57 +144,6 @@ public class VrpWriterV2Test { assertEquals(2.0,s1_read.getServiceDuration(),0.01); } - @Test - public void whenWritingSolutions_itWritesThemCorrectly(){ - VehicleRoutingProblem.Builder builder = VehicleRoutingProblem.Builder.newInstance(); - builder.setFleetComposition(FleetComposition.HETEROGENEOUS); - builder.setFleetSize(FleetSize.FINITE); - VehicleTypeImpl type1 = VehicleTypeImpl.Builder.newInstance("vehType", 20).build(); - VehicleTypeImpl type2 = VehicleTypeImpl.Builder.newInstance("vehType2", 200).build(); - Vehicle v1 = VehicleImpl.Builder.newInstance("v1").setLocationId("loc").setType(type1).build(); - Vehicle v2 = VehicleImpl.Builder.newInstance("v2").setLocationId("loc").setType(type2).build(); - builder.addVehicleType(type1); - builder.addVehicleType(type2); - builder.addVehicle(v1); - builder.addVehicle(v2); - - Service s1 = Service.Builder.newInstance("1", 1).setLocationId("loc").setServiceTime(2.0).build(); - Service s2 = Service.Builder.newInstance("2", 1).setLocationId("loc2").setServiceTime(4.0).build(); - builder.addService(s1).addService(s2); - - VehicleRoutingProblem vrp = builder.build(); - - Collection routes = new ArrayList(); - Start start = Start.newInstance("start", 0.0, Double.MAX_VALUE); - start.setEndTime(10.0); - End end = End.newInstance("end", 0.0, Double.MAX_VALUE); - end.setArrTime(100); - VehicleRoute.Builder routebuilder = VehicleRoute.Builder.newInstance(start, end); - - ServiceActivity act1 = ServiceActivity.newInstance(s1); - ServiceActivity act2 = ServiceActivity.newInstance(s2); - act1.setArrTime(20.0); - act1.setEndTime(30.0); - - act2.setArrTime(40.0); - act2.setEndTime(80.0); - - routebuilder.addActivity(act1).addActivity(act2).setVehicle(v1); - VehicleRoute route = routebuilder.build(); - routes.add(route); - - VehicleRoutingProblemSolution solution = new VehicleRoutingProblemSolution(routes, 100); - - new VrpXMLWriter(vrp, Arrays.asList(solution)).write(infileName); - - VehicleRoutingProblem.Builder vrpToReadBuilder = VehicleRoutingProblem.Builder.newInstance(); - Collection solutions = new ArrayList(); - new VrpXMLReader(vrpToReadBuilder, solutions).read(infileName); - - VehicleRoutingProblem readVrp = vrpToReadBuilder.build(); - - assertEquals(1, solutions.size()); - - } + } diff --git a/jsprit-core/src/test/java/basics/ServiceTest.java b/jsprit-core/src/test/java/jsprit/core/problem/job/ServiceTest.java similarity index 96% rename from jsprit-core/src/test/java/basics/ServiceTest.java rename to jsprit-core/src/test/java/jsprit/core/problem/job/ServiceTest.java index 9b2f39de..0c68453c 100644 --- a/jsprit-core/src/test/java/basics/ServiceTest.java +++ b/jsprit-core/src/test/java/jsprit/core/problem/job/ServiceTest.java @@ -14,13 +14,15 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics; +package jsprit.core.problem.job; import static org.junit.Assert.assertTrue; import java.util.HashSet; import java.util.Set; +import jsprit.core.problem.job.Service; + import org.junit.Test; diff --git a/jsprit-core/src/test/java/basics/ShipmentTest.java b/jsprit-core/src/test/java/jsprit/core/problem/job/ShipmentTest.java similarity index 93% rename from jsprit-core/src/test/java/basics/ShipmentTest.java rename to jsprit-core/src/test/java/jsprit/core/problem/job/ShipmentTest.java index d594cef3..9fff73b9 100644 --- a/jsprit-core/src/test/java/basics/ShipmentTest.java +++ b/jsprit-core/src/test/java/jsprit/core/problem/job/ShipmentTest.java @@ -1,12 +1,13 @@ -package basics; +package jsprit.core.problem.job; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; +import jsprit.core.problem.job.Shipment; +import jsprit.core.problem.solution.route.activity.TimeWindow; +import jsprit.core.util.Coordinate; import org.junit.Test; -import util.Coordinate; -import basics.route.TimeWindow; public class ShipmentTest { diff --git a/jsprit-core/src/test/java/basics/route/TestVehicleRoute.java b/jsprit-core/src/test/java/jsprit/core/problem/solution/route/TestVehicleRoute.java similarity index 92% rename from jsprit-core/src/test/java/basics/route/TestVehicleRoute.java rename to jsprit-core/src/test/java/jsprit/core/problem/solution/route/TestVehicleRoute.java index c1c02158..9c8b733b 100644 --- a/jsprit-core/src/test/java/basics/route/TestVehicleRoute.java +++ b/jsprit-core/src/test/java/jsprit/core/problem/solution/route/TestVehicleRoute.java @@ -14,18 +14,28 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.route; +package jsprit.core.problem.solution.route; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.util.Iterator; +import jsprit.core.problem.driver.DriverImpl; +import jsprit.core.problem.driver.DriverImpl.NoDriver; +import jsprit.core.problem.job.Service; +import jsprit.core.problem.solution.route.VehicleRoute; +import jsprit.core.problem.solution.route.activity.ServiceActivity; +import jsprit.core.problem.solution.route.activity.Start; +import jsprit.core.problem.solution.route.activity.TourActivities; +import jsprit.core.problem.solution.route.activity.TourActivity; +import jsprit.core.problem.vehicle.Vehicle; +import jsprit.core.problem.vehicle.VehicleImpl; +import jsprit.core.problem.vehicle.VehicleTypeImpl; + import org.junit.Before; import org.junit.Test; -import basics.Service; -import basics.route.DriverImpl.NoDriver; public class TestVehicleRoute { diff --git a/jsprit-core/src/test/java/basics/route/VehicleRouteBuilderTest.java b/jsprit-core/src/test/java/jsprit/core/problem/solution/route/VehicleRouteBuilderTest.java similarity index 66% rename from jsprit-core/src/test/java/basics/route/VehicleRouteBuilderTest.java rename to jsprit-core/src/test/java/jsprit/core/problem/solution/route/VehicleRouteBuilderTest.java index f8c5862e..b9219432 100644 --- a/jsprit-core/src/test/java/basics/route/VehicleRouteBuilderTest.java +++ b/jsprit-core/src/test/java/jsprit/core/problem/solution/route/VehicleRouteBuilderTest.java @@ -1,25 +1,27 @@ -package basics.route; +package jsprit.core.problem.solution.route; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.mock; +import jsprit.core.problem.driver.Driver; +import jsprit.core.problem.job.Shipment; +import jsprit.core.problem.vehicle.Vehicle; import org.junit.Test; -import basics.Shipment; public class VehicleRouteBuilderTest { @Test(expected=IllegalStateException.class) public void whenDeliveryIsAddedBeforePickup_throwsException(){ Shipment s = mock(Shipment.class); - VehicleRouteBuilder builder = new VehicleRouteBuilder(mock(Vehicle.class), mock(Driver.class)); + VehicleRoute.Builder builder = VehicleRoute.Builder.newInstance(mock(Vehicle.class), mock(Driver.class)); builder.addDelivery(s); } @Test(expected=IllegalStateException.class) public void whenPickupIsAddedTwice_throwsException(){ Shipment s = mock(Shipment.class); - VehicleRouteBuilder builder = new VehicleRouteBuilder(mock(Vehicle.class), mock(Driver.class)); + VehicleRoute.Builder builder = VehicleRoute.Builder.newInstance(mock(Vehicle.class), mock(Driver.class)); builder.addPickup(s); builder.addPickup(s); } @@ -27,7 +29,7 @@ public class VehicleRouteBuilderTest { @Test(expected=IllegalStateException.class) public void whenShipmentIsPickedDeliveredAndDeliveredAgain_throwsException(){ Shipment s = mock(Shipment.class); - VehicleRouteBuilder builder = new VehicleRouteBuilder(mock(Vehicle.class), mock(Driver.class)); + VehicleRoute.Builder builder = VehicleRoute.Builder.newInstance(mock(Vehicle.class), mock(Driver.class)); builder.addPickup(s); builder.addDelivery(s); builder.addDelivery(s); @@ -36,7 +38,7 @@ public class VehicleRouteBuilderTest { @Test(expected=IllegalStateException.class) public void whenShipmentIsPickedUpThoughButHasNotBeenDeliveredAndRouteIsBuilt_throwsException(){ Shipment s = mock(Shipment.class); - VehicleRouteBuilder builder = new VehicleRouteBuilder(mock(Vehicle.class), mock(Driver.class)); + VehicleRoute.Builder builder = VehicleRoute.Builder.newInstance(mock(Vehicle.class), mock(Driver.class)); builder.addPickup(s); builder.addPickup(mock(Shipment.class)); builder.addDelivery(s); @@ -47,7 +49,7 @@ public class VehicleRouteBuilderTest { public void whenTwoShipmentsHaveBeenAdded_nuOfActivitiesMustEqualFour(){ Shipment s = mock(Shipment.class); Shipment s2 = mock(Shipment.class); - VehicleRouteBuilder builder = new VehicleRouteBuilder(mock(Vehicle.class), mock(Driver.class)); + VehicleRoute.Builder builder = VehicleRoute.Builder.newInstance(mock(Vehicle.class), mock(Driver.class)); builder.addPickup(s); builder.addPickup(s2); builder.addDelivery(s); diff --git a/jsprit-core/src/test/java/basics/route/ServiceActTest.java b/jsprit-core/src/test/java/jsprit/core/problem/solution/route/activity/ServiceActTest.java similarity index 91% rename from jsprit-core/src/test/java/basics/route/ServiceActTest.java rename to jsprit-core/src/test/java/jsprit/core/problem/solution/route/activity/ServiceActTest.java index ffc662f4..80801fc1 100644 --- a/jsprit-core/src/test/java/basics/route/ServiceActTest.java +++ b/jsprit-core/src/test/java/jsprit/core/problem/solution/route/activity/ServiceActTest.java @@ -14,14 +14,15 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.route; +package jsprit.core.problem.solution.route.activity; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import jsprit.core.problem.job.Service; +import jsprit.core.problem.solution.route.activity.ServiceActivity; import org.junit.Test; -import basics.Service; public class ServiceActTest { diff --git a/jsprit-core/src/test/java/algorithms/TestRefs.java b/jsprit-core/src/test/java/jsprit/core/problem/solution/route/activity/TestRefs.java similarity index 93% rename from jsprit-core/src/test/java/algorithms/TestRefs.java rename to jsprit-core/src/test/java/jsprit/core/problem/solution/route/activity/TestRefs.java index 0133ed26..57d8d5ae 100644 --- a/jsprit-core/src/test/java/algorithms/TestRefs.java +++ b/jsprit-core/src/test/java/jsprit/core/problem/solution/route/activity/TestRefs.java @@ -14,16 +14,17 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms; +package jsprit.core.problem.solution.route.activity; import static org.junit.Assert.assertTrue; import java.util.ArrayList; import java.util.List; +import jsprit.core.problem.solution.route.activity.Start; + import org.junit.Test; -import basics.route.Start; public class TestRefs { diff --git a/jsprit-core/src/test/java/basics/route/TestTour.java b/jsprit-core/src/test/java/jsprit/core/problem/solution/route/activity/TestTour.java similarity index 89% rename from jsprit-core/src/test/java/basics/route/TestTour.java rename to jsprit-core/src/test/java/jsprit/core/problem/solution/route/activity/TestTour.java index 6afcc5a5..8b7b1c0e 100644 --- a/jsprit-core/src/test/java/basics/route/TestTour.java +++ b/jsprit-core/src/test/java/jsprit/core/problem/solution/route/activity/TestTour.java @@ -14,17 +14,22 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package basics.route; +package jsprit.core.problem.solution.route.activity; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import jsprit.core.problem.job.Service; +import jsprit.core.problem.job.Shipment; +import jsprit.core.problem.solution.route.activity.DefaultShipmentActivityFactory; +import jsprit.core.problem.solution.route.activity.ServiceActivity; +import jsprit.core.problem.solution.route.activity.TourActivities; +import jsprit.core.problem.solution.route.activity.TourActivity; +import jsprit.core.problem.solution.route.activity.TourShipmentActivityFactory; import org.junit.Before; import org.junit.Test; -import basics.Service; -import basics.Shipment; public class TestTour { diff --git a/jsprit-core/src/test/java/algorithms/TestVehicleFleetManager.java b/jsprit-core/src/test/java/jsprit/core/problem/vehicle/TestVehicleFleetManager.java similarity index 93% rename from jsprit-core/src/test/java/algorithms/TestVehicleFleetManager.java rename to jsprit-core/src/test/java/jsprit/core/problem/vehicle/TestVehicleFleetManager.java index 5b6fa031..9ab69b02 100644 --- a/jsprit-core/src/test/java/algorithms/TestVehicleFleetManager.java +++ b/jsprit-core/src/test/java/jsprit/core/problem/vehicle/TestVehicleFleetManager.java @@ -14,19 +14,19 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package algorithms; +package jsprit.core.problem.vehicle; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import jsprit.core.problem.vehicle.FiniteFleetManagerFactory; +import jsprit.core.problem.vehicle.PenaltyVehicleType; +import jsprit.core.problem.vehicle.Vehicle; +import jsprit.core.problem.vehicle.VehicleFleetManager; +import jsprit.core.problem.vehicle.VehicleImpl; +import jsprit.core.problem.vehicle.VehicleTypeImpl; import junit.framework.TestCase; -import basics.route.FiniteFleetManagerFactory; -import basics.route.PenaltyVehicleType; -import basics.route.Vehicle; -import basics.route.VehicleFleetManager; -import basics.route.VehicleImpl; -import basics.route.VehicleTypeImpl; public class TestVehicleFleetManager extends TestCase{ diff --git a/jsprit-core/src/test/resources/infiniteWriterV2Test.xml b/jsprit-core/src/test/resources/infiniteWriterV2Test.xml index 5761c975..ec10a45f 100644 --- a/jsprit-core/src/test/resources/infiniteWriterV2Test.xml +++ b/jsprit-core/src/test/resources/infiniteWriterV2Test.xml @@ -2,8 +2,8 @@ - FINITE - HETEROGENEOUS + INFINITE + HOMOGENEOUS @@ -73,28 +73,4 @@ - - - 100.0 - - - 0.0 - noDriver - v1 - 10.0 - - 1 - 20.0 - 30.0 - - - 2 - 40.0 - 80.0 - - 100.0 - - - - diff --git a/jsprit-core/src/test/resources/pdp.xml b/jsprit-core/src/test/resources/pdp.xml index 0dc17dd9..3f3800f1 100644 --- a/jsprit-core/src/test/resources/pdp.xml +++ b/jsprit-core/src/test/resources/pdp.xml @@ -506,24530 +506,6 @@ 1 - - - [x=24.0][y=15.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=36.0][y=4.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=87.0][y=31.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=31.0][y=71.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=11.0][y=29.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=78.0][y=30.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=94.0][y=42.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=56.0][y=86.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=59.0][y=54.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=11.0][y=92.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=43.0][y=73.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=43.0][y=27.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=24.0][y=97.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=89.0][y=98.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=48.0][y=82.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=45.0][y=62.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=89.0][y=90.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=6.0][y=25.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=69.0][y=76.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=17.0][y=57.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=16.0][y=82.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=66.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=40.0][y=56.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=51.0][y=5.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=71.0][y=21.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=3.0][y=58.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=40.0][y=52.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=34.0][y=86.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=54.0][y=14.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=55.0][y=71.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=53.0][y=63.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=77.0][y=93.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=63.0][y=35.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=16.0][y=95.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=84.0][y=90.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=96.0][y=2.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=86.0][y=80.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=72.0][y=79.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=8.0][y=48.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=8.0][y=1.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=59.0][y=38.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=75.0][y=59.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=54.0][y=55.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=3.0][y=82.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=92.0][y=38.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=17.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=65.0][y=1.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=17.0][y=69.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=32.0][y=100.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=82.0][y=30.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=90.0][y=56.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=52.0][y=29.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=95.0][y=97.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=93.0][y=26.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=82.0][y=32.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=52.0][y=13.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=74.0][y=92.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=1.0][y=82.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=54.0][y=25.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=62.0][y=96.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=64.0][y=19.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=86.0][y=54.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=88.0][y=17.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=17.0][y=1.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=27.0][y=8.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=62.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=11.0][y=70.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=90.0][y=19.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=82.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=12.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=72.0][y=71.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=57.0][y=36.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=67.0][y=91.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=100.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=26.0][y=38.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=15.0][y=8.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=79.0][y=90.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=36.0][y=15.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=30.0][y=87.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=50.0][y=38.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=96.0][y=89.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=5.0][y=96.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=67.0][y=35.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=77.0][y=3.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=97.0][y=46.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=95.0][y=7.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=81.0][y=23.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=95.0][y=54.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=26.0][y=79.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=45.0][y=79.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=42.0][y=36.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=25.0][y=19.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=86.0][y=76.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=41.0][y=88.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=1.0][y=39.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=41.0][y=94.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=57.0][y=4.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=92.0][y=81.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=56.0][y=37.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=32.0][y=89.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=33.0][y=7.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=68.0][y=82.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=15.0][y=77.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=52.0][y=36.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=61.0][y=56.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=33.0][y=2.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=38.0][y=49.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=34.0][y=42.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=15.0][y=64.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=77.0][y=76.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=1.0][y=55.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=89.0][y=39.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=46.0][y=42.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=47.0][y=36.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=40.0][y=52.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=2.0][y=42.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=14.0][y=35.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=61.0][y=19.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=26.0][y=42.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=56.0][y=39.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=18.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=2.0][y=54.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=48.0][y=94.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=63.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=33.0][y=90.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=8.0][y=29.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=64.0][y=20.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=38.0][y=35.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=38.0][y=93.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=88.0][y=15.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=5.0][y=9.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=46.0][y=35.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=73.0][y=37.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=46.0][y=64.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=51.0][y=20.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=31.0][y=60.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=75.0][y=79.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=96.0][y=52.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=72.0][y=68.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=100.0][y=56.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=36.0][y=22.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=93.0][y=81.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=78.0][y=38.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=60.0][y=6.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=34.0][y=50.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=32.0][y=96.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=61.0][y=57.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=68.0][y=3.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=33.0][y=79.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=16.0][y=87.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=81.0][y=73.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=31.0][y=27.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=23.0][y=34.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=21.0][y=50.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=51.0][y=88.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=3.0][y=38.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=73.0][y=59.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=53.0][y=20.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=3.0][y=19.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=60.0][y=88.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=99.0][y=36.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=88.0][y=40.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=36.0][y=90.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=46.0][y=77.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=20.0][y=32.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=24.0][y=77.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=25.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=99.0][y=97.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=22.0][y=59.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=6.0][y=34.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=61.0][y=62.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=68.0][y=57.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=25.0][y=52.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=71.0][y=73.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=57.0][y=25.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=40.0][y=21.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=17.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=57.0][y=83.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=74.0][y=18.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=94.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=43.0][y=69.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=85.0][y=10.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=90.0][y=4.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=40.0][y=69.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=69.0][y=67.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=66.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=68.0][y=23.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=56.0][y=89.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=75.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=9.0][y=25.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=12.0][y=38.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=17.0][y=68.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=58.0][y=57.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=33.0][y=8.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=10.0][y=40.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=33.0][y=24.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=59.0][y=85.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=40.0][y=36.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=12.0][y=64.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=89.0][y=79.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=95.0][y=54.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=70.0][y=30.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=85.0][y=17.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=95.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=82.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=59.0][y=33.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=17.0][y=95.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=78.0][y=9.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=49.0][y=64.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=32.0][y=15.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=58.0][y=32.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=13.0][y=60.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=88.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=23.0][y=2.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=29.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=9.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=16.0][y=1.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=2.0][y=96.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=37.0][y=78.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=85.0][y=52.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=93.0][y=88.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=43.0][y=30.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=90.0][y=62.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=65.0][y=33.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=91.0][y=46.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=74.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=27.0][y=45.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=17.0][y=46.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=78.0][y=73.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=26.0][y=15.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=79.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=43.0][y=67.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=92.0][y=100.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=71.0][y=9.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=53.0][y=45.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=6.0][y=37.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=48.0][y=57.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=22.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=85.0][y=45.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=36.0][y=14.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=63.0][y=34.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=92.0][y=67.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=46.0][y=40.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=58.0][y=60.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=20.0][y=58.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=32.0][y=97.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=61.0][y=22.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=46.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=35.0][y=2.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=39.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=56.0][y=21.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=67.0][y=49.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=9.0][y=88.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=41.0][y=20.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=43.0][y=33.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=63.0][y=5.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=57.0][y=78.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=11.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=35.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=63.0][y=59.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=51.0][y=34.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=72.0][y=64.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=3.0][y=21.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=78.0][y=27.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=50.0][y=27.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=69.0][y=15.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=36.0][y=79.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=21.0][y=43.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=95.0][y=45.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=38.0][y=40.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=21.0][y=54.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=42.0][y=68.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=24.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=97.0][y=6.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=61.0][y=49.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=55.0][y=97.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=12.0][y=81.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=65.0][y=3.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=64.0][y=15.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=9.0][y=24.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=43.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=2.0][y=62.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=84.0][y=84.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=89.0][y=6.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=33.0][y=39.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=21.0][y=38.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=55.0][y=61.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=56.0][y=53.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=98.0][y=20.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=76.0][y=74.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=43.0][y=68.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=52.0][y=45.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=58.0][y=64.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=95.0][y=79.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=55.0][y=7.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=29.0][y=27.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=18.0][y=72.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=83.0][y=84.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=21.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=35.0][y=97.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=9.0][y=2.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=81.0][y=98.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=37.0][y=57.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=24.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=29.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=32.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=13.0][y=4.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=69.0][y=93.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=80.0][y=33.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=47.0][y=71.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=32.0][y=57.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=24.0][y=95.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=67.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=58.0][y=96.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=36.0][y=23.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=60.0][y=13.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=26.0][y=66.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=92.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=23.0][y=22.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=2.0][y=95.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=40.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=92.0][y=57.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=5.0][y=4.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=99.0][y=92.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=86.0][y=24.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=43.0][y=59.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=95.0][y=56.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=61.0][y=18.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=31.0][y=18.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=58.0][y=93.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=92.0][y=80.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=72.0][y=71.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=88.0][y=72.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=4.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=38.0][y=77.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=84.0][y=6.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=29.0][y=46.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=99.0][y=77.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=7.0][y=26.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=73.0][y=30.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=72.0][y=91.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=78.0][y=85.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=81.0][y=9.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=25.0][y=21.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=97.0][y=91.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=51.0][y=35.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=93.0][y=72.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=30.0][y=10.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=63.0][y=77.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=74.0][y=98.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=18.0][y=72.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=28.0][y=16.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=67.0][y=63.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=55.0][y=29.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=6.0][y=73.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=30.0][y=1.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=59.0][y=33.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=41.0][y=42.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=14.0][y=45.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=45.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=35.0][y=32.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=98.0][y=32.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=69.0][y=48.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=60.0][y=35.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=16.0][y=52.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=28.0][y=91.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=5.0][y=60.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=86.0][y=86.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=34.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=46.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=96.0][y=14.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=67.0][y=62.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=23.0][y=95.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=58.0][y=4.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=91.0][y=87.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=68.0][y=73.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=89.0][y=98.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=27.0][y=59.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=63.0][y=29.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=37.0][y=1.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=54.0][y=25.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=94.0][y=86.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=22.0][y=73.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=5.0][y=88.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=16.0][y=48.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=13.0][y=71.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=20.0][y=19.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=34.0][y=98.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=56.0][y=76.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=40.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=49.0][y=80.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=53.0][y=59.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=30.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=84.0][y=24.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=85.0][y=91.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=14.0][y=89.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=51.0][y=32.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=99.0][y=3.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=36.0][y=86.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=51.0][y=55.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=44.0][y=27.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=39.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=25.0][y=53.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=3.0][y=24.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=62.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=60.0][y=84.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=49.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=98.0][y=22.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=59.0][y=20.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=18.0][y=35.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=56.0][y=86.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=82.0][y=96.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=72.0][y=77.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=15.0][y=56.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=74.0][y=20.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=99.0][y=56.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=4.0][y=66.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=72.0][y=35.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=92.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=50.0][y=30.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=17.0][y=18.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=89.0][y=48.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=94.0][y=54.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=94.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=27.0][y=58.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=82.0][y=90.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=32.0][y=86.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=59.0][y=68.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=80.0][y=59.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=85.0][y=62.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=14.0][y=80.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=41.0][y=22.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=24.0][y=64.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=31.0][y=83.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=92.0][y=49.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=100.0][y=46.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=76.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=37.0][y=89.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=17.0][y=61.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=4.0][y=73.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=10.0][y=44.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=24.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=74.0][y=15.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=77.0][y=32.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=14.0][y=93.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=68.0][y=64.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=75.0][y=56.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=72.0][y=93.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=22.0][y=67.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=12.0][y=68.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=95.0][y=23.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=95.0][y=4.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=26.0][y=84.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=54.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=21.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=2.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=86.0][y=66.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=99.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=5.0][y=62.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=46.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=52.0][y=26.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=25.0][y=66.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=44.0][y=13.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=57.0][y=70.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=26.0][y=79.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=79.0][y=80.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=14.0][y=57.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=82.0][y=1.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=37.0][y=38.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=29.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=88.0][y=17.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=35.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=43.0][y=50.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=42.0][y=39.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=57.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=65.0][y=96.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=29.0][y=94.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=79.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=42.0][y=37.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=99.0][y=40.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=41.0][y=82.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=90.0][y=94.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=81.0][y=69.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=61.0][y=59.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=18.0][y=98.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=30.0][y=72.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=54.0][y=50.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=74.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=7.0][y=84.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=85.0][y=63.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=97.0][y=81.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=36.0][y=67.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=63.0][y=88.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=9.0][y=31.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=72.0][y=3.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=49.0][y=19.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=78.0][y=45.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=91.0][y=30.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=50.0][y=3.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=3.0][y=87.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=53.0][y=21.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=16.0][y=22.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=96.0][y=61.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=6.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=77.0][y=23.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=84.0][y=95.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=98.0][y=6.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=13.0][y=30.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=29.0][y=79.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=41.0][y=66.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=26.0][y=20.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=54.0][y=75.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=97.0][y=89.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=11.0][y=57.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=20.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=43.0][y=100.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=17.0][y=26.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=82.0][y=48.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=59.0][y=33.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=17.0][y=27.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=66.0][y=56.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=63.0][y=35.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=8.0][y=44.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=31.0][y=33.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=2.0][y=85.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=4.0][y=79.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=48.0][y=58.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=82.0][y=37.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=13.0][y=93.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=49.0][y=79.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=100.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=56.0][y=26.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=49.0][y=32.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=83.0][y=10.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=99.0][y=68.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=17.0][y=48.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=76.0][y=50.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=96.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=88.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=44.0][y=70.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=97.0][y=73.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=27.0][y=64.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=61.0][y=17.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=57.0][y=66.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=17.0][y=80.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=65.0][y=64.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=6.0][y=37.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=54.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=92.0][y=95.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=4.0][y=46.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=46.0][y=88.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=32.0][y=76.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=67.0][y=62.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=83.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=81.0][y=75.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=75.0][y=27.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=22.0][y=60.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=80.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=17.0][y=24.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=82.0][y=35.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=11.0][y=100.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=60.0][y=14.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=35.0][y=1.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=55.0][y=87.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=33.0][y=39.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=87.0][y=21.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=47.0][y=66.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=33.0][y=17.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=19.0][y=69.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=59.0][y=5.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=24.0][y=46.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=5.0][y=22.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=76.0][y=79.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=16.0][y=39.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=45.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=5.0][y=15.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=15.0][y=64.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=58.0][y=66.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=23.0][y=10.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=92.0][y=44.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=9.0][y=60.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=11.0][y=60.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=79.0][y=11.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=59.0][y=42.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=27.0][y=73.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=100.0][y=3.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=97.0][y=74.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=42.0][y=45.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=26.0][y=50.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=17.0][y=20.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=24.0][y=74.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=91.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=75.0][y=10.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=40.0][y=45.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=60.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=45.0][y=9.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=80.0][y=29.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=20.0][y=2.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=48.0][y=89.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=34.0][y=20.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=35.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=81.0][y=14.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=41.0][y=21.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=50.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=100.0][y=64.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=22.0][y=11.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=27.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=78.0][y=19.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=14.0][y=18.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=92.0][y=96.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=10.0][y=52.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=81.0][y=30.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=38.0][y=46.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=32.0][y=92.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=70.0][y=100.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=20.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=45.0][y=49.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=70.0][y=75.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=11.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=54.0][y=8.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=62.0][y=20.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=84.0][y=67.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=38.0][y=93.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=14.0][y=78.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=89.0][y=37.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=19.0][y=96.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=24.0][y=72.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=8.0][y=38.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=7.0][y=6.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=15.0][y=27.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=80.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=44.0][y=15.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=64.0][y=96.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=18.0][y=49.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=53.0][y=35.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=7.0][y=61.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=47.0][y=37.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=38.0][y=30.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=29.0][y=52.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=9.0][y=69.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=8.0][y=18.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=9.0][y=38.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=14.0][y=13.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=50.0][y=89.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=52.0][y=87.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=22.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=28.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=51.0][y=1.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=28.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=27.0][y=4.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=13.0][y=70.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=92.0][y=63.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=81.0][y=62.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=77.0][y=85.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=47.0][y=7.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=41.0][y=7.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=87.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=83.0][y=64.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=70.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=57.0][y=69.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=19.0][y=9.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=39.0][y=73.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=44.0][y=90.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=89.0][y=32.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=100.0][y=15.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=93.0][y=29.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=21.0][y=79.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=81.0][y=46.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=58.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=3.0][y=55.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=38.0][y=95.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=51.0][y=9.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=75.0][y=50.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=10.0][y=26.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=80.0][y=21.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=3.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=11.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=19.0][y=49.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=34.0][y=94.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=5.0][y=16.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=5.0][y=98.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=17.0][y=8.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=75.0][y=76.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=7.0][y=20.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=100.0][y=40.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=56.0][y=56.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=56.0][y=19.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=30.0][y=37.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=57.0][y=35.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=55.0][y=70.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=56.0][y=90.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=68.0][y=16.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=48.0][y=26.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=94.0][y=36.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=44.0][y=44.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=43.0][y=11.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=69.0][y=26.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=1.0][y=70.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=29.0][y=88.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=68.0][y=33.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=14.0][y=38.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=73.0][y=69.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=89.0][y=36.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=61.0][y=13.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=73.0][y=20.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=37.0][y=34.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=51.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=38.0][y=40.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=93.0][y=61.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=27.0][y=92.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=31.0][y=83.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=51.0][y=59.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=65.0][y=80.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=85.0][y=80.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=21.0][y=32.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=59.0][y=92.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=51.0][y=3.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=47.0][y=75.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=88.0][y=6.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=46.0][y=42.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=53.0][y=78.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=32.0][y=92.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=49.0][y=62.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=92.0][y=32.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=42.0][y=55.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=93.0][y=19.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=1.0][y=2.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=42.0][y=20.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=89.0][y=35.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=61.0][y=79.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=54.0][y=10.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=32.0][y=94.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=73.0][y=50.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=64.0][y=84.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=86.0][y=92.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=46.0][y=36.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=73.0][y=63.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=22.0][y=74.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=16.0][y=89.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=27.0][y=50.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=99.0][y=67.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=61.0][y=68.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=13.0][y=34.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=16.0][y=67.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=27.0][y=42.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=79.0][y=4.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=92.0][y=29.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=26.0][y=72.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=55.0][y=71.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=33.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=81.0][y=15.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=64.0][y=84.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=89.0][y=83.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=90.0][y=88.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=81.0][y=100.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=32.0][y=75.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=31.0][y=86.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=7.0][y=23.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=36.0][y=35.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=88.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=74.0][y=68.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=92.0][y=69.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=28.0][y=56.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=62.0][y=70.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=79.0][y=84.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=59.0][y=30.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=45.0][y=72.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=82.0][y=9.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=36.0][y=42.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=6.0][y=15.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=61.0][y=98.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=17.0][y=20.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=9.0][y=68.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=67.0][y=35.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=82.0][y=90.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=46.0][y=46.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=64.0][y=52.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=2.0][y=25.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=53.0][y=39.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=95.0][y=63.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=86.0][y=39.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=79.0][y=22.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=42.0][y=44.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=15.0][y=6.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=12.0][y=14.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=28.0][y=96.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=34.0][y=92.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=56.0][y=80.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=80.0][y=72.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=44.0][y=7.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=12.0][y=87.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=69.0][y=10.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=53.0][y=16.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=47.0][y=27.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=39.0][y=82.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=66.0][y=66.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=37.0][y=17.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=89.0][y=7.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=14.0][y=93.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=23.0][y=36.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=80.0][y=64.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=31.0][y=30.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=31.0][y=85.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=91.0][y=39.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=55.0][y=34.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=88.0][y=31.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=37.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=91.0][y=4.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=23.0][y=77.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=44.0][y=78.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=37.0][y=2.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=87.0][y=66.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=65.0][y=66.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=39.0][y=89.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=42.0][y=1.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=93.0][y=66.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=36.0][y=18.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=31.0][y=48.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=65.0][y=57.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=41.0][y=26.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=44.0][y=57.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=49.0][y=29.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=39.0][y=70.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=47.0][y=100.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=19.0][y=96.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=32.0][y=100.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=34.0][y=60.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=3.0][y=29.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=80.0][y=80.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=57.0][y=75.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=26.0][y=52.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=85.0][y=64.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=13.0][y=97.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=9.0][y=5.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=12.0][y=91.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=53.0][y=92.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=12.0][y=23.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=68.0][y=55.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=37.0][y=88.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=23.0][y=9.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=88.0][y=44.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=79.0][y=48.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=70.0][y=75.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=4.0][y=35.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=16.0][y=50.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=48.0][y=6.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=56.0][y=77.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=27.0][y=62.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=94.0][y=54.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=72.0][y=72.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=44.0][y=24.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=91.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=27.0][y=57.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=15.0][y=73.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=54.0][y=22.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=4.0][y=2.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=13.0][y=11.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=2.0][y=76.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=37.0][y=9.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=33.0][y=6.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=53.0][y=92.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=17.0][y=98.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=13.0][y=70.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=44.0][y=4.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=94.0][y=88.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=95.0][y=76.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=47.0][y=18.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=99.0][y=45.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=24.0][y=54.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=9.0][y=36.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=83.0][y=57.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=73.0][y=29.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=51.0][y=73.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=51.0][y=64.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=92.0][y=3.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=6.0][y=18.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=34.0][y=27.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=57.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=15.0][y=36.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=4.0][y=72.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=79.0][y=42.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=57.0][y=42.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=17.0][y=11.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=63.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=66.0][y=58.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=75.0][y=14.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=19.0][y=38.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=62.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=20.0][y=75.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=81.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=89.0][y=18.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=22.0][y=91.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=69.0][y=57.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=51.0][y=15.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=50.0][y=80.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=4.0][y=85.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=31.0][y=18.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=41.0][y=97.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=6.0][y=86.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=69.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=48.0][y=16.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=68.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=85.0][y=48.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=47.0][y=17.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=77.0][y=16.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=57.0][y=55.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=31.0][y=23.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=86.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=13.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=25.0][y=58.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=98.0][y=64.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=76.0][y=92.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=61.0][y=60.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=20.0][y=19.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=21.0][y=31.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=97.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=97.0][y=75.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=3.0][y=15.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=73.0][y=49.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=49.0][y=95.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=34.0][y=3.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=73.0][y=9.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=66.0][y=17.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=77.0][y=97.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=98.0][y=5.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=14.0][y=40.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=49.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=41.0][y=43.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=43.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=26.0][y=61.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=98.0][y=16.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=83.0][y=50.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=47.0][y=85.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=99.0][y=17.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=4.0][y=87.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=25.0][y=27.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=67.0][y=21.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=70.0][y=21.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=70.0][y=45.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=28.0][y=14.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=95.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=69.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=68.0][y=67.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=19.0][y=16.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=98.0][y=5.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=18.0][y=7.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=50.0][y=62.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=5.0][y=45.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=38.0][y=52.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=32.0][y=95.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=15.0][y=40.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=33.0][y=66.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=21.0][y=73.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=55.0][y=100.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=23.0][y=13.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=60.0][y=32.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=8.0][y=94.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=56.0][y=18.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=36.0][y=37.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=89.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=90.0][y=71.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=86.0][y=60.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=24.0][y=31.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=85.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=31.0][y=1.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=49.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=83.0][y=43.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=60.0][y=25.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=81.0][y=32.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=98.0][y=68.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=65.0][y=72.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=22.0][y=68.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=32.0][y=88.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=56.0][y=55.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=83.0][y=74.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=41.0][y=19.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=100.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=87.0][y=92.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=8.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=2.0][y=6.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=35.0][y=58.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=43.0][y=34.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=16.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=43.0][y=70.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=7.0][y=42.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=97.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=24.0][y=94.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=80.0][y=100.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=46.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=62.0][y=10.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=90.0][y=18.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=65.0][y=78.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=80.0][y=70.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=34.0][y=21.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=6.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=15.0][y=55.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=82.0][y=23.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=47.0][y=48.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=89.0][y=82.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=98.0][y=3.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=62.0][y=66.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=61.0][y=13.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=18.0][y=70.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=28.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=35.0][y=96.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=91.0][y=16.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=62.0][y=95.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=78.0][y=80.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=67.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=58.0][y=81.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=82.0][y=63.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=71.0][y=16.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=20.0][y=73.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=8.0][y=62.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=31.0][y=90.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=44.0][y=33.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=40.0][y=13.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=80.0][y=16.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=49.0][y=3.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=30.0][y=18.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=6.0][y=91.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=63.0][y=68.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=93.0][y=32.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=61.0][y=52.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=80.0][y=25.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=51.0][y=50.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=91.0][y=96.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=28.0][y=49.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=84.0][y=35.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=13.0][y=10.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=23.0][y=61.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=99.0][y=82.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=13.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=7.0][y=78.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=8.0][y=81.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=21.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=89.0][y=27.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=9.0][y=38.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=53.0][y=10.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=61.0][y=61.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=16.0][y=77.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=85.0][y=4.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=45.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=32.0][y=43.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=90.0][y=6.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=63.0][y=7.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=15.0][y=91.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=4.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=28.0][y=44.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=40.0][y=11.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=5.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=47.0][y=77.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=24.0][y=24.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=11.0][y=46.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=60.0][y=91.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=21.0][y=29.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=42.0][y=55.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=66.0][y=17.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=93.0][y=13.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=91.0][y=67.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=68.0][y=52.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=64.0][y=34.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=39.0][y=75.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=55.0][y=78.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=43.0][y=19.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=94.0][y=43.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=94.0][y=63.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=66.0][y=73.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=52.0][y=21.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=100.0][y=27.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=25.0][y=98.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=94.0][y=2.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=42.0][y=42.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=75.0][y=71.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=14.0][y=80.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=86.0][y=44.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=43.0][y=25.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=47.0][y=62.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=85.0][y=11.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=28.0][y=6.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=44.0][y=19.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=54.0][y=92.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=21.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=28.0][y=57.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=81.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=80.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=52.0][y=73.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=35.0][y=27.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=97.0][y=34.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=70.0][y=18.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=69.0][y=20.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=35.0][y=27.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=51.0][y=63.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=67.0][y=44.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=63.0][y=62.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=4.0][y=50.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=4.0][y=19.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=76.0][y=31.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=30.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=49.0][y=45.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=24.0][y=6.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=100.0][y=17.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=85.0][y=72.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=33.0][y=91.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=24.0][y=62.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=91.0][y=17.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=42.0][y=30.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=9.0][y=74.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=67.0][y=98.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=43.0][y=93.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=100.0][y=38.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=49.0][y=46.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=66.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=15.0][y=49.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=43.0][y=63.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=19.0][y=97.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=80.0][y=37.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=66.0][y=77.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=95.0][y=66.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=25.0][y=37.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=20.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=81.0][y=61.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=78.0][y=3.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=30.0][y=14.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=61.0][y=31.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=3.0][y=31.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=26.0][y=16.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=8.0][y=72.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=47.0][y=50.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=50.0][y=49.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=49.0][y=5.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=39.0][y=57.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=35.0][y=26.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=87.0][y=10.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=49.0][y=90.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=3.0][y=54.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=44.0][y=1.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=6.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=50.0][y=48.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=81.0][y=96.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=5.0][y=76.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=82.0][y=61.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=71.0][y=21.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=79.0][y=40.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=91.0][y=40.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=54.0][y=9.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=89.0][y=48.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=29.0][y=76.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=26.0][y=40.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=75.0][y=97.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=83.0][y=70.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=48.0][y=20.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=10.0][y=86.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=42.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=17.0][y=83.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=27.0][y=100.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=51.0][y=67.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=59.0][y=2.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=44.0][y=10.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=11.0][y=80.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=88.0][y=49.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=97.0][y=3.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=17.0][y=72.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=95.0][y=91.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=97.0][y=100.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=67.0][y=90.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=36.0][y=86.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=60.0][y=18.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=4.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=9.0][y=29.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=38.0][y=19.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=25.0][y=4.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=5.0][y=68.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=96.0][y=75.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=96.0][y=7.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=83.0][y=89.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=92.0][y=71.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=27.0][y=3.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=77.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=58.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=31.0][y=89.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=60.0][y=14.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=20.0][y=37.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=83.0][y=59.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=55.0][y=9.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=17.0][y=2.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=63.0][y=93.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=28.0][y=52.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=59.0][y=26.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=78.0][y=92.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=99.0][y=11.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=99.0][y=10.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=20.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=14.0][y=64.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=14.0][y=39.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=30.0][y=56.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=98.0][y=66.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=55.0][y=9.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=2.0][y=100.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=5.0][y=32.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=55.0][y=81.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=71.0][y=4.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=89.0][y=70.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=46.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=62.0][y=67.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=99.0][y=62.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=28.0][y=38.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=2.0][y=9.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=38.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=7.0][y=39.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=41.0][y=35.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=43.0][y=89.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=21.0][y=3.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=98.0][y=56.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=4.0][y=45.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=96.0][y=57.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=9.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=58.0][y=60.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=8.0][y=45.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=33.0][y=77.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=58.0][y=72.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=83.0][y=83.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=12.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=73.0][y=7.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=58.0][y=92.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=32.0][y=36.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=62.0][y=40.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=35.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=88.0][y=10.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=44.0][y=25.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=11.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=8.0][y=89.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=97.0][y=80.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=76.0][y=66.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=71.0][y=53.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=63.0][y=92.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=67.0][y=7.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=78.0][y=96.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=68.0][y=11.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=98.0][y=2.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=29.0][y=54.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=62.0][y=2.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=89.0][y=69.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=67.0][y=69.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=93.0][y=30.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=72.0][y=84.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=96.0][y=75.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=80.0][y=56.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=61.0][y=52.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=78.0][y=37.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=32.0][y=40.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=72.0][y=19.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=2.0][y=40.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=40.0][y=7.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=11.0][y=6.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=64.0][y=87.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=98.0][y=63.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=24.0][y=3.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=53.0][y=67.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=16.0][y=35.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=64.0][y=46.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=2.0][y=79.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=19.0][y=75.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=33.0][y=39.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=70.0][y=86.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=72.0][y=88.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=46.0][y=86.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=3.0][y=33.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=9.0][y=5.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=42.0][y=13.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=99.0][y=20.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=9.0][y=23.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=80.0][y=71.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=34.0][y=79.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=95.0][y=97.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=89.0][y=75.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=54.0][y=3.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=54.0][y=13.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=71.0][y=43.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=24.0][y=39.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=61.0][y=60.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=15.0][y=76.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=4.0][y=26.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=61.0][y=57.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=31.0][y=96.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=63.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=74.0][y=26.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=20.0][y=2.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=25.0][y=50.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=56.0][y=54.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=23.0][y=25.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=12.0][y=26.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=98.0][y=33.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=24.0][y=55.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=21.0][y=37.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=58.0][y=11.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=27.0][y=19.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=49.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=49.0][y=11.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=67.0][y=20.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=66.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=89.0][y=79.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=76.0][y=18.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=50.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=87.0][y=31.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=14.0][y=32.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=70.0][y=76.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=70.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=48.0][y=23.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=44.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=84.0][y=45.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=17.0][y=26.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=95.0][y=59.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=78.0][y=77.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=51.0][y=45.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=52.0][y=71.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=68.0][y=29.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=2.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=89.0][y=8.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=44.0][y=48.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=98.0][y=77.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=91.0][y=8.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=40.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=13.0][y=6.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=61.0][y=17.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=65.0][y=40.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=52.0][y=86.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=59.0][y=54.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=12.0][y=96.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=10.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=64.0][y=23.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=52.0][y=86.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=31.0][y=37.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=83.0][y=3.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=86.0][y=96.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=92.0][y=93.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=49.0][y=86.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=9.0][y=46.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=83.0][y=37.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=55.0][y=24.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=11.0][y=32.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=86.0][y=67.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=19.0][y=3.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=51.0][y=48.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=33.0][y=37.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=58.0][y=36.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=16.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=81.0][y=52.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=53.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=21.0][y=5.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=44.0][y=45.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=6.0][y=78.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=38.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=81.0][y=5.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=91.0][y=88.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=28.0][y=22.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=47.0][y=37.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=74.0][y=49.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=9.0][y=92.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=87.0][y=79.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=68.0][y=18.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=45.0][y=93.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=38.0][y=20.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=38.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=77.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=53.0][y=6.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=35.0][y=37.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=10.0][y=92.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=48.0][y=18.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=86.0][y=5.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=73.0][y=1.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=17.0][y=66.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=94.0][y=80.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=90.0][y=89.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=4.0][y=92.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=15.0][y=87.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=65.0][y=48.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=97.0][y=11.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=18.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=5.0][y=69.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=49.0][y=16.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=2.0][y=69.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=13.0][y=31.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=3.0][y=90.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=96.0][y=46.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=42.0][y=39.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=14.0][y=17.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=98.0][y=31.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=37.0][y=25.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=95.0][y=45.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=30.0][y=7.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=83.0][y=30.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=89.0][y=57.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=37.0][y=69.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=60.0][y=91.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=94.0][y=5.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=4.0][y=15.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=46.0][y=50.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=7.0][y=59.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=27.0][y=42.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=78.0][y=40.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=54.0][y=57.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=70.0][y=15.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=81.0][y=18.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=67.0][y=44.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=35.0][y=27.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=43.0][y=79.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=20.0][y=76.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=96.0][y=18.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=7.0][y=56.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=27.0][y=74.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=84.0][y=55.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=75.0][y=89.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=64.0][y=74.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=35.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=45.0][y=6.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=95.0][y=76.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=11.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=20.0][y=71.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=59.0][y=8.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=64.0][y=77.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=76.0][y=73.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=39.0][y=60.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=29.0][y=37.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=93.0][y=84.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=44.0][y=81.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=69.0][y=93.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=62.0][y=43.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=74.0][y=86.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=85.0][y=62.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=63.0][y=40.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=43.0][y=91.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=49.0][y=52.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=67.0][y=44.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=48.0][y=82.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=16.0][y=50.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=22.0][y=97.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=6.0][y=77.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=36.0][y=95.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=55.0][y=14.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=14.0][y=27.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=24.0][y=97.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=45.0][y=98.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=24.0][y=60.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=1.0][y=11.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=89.0][y=66.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=6.0][y=69.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=32.0][y=31.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=50.0][y=15.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=18.0][y=68.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=71.0][y=38.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=16.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=73.0][y=7.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=1.0][y=90.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=16.0][y=46.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=100.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=87.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=32.0][y=3.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=2.0][y=24.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=82.0][y=7.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=42.0][y=53.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=73.0][y=1.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=72.0][y=48.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=22.0][y=31.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=22.0][y=61.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=86.0][y=92.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=50.0][y=19.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=30.0][y=70.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=42.0][y=7.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=99.0][y=29.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=94.0][y=39.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=62.0][y=53.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=69.0][y=21.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=58.0][y=82.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=34.0][y=62.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=81.0][y=54.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=74.0][y=58.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=84.0][y=61.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=66.0][y=66.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=99.0][y=22.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=18.0][y=4.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=55.0][y=59.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=18.0][y=36.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=43.0][y=86.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=33.0][y=83.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=28.0][y=55.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=56.0][y=82.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=95.0][y=63.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=11.0][y=17.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=39.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=83.0][y=66.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=47.0][y=79.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=96.0][y=19.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=12.0][y=16.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=13.0][y=53.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=26.0][y=9.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=11.0][y=1.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=19.0][y=69.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=75.0][y=54.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=31.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=72.0][y=98.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=94.0][y=84.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=21.0][y=24.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=91.0][y=42.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=35.0][y=86.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=86.0][y=10.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=24.0][y=60.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=89.0][y=16.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=18.0][y=2.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=27.0][y=85.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=20.0][y=6.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=61.0][y=3.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=74.0][y=44.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=93.0][y=72.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=35.0][y=38.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=100.0][y=83.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=60.0][y=5.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=97.0][y=9.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=70.0][y=87.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=51.0][y=26.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=44.0][y=64.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=58.0][y=4.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=36.0][y=31.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=65.0][y=18.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=73.0][y=49.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=34.0][y=72.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=94.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=89.0][y=77.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=83.0][y=2.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=6.0][y=19.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=10.0][y=8.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=85.0][y=32.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=56.0][y=86.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=51.0][y=77.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=43.0][y=8.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=55.0][y=63.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=54.0][y=10.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=62.0][y=39.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=20.0][y=73.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=23.0][y=96.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=46.0][y=77.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=62.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=71.0][y=91.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=2.0][y=55.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=48.0][y=48.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=87.0][y=100.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=97.0][y=32.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=3.0][y=37.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=43.0][y=56.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=65.0][y=75.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=19.0][y=11.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=21.0][y=77.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=83.0][y=42.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=66.0][y=90.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=23.0][y=70.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=19.0][y=48.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=91.0][y=68.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=11.0][y=85.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=77.0][y=26.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=6.0][y=49.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=82.0][y=68.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=88.0][y=90.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=71.0][y=92.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=20.0][y=64.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=33.0][y=16.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=13.0][y=39.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=60.0][y=76.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=52.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=15.0][y=13.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=66.0][y=74.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=31.0][y=17.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=27.0][y=31.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=22.0][y=9.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=55.0][y=64.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=98.0][y=58.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=14.0][y=68.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=59.0][y=14.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=91.0][y=71.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=14.0][y=93.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=47.0][y=66.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=62.0][y=71.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=74.0][y=21.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=79.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=20.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=14.0][y=19.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=29.0][y=52.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=51.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=36.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=14.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=30.0][y=4.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=35.0][y=89.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=32.0][y=45.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=69.0][y=43.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=79.0][y=33.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=66.0][y=13.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=83.0][y=96.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=54.0][y=87.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=34.0][y=81.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=80.0][y=71.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=10.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=15.0][y=88.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=99.0][y=70.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=22.0][y=23.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=40.0][y=40.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=28.0][y=97.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=59.0][y=100.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=60.0][y=16.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=79.0][y=93.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=14.0][y=11.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=23.0][y=42.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=87.0][y=40.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=66.0][y=35.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=60.0][y=50.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=23.0][y=15.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=5.0][y=10.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=77.0][y=35.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=59.0][y=66.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=21.0][y=2.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=30.0][y=92.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=28.0][y=26.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=94.0][y=38.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=15.0][y=73.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=76.0][y=77.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=85.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=61.0][y=90.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=7.0][y=16.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=15.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=89.0][y=18.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=39.0][y=27.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=82.0][y=32.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=10.0][y=97.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=21.0][y=58.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=24.0][y=25.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=53.0][y=23.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=83.0][y=73.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=65.0][y=73.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=49.0][y=17.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=73.0][y=78.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=84.0][y=2.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=7.0][y=53.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=72.0][y=14.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=68.0][y=59.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=51.0][y=82.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=78.0][y=97.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=21.0][y=62.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=85.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=53.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=90.0][y=38.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=80.0][y=19.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=95.0][y=49.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=67.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=22.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=84.0][y=13.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=82.0][y=39.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=50.0][y=22.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=57.0][y=6.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=53.0][y=86.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=17.0][y=2.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=53.0][y=10.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=89.0][y=9.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=87.0][y=21.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=75.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=73.0][y=16.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=49.0][y=20.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=36.0][y=19.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=81.0][y=1.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=29.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=44.0][y=39.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=68.0][y=46.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=44.0][y=49.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=82.0][y=64.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=87.0][y=87.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=62.0][y=24.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=67.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=8.0][y=81.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=38.0][y=38.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=65.0][y=68.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=43.0][y=91.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=73.0][y=43.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=37.0][y=75.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=64.0][y=24.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=26.0][y=52.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=58.0][y=56.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=92.0][y=50.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=61.0][y=7.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=82.0][y=52.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=79.0][y=56.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=45.0][y=32.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=43.0][y=96.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=94.0][y=96.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=32.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=53.0][y=36.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=55.0][y=54.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=13.0][y=39.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=19.0][y=15.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=44.0][y=42.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=85.0][y=62.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=39.0][y=38.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=9.0][y=67.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=85.0][y=82.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=1.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=3.0][y=82.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=58.0][y=90.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=54.0][y=23.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=58.0][y=40.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=48.0][y=69.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=97.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=34.0][y=3.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=91.0][y=87.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=38.0][y=89.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=59.0][y=42.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=63.0][y=79.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=79.0][y=69.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=80.0][y=63.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=16.0][y=48.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=74.0][y=34.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=2.0][y=33.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=61.0][y=22.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=43.0][y=10.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=44.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=41.0][y=87.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=3.0][y=45.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=64.0][y=87.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=26.0][y=15.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=69.0][y=48.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=75.0][y=31.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=67.0][y=66.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=29.0][y=26.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=94.0][y=93.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=72.0][y=81.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=97.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=84.0][y=40.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=80.0][y=96.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=47.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=57.0][y=22.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=74.0][y=59.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=61.0][y=80.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=40.0][y=55.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=4.0][y=22.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=64.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=3.0][y=26.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=22.0][y=77.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=77.0][y=10.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=63.0][y=64.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=73.0][y=72.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=5.0][y=30.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=47.0][y=38.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=39.0][y=85.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=54.0][y=21.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=4.0][y=35.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=69.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=53.0][y=31.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=44.0][y=72.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=43.0][y=87.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=75.0][y=76.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=36.0][y=56.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=22.0][y=55.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=47.0][y=60.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=74.0][y=26.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=36.0][y=82.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=97.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=64.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=89.0][y=68.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=43.0][y=59.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=10.0][y=46.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=9.0][y=75.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=83.0][y=48.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=56.0][y=100.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=98.0][y=35.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=5.0][y=30.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=72.0][y=36.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=48.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=31.0][y=21.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=89.0][y=79.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=81.0][y=77.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=81.0][y=1.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=62.0][y=24.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=56.0][y=14.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=32.0][y=91.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=22.0][y=84.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=22.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=14.0][y=22.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=11.0][y=82.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=1.0][y=21.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=99.0][y=42.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=12.0][y=15.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=73.0][y=86.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=23.0][y=89.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=44.0][y=39.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=36.0][y=100.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=78.0][y=53.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=6.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=41.0][y=82.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=35.0][y=52.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=91.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=62.0][y=93.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=17.0][y=60.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=74.0][y=75.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=70.0][y=67.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=63.0][y=3.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=100.0][y=5.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=6.0][y=4.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=100.0][y=19.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=11.0][y=40.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=47.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=99.0][y=83.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=41.0][y=39.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=54.0][y=53.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=48.0][y=24.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=31.0][y=94.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=79.0][y=64.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=7.0][y=34.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=23.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=63.0][y=97.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=94.0][y=7.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=64.0][y=76.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=47.0][y=34.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=3.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=40.0][y=74.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=44.0][y=24.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=21.0][y=61.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=83.0][y=22.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=75.0][y=88.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=37.0][y=20.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=30.0][y=57.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=23.0][y=36.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=98.0][y=17.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=3.0][y=84.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=72.0][y=66.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=87.0][y=92.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=91.0][y=93.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=54.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=37.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=52.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=54.0][y=89.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=15.0][y=38.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=13.0][y=71.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=21.0][y=35.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=8.0][y=87.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=6.0][y=14.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=95.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=17.0][y=61.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=100.0][y=58.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=55.0][y=4.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=19.0][y=9.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=10.0][y=34.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=38.0][y=81.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=73.0][y=42.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=20.0][y=54.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=14.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=73.0][y=9.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=66.0][y=14.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=29.0][y=3.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=20.0][y=24.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=75.0][y=71.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=35.0][y=35.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=82.0][y=27.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=20.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=47.0][y=6.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=18.0][y=40.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=3.0][y=48.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=76.0][y=100.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=88.0][y=5.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=32.0][y=67.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=24.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=5.0][y=63.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=98.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=3.0][y=53.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=81.0][y=96.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=60.0][y=74.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=36.0][y=17.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=57.0][y=18.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=41.0][y=91.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=34.0][y=83.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=59.0][y=27.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=92.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=39.0][y=53.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=49.0][y=36.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=3.0][y=52.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=71.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=60.0][y=11.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=95.0][y=23.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=31.0][y=70.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=91.0][y=68.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=15.0][y=21.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=99.0][y=8.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=89.0][y=54.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=37.0][y=8.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=3.0][y=7.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=41.0][y=78.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=59.0][y=25.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=26.0][y=34.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=32.0][y=85.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=16.0][y=77.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=70.0][y=63.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=48.0][y=88.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=60.0][y=66.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=71.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=60.0][y=3.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=82.0][y=85.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=3.0][y=20.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=19.0][y=96.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=6.0][y=98.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=78.0][y=9.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=66.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=88.0][y=19.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=70.0][y=82.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=23.0][y=75.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=4.0][y=88.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=79.0][y=93.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=3.0][y=40.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=32.0][y=21.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=83.0][y=6.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=40.0][y=100.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=68.0][y=54.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=12.0][y=93.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=24.0][y=52.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=22.0][y=62.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=17.0][y=61.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=32.0][y=80.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=4.0][y=22.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=9.0][y=81.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=57.0][y=35.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=92.0][y=20.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=69.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=17.0][y=21.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=8.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=10.0][y=76.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=20.0][y=94.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=51.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=7.0][y=83.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=93.0][y=50.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=69.0][y=2.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=52.0][y=5.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=86.0][y=61.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=72.0][y=29.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=62.0][y=74.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=54.0][y=38.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=23.0][y=86.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=4.0][y=7.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=27.0][y=27.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=78.0][y=7.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=40.0][y=88.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=77.0][y=16.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=9.0][y=82.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=57.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=45.0][y=57.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=43.0][y=20.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=35.0][y=84.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=23.0][y=1.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=52.0][y=16.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=95.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=54.0][y=11.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=77.0][y=15.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=90.0][y=21.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=68.0][y=69.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=92.0][y=30.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=1.0][y=100.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=54.0][y=49.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=61.0][y=91.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=39.0][y=85.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=82.0][y=42.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - + diff --git a/jsprit-core/src/test/resources/pdp_sol.xml b/jsprit-core/src/test/resources/pdp_sol.xml deleted file mode 100644 index 39951df4..00000000 --- a/jsprit-core/src/test/resources/pdp_sol.xml +++ /dev/null @@ -1,35581 +0,0 @@ - - - - INFINITE - HOMOGENEOUS - - - - v - t - - [x=10.0][y=10.0] - - - - 0.0 - 500.0 - - - - - - t - 5 - - 0.0 - 1.0 - - - - - - - - [x=77.0][y=23.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=20.0][y=39.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=67.0][y=1.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=41.0][y=7.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=57.0][y=96.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=36.0][y=97.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=28.0][y=84.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=93.0][y=44.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=3.0][y=36.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=77.0][y=6.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=45.0][y=11.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=63.0][y=80.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=4.0][y=84.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=93.0][y=23.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=80.0][y=9.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=19.0][y=76.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=8.0][y=23.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=84.0][y=33.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=26.0][y=89.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=48.0][y=55.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=78.0][y=43.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=66.0][y=44.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=73.0][y=38.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=89.0][y=40.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=22.0][y=62.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=6.0][y=60.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=56.0][y=17.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=84.0][y=71.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=26.0][y=60.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=37.0][y=25.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=96.0][y=35.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=93.0][y=20.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=1.0][y=18.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=56.0][y=33.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=93.0][y=44.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=5.0][y=90.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=31.0][y=63.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=12.0][y=56.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=24.0][y=15.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=36.0][y=4.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=87.0][y=31.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=31.0][y=71.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=11.0][y=29.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=78.0][y=30.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=94.0][y=42.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=56.0][y=86.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=59.0][y=54.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=11.0][y=92.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=43.0][y=73.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=43.0][y=27.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=24.0][y=97.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=89.0][y=98.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=48.0][y=82.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=45.0][y=62.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=89.0][y=90.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=6.0][y=25.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=69.0][y=76.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=17.0][y=57.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=16.0][y=82.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=66.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=40.0][y=56.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=51.0][y=5.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=71.0][y=21.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=3.0][y=58.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=40.0][y=52.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=34.0][y=86.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=54.0][y=14.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=55.0][y=71.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=53.0][y=63.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=77.0][y=93.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=63.0][y=35.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=16.0][y=95.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=84.0][y=90.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=96.0][y=2.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=86.0][y=80.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=72.0][y=79.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=8.0][y=48.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=8.0][y=1.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=59.0][y=38.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=75.0][y=59.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=54.0][y=55.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=3.0][y=82.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=92.0][y=38.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=17.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=65.0][y=1.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=17.0][y=69.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=32.0][y=100.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=82.0][y=30.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=90.0][y=56.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=52.0][y=29.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=95.0][y=97.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=93.0][y=26.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=82.0][y=32.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=52.0][y=13.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=74.0][y=92.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=1.0][y=82.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=54.0][y=25.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=62.0][y=96.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=64.0][y=19.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=86.0][y=54.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=88.0][y=17.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=17.0][y=1.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=27.0][y=8.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=62.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=11.0][y=70.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=90.0][y=19.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=82.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=12.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=72.0][y=71.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=57.0][y=36.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=67.0][y=91.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=100.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=26.0][y=38.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=15.0][y=8.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=79.0][y=90.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=36.0][y=15.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=30.0][y=87.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=50.0][y=38.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=67.0][y=35.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=77.0][y=3.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=96.0][y=89.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=5.0][y=96.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=81.0][y=23.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=95.0][y=54.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=97.0][y=46.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=95.0][y=7.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=42.0][y=36.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=25.0][y=19.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=26.0][y=79.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=45.0][y=79.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=86.0][y=76.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=41.0][y=88.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=1.0][y=39.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=41.0][y=94.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=57.0][y=4.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=92.0][y=81.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=56.0][y=37.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=32.0][y=89.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=33.0][y=7.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=68.0][y=82.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=15.0][y=77.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=52.0][y=36.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=61.0][y=56.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=33.0][y=2.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=38.0][y=49.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=34.0][y=42.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=15.0][y=64.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=77.0][y=76.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=1.0][y=55.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=89.0][y=39.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=46.0][y=42.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=47.0][y=36.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=40.0][y=52.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=2.0][y=42.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=14.0][y=35.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=61.0][y=19.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=26.0][y=42.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=56.0][y=39.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=18.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=2.0][y=54.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=48.0][y=94.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=63.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=33.0][y=90.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=8.0][y=29.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=64.0][y=20.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=38.0][y=35.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=38.0][y=93.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=88.0][y=15.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=5.0][y=9.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=46.0][y=35.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=73.0][y=37.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=46.0][y=64.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=51.0][y=20.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=31.0][y=60.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=75.0][y=79.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=96.0][y=52.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=72.0][y=68.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=100.0][y=56.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=36.0][y=22.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=93.0][y=81.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=78.0][y=38.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=60.0][y=6.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=34.0][y=50.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=32.0][y=96.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=61.0][y=57.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=68.0][y=3.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=33.0][y=79.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=16.0][y=87.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=81.0][y=73.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=31.0][y=27.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=23.0][y=34.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=21.0][y=50.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=51.0][y=88.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=3.0][y=38.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=73.0][y=59.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=53.0][y=20.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=3.0][y=19.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=60.0][y=88.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=99.0][y=36.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=88.0][y=40.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=36.0][y=90.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=46.0][y=77.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=20.0][y=32.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=24.0][y=77.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=25.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=99.0][y=97.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=22.0][y=59.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=6.0][y=34.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=61.0][y=62.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=68.0][y=57.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=25.0][y=52.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=71.0][y=73.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=57.0][y=25.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=40.0][y=21.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=17.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=57.0][y=83.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=74.0][y=18.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=94.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=43.0][y=69.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=85.0][y=10.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=90.0][y=4.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=40.0][y=69.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=69.0][y=67.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=66.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=68.0][y=23.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=56.0][y=89.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=75.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=9.0][y=25.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=12.0][y=38.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=17.0][y=68.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=58.0][y=57.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=33.0][y=8.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=10.0][y=40.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=33.0][y=24.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=59.0][y=85.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=40.0][y=36.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=12.0][y=64.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=89.0][y=79.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=95.0][y=54.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=70.0][y=30.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=85.0][y=17.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=95.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=82.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=59.0][y=33.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=17.0][y=95.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=78.0][y=9.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=49.0][y=64.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=32.0][y=15.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=58.0][y=32.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=13.0][y=60.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=88.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=23.0][y=2.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=29.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=9.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=16.0][y=1.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=2.0][y=96.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=37.0][y=78.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=85.0][y=52.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=93.0][y=88.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=43.0][y=30.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=90.0][y=62.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=65.0][y=33.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=91.0][y=46.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=74.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=27.0][y=45.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=17.0][y=46.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=78.0][y=73.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=26.0][y=15.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=79.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=43.0][y=67.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=92.0][y=100.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=71.0][y=9.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=53.0][y=45.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=6.0][y=37.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=48.0][y=57.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=22.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=85.0][y=45.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=36.0][y=14.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=63.0][y=34.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=92.0][y=67.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=46.0][y=40.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=58.0][y=60.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=20.0][y=58.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=32.0][y=97.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=61.0][y=22.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=46.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=35.0][y=2.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=39.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=56.0][y=21.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=67.0][y=49.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=9.0][y=88.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=41.0][y=20.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=43.0][y=33.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=63.0][y=5.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=57.0][y=78.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=11.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=35.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=63.0][y=59.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=51.0][y=34.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=72.0][y=64.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=3.0][y=21.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=78.0][y=27.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=50.0][y=27.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=69.0][y=15.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=36.0][y=79.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=21.0][y=43.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=95.0][y=45.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=38.0][y=40.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=21.0][y=54.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=42.0][y=68.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=24.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=97.0][y=6.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=61.0][y=49.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=55.0][y=97.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=12.0][y=81.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=65.0][y=3.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=64.0][y=15.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=9.0][y=24.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=43.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=2.0][y=62.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=84.0][y=84.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=89.0][y=6.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=33.0][y=39.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=21.0][y=38.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=55.0][y=61.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=56.0][y=53.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=98.0][y=20.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=76.0][y=74.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=43.0][y=68.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=52.0][y=45.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=58.0][y=64.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=95.0][y=79.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=55.0][y=7.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=29.0][y=27.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=18.0][y=72.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=83.0][y=84.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=21.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=35.0][y=97.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=9.0][y=2.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=81.0][y=98.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=37.0][y=57.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=24.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=29.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=32.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=13.0][y=4.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=69.0][y=93.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=80.0][y=33.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=47.0][y=71.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=32.0][y=57.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=24.0][y=95.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=67.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=58.0][y=96.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=36.0][y=23.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=60.0][y=13.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=26.0][y=66.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=92.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=23.0][y=22.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=2.0][y=95.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=40.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=92.0][y=57.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=5.0][y=4.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=99.0][y=92.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=86.0][y=24.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=43.0][y=59.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=95.0][y=56.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=61.0][y=18.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=31.0][y=18.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=58.0][y=93.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=92.0][y=80.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=72.0][y=71.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=88.0][y=72.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=4.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=38.0][y=77.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=84.0][y=6.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=29.0][y=46.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=99.0][y=77.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=7.0][y=26.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=73.0][y=30.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=72.0][y=91.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=78.0][y=85.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=81.0][y=9.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=25.0][y=21.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=97.0][y=91.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=51.0][y=35.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=63.0][y=77.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=74.0][y=98.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=93.0][y=72.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=30.0][y=10.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=18.0][y=72.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=28.0][y=16.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=6.0][y=73.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=30.0][y=1.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=67.0][y=63.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=55.0][y=29.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=14.0][y=45.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=45.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=59.0][y=33.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=41.0][y=42.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=69.0][y=48.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=60.0][y=35.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=35.0][y=32.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=98.0][y=32.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=5.0][y=60.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=86.0][y=86.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=16.0][y=52.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=28.0][y=91.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=96.0][y=14.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=67.0][y=62.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=34.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=46.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=91.0][y=87.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=68.0][y=73.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=23.0][y=95.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=58.0][y=4.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=63.0][y=29.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=37.0][y=1.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=89.0][y=98.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=27.0][y=59.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=22.0][y=73.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=5.0][y=88.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=54.0][y=25.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=94.0][y=86.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=20.0][y=19.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=34.0][y=98.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=16.0][y=48.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=13.0][y=71.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=49.0][y=80.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=53.0][y=59.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=56.0][y=76.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=40.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=30.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=84.0][y=24.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=51.0][y=32.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=99.0][y=3.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=85.0][y=91.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=14.0][y=89.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=36.0][y=86.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=51.0][y=55.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=44.0][y=27.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=39.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=25.0][y=53.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=3.0][y=24.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=62.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=60.0][y=84.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=49.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=98.0][y=22.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=59.0][y=20.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=18.0][y=35.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=56.0][y=86.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=82.0][y=96.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=72.0][y=77.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=15.0][y=56.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=74.0][y=20.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=99.0][y=56.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=4.0][y=66.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=72.0][y=35.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=17.0][y=18.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=89.0][y=48.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=92.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=50.0][y=30.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=94.0][y=54.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=94.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=32.0][y=86.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=59.0][y=68.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=27.0][y=58.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=82.0][y=90.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=14.0][y=80.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=41.0][y=22.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=80.0][y=59.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=85.0][y=62.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=24.0][y=64.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=31.0][y=83.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=92.0][y=49.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=100.0][y=46.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=76.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=37.0][y=89.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=10.0][y=44.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=24.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=17.0][y=61.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=4.0][y=73.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=14.0][y=93.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=68.0][y=64.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=74.0][y=15.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=77.0][y=32.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=22.0][y=67.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=12.0][y=68.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=75.0][y=56.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=72.0][y=93.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=95.0][y=23.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=95.0][y=4.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=26.0][y=84.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=54.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=21.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=2.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=86.0][y=66.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=99.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=5.0][y=62.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=46.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=52.0][y=26.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=25.0][y=66.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=44.0][y=13.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=57.0][y=70.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=26.0][y=79.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=79.0][y=80.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=14.0][y=57.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=82.0][y=1.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=37.0][y=38.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=29.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=88.0][y=17.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=35.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=43.0][y=50.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=42.0][y=39.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=57.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=65.0][y=96.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=29.0][y=94.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=79.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=42.0][y=37.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=99.0][y=40.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=41.0][y=82.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=90.0][y=94.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=81.0][y=69.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=61.0][y=59.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=18.0][y=98.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=30.0][y=72.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=54.0][y=50.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=74.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=7.0][y=84.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=85.0][y=63.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=97.0][y=81.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=36.0][y=67.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=63.0][y=88.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=9.0][y=31.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=72.0][y=3.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=49.0][y=19.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=78.0][y=45.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=91.0][y=30.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=50.0][y=3.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=3.0][y=87.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=53.0][y=21.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=16.0][y=22.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=96.0][y=61.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=6.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=77.0][y=23.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=84.0][y=95.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=98.0][y=6.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=13.0][y=30.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=29.0][y=79.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=41.0][y=66.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=26.0][y=20.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=54.0][y=75.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=97.0][y=89.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=11.0][y=57.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=20.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=43.0][y=100.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=17.0][y=26.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=82.0][y=48.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=59.0][y=33.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=17.0][y=27.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=66.0][y=56.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=63.0][y=35.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=8.0][y=44.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=31.0][y=33.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=2.0][y=85.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=4.0][y=79.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=48.0][y=58.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=82.0][y=37.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=13.0][y=93.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=49.0][y=79.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=100.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=56.0][y=26.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=49.0][y=32.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=83.0][y=10.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=99.0][y=68.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=17.0][y=48.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=76.0][y=50.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=96.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=88.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=44.0][y=70.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=97.0][y=73.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=27.0][y=64.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=61.0][y=17.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=57.0][y=66.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=17.0][y=80.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=65.0][y=64.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=6.0][y=37.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=54.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=92.0][y=95.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=4.0][y=46.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=46.0][y=88.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=32.0][y=76.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=67.0][y=62.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=83.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=81.0][y=75.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=75.0][y=27.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=22.0][y=60.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=80.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=17.0][y=24.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=82.0][y=35.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=11.0][y=100.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=60.0][y=14.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=35.0][y=1.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=55.0][y=87.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=33.0][y=39.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=87.0][y=21.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=47.0][y=66.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=33.0][y=17.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=19.0][y=69.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=59.0][y=5.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=24.0][y=46.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=5.0][y=22.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=76.0][y=79.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=16.0][y=39.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=45.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=5.0][y=15.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=15.0][y=64.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=58.0][y=66.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=23.0][y=10.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=92.0][y=44.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=9.0][y=60.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=11.0][y=60.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=79.0][y=11.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=59.0][y=42.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=27.0][y=73.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=100.0][y=3.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=97.0][y=74.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=42.0][y=45.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=26.0][y=50.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=17.0][y=20.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=24.0][y=74.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=91.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=75.0][y=10.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=40.0][y=45.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=80.0][y=29.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=20.0][y=2.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=60.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=45.0][y=9.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=48.0][y=89.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=34.0][y=20.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=35.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=81.0][y=14.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=41.0][y=21.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=50.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=100.0][y=64.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=22.0][y=11.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=27.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=78.0][y=19.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=14.0][y=18.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=92.0][y=96.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=10.0][y=52.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=81.0][y=30.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=38.0][y=46.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=32.0][y=92.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=70.0][y=100.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=20.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=45.0][y=49.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=70.0][y=75.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=11.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=54.0][y=8.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=62.0][y=20.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=84.0][y=67.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=38.0][y=93.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=14.0][y=78.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=89.0][y=37.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=19.0][y=96.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=24.0][y=72.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=8.0][y=38.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=7.0][y=6.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=15.0][y=27.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=80.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=44.0][y=15.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=64.0][y=96.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=18.0][y=49.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=53.0][y=35.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=7.0][y=61.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=47.0][y=37.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=38.0][y=30.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=29.0][y=52.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=9.0][y=69.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=8.0][y=18.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=9.0][y=38.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=14.0][y=13.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=50.0][y=89.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=52.0][y=87.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=22.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=28.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=51.0][y=1.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=28.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=27.0][y=4.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=13.0][y=70.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=92.0][y=63.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=81.0][y=62.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=77.0][y=85.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=47.0][y=7.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=41.0][y=7.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=87.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=83.0][y=64.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=70.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=57.0][y=69.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=19.0][y=9.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=39.0][y=73.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=44.0][y=90.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=89.0][y=32.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=100.0][y=15.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=93.0][y=29.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=58.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=3.0][y=55.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=21.0][y=79.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=81.0][y=46.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=38.0][y=95.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=51.0][y=9.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=75.0][y=50.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=10.0][y=26.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=80.0][y=21.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=3.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=11.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=19.0][y=49.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=34.0][y=94.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=5.0][y=16.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=5.0][y=98.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=17.0][y=8.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=75.0][y=76.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=7.0][y=20.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=100.0][y=40.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=56.0][y=56.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=56.0][y=19.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=30.0][y=37.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=57.0][y=35.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=55.0][y=70.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=56.0][y=90.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=68.0][y=16.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=48.0][y=26.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=94.0][y=36.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=44.0][y=44.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=43.0][y=11.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=69.0][y=26.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=1.0][y=70.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=29.0][y=88.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=68.0][y=33.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=14.0][y=38.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=73.0][y=69.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=89.0][y=36.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=61.0][y=13.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=73.0][y=20.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=37.0][y=34.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=51.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=38.0][y=40.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=93.0][y=61.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=27.0][y=92.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=31.0][y=83.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=51.0][y=59.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=65.0][y=80.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=85.0][y=80.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=21.0][y=32.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=59.0][y=92.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=51.0][y=3.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=47.0][y=75.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=88.0][y=6.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=46.0][y=42.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=53.0][y=78.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=32.0][y=92.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=49.0][y=62.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=92.0][y=32.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=42.0][y=55.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=93.0][y=19.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=1.0][y=2.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=42.0][y=20.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=89.0][y=35.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=61.0][y=79.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=54.0][y=10.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=32.0][y=94.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=73.0][y=50.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=64.0][y=84.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=86.0][y=92.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=46.0][y=36.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=73.0][y=63.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=22.0][y=74.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=16.0][y=89.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=27.0][y=50.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=99.0][y=67.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=61.0][y=68.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=13.0][y=34.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=16.0][y=67.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=27.0][y=42.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=79.0][y=4.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=92.0][y=29.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=26.0][y=72.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=55.0][y=71.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=33.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=81.0][y=15.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=64.0][y=84.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=89.0][y=83.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=90.0][y=88.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=81.0][y=100.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=32.0][y=75.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=31.0][y=86.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=7.0][y=23.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=36.0][y=35.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=88.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=74.0][y=68.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=92.0][y=69.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=28.0][y=56.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=62.0][y=70.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=79.0][y=84.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=59.0][y=30.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=45.0][y=72.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=82.0][y=9.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=36.0][y=42.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=6.0][y=15.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=61.0][y=98.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=17.0][y=20.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=9.0][y=68.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=67.0][y=35.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=82.0][y=90.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=46.0][y=46.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=64.0][y=52.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=2.0][y=25.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=53.0][y=39.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=95.0][y=63.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=86.0][y=39.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=79.0][y=22.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=42.0][y=44.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=15.0][y=6.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=12.0][y=14.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=28.0][y=96.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=34.0][y=92.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=56.0][y=80.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=80.0][y=72.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=44.0][y=7.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=12.0][y=87.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=69.0][y=10.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=53.0][y=16.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=47.0][y=27.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=39.0][y=82.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=66.0][y=66.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=37.0][y=17.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=89.0][y=7.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=14.0][y=93.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=23.0][y=36.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=80.0][y=64.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=31.0][y=30.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=31.0][y=85.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=91.0][y=39.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=55.0][y=34.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=88.0][y=31.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=37.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=91.0][y=4.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=23.0][y=77.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=44.0][y=78.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=37.0][y=2.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=87.0][y=66.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=65.0][y=66.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=39.0][y=89.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=42.0][y=1.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=93.0][y=66.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=36.0][y=18.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=31.0][y=48.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=65.0][y=57.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=41.0][y=26.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=44.0][y=57.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=49.0][y=29.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=39.0][y=70.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=47.0][y=100.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=19.0][y=96.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=32.0][y=100.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=34.0][y=60.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=3.0][y=29.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=80.0][y=80.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=57.0][y=75.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=26.0][y=52.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=85.0][y=64.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=13.0][y=97.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=9.0][y=5.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=12.0][y=91.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=53.0][y=92.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=12.0][y=23.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=68.0][y=55.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=37.0][y=88.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=23.0][y=9.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=88.0][y=44.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=79.0][y=48.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=70.0][y=75.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=4.0][y=35.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=16.0][y=50.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=48.0][y=6.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=56.0][y=77.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=27.0][y=62.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=94.0][y=54.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=72.0][y=72.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=44.0][y=24.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=91.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=27.0][y=57.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=15.0][y=73.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=54.0][y=22.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=4.0][y=2.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=13.0][y=11.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=2.0][y=76.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=37.0][y=9.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=33.0][y=6.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=53.0][y=92.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=17.0][y=98.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=13.0][y=70.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=44.0][y=4.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=94.0][y=88.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=95.0][y=76.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=47.0][y=18.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=99.0][y=45.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=24.0][y=54.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=9.0][y=36.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=83.0][y=57.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=73.0][y=29.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=51.0][y=73.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=51.0][y=64.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=92.0][y=3.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=6.0][y=18.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=34.0][y=27.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=57.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=15.0][y=36.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=4.0][y=72.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=79.0][y=42.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=57.0][y=42.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=17.0][y=11.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=63.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=66.0][y=58.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=75.0][y=14.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=19.0][y=38.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=62.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=20.0][y=75.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=81.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=89.0][y=18.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=22.0][y=91.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=69.0][y=57.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=51.0][y=15.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=50.0][y=80.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=4.0][y=85.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=31.0][y=18.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=41.0][y=97.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=6.0][y=86.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=69.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=48.0][y=16.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=68.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=85.0][y=48.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=47.0][y=17.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=77.0][y=16.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=57.0][y=55.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=31.0][y=23.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=86.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=13.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=25.0][y=58.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=98.0][y=64.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=76.0][y=92.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=61.0][y=60.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=20.0][y=19.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=21.0][y=31.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=97.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=97.0][y=75.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=3.0][y=15.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=73.0][y=49.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=49.0][y=95.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=34.0][y=3.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=73.0][y=9.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=66.0][y=17.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=77.0][y=97.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=98.0][y=5.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=14.0][y=40.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=49.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=41.0][y=43.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=43.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=26.0][y=61.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=98.0][y=16.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=83.0][y=50.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=47.0][y=85.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=99.0][y=17.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=4.0][y=87.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=25.0][y=27.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=67.0][y=21.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=70.0][y=21.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=70.0][y=45.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=28.0][y=14.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=95.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=69.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=68.0][y=67.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=19.0][y=16.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=98.0][y=5.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=18.0][y=7.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=50.0][y=62.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=5.0][y=45.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=38.0][y=52.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=32.0][y=95.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=15.0][y=40.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=33.0][y=66.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=21.0][y=73.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=55.0][y=100.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=23.0][y=13.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=60.0][y=32.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=8.0][y=94.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=56.0][y=18.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=36.0][y=37.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=89.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=90.0][y=71.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=86.0][y=60.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=24.0][y=31.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=85.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=31.0][y=1.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=49.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=83.0][y=43.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=60.0][y=25.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=81.0][y=32.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=98.0][y=68.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=65.0][y=72.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=22.0][y=68.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=32.0][y=88.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=56.0][y=55.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=83.0][y=74.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=41.0][y=19.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=100.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=87.0][y=92.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=8.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=2.0][y=6.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=35.0][y=58.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=43.0][y=34.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=16.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=43.0][y=70.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=7.0][y=42.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=97.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=24.0][y=94.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=80.0][y=100.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=46.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=62.0][y=10.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=90.0][y=18.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=65.0][y=78.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=80.0][y=70.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=34.0][y=21.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=6.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=15.0][y=55.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=82.0][y=23.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=47.0][y=48.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=89.0][y=82.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=98.0][y=3.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=62.0][y=66.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=61.0][y=13.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=18.0][y=70.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=28.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=35.0][y=96.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=91.0][y=16.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=62.0][y=95.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=78.0][y=80.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=67.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=58.0][y=81.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=82.0][y=63.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=71.0][y=16.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=20.0][y=73.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=8.0][y=62.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=31.0][y=90.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=44.0][y=33.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=40.0][y=13.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=80.0][y=16.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=49.0][y=3.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=30.0][y=18.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=6.0][y=91.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=63.0][y=68.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=93.0][y=32.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=61.0][y=52.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=80.0][y=25.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=51.0][y=50.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=91.0][y=96.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=28.0][y=49.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=84.0][y=35.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=13.0][y=10.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=23.0][y=61.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=99.0][y=82.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=13.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=7.0][y=78.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=8.0][y=81.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=21.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=89.0][y=27.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=9.0][y=38.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=53.0][y=10.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=61.0][y=61.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=16.0][y=77.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=85.0][y=4.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=45.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=32.0][y=43.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=90.0][y=6.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=63.0][y=7.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=15.0][y=91.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=4.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=28.0][y=44.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=40.0][y=11.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=5.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=47.0][y=77.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=24.0][y=24.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=11.0][y=46.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=60.0][y=91.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=21.0][y=29.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=42.0][y=55.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=66.0][y=17.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=93.0][y=13.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=91.0][y=67.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=68.0][y=52.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=64.0][y=34.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=39.0][y=75.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=55.0][y=78.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=43.0][y=19.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=94.0][y=43.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=94.0][y=63.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=66.0][y=73.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=52.0][y=21.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=100.0][y=27.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=25.0][y=98.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=94.0][y=2.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=42.0][y=42.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=75.0][y=71.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=14.0][y=80.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=86.0][y=44.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=43.0][y=25.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=47.0][y=62.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=85.0][y=11.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=28.0][y=6.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=44.0][y=19.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=54.0][y=92.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=21.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=28.0][y=57.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=81.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=80.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=52.0][y=73.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=35.0][y=27.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=97.0][y=34.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=70.0][y=18.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=69.0][y=20.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=35.0][y=27.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=51.0][y=63.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=67.0][y=44.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=63.0][y=62.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=4.0][y=50.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=4.0][y=19.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=76.0][y=31.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=30.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=49.0][y=45.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=24.0][y=6.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=100.0][y=17.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=85.0][y=72.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=33.0][y=91.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=24.0][y=62.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=91.0][y=17.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=42.0][y=30.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=9.0][y=74.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=67.0][y=98.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=43.0][y=93.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=100.0][y=38.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=49.0][y=46.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=66.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=15.0][y=49.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=43.0][y=63.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=19.0][y=97.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=80.0][y=37.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=66.0][y=77.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=95.0][y=66.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=25.0][y=37.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=20.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=81.0][y=61.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=78.0][y=3.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=30.0][y=14.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=61.0][y=31.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=3.0][y=31.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=26.0][y=16.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=8.0][y=72.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=47.0][y=50.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=50.0][y=49.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=49.0][y=5.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=39.0][y=57.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=35.0][y=26.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=87.0][y=10.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=49.0][y=90.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=3.0][y=54.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=44.0][y=1.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=6.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=50.0][y=48.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=81.0][y=96.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=5.0][y=76.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=82.0][y=61.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=71.0][y=21.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=79.0][y=40.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=91.0][y=40.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=54.0][y=9.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=89.0][y=48.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=29.0][y=76.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=26.0][y=40.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=75.0][y=97.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=83.0][y=70.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=48.0][y=20.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=10.0][y=86.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=42.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=17.0][y=83.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=27.0][y=100.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=51.0][y=67.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=59.0][y=2.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=44.0][y=10.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=11.0][y=80.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=88.0][y=49.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=97.0][y=3.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=17.0][y=72.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=95.0][y=91.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=97.0][y=100.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=67.0][y=90.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=36.0][y=86.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=60.0][y=18.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=4.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=9.0][y=29.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=38.0][y=19.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=25.0][y=4.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=5.0][y=68.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=96.0][y=75.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=96.0][y=7.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=83.0][y=89.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=92.0][y=71.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=27.0][y=3.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=77.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=58.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=31.0][y=89.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=60.0][y=14.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=20.0][y=37.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=83.0][y=59.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=55.0][y=9.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=17.0][y=2.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=63.0][y=93.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=28.0][y=52.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=59.0][y=26.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=78.0][y=92.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=99.0][y=11.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=99.0][y=10.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=20.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=14.0][y=64.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=14.0][y=39.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=30.0][y=56.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=98.0][y=66.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=55.0][y=9.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=2.0][y=100.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=5.0][y=32.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=55.0][y=81.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=71.0][y=4.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=89.0][y=70.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=46.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=62.0][y=67.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=99.0][y=62.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=28.0][y=38.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=2.0][y=9.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=38.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=7.0][y=39.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=41.0][y=35.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=43.0][y=89.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=21.0][y=3.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=98.0][y=56.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=4.0][y=45.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=96.0][y=57.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=9.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=58.0][y=60.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=8.0][y=45.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=33.0][y=77.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=58.0][y=72.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=83.0][y=83.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=12.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=73.0][y=7.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=58.0][y=92.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=32.0][y=36.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=62.0][y=40.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=35.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=88.0][y=10.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=44.0][y=25.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=11.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=8.0][y=89.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=97.0][y=80.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=76.0][y=66.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=71.0][y=53.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=63.0][y=92.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=67.0][y=7.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=78.0][y=96.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=68.0][y=11.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=98.0][y=2.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=29.0][y=54.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=62.0][y=2.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=89.0][y=69.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=67.0][y=69.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=93.0][y=30.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=72.0][y=84.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=96.0][y=75.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=80.0][y=56.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=61.0][y=52.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=78.0][y=37.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=32.0][y=40.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=72.0][y=19.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=2.0][y=40.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=40.0][y=7.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=11.0][y=6.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=64.0][y=87.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=98.0][y=63.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=24.0][y=3.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=53.0][y=67.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=16.0][y=35.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=64.0][y=46.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=2.0][y=79.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=19.0][y=75.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=33.0][y=39.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=70.0][y=86.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=72.0][y=88.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=46.0][y=86.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=3.0][y=33.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=9.0][y=5.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=42.0][y=13.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=99.0][y=20.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=9.0][y=23.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=80.0][y=71.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=34.0][y=79.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=95.0][y=97.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=89.0][y=75.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=54.0][y=3.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=54.0][y=13.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=71.0][y=43.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=24.0][y=39.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=61.0][y=60.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=15.0][y=76.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=4.0][y=26.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=61.0][y=57.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=31.0][y=96.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=63.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=74.0][y=26.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=20.0][y=2.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=25.0][y=50.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=56.0][y=54.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=23.0][y=25.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=12.0][y=26.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=98.0][y=33.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=24.0][y=55.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=21.0][y=37.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=58.0][y=11.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=27.0][y=19.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=49.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=49.0][y=11.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=67.0][y=20.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=66.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=89.0][y=79.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=76.0][y=18.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=50.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=87.0][y=31.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=14.0][y=32.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=70.0][y=76.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=70.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=48.0][y=23.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=44.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=84.0][y=45.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=17.0][y=26.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=95.0][y=59.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=78.0][y=77.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=51.0][y=45.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=52.0][y=71.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=68.0][y=29.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=2.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=89.0][y=8.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=44.0][y=48.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=98.0][y=77.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=91.0][y=8.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=40.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=13.0][y=6.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=61.0][y=17.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=65.0][y=40.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=52.0][y=86.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=59.0][y=54.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=12.0][y=96.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=10.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=64.0][y=23.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=52.0][y=86.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=31.0][y=37.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=83.0][y=3.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=86.0][y=96.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=92.0][y=93.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=49.0][y=86.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=9.0][y=46.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=83.0][y=37.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=55.0][y=24.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=11.0][y=32.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=86.0][y=67.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=19.0][y=3.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=51.0][y=48.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=33.0][y=37.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=58.0][y=36.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=16.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=81.0][y=52.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=53.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=21.0][y=5.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=44.0][y=45.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=6.0][y=78.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=38.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=81.0][y=5.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=91.0][y=88.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=28.0][y=22.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=47.0][y=37.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=74.0][y=49.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=9.0][y=92.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=87.0][y=79.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=68.0][y=18.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=45.0][y=93.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=38.0][y=20.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=38.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=77.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=53.0][y=6.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=35.0][y=37.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=10.0][y=92.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=48.0][y=18.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=86.0][y=5.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=73.0][y=1.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=17.0][y=66.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=94.0][y=80.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=90.0][y=89.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=4.0][y=92.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=15.0][y=87.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=65.0][y=48.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=97.0][y=11.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=18.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=5.0][y=69.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=49.0][y=16.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=2.0][y=69.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=13.0][y=31.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=3.0][y=90.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=96.0][y=46.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=42.0][y=39.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=14.0][y=17.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=98.0][y=31.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=37.0][y=25.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=95.0][y=45.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=30.0][y=7.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=83.0][y=30.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=89.0][y=57.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=37.0][y=69.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=60.0][y=91.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=94.0][y=5.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=4.0][y=15.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=46.0][y=50.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=7.0][y=59.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=27.0][y=42.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=78.0][y=40.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=54.0][y=57.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=70.0][y=15.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=81.0][y=18.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=67.0][y=44.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=35.0][y=27.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=43.0][y=79.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=20.0][y=76.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=96.0][y=18.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=7.0][y=56.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=27.0][y=74.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=84.0][y=55.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=75.0][y=89.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=64.0][y=74.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=35.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=45.0][y=6.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=95.0][y=76.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=11.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=20.0][y=71.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=59.0][y=8.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=64.0][y=77.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=76.0][y=73.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=39.0][y=60.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=29.0][y=37.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=93.0][y=84.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=44.0][y=81.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=69.0][y=93.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=62.0][y=43.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=74.0][y=86.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=85.0][y=62.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=63.0][y=40.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=43.0][y=91.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=49.0][y=52.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=67.0][y=44.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=48.0][y=82.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=16.0][y=50.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=22.0][y=97.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=6.0][y=77.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=36.0][y=95.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=55.0][y=14.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=14.0][y=27.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=24.0][y=97.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=45.0][y=98.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=24.0][y=60.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=1.0][y=11.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=89.0][y=66.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=6.0][y=69.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=32.0][y=31.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=50.0][y=15.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=18.0][y=68.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=71.0][y=38.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=16.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=73.0][y=7.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=1.0][y=90.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=16.0][y=46.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=100.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=87.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=32.0][y=3.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=2.0][y=24.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=82.0][y=7.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=42.0][y=53.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=73.0][y=1.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=72.0][y=48.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=22.0][y=31.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=22.0][y=61.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=86.0][y=92.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=50.0][y=19.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=30.0][y=70.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=42.0][y=7.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=99.0][y=29.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=94.0][y=39.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=62.0][y=53.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=69.0][y=21.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=58.0][y=82.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=34.0][y=62.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=81.0][y=54.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=74.0][y=58.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=84.0][y=61.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=66.0][y=66.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=99.0][y=22.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=18.0][y=4.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=55.0][y=59.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=18.0][y=36.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=43.0][y=86.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=33.0][y=83.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=28.0][y=55.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=56.0][y=82.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=95.0][y=63.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=11.0][y=17.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=39.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=83.0][y=66.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=47.0][y=79.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=96.0][y=19.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=12.0][y=16.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=13.0][y=53.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=26.0][y=9.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=11.0][y=1.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=19.0][y=69.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=75.0][y=54.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=31.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=72.0][y=98.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=94.0][y=84.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=21.0][y=24.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=91.0][y=42.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=35.0][y=86.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=86.0][y=10.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=24.0][y=60.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=89.0][y=16.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=18.0][y=2.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=27.0][y=85.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=20.0][y=6.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=61.0][y=3.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=74.0][y=44.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=93.0][y=72.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=35.0][y=38.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=100.0][y=83.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=60.0][y=5.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=97.0][y=9.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=70.0][y=87.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=51.0][y=26.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=44.0][y=64.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=58.0][y=4.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=36.0][y=31.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=65.0][y=18.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=73.0][y=49.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=34.0][y=72.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=94.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=89.0][y=77.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=83.0][y=2.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=6.0][y=19.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=10.0][y=8.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=85.0][y=32.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=56.0][y=86.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=51.0][y=77.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=43.0][y=8.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=55.0][y=63.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=54.0][y=10.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=62.0][y=39.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=20.0][y=73.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=23.0][y=96.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=46.0][y=77.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=62.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=71.0][y=91.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=2.0][y=55.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=48.0][y=48.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=87.0][y=100.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=97.0][y=32.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=3.0][y=37.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=43.0][y=56.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=65.0][y=75.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=19.0][y=11.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=21.0][y=77.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=83.0][y=42.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=66.0][y=90.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=23.0][y=70.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=19.0][y=48.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=91.0][y=68.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=11.0][y=85.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=77.0][y=26.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=6.0][y=49.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=82.0][y=68.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=88.0][y=90.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=33.0][y=16.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=13.0][y=39.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=71.0][y=92.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=20.0][y=64.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=60.0][y=76.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=52.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=15.0][y=13.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=66.0][y=74.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=31.0][y=17.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=27.0][y=31.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=98.0][y=58.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=14.0][y=68.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=22.0][y=9.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=55.0][y=64.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=59.0][y=14.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=91.0][y=71.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=62.0][y=71.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=74.0][y=21.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=14.0][y=93.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=47.0][y=66.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=14.0][y=19.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=29.0][y=52.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=79.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=20.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=14.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=30.0][y=4.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=51.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=36.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=69.0][y=43.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=79.0][y=33.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=35.0][y=89.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=32.0][y=45.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=66.0][y=13.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=83.0][y=96.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=80.0][y=71.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=10.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=54.0][y=87.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=34.0][y=81.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=15.0][y=88.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=99.0][y=70.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=22.0][y=23.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=40.0][y=40.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=28.0][y=97.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=59.0][y=100.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=60.0][y=16.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=79.0][y=93.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=14.0][y=11.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=23.0][y=42.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=87.0][y=40.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=66.0][y=35.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=60.0][y=50.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=23.0][y=15.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=5.0][y=10.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=77.0][y=35.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=59.0][y=66.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=21.0][y=2.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=30.0][y=92.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=28.0][y=26.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=94.0][y=38.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=15.0][y=73.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=76.0][y=77.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=85.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=61.0][y=90.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=7.0][y=16.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=15.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=89.0][y=18.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=39.0][y=27.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=82.0][y=32.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=10.0][y=97.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=21.0][y=58.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=24.0][y=25.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=53.0][y=23.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=83.0][y=73.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=65.0][y=73.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=49.0][y=17.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=73.0][y=78.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=84.0][y=2.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=7.0][y=53.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=72.0][y=14.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=68.0][y=59.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=51.0][y=82.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=78.0][y=97.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=21.0][y=62.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=85.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=53.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=90.0][y=38.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=80.0][y=19.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=95.0][y=49.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=67.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=22.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=84.0][y=13.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=82.0][y=39.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=50.0][y=22.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=57.0][y=6.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=53.0][y=86.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=17.0][y=2.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=53.0][y=10.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=89.0][y=9.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=87.0][y=21.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=75.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=73.0][y=16.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=49.0][y=20.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=36.0][y=19.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=81.0][y=1.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=29.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=44.0][y=39.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=68.0][y=46.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=44.0][y=49.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=82.0][y=64.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=87.0][y=87.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=62.0][y=24.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=67.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=8.0][y=81.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=38.0][y=38.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=65.0][y=68.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=43.0][y=91.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=73.0][y=43.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=37.0][y=75.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=64.0][y=24.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=26.0][y=52.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=58.0][y=56.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=92.0][y=50.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=61.0][y=7.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=82.0][y=52.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=79.0][y=56.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=45.0][y=32.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=43.0][y=96.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=94.0][y=96.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=32.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=53.0][y=36.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=55.0][y=54.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=13.0][y=39.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=19.0][y=15.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=44.0][y=42.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=85.0][y=62.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=39.0][y=38.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=9.0][y=67.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=85.0][y=82.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=1.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=3.0][y=82.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=58.0][y=90.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=54.0][y=23.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=58.0][y=40.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=48.0][y=69.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=97.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=34.0][y=3.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=91.0][y=87.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=38.0][y=89.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=59.0][y=42.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=63.0][y=79.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=79.0][y=69.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=80.0][y=63.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=16.0][y=48.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=74.0][y=34.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=2.0][y=33.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=61.0][y=22.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=43.0][y=10.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=44.0][y=28.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=41.0][y=87.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=3.0][y=45.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=64.0][y=87.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=26.0][y=15.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=69.0][y=48.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=75.0][y=31.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=67.0][y=66.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=29.0][y=26.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=94.0][y=93.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=72.0][y=81.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=97.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=84.0][y=40.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=80.0][y=96.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=47.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=57.0][y=22.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=74.0][y=59.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=61.0][y=80.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=40.0][y=55.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=4.0][y=22.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=64.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=3.0][y=26.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=22.0][y=77.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=77.0][y=10.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=63.0][y=64.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=73.0][y=72.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=5.0][y=30.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=47.0][y=38.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=39.0][y=85.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=54.0][y=21.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=4.0][y=35.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=69.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=53.0][y=31.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=44.0][y=72.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=43.0][y=87.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=75.0][y=76.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=36.0][y=56.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=22.0][y=55.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=47.0][y=60.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=74.0][y=26.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=36.0][y=82.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=89.0][y=68.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=43.0][y=59.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=97.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=64.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=83.0][y=48.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=56.0][y=100.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=10.0][y=46.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=9.0][y=75.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=72.0][y=36.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=48.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=98.0][y=35.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=5.0][y=30.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=81.0][y=77.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=81.0][y=1.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=31.0][y=21.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=89.0][y=79.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=62.0][y=24.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=56.0][y=14.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=32.0][y=91.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=22.0][y=84.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=22.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=14.0][y=22.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=11.0][y=82.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=1.0][y=21.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=99.0][y=42.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=12.0][y=15.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=73.0][y=86.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=23.0][y=89.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=44.0][y=39.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=36.0][y=100.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=78.0][y=53.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=6.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=41.0][y=82.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=35.0][y=52.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=91.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=62.0][y=93.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=17.0][y=60.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=74.0][y=75.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=70.0][y=67.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=63.0][y=3.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=100.0][y=5.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=6.0][y=4.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=100.0][y=19.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=11.0][y=40.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=47.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=99.0][y=83.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=41.0][y=39.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=54.0][y=53.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=48.0][y=24.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=31.0][y=94.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=79.0][y=64.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=7.0][y=34.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=23.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=63.0][y=97.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=94.0][y=7.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=64.0][y=76.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=47.0][y=34.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=3.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=40.0][y=74.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=44.0][y=24.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=21.0][y=61.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=83.0][y=22.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=75.0][y=88.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=37.0][y=20.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=30.0][y=57.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=23.0][y=36.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=98.0][y=17.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=3.0][y=84.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=72.0][y=66.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=87.0][y=92.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=91.0][y=93.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=54.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=37.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=52.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=54.0][y=89.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=15.0][y=38.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=13.0][y=71.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=21.0][y=35.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=8.0][y=87.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=6.0][y=14.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=95.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=17.0][y=61.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=100.0][y=58.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=55.0][y=4.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=19.0][y=9.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=10.0][y=34.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=38.0][y=81.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=73.0][y=42.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=20.0][y=54.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=14.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=73.0][y=9.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=66.0][y=14.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=29.0][y=3.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=20.0][y=24.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=75.0][y=71.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=35.0][y=35.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=82.0][y=27.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=20.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=47.0][y=6.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=18.0][y=40.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=3.0][y=48.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=76.0][y=100.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=88.0][y=5.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=32.0][y=67.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=24.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=5.0][y=63.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=98.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=3.0][y=53.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=81.0][y=96.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=60.0][y=74.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=36.0][y=17.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=57.0][y=18.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=41.0][y=91.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=34.0][y=83.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=59.0][y=27.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=92.0][y=99.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=39.0][y=53.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=49.0][y=36.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=3.0][y=52.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=71.0][y=12.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=60.0][y=11.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=95.0][y=23.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=31.0][y=70.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=91.0][y=68.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=15.0][y=21.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=99.0][y=8.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=89.0][y=54.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=37.0][y=8.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=3.0][y=7.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=41.0][y=78.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=59.0][y=25.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=26.0][y=34.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=32.0][y=85.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=16.0][y=77.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=60.0][y=66.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=71.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=70.0][y=63.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=48.0][y=88.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=3.0][y=20.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=19.0][y=96.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=60.0][y=3.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=82.0][y=85.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=6.0][y=98.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=78.0][y=9.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=66.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=88.0][y=19.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=70.0][y=82.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=23.0][y=75.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=4.0][y=88.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=79.0][y=93.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=3.0][y=40.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=32.0][y=21.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=83.0][y=6.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=40.0][y=100.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=68.0][y=54.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=12.0][y=93.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=24.0][y=52.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=22.0][y=62.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=17.0][y=61.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=32.0][y=80.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=4.0][y=22.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=9.0][y=81.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=57.0][y=35.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=92.0][y=20.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=69.0][y=51.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=17.0][y=21.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=8.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=10.0][y=76.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=20.0][y=94.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=51.0][y=65.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=7.0][y=83.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=93.0][y=50.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=86.0][y=61.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=72.0][y=29.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=69.0][y=2.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=52.0][y=5.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=62.0][y=74.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=54.0][y=38.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=23.0][y=86.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=4.0][y=7.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=27.0][y=27.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=78.0][y=7.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=40.0][y=88.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=77.0][y=16.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=9.0][y=82.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=57.0][y=47.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=45.0][y=57.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=43.0][y=20.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=35.0][y=84.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=23.0][y=1.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=52.0][y=16.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=95.0][y=41.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=54.0][y=11.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=77.0][y=15.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=90.0][y=21.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=68.0][y=69.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=92.0][y=30.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=1.0][y=100.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=54.0][y=49.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=61.0][y=91.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - [x=39.0][y=85.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - - [x=82.0][y=42.0] - - 0.0 - - - 0.0 - 1.7976931348623157E308 - - - - 1 - - - - - 27180.562894669627 - - - 343.58863797796135 - noDriver - v - 0.0 - - s543 - 25.0 - 25.0 - - - s587 - 40.13274595042156 - 40.13274595042156 - - - s352 - 58.24351622669639 - 58.24351622669639 - - - s543 - 64.56807154703316 - 64.56807154703316 - - - s904 - 66.80413952453294 - 66.80413952453294 - - - s887 - 68.80413952453294 - 68.80413952453294 - - - s141 - 74.80413952453294 - 74.80413952453294 - - - s141 - 118.63335352615519 - 118.63335352615519 - - - s46 - 138.88181025747178 - 138.88181025747178 - - - s46 - 172.71965888884904 - 172.71965888884904 - - - s545 - 177.71965888884904 - 177.71965888884904 - - - s352 - 206.03926340586162 - 206.03926340586162 - - - s887 - 241.3804575000062 - 241.3804575000062 - - - s747 - 253.4220520787985 - 253.4220520787985 - - - s587 - 267.84425718065444 - 267.84425718065444 - - - s904 - 279.8858517594467 - 279.8858517594467 - - - s522 - 284.8858517594467 - 284.8858517594467 - - - s747 - 287.71427888419294 - 287.71427888419294 - - - s367 - 308.92748231978936 - 308.92748231978936 - - - s367 - 319.9728433369766 - 319.9728433369766 - - - s545 - 334.1855137405285 - 334.1855137405285 - - - s522 - 337.1855137405285 - 337.1855137405285 - - 343.58863797796135 - - - 411.27627135439747 - noDriver - v - 0.0 - - s919 - 8.94427190999916 - 8.94427190999916 - - - s407 - 18.37825304205576 - 18.37825304205576 - - - s331 - 37.48322621659856 - 37.48322621659856 - - - s45 - 38.48322621659856 - 38.48322621659856 - - - s407 - 43.86839102373306 - 43.86839102373306 - - - s197 - 46.69681814847925 - 46.69681814847925 - - - s515 - 79.93835842566858 - 79.93835842566858 - - - s197 - 91.11869831316753 - 91.11869831316753 - - - s991 - 94.72424958863152 - 94.72424958863152 - - - s45 - 118.89034153582067 - 118.89034153582067 - - - s957 - 126.10144408674864 - 126.10144408674864 - - - s919 - 134.1637018350472 - 134.1637018350472 - - - s858 - 137.7692531105112 - 137.7692531105112 - - - s858 - 162.82918128279454 - 162.82918128279454 - - - s853 - 172.82918128279454 - 172.82918128279454 - - - s515 - 197.90905369076344 - 197.90905369076344 - - - s331 - 227.06381316498994 - 227.06381316498994 - - - s957 - 233.4669374024228 - 233.4669374024228 - - - s172 - 237.07248867788678 - 237.07248867788678 - - - s66 - 243.155251208185 - 243.155251208185 - - - s287 - 281.4436306463383 - 281.4436306463383 - - - s66 - 285.9157666013379 - 285.9157666013379 - - - s783 - 297.99881257493246 - 297.99881257493246 - - - s287 - 312.1409481986634 - 312.1409481986634 - - - s398 - 342.37338111432535 - 342.37338111432535 - - - s783 - 346.6160218014446 - 346.6160218014446 - - - s172 - 356.66589742256554 - 356.66589742256554 - - - s398 - 379.51321674015725 - 379.51321674015725 - - - s991 - 394.51321674015725 - 394.51321674015725 - - - s853 - 394.51321674015725 - 394.51321674015725 - - 411.27627135439747 - - - 239.3574354740348 - noDriver - v - 0.0 - - s275 - 13.45362404707371 - 13.45362404707371 - - - s484 - 26.45362404707371 - 26.45362404707371 - - - s312 - 30.92576000207329 - 30.92576000207329 - - - s648 - 48.013767492708354 - 48.013767492708354 - - - s609 - 51.61931876817234 - 51.61931876817234 - - - s648 - 58.61931876817234 - 58.61931876817234 - - - s484 - 73.7520647185939 - 73.7520647185939 - - - s932 - 85.91758977919034 - 85.91758977919034 - - - s984 - 96.35789628810089 - 96.35789628810089 - - - s275 - 101.45691580169367 - 101.45691580169367 - - - s895 - 106.45691580169367 - 106.45691580169367 - - - s312 - 116.75254594268067 - 116.75254594268067 - - - s623 - 129.12186281953365 - 129.12186281953365 - - - s609 - 144.77433866203216 - 144.77433866203216 - - - s932 - 149.87335817562496 - 149.87335817562496 - - - s429 - 163.02630461359087 - 163.02630461359087 - - - s429 - 169.1090671438891 - 169.1090671438891 - - - s623 - 181.47838402074208 - 181.47838402074208 - - - s895 - 198.03132937798892 - 198.03132937798892 - - - s984 - 217.26671343966026 - 217.26671343966026 - - 239.3574354740348 - - - 449.1947801596979 - noDriver - v - 0.0 - - s424 - 47.38143096192854 - 47.38143096192854 - - - s121 - 63.934376319175385 - 63.934376319175385 - - - s691 - 70.25893163951214 - 70.25893163951214 - - - s399 - 90.18379048468341 - 90.18379048468341 - - - s691 - 100.47942062567041 - 100.47942062567041 - - - s11 - 123.82465568552792 - 123.82465568552792 - - - s375 - 129.6556075803732 - 129.6556075803732 - - - s424 - 145.2761069321865 - 145.2761069321865 - - - s451 - 151.35886946248473 - 151.35886946248473 - - - s451 - 165.39453831010294 - 165.39453831010294 - - - s643 - 169.00008958556694 - 169.00008958556694 - - - s11 - 192.19491659505334 - 192.19491659505334 - - - s327 - 196.19491659505334 - 196.19491659505334 - - - s375 - 205.19491659505334 - 205.19491659505334 - - - s682 - 206.19491659505334 - 206.19491659505334 - - - s643 - 216.96524620932234 - 216.96524620932234 - - - s327 - 220.12752386949072 - 220.12752386949072 - - - s657 - 234.44534493276706 - 234.44534493276706 - - - s182 - 248.0468154415025 - 248.0468154415025 - - - s682 - 254.12957797180073 - 254.12957797180073 - - - s798 - 266.77868861247424 - 266.77868861247424 - - - s121 - 300.9107849442263 - 300.9107849442263 - - - s399 - 307.98185275609177 - 307.98185275609177 - - - s617 - 320.6309633967653 - 320.6309633967653 - - - s182 - 324.2365146722293 - 324.2365146722293 - - - s714 - 331.2365146722293 - 331.2365146722293 - - - s760 - 333.2365146722293 - 333.2365146722293 - - - s617 - 342.6704958042859 - 342.6704958042859 - - - s798 - 380.31355625372333 - 380.31355625372333 - - - s760 - 410.57904815456646 - 410.57904815456646 - - - s657 - 426.9802676214232 - 426.9802676214232 - - - s714 - 442.7916559222651 - 442.7916559222651 - - 449.1947801596979 - - - 365.1872756991465 - noDriver - v - 0.0 - - s495 - 13.038404810405298 - 13.038404810405298 - - - s29 - 27.180540434136248 - 27.180540434136248 - - - s862 - 47.18054043413625 - 47.18054043413625 - - - s524 - 69.65274548838048 - 69.65274548838048 - - - s862 - 84.88429170010829 - 84.88429170010829 - - - s552 - 89.98331121370107 - 89.98331121370107 - - - s29 - 93.14558887386946 - 93.14558887386946 - - - s641 - 101.68959261918698 - 101.68959261918698 - - - s245 - 113.68959261918698 - 113.68959261918698 - - - s245 - 142.3252347457397 - 142.3252347457397 - - - s916 - 150.92756001278232 - 150.92756001278232 - - - s524 - 194.79098441170493 - 194.79098441170493 - - - s495 - 208.39245492044037 - 208.39245492044037 - - - s810 - 212.39245492044037 - 212.39245492044037 - - - s65 - 215.55473258060874 - 215.55473258060874 - - - s916 - 229.6968682043397 - 229.6968682043397 - - - s641 - 235.527820099185 - 235.527820099185 - - - s486 - 261.92857766407315 - 261.92857766407315 - - - s235 - 267.5854319135655 - 267.5854319135655 - - - s486 - 280.5854319135655 - 280.5854319135655 - - - s552 - 296.740926334969 - 296.740926334969 - - - s684 - 304.02103622424954 - 304.02103622424954 - - - s684 - 320.14555172084664 - 320.14555172084664 - - - s810 - 321.55976528321975 - 321.55976528321975 - - - s65 - 344.55976528321975 - 344.55976528321975 - - - s235 - 351.77086783414774 - 351.77086783414774 - - 365.1872756991465 - - - 380.57984642199483 - noDriver - v - 0.0 - - s54 - 33.06055050963308 - 33.06055050963308 - - - s969 - 47.48275561148904 - 47.48275561148904 - - - s417 - 53.31370750633434 - 53.31370750633434 - - - s264 - 55.549775483834125 - 55.549775483834125 - - - s181 - 77.64049751820865 - 77.64049751820865 - - - s969 - 100.11270257245287 - 100.11270257245287 - - - s264 - 108.59798394669144 - 108.59798394669144 - - - s632 - 135.22503785808013 - 135.22503785808013 - - - s706 - 138.22503785808013 - 138.22503785808013 - - - s417 - 164.4738473548935 - 164.4738473548935 - - - s772 - 173.01785110021103 - 173.01785110021103 - - - s181 - 184.41960535120242 - 184.41960535120242 - - - s270 - 197.87322939827612 - 197.87322939827612 - - - s270 - 224.79905343394864 - 224.79905343394864 - - - s772 - 236.50375334466827 - 236.50375334466827 - - - s183 - 242.82830866500504 - 242.82830866500504 - - - s54 - 248.4851629144974 - 248.4851629144974 - - - s428 - 257.7047073717903 - 257.7047073717903 - - - s536 - 263.0898721789248 - 263.0898721789248 - - - s632 - 306.5064588711096 - 306.5064588711096 - - - s536 - 309.3348859958558 - 309.3348859958558 - - - s183 - 329.3348859958558 - 329.3348859958558 - - - s428 - 355.3348859958558 - 355.3348859958558 - - - s706 - 367.5414416115895 - 367.5414416115895 - - 380.57984642199483 - - - 489.4558318659026 - noDriver - v - 0.0 - - s532 - 29.410882339705484 - 29.410882339705484 - - - s41 - 33.88301829470507 - 33.88301829470507 - - - s227 - 46.921423105110364 - 46.921423105110364 - - - s532 - 55.86569501510952 - 55.86569501510952 - - - s41 - 68.67194348997522 - 68.67194348997522 - - - s475 - 81.2019075761169 - 81.2019075761169 - - - s909 - 84.36418523628528 - 84.36418523628528 - - - s434 - 86.60025321378507 - 86.60025321378507 - - - s227 - 89.76253087395345 - 89.76253087395345 - - - s571 - 105.0595894147318 - 105.0595894147318 - - - s870 - 132.0781015869444 - 132.0781015869444 - - - s909 - 132.0781015869444 - 132.0781015869444 - - - s527 - 138.78630551944377 - 138.78630551944377 - - - s571 - 149.96664540694272 - 149.96664540694272 - - - s390 - 165.23098292941646 - 165.23098292941646 - - - s434 - 192.52567105732882 - 192.52567105732882 - - - s229 - 210.55342743464877 - 210.55342743464877 - - - s390 - 217.76452998557676 - 217.76452998557676 - - - s410 - 231.1061940497031 - 231.1061940497031 - - - s475 - 243.18924002329769 - 243.18924002329769 - - - s438 - 253.4848701642847 - 253.4848701642847 - - - s229 - 275.0719033092076 - 275.0719033092076 - - - s10 - 282.6876764150715 - 282.6876764150715 - - - s870 - 290.30344952093543 - 290.30344952093543 - - - s430 - 302.30344952093543 - 302.30344952093543 - - - s438 - 341.6607868292443 - 341.6607868292443 - - - s784 - 364.2218151746012 - 364.2218151746012 - - - s10 - 368.46445586172047 - 368.46445586172047 - - - s527 - 368.46445586172047 - 368.46445586172047 - - - s430 - 379.5098168789077 - 379.5098168789077 - - - s379 - 392.5098168789077 - 392.5098168789077 - - - s745 - 396.9819528339073 - 396.9819528339073 - - - s410 - 406.2014972912002 - 406.2014972912002 - - - s200 - 408.4375652687 - 408.4375652687 - - - s386 - 411.5998429288684 - 411.5998429288684 - - - s745 - 433.53155512832967 - 433.53155512832967 - - - s386 - 436.69383278849807 - 436.69383278849807 - - - s784 - 440.93647347561733 - 440.93647347561733 - - - s379 - 441.93647347561733 - 441.93647347561733 - - - s200 - 476.6495833910369 - 476.6495833910369 - - 489.4558318659026 - - - 384.9310614030104 - noDriver - v - 0.0 - - s771 - 9.055385138137417 - 9.055385138137417 - - - s418 - 17.117642886435966 - 17.117642886435966 - - - s865 - 23.520767123868815 - 23.520767123868815 - - - s915 - 36.24868918522667 - 36.24868918522667 - - - s920 - 54.68777809981244 - 54.68777809981244 - - - s865 - 55.68777809981244 - 55.68777809981244 - - - s298 - 62.09090233724529 - 62.09090233724529 - - - s418 - 81.50739017619289 - 81.50739017619289 - - - s371 - 90.56277531433031 - 90.56277531433031 - - - s915 - 102.64582128792489 - 102.64582128792489 - - - s206 - 105.80809894809327 - 105.80809894809327 - - - s771 - 116.43824476082793 - 116.43824476082793 - - - s474 - 141.49817293311128 - 141.49817293311128 - - - s298 - 145.62127855872893 - 145.62127855872893 - - - s920 - 151.70404108902716 - 151.70404108902716 - - - s474 - 164.07335796588015 - 164.07335796588015 - - - s487 - 179.88474626672203 - 179.88474626672203 - - - s573 - 184.12738695384132 - 184.12738695384132 - - - s371 - 201.62024263837722 - 201.62024263837722 - - - s254 - 213.0219968893686 - 213.0219968893686 - - - s446 - 231.04975326668855 - 231.04975326668855 - - - s573 - 251.66528139477685 - 251.66528139477685 - - - s254 - 271.66528139477685 - 271.66528139477685 - - - s553 - 278.87638394570484 - 278.87638394570484 - - - s246 - 284.26154875283936 - 284.26154875283936 - - - s246 - 306.62222852783725 - 306.62222852783725 - - - s78 - 315.67761366597466 - 315.67761366597466 - - - s446 - 344.27831295812484 - 344.27831295812484 - - - s487 - 351.5584228474054 - 351.5584228474054 - - - s553 - 352.5584228474054 - 352.5584228474054 - - - s206 - 360.8046340986407 - 360.8046340986407 - - - s78 - 371.0026731258263 - 371.0026731258263 - - 384.9310614030104 - - - 317.334971144553 - noDriver - v - 0.0 - - s802 - 9.055385138137417 - 9.055385138137417 - - - s778 - 38.88825291849001 - 38.88825291849001 - - - s497 - 51.92665772889531 - 51.92665772889531 - - - s223 - 73.327592287928 - 73.327592287928 - - - s284 - 84.37295330511526 - 84.37295330511526 - - - s284 - 99.63729082758901 - 99.63729082758901 - - - s778 - 117.13014651212491 - 117.13014651212491 - - - s894 - 130.1301465121249 - 130.1301465121249 - - - s802 - 132.1301465121249 - 132.1301465121249 - - - s497 - 177.82478514730835 - 177.82478514730835 - - - s540 - 184.14934046764512 - 184.14934046764512 - - - s15 - 189.2483599812379 - 189.2483599812379 - - - s15 - 199.68866649014845 - 199.68866649014845 - - - s640 - 201.68866649014845 - 201.68866649014845 - - - s149 - 214.72707130055375 - 214.72707130055375 - - - s894 - 219.19920725555332 - 219.19920725555332 - - - s694 - 223.32231288117097 - 223.32231288117097 - - - s223 - 231.8663166264885 - 231.8663166264885 - - - s415 - 236.8663166264885 - 236.8663166264885 - - - s640 - 247.30662313539904 - 247.30662313539904 - - - s415 - 272.91912008513043 - 272.91912008513043 - - - s540 - 275.1551880626302 - 275.1551880626302 - - - s149 - 279.6273240176298 - 279.6273240176298 - - - s694 - 291.02907826862116 - 291.02907826862116 - - 317.334971144553 - - - 471.34270016817703 - noDriver - v - 0.0 - - s146 - 22.47220505424423 - 22.47220505424423 - - - s112 - 34.67876066997793 - 34.67876066997793 - - - s597 - 42.29453377584184 - 42.29453377584184 - - - s176 - 59.557210277473914 - 59.557210277473914 - - - s852 - 94.6855464179745 - 94.6855464179745 - - - s176 - 106.7271409967668 - 106.7271409967668 - - - s146 - 115.94668545405969 - 115.94668545405969 - - - s896 - 123.5624585599236 - 123.5624585599236 - - - s597 - 124.97667212229669 - 124.97667212229669 - - - s444 - 133.57899738933932 - 133.57899738933932 - - - s274 - 135.81506536683912 - 135.81506536683912 - - - s274 - 157.19262369327106 - 157.19262369327106 - - - s467 - 175.63171260785683 - 175.63171260785683 - - - s112 - 223.798090923026 - 223.798090923026 - - - s620 - 244.6067429697108 - 244.6067429697108 - - - s467 - 249.6067429697108 - 249.6067429697108 - - - s896 - 263.06036701678454 - 263.06036701678454 - - - s938 - 265.2964349942843 - 265.2964349942843 - - - s326 - 278.02435705564216 - 278.02435705564216 - - - s326 - 307.43523939534765 - 307.43523939534765 - - - s139 - 313.8383636327805 - 313.8383636327805 - - - s444 - 318.8383636327805 - 318.8383636327805 - - - s938 - 335.48168060987376 - 335.48168060987376 - - - s272 - 344.70122506716666 - 344.70122506716666 - - - s873 - 358.91389547071856 - 358.91389547071856 - - - s272 - 367.39917684495714 - 367.39917684495714 - - - s579 - 377.8394833538677 - 377.8394833538677 - - - s620 - 391.7319273433175 - 391.7319273433175 - - - s139 - 430.7831757228508 - 430.7831757228508 - - - s852 - 432.7831757228508 - 432.7831757228508 - - - s579 - 436.90628134846844 - 436.90628134846844 - - - s873 - 457.13002976462514 - 457.13002976462514 - - 471.34270016817703 - - - 308.3710900060029 - noDriver - v - 0.0 - - s363 - 19.235384061671343 - 19.235384061671343 - - - s233 - 20.64959762404444 - 20.64959762404444 - - - s994 - 43.121802678288674 - 43.121802678288674 - - - s901 - 78.50541470419694 - 78.50541470419694 - - - s233 - 90.16731849388754 - 90.16731849388754 - - - s737 - 93.32959615405592 - 93.32959615405592 - - - s900 - 105.41264212765049 - 105.41264212765049 - - - s363 - 115.46251774877138 - 115.46251774877138 - - - s994 - 118.46251774877138 - 118.46251774877138 - - - s578 - 119.46251774877138 - 119.46251774877138 - - - s737 - 134.22734080900477 - 134.22734080900477 - - - s313 - 143.28272594714218 - 143.28272594714218 - - - s665 - 162.51811000881352 - 162.51811000881352 - - - s313 - 191.17120757260233 - 191.17120757260233 - - - s781 - 202.17120757260233 - 202.17120757260233 - - - s578 - 206.29431319821998 - 206.29431319821998 - - - s765 - 210.76644915321955 - 210.76644915321955 - - - s900 - 232.6067788210611 - 232.6067788210611 - - - s665 - 239.88688871034162 - 239.88688871034162 - - - s901 - 253.48835921907707 - 253.48835921907707 - - - s765 - 263.4883592190771 - 263.4883592190771 - - - s781 - 278.3544279663956 - 278.3544279663956 - - 308.3710900060029 - - - 331.74548067426264 - noDriver - v - 0.0 - - s50 - 23.769728648009426 - 23.769728648009426 - - - s100 - 58.826824933925636 - 58.826824933925636 - - - s360 - 66.82682493392564 - 66.82682493392564 - - - s864 - 95.25216574102943 - 95.25216574102943 - - - s357 - 103.85449100807206 - 103.85449100807206 - - - s360 - 109.93725353837029 - 109.93725353837029 - - - s864 - 128.04802381464512 - 128.04802381464512 - - - s357 - 132.5201597696447 - 132.5201597696447 - - - s466 - 153.4007727874658 - 153.4007727874658 - - - s699 - 167.436441635084 - 167.436441635084 - - - s912 - 196.2808518387959 - 196.2808518387959 - - - s100 - 222.24236181029025 - 222.24236181029025 - - - s338 - 229.31342962215572 - 229.31342962215572 - - - s699 - 234.69859442929024 - 234.69859442929024 - - - s805 - 260.15443855200596 - 260.15443855200596 - - - s912 - 265.9853904468513 - 265.9853904468513 - - - s466 - 276.28102058783827 - 276.28102058783827 - - - s805 - 285.2252924978374 - 285.2252924978374 - - - s50 - 296.0419463242294 - 296.0419463242294 - - - s338 - 307.70385011392 - 307.70385011392 - - 331.74548067426264 - - - 356.7722091334038 - noDriver - v - 0.0 - - s188 - 34.0 - 34.0 - - - s941 - 44.77032961426901 - 44.77032961426901 - - - s212 - 52.38610272013292 - 52.38610272013292 - - - s310 - 52.38610272013292 - 52.38610272013292 - - - s453 - 70.49687299640775 - 70.49687299640775 - - - s310 - 75.88203780354225 - 75.88203780354225 - - - s946 - 94.48311304128052 - 94.48311304128052 - - - s212 - 105.88486729227189 - 105.88486729227189 - - - s261 - 141.73176395014173 - 141.73176395014173 - - - s188 - 157.25593864640175 - 157.25593864640175 - - - s946 - 165.50214989763705 - 165.50214989763705 - - - s751 - 181.62666539423415 - 181.62666539423415 - - - s453 - 193.02841964522554 - 193.02841964522554 - - - s704 - 198.6852738947179 - 198.6852738947179 - - - s712 - 220.70798944026313 - 220.70798944026313 - - - s704 - 239.70798944026313 - 239.70798944026313 - - - s764 - 244.80700895385593 - 244.80700895385593 - - - s712 - 252.86926670215448 - 252.86926670215448 - - - s51 - 258.5261209516469 - 258.5261209516469 - - - s941 - 265.59718876351235 - 265.59718876351235 - - - s288 - 275.59718876351235 - 275.59718876351235 - - - s288 - 283.65944651181087 - 283.65944651181087 - - - s261 - 289.9840018321476 - 289.9840018321476 - - - s51 - 309.0889750066904 - 309.0889750066904 - - - s764 - 343.0889750066904 - 343.0889750066904 - - - s751 - 349.49209924412327 - 349.49209924412327 - - 356.7722091334038 - - - 389.46002882614056 - noDriver - v - 0.0 - - s342 - 4.123105625617661 - 4.123105625617661 - - - s676 - 38.13780832900756 - 38.13780832900756 - - - s599 - 45.948058004914216 - 45.948058004914216 - - - s13 - 70.0312471624988 - 70.0312471624988 - - - s82 - 105.83627474243511 - 105.83627474243511 - - - s342 - 119.76466301961923 - 119.76466301961923 - - - s953 - 124.76466301961923 - 124.76466301961923 - - - s82 - 137.2946271057609 - 137.2946271057609 - - - s625 - 146.78146008626604 - 146.78146008626604 - - - s13 - 158.48615999698566 - 158.48615999698566 - - - s450 - 161.31458712173185 - 161.31458712173185 - - - s953 - 190.9962312810435 - 190.9962312810435 - - - s599 - 199.94050319104264 - 199.94050319104264 - - - s975 - 203.102780851211 - 203.102780851211 - - - s878 - 215.75189149188452 - 215.75189149188452 - - - s450 - 255.86423373214768 - 255.86423373214768 - - - s302 - 293.20054313733664 - 293.20054313733664 - - - s975 - 307.96536619757006 - 307.96536619757006 - - - s844 - 320.0484121711646 - 320.0484121711646 - - - s302 - 324.17151779678227 - 324.17151779678227 - - - s625 - 342.61060671136806 - 342.61060671136806 - - - s676 - 348.26746096086043 - 348.26746096086043 - - - s844 - 360.4740165765941 - 360.4740165765941 - - - s878 - 384.07486401900604 - 384.07486401900604 - - 389.46002882614056 - - - 272.59036540305965 - noDriver - v - 0.0 - - s690 - 26.248809496813376 - 26.248809496813376 - - - s674 - 65.36402392802927 - 65.36402392802927 - - - s690 - 116.40322454872864 - 116.40322454872864 - - - s674 - 145.81410688843414 - 145.81410688843414 - - - s47 - 159.9562425121651 - 159.9562425121651 - - - s481 - 192.26723135497213 - 192.26723135497213 - - - s47 - 224.04772851911355 - 224.04772851911355 - - - s481 - 249.50357264182927 - 249.50357264182927 - - 272.59036540305965 - - - 439.92875806185685 - noDriver - v - 0.0 - - s913 - 17.11724276862369 - 17.11724276862369 - - - s194 - 34.58149196519667 - 34.58149196519667 - - - s151 - 38.70459759081433 - 38.70459759081433 - - - s758 - 47.75998272895175 - 47.75998272895175 - - - s913 - 69.75998272895174 - 69.75998272895174 - - - s83 - 71.75998272895174 - 71.75998272895174 - - - s344 - 88.78936909487814 - 88.78936909487814 - - - s194 - 101.82777390528344 - 101.82777390528344 - - - s151 - 107.21293871241794 - 107.21293871241794 - - - s83 - 112.86979296191032 - 112.86979296191032 - - - s43 - 115.1058609394101 - 115.1058609394101 - - - s343 - 127.75497158008362 - 127.75497158008362 - - - s806 - 136.35729684712624 - 136.35729684712624 - - - s43 - 145.57684130441913 - 145.57684130441913 - - - s999 - 160.13706108298018 - 160.13706108298018 - - - s344 - 174.90188414321358 - 174.90188414321358 - - - s383 - 210.95739689785347 - 210.95739689785347 - - - s999 - 233.16100020902797 - 233.16100020902797 - - - s719 - 237.16100020902797 - 237.16100020902797 - - - s806 - 245.7050039543455 - 245.7050039543455 - - - s539 - 260.83774990476707 - 260.83774990476707 - - - s719 - 296.27784019810576 - 296.27784019810576 - - - s722 - 303.48894274903375 - 303.48894274903375 - - - s758 - 309.3198946438791 - 309.3198946438791 - - - s488 - 322.9213651526145 - 322.9213651526145 - - - s383 - 345.5929332501238 - 345.5929332501238 - - - s722 - 369.1937806925357 - 369.1937806925357 - - - s488 - 385.2250002344171 - 385.2250002344171 - - - s539 - 404.25129782485755 - 404.25129782485755 - - - s343 - 424.27628221935834 - 424.27628221935834 - - 439.92875806185685 - - - 256.71955194740724 - noDriver - v - 0.0 - - s291 - 44.598206241955516 - 44.598206241955516 - - - s529 - 49.598206241955516 - 49.598206241955516 - - - s849 - 63.91602730523187 - 63.91602730523187 - - - s111 - 86.47705565058882 - 86.47705565058882 - - - s529 - 96.77268579157582 - 96.77268579157582 - - - s130 - 104.05279568085635 - 104.05279568085635 - - - s291 - 112.1150534291549 - 112.1150534291549 - - - s952 - 114.35112140665468 - 114.35112140665468 - - - s130 - 118.82325736165427 - 118.82325736165427 - - - s711 - 122.94636298727193 - 122.94636298727193 - - - s377 - 126.55191426273592 - 126.55191426273592 - - - s849 - 134.79812551397123 - 134.79812551397123 - - - s462 - 159.31342685823375 - 159.31342685823375 - - - s952 - 188.1057869560097 - 188.1057869560097 - - - s462 - 195.3858968452902 - 195.3858968452902 - - - s356 - 204.6054413025831 - 204.6054413025831 - - - s377 - 207.6054413025831 - 207.6054413025831 - - - s356 - 216.54971321258228 - 216.54971321258228 - - - s711 - 221.54971321258228 - 221.54971321258228 - - - s111 - 244.63650597381266 - 244.63650597381266 - - 256.71955194740724 - - - 361.513445926999 - noDriver - v - 0.0 - - s985 - 8.06225774829855 - 8.06225774829855 - - - s841 - 15.872507424205203 - 15.872507424205203 - - - s420 - 47.934946507968 - 47.934946507968 - - - s147 - 95.20015570035389 - 95.20015570035389 - - - s247 - 130.42798560797095 - 130.42798560797095 - - - s420 - 142.42798560797095 - 142.42798560797095 - - - s1 - 145.25641273271714 - 145.25641273271714 - - - s147 - 171.42891738932195 - 171.42891738932195 - - - s985 - 183.47051196811424 - 183.47051196811424 - - - s951 - 184.88472553048734 - 184.88472553048734 - - - s1 - 197.25404240734034 - 197.25404240734034 - - - s622 - 201.49668309445963 - 201.49668309445963 - - - s247 - 202.91089665683273 - 202.91089665683273 - - - s809 - 222.01586983137554 - 222.01586983137554 - - - s622 - 240.40064614222578 - 240.40064614222578 - - - s628 - 250.40064614222578 - 250.40064614222578 - - - s320 - 259.62019059951865 - 259.62019059951865 - - - s841 - 267.68244834781717 - 267.68244834781717 - - - s936 - 285.71020472513715 - 285.71020472513715 - - - s809 - 296.7555657423244 - 296.7555657423244 - - - s951 - 304.8178234906229 - 304.8178234906229 - - - s936 - 313.8178234906229 - 313.8178234906229 - - - s320 - 321.0289260415509 - 321.0289260415509 - - - s628 - 333.0705206203432 - 333.0705206203432 - - 361.513445926999 - - - 424.67735496931516 - noDriver - v - 0.0 - - s971 - 10.816653826391969 - 10.816653826391969 - - - s39 - 13.052721803891759 - 13.052721803891759 - - - s268 - 33.668249931980064 - 33.668249931980064 - - - s260 - 39.99280525231682 - 39.99280525231682 - - - s998 - 60.60833338040513 - 60.60833338040513 - - - s998 - 83.80316038989153 - 83.80316038989153 - - - s158 - 94.98350027739048 - 94.98350027739048 - - - s268 - 110.2150464891183 - 110.2150464891183 - - - s127 - 113.82059776458229 - 113.82059776458229 - - - s971 - 118.29273371958186 - 118.29273371958186 - - - s260 - 121.29273371958186 - 121.29273371958186 - - - s207 - 130.34811885771927 - 130.34811885771927 - - - s127 - 143.94958936645472 - 143.94958936645472 - - - s993 - 155.26329786543948 - 155.26329786543948 - - - s39 - 166.03362747970849 - 166.03362747970849 - - - s718 - 181.16637343013005 - 181.16637343013005 - - - s7 - 188.37747598105804 - 188.37747598105804 - - - s158 - 221.0730414296017 - 221.0730414296017 - - - s340 - 236.62939061570574 - 236.62939061570574 - - - s7 - 242.95394593604252 - 242.95394593604252 - - - s99 - 262.9539459360425 - 262.9539459360425 - - - s207 - 275.7601944109082 - 275.7601944109082 - - - s847 - 278.7601944109082 - 278.7601944109082 - - - s340 - 293.18239951276416 - 293.18239951276416 - - - s847 - 316.52763457262165 - 316.52763457262165 - - - s37 - 320.6507401982393 - 320.6507401982393 - - - s718 - 349.11123913975473 - 349.11123913975473 - - - s993 - 361.6412032258964 - 361.6412032258964 - - - s99 - 363.87727120339616 - 363.87727120339616 - - - s202 - 377.2936790683949 - 377.2936790683949 - - - s37 - 410.5352193455842 - 410.5352193455842 - - - s202 - 417.6062871574497 - 417.6062871574497 - - 424.67735496931516 - - - 440.87606341604845 - noDriver - v - 0.0 - - s854 - 24.351591323771842 - 24.351591323771842 - - - s225 - 36.88155540991351 - 36.88155540991351 - - - s175 - 44.94381315821206 - 44.94381315821206 - - - s688 - 60.175359369939876 - 60.175359369939876 - - - s440 - 67.98560904584653 - 67.98560904584653 - - - s175 - 77.20515350313941 - 77.20515350313941 - - - s459 - 89.28819947673398 - 89.28819947673398 - - - s688 - 99.13705727853008 - 99.13705727853008 - - - s511 - 120.72409042345298 - 120.72409042345298 - - - s225 - 135.95563663518078 - 135.95563663518078 - - - s761 - 154.34041294603102 - 154.34041294603102 - - - s854 - 167.94188345476647 - 167.94188345476647 - - - s928 - 189.41279400835035 - 189.41279400835035 - - - s459 - 196.62389655927834 - 196.62389655927834 - - - s511 - 203.90400644855885 - 203.90400644855885 - - - s761 - 236.04432380853524 - 236.04432380853524 - - - s441 - 238.28039178603504 - 238.28039178603504 - - - s893 - 240.28039178603504 - 240.28039178603504 - - - s395 - 241.69460534840815 - 241.69460534840815 - - - s441 - 256.2548251269692 - 256.2548251269692 - - - s87 - 276.3794369244673 - 276.3794369244673 - - - s395 - 297.6397285499366 - 297.6397285499366 - - - s686 - 304.34793248243597 - 304.34793248243597 - - - s928 - 324.34793248243597 - 324.34793248243597 - - - s614 - 333.8347654629411 - 333.8347654629411 - - - s440 - 355.305676016525 - 355.305676016525 - - - s614 - 379.51311289034544 - 379.51311289034544 - - - s87 - 396.54249925627187 - 396.54249925627187 - - - s893 - 419.6292920175023 - 419.6292920175023 - - - s686 - 426.84039456843027 - 426.84039456843027 - - 440.87606341604845 - - - 470.1944896518631 - noDriver - v - 0.0 - - s929 - 5.0 - 5.0 - - - s965 - 8.60555127546399 - 8.60555127546399 - - - s79 - 9.60555127546399 - 9.60555127546399 - - - s929 - 29.32863419878001 - 29.32863419878001 - - - s743 - 37.13888387468666 - 37.13888387468666 - - - s173 - 40.30116153485504 - 40.30116153485504 - - - s627 - 56.70238100171177 - 56.70238100171177 - - - s965 - 67.51903482810374 - 67.51903482810374 - - - s627 - 76.00431620234231 - 76.00431620234231 - - - s117 - 87.04967721952957 - 87.04967721952957 - - - s17 - 95.2958884707649 - 95.2958884707649 - - - s79 - 102.00409240326427 - 102.00409240326427 - - - s800 - 111.22363686055715 - 111.22363686055715 - - - s173 - 116.60880166769165 - 116.60880166769165 - - - s740 - 132.73331716428874 - 132.73331716428874 - - - s800 - 172.35654267660664 - 172.35654267660664 - - - s879 - 180.41880042490519 - 180.41880042490519 - - - s743 - 195.650346636633 - 195.650346636633 - - - s756 - 199.255897912097 - 199.255897912097 - - - s117 - 212.2943027225023 - 212.2943027225023 - - - s924 - 217.6794675296368 - 217.6794675296368 - - - s740 - 228.72482854682409 - 228.72482854682409 - - - s879 - 233.72482854682409 - 233.72482854682409 - - - s491 - 247.32629905555953 - 247.32629905555953 - - - s924 - 250.93185033102353 - 250.93185033102353 - - - s134 - 271.1803070623401 - 271.1803070623401 - - - s848 - 279.24256481063867 - 279.24256481063867 - - - s17 - 292.280969621044 - 292.280969621044 - - - s404 - 294.280969621044 - 294.280969621044 - - - s134 - 310.0923579218859 - 310.0923579218859 - - - s106 - 316.4954821593187 - 316.4954821593187 - - - s756 - 359.039576931684 - 359.039576931684 - - - s848 - 364.039576931684 - 364.039576931684 - - - s106 - 379.039576931684 - 379.039576931684 - - - s588 - 384.039576931684 - 384.039576931684 - - - s240 - 390.039576931684 - 390.039576931684 - - - s491 - 397.039576931684 - 397.039576931684 - - - s240 - 419.66699392965353 - 419.66699392965353 - - - s588 - 439.313876634042 - 439.313876634042 - - - s404 - 449.313876634042 - 449.313876634042 - - 470.1944896518631 - - - 339.5328185432647 - noDriver - v - 0.0 - - s300 - 11.40175425099138 - 11.40175425099138 - - - s208 - 27.52626974758848 - 27.52626974758848 - - - s855 - 39.56786432638077 - 39.56786432638077 - - - s199 - 54.56786432638077 - 54.56786432638077 - - - s855 - 57.73014198654915 - 57.73014198654915 - - - s889 - 68.1704484954597 - 68.1704484954597 - - - s300 - 78.9407781097287 - 78.9407781097287 - - - s638 - 82.10305576989708 - 82.10305576989708 - - - s321 - 87.93400766474238 - 87.93400766474238 - - - s199 - 98.13204669192795 - 98.13204669192795 - - - s31 - 124.96486242192543 - 124.96486242192543 - - - s889 - 129.0879680475431 - 129.0879680475431 - - - s109 - 142.12637285794838 - 142.12637285794838 - - - s208 - 145.28865051811675 - 145.28865051811675 - - - s329 - 151.6917747555496 - 151.6917747555496 - - - s638 - 152.6917747555496 - 152.6917747555496 - - - s681 - 186.6917747555496 - 186.6917747555496 - - - s109 - 190.2973260310136 - 190.2973260310136 - - - s850 - 201.9592298207042 - 201.9592298207042 - - - s321 - 206.43136577570377 - 206.43136577570377 - - - s850 - 221.6957032981775 - 221.6957032981775 - - - s392 - 244.0563830731754 - 244.0563830731754 - - - s31 - 245.4705966355485 - 245.4705966355485 - - - s329 - 254.9045777676051 - 254.9045777676051 - - - s681 - 280.9813873884157 - 280.9813873884157 - - - s392 - 321.0937296286789 - 321.0937296286789 - - 339.5328185432647 - - - 301.7054123435207 - noDriver - v - 0.0 - - s35 - 9.055385138137417 - 9.055385138137417 - - - s311 - 16.671158244001326 - 16.671158244001326 - - - s38 - 19.499585368747518 - 19.499585368747518 - - - s816 - 22.661863028915896 - 22.661863028915896 - - - s816 - 49.23252354008874 - 49.23252354008874 - - - s508 - 66.3205310307238 - 66.3205310307238 - - - s35 - 85.55591509239514 - 85.55591509239514 - - - s633 - 101.95713455925187 - 101.95713455925187 - - - s385 - 125.04392732048225 - 125.04392732048225 - - - s311 - 163.46267274507935 - 163.46267274507935 - - - s42 - 175.54571871867392 - 175.54571871867392 - - - s633 - 196.94665327770662 - 196.94665327770662 - - - s489 - 222.26463108005095 - 222.26463108005095 - - - s385 - 230.3268888283495 - 230.3268888283495 - - - s38 - 241.37224984553677 - 241.37224984553677 - - - s42 - 244.53452750570514 - 244.53452750570514 - - - s564 - 253.58991264384255 - 253.58991264384255 - - - s508 - 256.7521903040109 - 256.7521903040109 - - - s489 - 263.07674562434767 - 263.07674562434767 - - - s564 - 280.1647531149827 - 280.1647531149827 - - 301.7054123435207 - - - 422.94283933982564 - noDriver - v - 0.0 - - s808 - 22.135943621178654 - 22.135943621178654 - - - s124 - 40.1636999984986 - 40.1636999984986 - - - s782 - 66.41250949531198 - 66.41250949531198 - - - s808 - 74.02828260117589 - 74.02828260117589 - - - s782 - 95.95999480063719 - 95.95999480063719 - - - s425 - 109.4136188477109 - 109.4136188477109 - - - s124 - 123.44928769532909 - 123.44928769532909 - - - s950 - 132.50467283346651 - 132.50467283346651 - - - s538 - 142.80030297445353 - 142.80030297445353 - - - s905 - 146.92340860007118 - 146.92340860007118 - - - s168 - 178.75106952575027 - 178.75106952575027 - - - s538 - 215.15161897215285 - 215.15161897215285 - - - s934 - 223.69562271747037 - 223.69562271747037 - - - s934 - 239.82013821406747 - 239.82013821406747 - - - s425 - 240.82013821406747 - 240.82013821406747 - - - s361 - 249.06634946530278 - 249.06634946530278 - - - s905 - 254.06634946530278 - 254.06634946530278 - - - s56 - 261.27745201623077 - 261.27745201623077 - - - s339 - 273.4429770768272 - 273.4429770768272 - - - s950 - 282.49836221496463 - 282.49836221496463 - - - s168 - 311.9092445546701 - 311.9092445546701 - - - s468 - 322.3495510635807 - 322.3495510635807 - - - s593 - 344.8217561178249 - 344.8217561178249 - - - s468 - 375.30125742608124 - 375.30125742608124 - - - s361 - 380.30125742608124 - 380.30125742608124 - - - s593 - 390.2007523626929 - 390.2007523626929 - - - s56 - 394.6728883176925 - 394.6728883176925 - - - s339 - 409.9044345294203 - 409.9044345294203 - - 422.94283933982564 - - - 386.36237559658184 - noDriver - v - 0.0 - - s773 - 10.816653826391969 - 10.816653826391969 - - - s661 - 18.43242693225588 - 18.43242693225588 - - - s590 - 33.197249992489276 - 33.197249992489276 - - - s963 - 45.56656686934225 - 45.56656686934225 - - - s30 - 63.67733714561709 - 63.67733714561709 - - - s590 - 70.88843969654506 - 70.88843969654506 - - - s547 - 86.69982799738696 - 86.69982799738696 - - - s963 - 101.96416551986071 - 101.96416551986071 - - - s696 - 113.66886543058034 - 113.66886543058034 - - - s661 - 121.479115106487 - 121.479115106487 - - - s30 - 142.7394067319563 - 142.7394067319563 - - - s612 - 153.78476774914355 - 153.78476774914355 - - - s49 - 159.61571964398885 - 159.61571964398885 - - - s696 - 165.69848217428708 - 165.69848217428708 - - - s237 - 185.69848217428708 - 185.69848217428708 - - - s773 - 193.76073992258563 - 193.76073992258563 - - - s44 - 212.00902751348028 - 212.00902751348028 - - - s237 - 259.30596187502215 - 259.30596187502215 - - - s244 - 281.4419054962008 - 281.4419054962008 - - - s44 - 314.5628958195592 - 314.5628958195592 - - - s612 - 319.9480606266937 - 319.9480606266937 - - - s547 - 328.43334200093227 - 328.43334200093227 - - - s154 - 335.7134518902128 - 335.7134518902128 - - - s154 - 359.1442009179328 - 359.1442009179328 - - - s244 - 364.1442009179328 - 364.1442009179328 - - - s49 - 376.51351779478574 - 376.51351779478574 - - 386.36237559658184 - - - 482.4720260853876 - noDriver - v - 0.0 - - s723 - 24.186773244895647 - 24.186773244895647 - - - s744 - 28.30987887051331 - 28.30987887051331 - - - s290 - 32.55251955763259 - 32.55251955763259 - - - s463 - 43.597880574819854 - 43.597880574819854 - - - s723 - 58.597880574819854 - 58.597880574819854 - - - s408 - 79.6216766164485 - 79.6216766164485 - - - s463 - 92.96334068057483 - 92.96334068057483 - - - s680 - 101.02559842887338 - 101.02559842887338 - - - s716 - 109.5696021741909 - 109.5696021741909 - - - s680 - 118.17192744123354 - 118.17192744123354 - - - s8 - 139.19572348286218 - 139.19572348286218 - - - s716 - 141.43179146036198 - 141.43179146036198 - - - s744 - 149.0475645662259 - 149.0475645662259 - - - s528 - 150.461778128599 - 150.461778128599 - - - s528 - 168.48953450591895 - 168.48953450591895 - - - s408 - 175.56060231778443 - 175.56060231778443 - - - s458 - 186.74094220528337 - 186.74094220528337 - - - s775 - 189.74094220528337 - 189.74094220528337 - - - s85 - 191.97701018278318 - 191.97701018278318 - - - s85 - 209.97701018278318 - 209.97701018278318 - - - s290 - 222.78325865764887 - 222.78325865764887 - - - s96 - 227.78325865764887 - 227.78325865764887 - - - s8 - 238.96359854514782 - 238.96359854514782 - - - s114 - 247.02585629344637 - 247.02585629344637 - - - s775 - 252.02585629344637 - 252.02585629344637 - - - s831 - 265.3675203575727 - 265.3675203575727 - - - s353 - 275.6631504985597 - 275.6631504985597 - - - s458 - 282.6631504985597 - 282.6631504985597 - - - s353 - 293.4334801128287 - 293.4334801128287 - - - s421 - 307.3259241022785 - 307.3259241022785 - - - s203 - 316.27019601227767 - 316.27019601227767 - - - s831 - 348.51922700547186 - 348.51922700547186 - - - s942 - 362.73189740902376 - 362.73189740902376 - - - s421 - 386.05570498840495 - 386.05570498840495 - - - s273 - 399.0941097988103 - 399.0941097988103 - - - s114 - 416.0941097988103 - 416.0941097988103 - - - s203 - 425.9429676006064 - 425.9429676006064 - - - s787 - 431.59982185009875 - 431.59982185009875 - - - s942 - 437.2566760995911 - 437.2566760995911 - - - s273 - 451.81689587815214 - 451.81689587815214 - - - s96 - 471.84188027265293 - 471.84188027265293 - - - s787 - 471.84188027265293 - 471.84188027265293 - - 482.4720260853876 - - - 499.9399920498682 - noDriver - v - 0.0 - - s598 - 13.038404810405298 - 13.038404810405298 - - - s636 - 46.653877438348516 - 46.653877438348516 - - - s542 - 60.68954628596671 - 60.68954628596671 - - - s672 - 69.23355003128424 - 69.23355003128424 - - - s437 - 73.47619071840353 - 73.47619071840353 - - - s636 - 98.93203484111925 - 98.93203484111925 - - - s601 - 112.82447883056905 - 112.82447883056905 - - - s598 - 129.82447883056903 - 129.82447883056903 - - - s672 - 130.82447883056903 - 130.82447883056903 - - - s556 - 139.87986396870645 - 139.87986396870645 - - - s323 - 160.12832070002304 - 160.12832070002304 - - - s556 - 170.12832070002304 - 170.12832070002304 - - - s726 - 180.12832070002304 - 180.12832070002304 - - - s542 - 185.12832070002304 - 185.12832070002304 - - - s592 - 199.6885404785841 - 199.6885404785841 - - - s601 - 209.58803541519575 - 209.58803541519575 - - - s216 - 225.20853476700904 - 225.20853476700904 - - - s323 - 232.48864465628955 - 232.48864465628955 - - - s619 - 242.9289511652001 - 242.9289511652001 - - - s726 - 261.2865109158859 - 261.2865109158859 - - - s619 - 269.5327221671212 - 269.5327221671212 - - - s956 - 275.1895764166136 - 275.1895764166136 - - - s749 - 276.6037899789867 - 276.6037899789867 - - - s216 - 288.97310685583966 - 288.97310685583966 - - - s560 - 307.22139444673434 - 307.22139444673434 - - - s592 - 316.44093890402723 - 316.44093890402723 - - - s956 - 342.5177485248378 - 342.5177485248378 - - - s749 - 361.1992902171072 - 361.1992902171072 - - - s803 - 372.60104446809856 - 372.60104446809856 - - - s80 - 382.79908349528415 - 382.79908349528415 - - - s498 - 392.23306462734075 - 392.23306462734075 - - - s560 - 408.26428416922215 - 408.26428416922215 - - - s989 - 419.4446240567211 - 419.4446240567211 - - - s80 - 433.04609456545654 - 433.04609456545654 - - - s803 - 449.17061006205364 - 449.17061006205364 - - - s989 - 467.7716852997919 - 467.7716852997919 - - - s437 - 469.185898862165 - 469.185898862165 - - - s498 - 481.55521573901797 - 481.55521573901797 - - 499.9399920498682 - - - 303.1737927726989 - noDriver - v - 0.0 - - s886 - 17.46424919657298 - 17.46424919657298 - - - s341 - 31.499918044191176 - 31.499918044191176 - - - s504 - 61.73235095985312 - 61.73235095985312 - - - s211 - 67.56330285469842 - 67.56330285469842 - - - s504 - 82.32812591493182 - 82.32812591493182 - - - s577 - 86.45123154054947 - 86.45123154054947 - - - s215 - 89.61350920071786 - 89.61350920071786 - - - s886 - 95.44446109556316 - 95.44446109556316 - - - s512 - 96.44446109556316 - 96.44446109556316 - - - s512 - 117.4682571371918 - 117.4682571371918 - - - s595 - 128.87001138818317 - 128.87001138818317 - - - s215 - 148.5930943114992 - 148.5930943114992 - - - s402 - 156.20886741736308 - 156.20886741736308 - - - s402 - 207.62870794609285 - 207.62870794609285 - - - s211 - 218.4453617724848 - 218.4453617724848 - - - s577 - 227.8793429045414 - 227.8793429045414 - - - s595 - 241.8793429045414 - 241.8793429045414 - - - s341 - 273.02416590933626 - 273.02416590933626 - - 303.1737927726989 - - - 300.81286810877685 - noDriver - v - 0.0 - - s885 - 13.416407864998739 - 13.416407864998739 - - - s372 - 17.41640786499874 - 17.41640786499874 - - - s52 - 67.06517421422438 - 67.06517421422438 - - - s378 - 77.50548072313494 - 77.50548072313494 - - - s703 - 90.65842716110085 - 90.65842716110085 - - - s52 - 94.65842716110085 - 94.65842716110085 - - - s378 - 100.31528141059323 - 100.31528141059323 - - - s409 - 103.47755907076161 - 103.47755907076161 - - - s370 - 106.63983673093 - 106.63983673093 - - - s703 - 110.76294235654765 - 110.76294235654765 - - - s824 - 119.81832749468506 - 119.81832749468506 - - - s409 - 155.83221370542327 - 155.83221370542327 - - - s824 - 160.83221370542327 - 160.83221370542327 - - - s662 - 171.64886753181523 - 171.64886753181523 - - - s955 - 178.7199353436807 - 178.7199353436807 - - - s662 - 183.8189548572735 - 183.8189548572735 - - - s979 - 203.94356665477162 - 203.94356665477162 - - - s885 - 209.32873146190613 - 209.32873146190613 - - - s372 - 217.87273520722366 - 217.87273520722366 - - - s370 - 224.19729052756043 - 224.19729052756043 - - - s979 - 234.63759703647096 - 234.63759703647096 - - - s955 - 274.3364635190294 - 274.3364635190294 - - 300.81286810877685 - - - 352.2457482283697 - noDriver - v - 0.0 - - s433 - 26.92582403567252 - 26.92582403567252 - - - s937 - 56.624308845507514 - 56.624308845507514 - - - s293 - 62.45526074035281 - 62.45526074035281 - - - s422 - 68.85838497778566 - 68.85838497778566 - - - s937 - 73.10102566490495 - 73.10102566490495 - - - s510 - 75.33709364240474 - 75.33709364240474 - - - s750 - 89.37276249002294 - 89.37276249002294 - - - s433 - 115.54526714662774 - 115.54526714662774 - - - s184 - 159.22592648231085 - 159.22592648231085 - - - s510 - 177.33669675858567 - 177.33669675858567 - - - s727 - 194.45393952720937 - 194.45393952720937 - - - s727 - 199.55295904080216 - 199.55295904080216 - - - s217 - 206.83306893008267 - 206.83306893008267 - - - s422 - 234.12775705799504 - 234.12775705799504 - - - s280 - 245.83245696871467 - 245.83245696871467 - - - s750 - 256.27276347762523 - 256.27276347762523 - - - s184 - 274.30051985494515 - 274.30051985494515 - - - s280 - 295.3955429646741 - 295.3955429646741 - - - s217 - 315.6439996959907 - 315.6439996959907 - - - s293 - 350.0096802508699 - 350.0096802508699 - - 352.2457482283697 - - - 350.46724489809424 - noDriver - v - 0.0 - - s32 - 17.804493814764857 - 17.804493814764857 - - - s89 - 20.966771474933235 - 20.966771474933235 - - - s822 - 44.98759577386186 - 44.98759577386186 - - - s89 - 50.08661528745465 - 50.08661528745465 - - - s786 - 56.79481921995402 - 56.79481921995402 - - - s107 - 62.62577111479932 - 62.62577111479932 - - - s697 - 79.62577111479932 - 79.62577111479932 - - - s32 - 101.09668166838321 - 101.09668166838321 - - - s881 - 110.09668166838321 - 110.09668166838321 - - - s697 - 115.09668166838321 - 115.09668166838321 - - - s358 - 120.09668166838321 - 120.09668166838321 - - - s358 - 144.8555184746631 - 144.8555184746631 - - - s786 - 159.8555184746631 - 159.8555184746631 - - - s414 - 163.8555184746631 - 163.8555184746631 - - - s881 - 175.8971130534554 - 175.8971130534554 - - - s191 - 178.72554017820158 - 178.72554017820158 - - - s150 - 185.79660799006706 - 185.79660799006706 - - - s107 - 191.87937052036528 - 191.87937052036528 - - - s822 - 214.3515755746095 - 214.3515755746095 - - - s785 - 226.4346215482041 - 226.4346215482041 - - - s150 - 229.59689920837246 - 229.59689920837246 - - - s70 - 236.66796702023794 - 236.66796702023794 - - - s224 - 251.0901721220939 - 251.0901721220939 - - - s414 - 254.25244978226226 - 254.25244978226226 - - - s224 - 258.4950904693815 - 258.4950904693815 - - - s629 - 270.5366850481738 - 270.5366850481738 - - - s906 - 282.24138495889343 - 282.24138495889343 - - - s906 - 284.24138495889343 - 284.24138495889343 - - - s785 - 289.24138495889343 - 289.24138495889343 - - - s70 - 298.46092941618633 - 298.46092941618633 - - - s814 - 302.584035041804 - 302.584035041804 - - - s629 - 321.6103326322444 - 321.6103326322444 - - - s191 - 327.6103326322444 - 327.6103326322444 - - - s814 - 345.99510894309464 - 345.99510894309464 - - 350.46724489809424 - - - 147.95480365373615 - noDriver - v - 0.0 - - s766 - 18.110770276274835 - 18.110770276274835 - - - s102 - 30.110770276274835 - 30.110770276274835 - - - s637 - 44.14643912389303 - 44.14643912389303 - - - s23 - 60.63886162636368 - 60.63886162636368 - - - s23 - 72.04061587735505 - 72.04061587735505 - - - s637 - 77.04061587735505 - 77.04061587735505 - - - s501 - 117.48811270966843 - 117.48811270966843 - - - s501 - 122.48811270966843 - 122.48811270966843 - - - s766 - 128.8126680300052 - 128.8126680300052 - - - s102 - 142.95480365373615 - 142.95480365373615 - - 147.95480365373615 - - - 412.9769963113504 - noDriver - v - 0.0 - - s145 - 3.605551275463989 - 3.605551275463989 - - - s185 - 34.47624935633025 - 34.47624935633025 - - - s368 - 44.52612497745114 - 44.52612497745114 - - - s145 - 52.52612497745114 - 52.52612497745114 - - - s679 - 59.52612497745114 - 59.52612497745114 - - - s776 - 64.52612497745113 - 64.52612497745113 - - - s586 - 87.1976930749604 - 87.1976930749604 - - - s776 - 92.5828578820949 - 92.5828578820949 - - - s57 - 95.74513554226328 - 95.74513554226328 - - - s586 - 97.98120351976307 - 97.98120351976307 - - - s368 - 105.79145319566973 - 105.79145319566973 - - - s795 - 123.90222347194457 - 123.90222347194457 - - - s655 - 130.97329128381006 - 130.97329128381006 - - - s655 - 154.67983046606946 - 154.67983046606946 - - - s185 - 156.09404402844257 - 156.09404402844257 - - - s308 - 167.13940504562981 - 167.13940504562981 - - - s57 - 171.26251067124747 - 171.26251067124747 - - - s412 - 179.806514416565 - 179.806514416565 - - - s679 - 183.806514416565 - 183.806514416565 - - - s859 - 186.63494154131118 - 186.63494154131118 - - - s990 - 191.73396105490397 - 191.73396105490397 - - - s308 - 198.73396105490397 - 198.73396105490397 - - - s795 - 212.18758510197767 - 212.18758510197767 - - - s218 - 220.43379635321298 - 220.43379635321298 - - - s842 - 242.9060014074572 - 242.9060014074572 - - - s859 - 257.7720701547757 - 257.7720701547757 - - - s469 - 272.19427525663167 - 272.19427525663167 - - - s412 - 274.43034323413144 - 274.43034323413144 - - - s218 - 292.4580996114514 - 292.4580996114514 - - - s653 - 311.4317655724617 - 311.4317655724617 - - - s813 - 319.4317655724617 - 319.4317655724617 - - - s990 - 321.4317655724617 - 321.4317655724617 - - - s813 - 328.5028333843272 - 328.5028333843272 - - - s469 - 351.1302503822967 - 351.1302503822967 - - - s842 - 376.684115060658 - 376.684115060658 - - - s653 - 394.3759210736121 - 394.3759210736121 - - 412.9769963113504 - - - 429.0284019201729 - noDriver - v - 0.0 - - s263 - 34.132096331752024 - 34.132096331752024 - - - s238 - 45.79400012144262 - 45.79400012144262 - - - s373 - 49.79400012144262 - 49.79400012144262 - - - s411 - 60.97434000894157 - 60.97434000894157 - - - s373 - 77.25316060504127 - 77.25316060504127 - - - s16 - 81.72529656004085 - 81.72529656004085 - - - s148 - 83.96136453754063 - 83.96136453754063 - - - s16 - 143.99468861675518 - 143.99468861675518 - - - s238 - 168.20212549057558 - 168.20212549057558 - - - s297 - 192.90030356103253 - 192.90030356103253 - - - s411 - 199.971371372898 - 199.971371372898 - - - s22 - 203.576922648362 - 203.576922648362 - - - s263 - 240.5904336950055 - 240.5904336950055 - - - s163 - 246.99355793243834 - 246.99355793243834 - - - s621 - 256.9935579324383 - 256.9935579324383 - - - s621 - 287.01021997204555 - 287.01021997204555 - - - s297 - 300.16316641001146 - 300.16316641001146 - - - s332 - 318.60225532459725 - 318.60225532459725 - - - s193 - 334.41364362543914 - 334.41364362543914 - - - s148 - 335.41364362543914 - 335.41364362543914 - - - s193 - 352.8778928220121 - 352.8778928220121 - - - s163 - 374.0910962576085 - 374.0910962576085 - - - s22 - 379.476261064743 - 379.476261064743 - - - s332 - 385.80081638507977 - 385.80081638507977 - - - s769 - 391.883578915378 - 391.883578915378 - - - s769 - 397.883578915378 - 397.883578915378 - - 429.0284019201729 - - - 444.33060313457645 - noDriver - v - 0.0 - - s64 - 12.041594578792296 - 12.041594578792296 - - - s94 - 19.657367684656204 - 19.657367684656204 - - - s94 - 50.54425810761721 - 50.54425810761721 - - - s490 - 52.780326085117 - 52.780326085117 - - - s307 - 56.90343171073466 - 56.90343171073466 - - - s447 - 74.39628739527056 - 74.39628739527056 - - - s940 - 93.50126056981335 - 93.50126056981335 - - - s490 - 132.79502597859036 - 132.79502597859036 - - - s791 - 147.1128470418667 - 147.1128470418667 - - - s307 - 149.3489150193665 - 149.3489150193665 - - - s830 - 154.4479345329593 - 154.4479345329593 - - - s447 - 164.2967923347554 - 164.2967923347554 - - - s721 - 170.1277442296007 - 170.1277442296007 - - - s940 - 188.37603182049534 - 188.37603182049534 - - - s292 - 196.92003556581287 - 196.92003556581287 - - - s64 - 219.72354406779561 - 219.72354406779561 - - - s678 - 226.04809938813239 - 226.04809938813239 - - - s791 - 247.071895429761 - 247.071895429761 - - - s222 - 254.282997980689 - 254.282997980689 - - - s830 - 270.0943862815309 - 270.0943862815309 - - - s292 - 278.3405975327662 - 278.3405975327662 - - - s5 - 293.3405975327662 - 293.3405975327662 - - - s582 - 301.4028552810647 - 301.4028552810647 - - - s678 - 311.6008943082503 - 311.6008943082503 - - - s509 - 334.9247018876315 - 334.9247018876315 - - - s222 - 348.8171458770813 - 348.8171458770813 - - - s5 - 357.4194711441239 - 357.4194711441239 - - - s509 - 373.82069061098065 - 373.82069061098065 - - - s626 - 379.651642505826 - 379.651642505826 - - - s721 - 387.2674156116899 - 387.2674156116899 - - - s582 - 399.3090101904822 - 399.3090101904822 - - - s872 - 409.93915600321685 - 409.93915600321685 - - - s626 - 415.03817551680964 - 415.03817551680964 - - - s872 - 431.6814924939029 - 431.6814924939029 - - 444.33060313457645 - - - 421.0020181819808 - noDriver - v - 0.0 - - s442 - 12.041594578792296 - 12.041594578792296 - - - s673 - 60.135253204436495 - 60.135253204436495 - - - s435 - 78.1352532044365 - 78.1352532044365 - - - s198 - 88.9055828187055 - 88.9055828187055 - - - s551 - 122.28222135526278 - 122.28222135526278 - - - s198 - 178.8684387584432 - 178.8684387584432 - - - s777 - 194.09998497017102 - 194.09998497017102 - - - s551 - 215.12378101179965 - 215.12378101179965 - - - s24 - 218.28605867196802 - 218.28605867196802 - - - s435 - 224.11701056681332 - 224.11701056681332 - - - s366 - 235.29735045431227 - 235.29735045431227 - - - s673 - 261.37416007512286 - 261.37416007512286 - - - s748 - 270.860993055628 - 270.860993055628 - - - s442 - 285.6258161158614 - 285.6258161158614 - - - s777 - 300.39063917609485 - 300.39063917609485 - - - s922 - 321.2712521939159 - 321.2712521939159 - - - s613 - 326.3702717075087 - 326.3702717075087 - - - s366 - 330.3702717075087 - 330.3702717075087 - - - s483 - 334.8424076625083 - 334.8424076625083 - - - s922 - 351.24362712936505 - 351.24362712936505 - - - s748 - 359.30588487766363 - 359.30588487766363 - - - s613 - 367.36814262596215 - 367.36814262596215 - - - s24 - 374.6482525152427 - 374.6482525152427 - - - s483 - 396.6709680607879 - 396.6709680607879 - - 421.0020181819808 - - - 301.6307230067693 - noDriver - v - 0.0 - - s25 - 20.223748416156685 - 20.223748416156685 - - - s432 - 35.74792311241671 - 35.74792311241671 - - - s364 - 39.74792311241671 - 39.74792311241671 - - - s550 - 60.33918339439071 - 60.33918339439071 - - - s364 - 61.33918339439071 - 61.33918339439071 - - - s122 - 63.5752513718905 - 63.5752513718905 - - - s550 - 64.5752513718905 - 64.5752513718905 - - - s943 - 65.5752513718905 - 65.5752513718905 - - - s600 - 71.4062032667358 - 71.4062032667358 - - - s25 - 81.2550610685319 - 81.2550610685319 - - - s724 - 96.38780701895345 - 96.38780701895345 - - - s724 - 167.4511590367129 - 167.4511590367129 - - - s432 - 171.57426466233056 - 171.57426466233056 - - - s122 - 176.95942946946508 - 176.95942946946508 - - - s309 - 186.80828727126118 - 186.80828727126118 - - - s476 - 189.63671439600736 - 189.63671439600736 - - - s180 - 192.46514152075355 - 192.46514152075355 - - - s600 - 207.7294790432273 - 207.7294790432273 - - - s567 - 226.0870387939131 - 226.0870387939131 - - - s567 - 242.36585939001282 - 242.36585939001282 - - - s943 - 248.76898362744566 - 248.76898362744566 - - - s180 - 252.76898362744566 - 252.76898362744566 - - - s309 - 262.76898362744566 - 262.76898362744566 - - - s476 - 272.76898362744566 - 272.76898362744566 - - 301.6307230067693 - - - 233.45514079733672 - noDriver - v - 0.0 - - s807 - 5.830951894845301 - 5.830951894845301 - - - s362 - 30.56958564855126 - 30.56958564855126 - - - s911 - 57.40240137854874 - 57.40240137854874 - - - s651 - 80.07396947605801 - 80.07396947605801 - - - s807 - 90.07396947605801 - 90.07396947605801 - - - s359 - 94.54610543105758 - 94.54610543105758 - - - s911 - 95.54610543105758 - 95.54610543105758 - - - s829 - 103.54610543105758 - 103.54610543105758 - - - s226 - 115.25080534177721 - 115.25080534177721 - - - s651 - 125.54643548276421 - 125.54643548276421 - - - s137 - 127.782503460264 - 127.782503460264 - - - s226 - 139.9890590759977 - 139.9890590759977 - - - s359 - 164.0306896363403 - 164.0306896363403 - - - s829 - 175.4324438873317 - 175.4324438873317 - - - s362 - 184.8664250193883 - 184.8664250193883 - - - s137 - 215.01605188275096 - 215.01605188275096 - - 233.45514079733672 - - - 237.8881330361732 - noDriver - v - 0.0 - - s269 - 30.066592756745816 - 30.066592756745816 - - - s4 - 51.65362590166872 - 51.65362590166872 - - - s416 - 64.0229427785217 - 64.0229427785217 - - - s695 - 79.0562391568946 - 79.0562391568946 - - - s374 - 91.0978337356869 - 91.0978337356869 - - - s4 - 105.3105041392388 - 105.3105041392388 - - - s416 - 109.78264009423839 - 109.78264009423839 - - - s269 - 116.49084402673776 - 116.49084402673776 - - - s695 - 126.49084402673776 - 126.49084402673776 - - - s602 - 129.65312168690613 - 129.65312168690613 - - - s279 - 172.10309224048837 - 172.10309224048837 - - - s602 - 177.48825704762288 - 177.48825704762288 - - - s374 - 205.07448549589031 - 205.07448549589031 - - - s279 - 216.25482538338926 - 216.25482538338926 - - 237.8881330361732 - - - 408.90594223941497 - noDriver - v - 0.0 - - s12 - 16.1245154965971 - 16.1245154965971 - - - s910 - 25.973373298393202 - 25.973373298393202 - - - s499 - 32.29792861872996 - 32.29792861872996 - - - s492 - 39.57803850801048 - 39.57803850801048 - - - s910 - 75.63355126265037 - 75.63355126265037 - - - s845 - 83.44380093855702 - 83.44380093855702 - - - s347 - 94.75750943754178 - 94.75750943754178 - - - s12 - 109.31772921610282 - 109.31772921610282 - - - s155 - 120.08805883037182 - 120.08805883037182 - - - s347 - 126.17082136067005 - 126.17082136067005 - - - s492 - 130.29392698628772 - 130.29392698628772 - - - s179 - 131.70814054866082 - 131.70814054866082 - - - s770 - 154.55545986625253 - 154.55545986625253 - - - s499 - 175.17098799434083 - 175.17098799434083 - - - s770 - 191.20220753622223 - 191.20220753622223 - - - s804 - 195.3253131618399 - 195.3253131618399 - - - s75 - 206.14196698823184 - 206.14196698823184 - - - s845 - 216.14196698823184 - 216.14196698823184 - - - s179 - 220.2650726138495 - 220.2650726138495 - - - s804 - 225.3640921274423 - 225.3640921274423 - - - s230 - 234.4194772655797 - 234.4194772655797 - - - s187 - 245.4194772655797 - 245.4194772655797 - - - s75 - 257.461071844372 - 257.461071844372 - - - s482 - 267.461071844372 - 267.461071844372 - - - s58 - 276.40534375437113 - 276.40534375437113 - - - s187 - 280.5284493799888 - 280.5284493799888 - - - s69 - 293.87011344411513 - 293.87011344411513 - - - s69 - 314.7507264619362 - 314.7507264619362 - - - s930 - 337.22293151618044 - 337.22293151618044 - - - s230 - 349.305977489775 - 349.305977489775 - - - s930 - 355.1369293846203 - 355.1369293846203 - - - s58 - 361.54005362205316 - 361.54005362205316 - - - s482 - 392.3458972235519 - 392.3458972235519 - - - s155 - 399.9616703294158 - 399.9616703294158 - - 408.90594223941497 - - - 251.32005064477687 - noDriver - v - 0.0 - - s867 - 10.295630140987 - 10.295630140987 - - - s867 - 47.092369126935196 - 47.092369126935196 - - - s241 - 59.89861760180089 - 59.89861760180089 - - - s241 - 84.8986176018009 - 84.8986176018009 - - - s20 - 113.34154290845667 - 113.34154290845667 - - - s732 - 130.3709292743831 - 130.3709292743831 - - - s683 - 150.0178119787716 - 150.0178119787716 - - - s519 - 159.073197116909 - 159.073197116909 - - - s20 - 186.73183048878766 - 186.73183048878766 - - - s923 - 202.88732491019118 - 202.88732491019118 - - - s732 - 204.3015384725643 - 204.3015384725643 - - - s923 - 214.3015384725643 - 214.3015384725643 - - - s519 - 221.3015384725643 - 221.3015384725643 - - - s683 - 224.3015384725643 - 224.3015384725643 - - 251.32005064477687 - - - 435.6557239803755 - noDriver - v - 0.0 - - s962 - 25.317977802344327 - 25.317977802344327 - - - s656 - 35.31797780234433 - 35.31797780234433 - - - s306 - 55.41772904458611 - 55.41772904458611 - - - s708 - 71.81894851144284 - 71.81894851144284 - - - s656 - 93.77344691154299 - 93.77344691154299 - - - s9 - 117.8150774718856 - 117.8150774718856 - - - s9 - 124.21820170931845 - 124.21820170931845 - - - s406 - 139.25149808769135 - 139.25149808769135 - - - s63 - 146.32256589955682 - 146.32256589955682 - - - s962 - 151.70773070669134 - 151.70773070669134 - - - s365 - 162.00336084767832 - 162.00336084767832 - - - s306 - 190.30530424384813 - 190.30530424384813 - - - s2 - 194.7774401988477 - 194.7774401988477 - - - s708 - 204.7774401988477 - 204.7774401988477 - - - s720 - 219.09526126212404 - 219.09526126212404 - - - s63 - 228.03953317212319 - 228.03953317212319 - - - s144 - 237.93902810873485 - 237.93902810873485 - - - s365 - 255.43188379327074 - 255.43188379327074 - - - s144 - 273.81666010412096 - 273.81666010412096 - - - s611 - 280.2197843415538 - 280.2197843415538 - - - s406 - 282.2197843415538 - 282.2197843415538 - - - s652 - 297.0858530888723 - 297.0858530888723 - - - s709 - 317.3343098201889 - 317.3343098201889 - - - s611 - 338.21492283800995 - 338.21492283800995 - - - s709 - 341.37720049817835 - 341.37720049817835 - - - s834 - 346.47622001177115 - 346.47622001177115 - - - s720 - 352.5589825420694 - 352.5589825420694 - - - s834 - 383.3648261435681 - 383.3648261435681 - - - s652 - 387.6074668306874 - 387.6074668306874 - - - s2 - 394.31567076318674 - 394.31567076318674 - - 435.6557239803755 - - - 260.72430017827253 - noDriver - v - 0.0 - - s827 - 42.44997055358225 - 42.44997055358225 - - - s692 - 47.54899006717503 - 47.54899006717503 - - - s278 - 56.15131533421766 - 56.15131533421766 - - - s827 - 64.2135730825162 - 64.2135730825162 - - - s866 - 65.6277866448893 - 65.6277866448893 - - - s3 - 69.23333792035329 - 69.23333792035329 - - - s692 - 73.23333792035329 - 73.23333792035329 - - - s431 - 89.35785341695039 - 89.35785341695039 - - - s220 - 116.35785341695039 - 116.35785341695039 - - - s431 - 128.3994479957427 - 128.3994479957427 - - - s3 - 138.3994479957427 - 138.3994479957427 - - - s898 - 155.3994479957427 - 155.3994479957427 - - - s68 - 179.42027229467132 - 179.42027229467132 - - - s68 - 194.42027229467132 - 194.42027229467132 - - - s294 - 205.23692612106328 - 205.23692612106328 - - - s220 - 215.67723262997382 - 215.67723262997382 - - - s294 - 217.67723262997382 - 217.67723262997382 - - - s866 - 225.73949037827236 - 225.73949037827236 - - - s278 - 233.01960026755287 - 233.01960026755287 - - - s898 - 244.7243001782725 - 244.7243001782725 - - 260.72430017827253 - - - 290.6750302203136 - noDriver - v - 0.0 - - s401 - 9.848857801796104 - 9.848857801796104 - - - s394 - 21.25061205278748 - 21.25061205278748 - - - s401 - 46.548833334134514 - 46.548833334134514 - - - s346 - 48.548833334134514 - 48.548833334134514 - - - s394 - 51.71111099430289 - 51.71111099430289 - - - s580 - 58.11423523173574 - 58.11423523173574 - - - s232 - 75.83428037840508 - 75.83428037840508 - - - s964 - 92.47759735549832 - 92.47759735549832 - - - s815 - 104.47759735549832 - 104.47759735549832 - - - s232 - 119.77465589627667 - 119.77465589627667 - - - s120 - 132.81306070668197 - 132.81306070668197 - - - s815 - 165.70682911347902 - 165.70682911347902 - - - s972 - 186.2251136421622 - 186.2251136421622 - - - s580 - 197.6268678931536 - 197.6268678931536 - - - s419 - 200.6268678931536 - 200.6268678931536 - - - s964 - 202.6268678931536 - 202.6268678931536 - - - s120 - 223.14515242183677 - 223.14515242183677 - - - s346 - 234.19051343902402 - 234.19051343902402 - - - s972 - 273.190513439024 - 273.190513439024 - - - s419 - 279.27327596932224 - 279.27327596932224 - - 290.6750302203136 - - - 340.00846559760157 - noDriver - v - 0.0 - - s303 - 22.02271554554524 - 22.02271554554524 - - - s677 - 28.105478075843457 - 28.105478075843457 - - - s209 - 54.27798273244826 - 54.27798273244826 - - - s677 - 58.75011868744784 - 58.75011868744784 - - - s945 - 72.78578753506604 - 72.78578753506604 - - - s132 - 86.38725804380148 - 86.38725804380148 - - - s209 - 118.40287923096572 - 118.40287923096572 - - - s987 - 120.40287923096572 - 120.40287923096572 - - - s945 - 128.4651369792643 - 128.4651369792643 - - - s132 - 149.0563972612383 - 149.0563972612383 - - - s400 - 163.37421832451463 - 163.37421832451463 - - - s234 - 166.97976959997862 - 166.97976959997862 - - - s213 - 179.0213641787709 - 179.0213641787709 - - - s987 - 185.34591949910768 - 185.34591949910768 - - - s345 - 197.00782328879828 - 197.00782328879828 - - - s303 - 200.61337456426227 - 200.61337456426227 - - - s888 - 214.5417628414464 - 214.5417628414464 - - - s345 - 221.24996677394577 - 221.24996677394577 - - - s759 - 231.09882457574187 - 231.09882457574187 - - - s213 - 262.1149494142835 - 262.1149494142835 - - - s667 - 267.9459013091288 - 267.9459013091288 - - - s400 - 276.0081590574274 - 276.0081590574274 - - - s667 - 278.0081590574274 - 278.0081590574274 - - - s759 - 293.8195473582693 - 293.8195473582693 - - - s234 - 302.3635511035868 - 302.3635511035868 - - - s888 - 319.39293746951324 - 319.39293746951324 - - 340.00846559760157 - - - 301.8723620535624 - noDriver - v - 0.0 - - s1000 - 7.810249675906654 - 7.810249675906654 - - - s26 - 18.855610693093915 - 18.855610693093915 - - - s645 - 43.87560269948752 - 43.87560269948752 - - - s584 - 62.26037901033776 - 62.26037901033776 - - - s660 - 71.31576414847518 - 71.31576414847518 - - - s26 - 88.78001334504816 - 88.78001334504816 - - - s584 - 125.46788600073644 - 125.46788600073644 - - - s768 - 126.46788600073644 - 126.46788600073644 - - - s789 - 137.7815944997212 - 137.7815944997212 - - - s660 - 149.98815011545489 - 149.98815011545489 - - - s1000 - 164.98815011545489 - 164.98815011545489 - - - s304 - 173.93242202545406 - 173.93242202545406 - - - s525 - 183.15196648274696 - 183.15196648274696 - - - s768 - 190.22303429461243 - 190.22303429461243 - - - s324 - 194.695170249612 - 194.695170249612 - - - s324 - 213.2962454873503 - 213.2962454873503 - - - s525 - 246.58287944153676 - 246.58287944153676 - - - s789 - 251.58287944153676 - 251.58287944153676 - - - s698 - 257.9860036789696 - 257.9860036789696 - - - s645 - 276.0137600562896 - 276.0137600562896 - - - s304 - 280.13686568190724 - 280.13686568190724 - - - s698 - 284.3795063690265 - 284.3795063690265 - - 301.8723620535624 - - - 326.5549029606495 - noDriver - v - 0.0 - - s670 - 10.63014581273465 - 10.63014581273465 - - - s832 - 24.08376985980836 - 24.08376985980836 - - - s715 - 38.22590548353931 - 38.22590548353931 - - - s330 - 49.27126650072657 - 49.27126650072657 - - - s48 - 66.9630725136807 - 66.9630725136807 - - - s832 - 85.07384278995553 - 85.07384278995553 - - - s330 - 93.32005404119086 - 93.32005404119086 - - - s715 - 96.92560531665485 - 96.92560531665485 - - - s675 - 100.08788297682324 - 100.08788297682324 - - - s48 - 108.69020824386587 - 108.69020824386587 - - - s192 - 114.34706249335825 - 114.34706249335825 - - - s169 - 120.17801438820355 - 120.17801438820355 - - - s315 - 149.33277386243006 - 149.33277386243006 - - - s670 - 151.56884183992986 - 151.56884183992986 - - - s502 - 159.3790915158365 - 159.3790915158365 - - - s192 - 172.72075557996283 - 172.72075557996283 - - - s387 - 176.84386120558048 - 176.84386120558048 - - - s502 - 196.86884560008127 - 196.86884560008127 - - - s169 - 206.08839005737417 - 206.08839005737417 - - - s725 - 218.29494567310786 - 218.29494567310786 - - - s396 - 221.90049694857186 - 221.90049694857186 - - - s675 - 234.54960758924537 - 234.54960758924537 - - - s427 - 254.64935883148715 - 254.64935883148715 - - - s427 - 262.7116165797857 - 262.7116165797857 - - - s725 - 276.7472854274039 - 276.7472854274039 - - - s396 - 278.98335340490365 - 278.98335340490365 - - - s315 - 303.1701266497993 - 303.1701266497993 - - - s387 - 308.1701266497993 - 308.1701266497993 - - 326.5549029606495 - - - 490.69863732461374 - noDriver - v - 0.0 - - s892 - 23.706539182259394 - 23.706539182259394 - - - s516 - 46.531963603286044 - 46.531963603286044 - - - s97 - 60.74463400683794 - 60.74463400683794 - - - s60 - 69.96417846413082 - 69.96417846413082 - - - s925 - 74.43631441913041 - 74.43631441913041 - - - s925 - 126.3304374004469 - 126.3304374004469 - - - s92 - 129.9359886759109 - 129.9359886759109 - - - s516 - 141.11632856340984 - 141.11632856340984 - - - s103 - 153.19937453700442 - 153.19937453700442 - - - s92 - 168.06544328432292 - 168.06544328432292 - - - s164 - 173.45060809145744 - 173.45060809145744 - - - s60 - 188.31667683877595 - 188.31667683877595 - - - s892 - 205.5213273728612 - 205.5213273728612 - - - s174 - 213.58358512115976 - 213.58358512115976 - - - s174 - 225.28828503187938 - 225.28828503187938 - - - s557 - 242.55096153351144 - 242.55096153351144 - - - s262 - 265.87476911289264 - 265.87476911289264 - - - s103 - 281.3989438091527 - 281.3989438091527 - - - s549 - 289.0147169150166 - 289.0147169150166 - - - s164 - 291.0147169150166 - 291.0147169150166 - - - s262 - 294.176994575185 - 294.176994575185 - - - s104 - 301.388097126113 - 301.388097126113 - - - s97 - 302.388097126113 - 302.388097126113 - - - s129 - 320.27664094611134 - 320.27664094611134 - - - s90 - 335.27664094611134 - 335.27664094611134 - - - s557 - 351.0880292469532 - 351.0880292469532 - - - s6 - 355.2111348725709 - 355.2111348725709 - - - s90 - 370.7353095688309 - 370.7353095688309 - - - s104 - 399.17823487548674 - 399.17823487548674 - - - s6 - 417.61732379007253 - 417.61732379007253 - - - s129 - 434.2606407671658 - 434.2606407671658 - - - s549 - 460.4331454237706 - 460.4331454237706 - - 490.69863732461374 - - - 324.1496329549029 - noDriver - v - 0.0 - - s314 - 7.0710678118654755 - 7.0710678118654755 - - - s931 - 13.779271744364845 - 13.779271744364845 - - - s449 - 20.487475676864214 - 20.487475676864214 - - - s210 - 28.29772535277087 - 28.29772535277087 - - - s314 - 50.658405127768766 - 50.658405127768766 - - - s496 - 64.0748129927675 - 64.0748129927675 - - - s84 - 71.35492288204803 - 71.35492288204803 - - - s449 - 98.66792344954335 - 98.66792344954335 - - - s983 - 102.27347472500735 - 102.27347472500735 - - - s210 - 105.10190184975353 - 105.10190184975353 - - - s931 - 107.93032897449972 - 107.93032897449972 - - - s927 - 114.33345321193256 - 114.33345321193256 - - - s84 - 115.74766677430566 - 115.74766677430566 - - - s34 - 137.67937897376697 - 137.67937897376697 - - - s730 - 146.89892343105987 - 146.89892343105987 - - - s496 - 148.31313699343298 - 148.31313699343298 - - - s983 - 174.2746469649273 - 174.2746469649273 - - - s689 - 187.87611747366276 - 187.87611747366276 - - - s966 - 199.27787172465415 - 199.27787172465415 - - - s927 - 214.50941793638196 - 214.50941793638196 - - - s833 - 225.27974755065097 - 225.27974755065097 - - - s730 - 237.32134212944325 - 237.32134212944325 - - - s34 - 250.0492641908011 - 250.0492641908011 - - - s256 - 263.4656720557998 - 263.4656720557998 - - - s689 - 274.23600167006884 - 274.23600167006884 - - - s966 - 293.34097484461165 - 293.34097484461165 - - - s256 - 300.4120426564771 - 300.4120426564771 - - - s833 - 317.44142902240355 - 317.44142902240355 - - 324.1496329549029 - - - 260.75927023015356 - noDriver - v - 0.0 - - s478 - 11.40175425099138 - 11.40175425099138 - - - s166 - 20.888587231496516 - 20.888587231496516 - - - s166 - 49.349086173011926 - 49.349086173011926 - - - s880 - 54.73425098014643 - 54.73425098014643 - - - s649 - 55.73425098014643 - 55.73425098014643 - - - s231 - 60.73425098014643 - 60.73425098014643 - - - s178 - 68.79650872844498 - 68.79650872844498 - - - s649 - 81.83491353885027 - 81.83491353885027 - - - s666 - 87.83491353885027 - 87.83491353885027 - - - s231 - 105.63940735361513 - 105.63940735361513 - - - s961 - 113.44965702952177 - 113.44965702952177 - - - s178 - 122.66920148681466 - 122.66920148681466 - - - s478 - 135.66920148681464 - 135.66920148681464 - - - s201 - 154.02676123750047 - 154.02676123750047 - - - s607 - 157.18903889766884 - 157.18903889766884 - - - s880 - 158.60325246004194 - 158.60325246004194 - - - s961 - 173.46932120736045 - 173.46932120736045 - - - s666 - 178.46932120736045 - 178.46932120736045 - - - s334 - 184.55208373765868 - 184.55208373765868 - - - s607 - 204.80054046897527 - 204.80054046897527 - - - s201 - 231.04934996578865 - 231.04934996578865 - - - s334 - 235.04934996578865 - 235.04934996578865 - - 260.75927023015356 - - - 298.48622224366125 - noDriver - v - 0.0 - - s214 - 27.294688127912362 - 27.294688127912362 - - - s669 - 35.356945876210915 - 35.356945876210915 - - - s890 - 37.356945876210915 - 37.356945876210915 - - - s836 - 39.5930138537107 - 39.5930138537107 - - - s890 - 67.6108653059545 - 67.6108653059545 - - - s242 - 76.83040976324739 - 76.83040976324739 - - - s836 - 85.37441350856491 - 85.37441350856491 - - - s767 - 92.08261744106429 - 92.08261744106429 - - - s267 - 105.68408794979973 - 105.68408794979973 - - - s214 - 133.70193940204354 - 133.70193940204354 - - - s594 - 141.94815065327884 - 141.94815065327884 - - - s242 - 165.29338571313636 - 165.29338571313636 - - - s295 - 170.39240522672915 - 170.39240522672915 - - - s767 - 172.62847320422895 - 172.62847320422895 - - - s914 - 180.6907309525275 - 180.6907309525275 - - - s594 - 182.9267989300273 - 182.9267989300273 - - - s228 - 193.97215994721455 - 193.97215994721455 - - - s267 - 201.97215994721455 - 201.97215994721455 - - - s62 - 214.05520592080913 - 214.05520592080913 - - - s62 - 235.64223906573204 - 235.64223906573204 - - - s295 - 237.87830704323184 - 237.87830704323184 - - - s228 - 249.28006129422323 - 249.28006129422323 - - - s669 - 284.2085596873692 - 284.2085596873692 - - - s914 - 286.44462766486896 - 286.44462766486896 - - 298.48622224366125 - - - 286.86950037308674 - noDriver - v - 0.0 - - s28 - 8.06225774829855 - 8.06225774829855 - - - s21 - 29.64929089322145 - 29.64929089322145 - - - s317 - 38.25161616026408 - 38.25161616026408 - - - s21 - 41.413893820432456 - 41.413893820432456 - - - s794 - 46.51291333402524 - 46.51291333402524 - - - s546 - 102.55753841083346 - 102.55753841083346 - - - s825 - 106.16308968629745 - 106.16308968629745 - - - s317 - 116.21296530741834 - 116.21296530741834 - - - s28 - 118.44903328491813 - 118.44903328491813 - - - s74 - 126.51129103321668 - 126.51129103321668 - - - s14 - 127.51129103321668 - 127.51129103321668 - - - s546 - 143.06764021932074 - 143.06764021932074 - - - s526 - 162.17261339386354 - 162.17261339386354 - - - s14 - 164.40868137136334 - 164.40868137136334 - - - s702 - 193.27042075068698 - 193.27042075068698 - - - s74 - 216.29214961712967 - 216.29214961712967 - - - s794 - 240.0618782651391 - 240.0618782651391 - - - s825 - 252.14492423873367 - 252.14492423873367 - - - s702 - 265.7463947474691 - 265.7463947474691 - - - s526 - 269.86950037308674 - 269.86950037308674 - - 286.86950037308674 - - - 305.268938028489 - noDriver - v - 0.0 - - s796 - 35.05709628591621 - 35.05709628591621 - - - s190 - 38.6626475613802 - 38.6626475613802 - - - s265 - 53.6626475613802 - 53.6626475613802 - - - s380 - 59.6626475613802 - 59.6626475613802 - - - s986 - 73.26411807011564 - 73.26411807011564 - - - s796 - 89.07550637095754 - 89.07550637095754 - - - s388 - 95.4000616912943 - 95.4000616912943 - - - s190 - 103.64627294252962 - 103.64627294252962 - - - s388 - 111.70853069082817 - 111.70853069082817 - - - s742 - 121.90656971801374 - 121.90656971801374 - - - s335 - 129.7168193939204 - 129.7168193939204 - - - s335 - 132.54524651866657 - 132.54524651866657 - - - s860 - 143.85895501765134 - 143.85895501765134 - - - s986 - 156.22827189450433 - 156.22827189450433 - - - s742 - 160.7004078495039 - 160.7004078495039 - - - s457 - 167.7004078495039 - 167.7004078495039 - - - s380 - 174.10353208693675 - 174.10353208693675 - - - s389 - 186.2690571475332 - 186.2690571475332 - - - s811 - 206.8845852756215 - 206.8845852756215 - - - s457 - 209.8845852756215 - 209.8845852756215 - - - s389 - 216.20914059595827 - 216.20914059595827 - - - s135 - 222.53369591629504 - 222.53369591629504 - - - s851 - 223.94790947866815 - 223.94790947866815 - - - s860 - 255.9635306658324 - 255.9635306658324 - - - s265 - 256.9635306658324 - 256.9635306658324 - - - s811 - 269.4934947519741 - 269.4934947519741 - - - s851 - 280.31014857836607 - 280.31014857836607 - - - s135 - 294.452284202097 - 294.452284202097 - - 305.268938028489 - - - 116.61172419982532 - noDriver - v - 0.0 - - s812 - 20.248456731316587 - 20.248456731316587 - - - s558 - 23.07688385606278 - 23.07688385606278 - - - s286 - 47.81551760976874 - 47.81551760976874 - - - s717 - 57.03506206706163 - 57.03506206706163 - - - s558 - 69.68417270773514 - 69.68417270773514 - - - s717 - 71.92024068523493 - 71.92024068523493 - - - s286 - 89.92024068523493 - 89.92024068523493 - - - s812 - 99.40707366574007 - 99.40707366574007 - - 116.61172419982532 - - - 356.61008788082506 - noDriver - v - 0.0 - - s500 - 3.1622776601683795 - 3.1622776601683795 - - - s531 - 28.242150068137285 - 28.242150068137285 - - - s19 - 38.292025689258175 - 38.292025689258175 - - - s125 - 43.677190496392676 - 43.677190496392676 - - - s861 - 62.03475024707849 - 62.03475024707849 - - - s125 - 66.50688620207808 - 66.50688620207808 - - - s531 - 69.66916386224646 - 69.66916386224646 - - - s500 - 74.14129981724605 - 74.14129981724605 - - - s110 - 91.60554901381903 - 91.60554901381903 - - - s563 - 106.73829496424058 - 106.73829496424058 - - - s249 - 111.73829496424058 - 111.73829496424058 - - - s249 - 161.98767306984502 - 161.98767306984502 - - - s563 - 163.40188663221812 - 163.40188663221812 - - - s685 - 179.89430913468877 - 179.89430913468877 - - - s861 - 182.13037711218857 - 182.13037711218857 - - - s110 - 185.73592838765256 - 185.73592838765256 - - - s817 - 210.4341064581095 - 210.4341064581095 - - - s671 - 217.6452090090375 - 217.6452090090375 - - - s973 - 226.18921275435503 - 226.18921275435503 - - - s19 - 246.31382455185314 - 246.31382455185314 - - - s869 - 262.59264514795285 - 262.59264514795285 - - - s671 - 265.59264514795285 - 265.59264514795285 - - - s780 - 272.80374769888084 - 272.80374769888084 - - - s685 - 273.80374769888084 - 273.80374769888084 - - - s973 - 289.95924212028433 - 289.95924212028433 - - - s780 - 302.0422880938789 - 302.0422880938789 - - - s817 - 310.5862918391964 - 310.5862918391964 - - - s869 - 331.61008788082506 - 331.61008788082506 - - 356.61008788082506 - - - 382.69700892817434 - noDriver - v - 0.0 - - s337 - 5.0990195135927845 - 5.0990195135927845 - - - s283 - 9.222125139210444 - 9.222125139210444 - - - s565 - 37.68262408072586 - 37.68262408072586 - - - s337 - 39.68262408072586 - 39.68262408072586 - - - s734 - 52.051940957578836 - 52.051940957578836 - - - s18 - 71.28732501925018 - 71.28732501925018 - - - s565 - 82.68907927024155 - 82.68907927024155 - - - s91 - 91.29140453728418 - 91.29140453728418 - - - s731 - 123.49388891349341 - 123.49388891349341 - - - s731 - 158.66489970363136 - 158.66489970363136 - - - s283 - 168.96052984461835 - 168.96052984461835 - - - s91 - 177.44581121885693 - 177.44581121885693 - - - s583 - 185.50806896715548 - 185.50806896715548 - - - s583 - 210.023370311418 - 210.023370311418 - - - s754 - 219.07875544955542 - 219.07875544955542 - - - s734 - 221.07875544955542 - 221.07875544955542 - - - s119 - 231.51906195846595 - 231.51906195846595 - - - s157 - 240.73860641575885 - 240.73860641575885 - - - s108 - 243.90088407592722 - 243.90088407592722 - - - s18 - 256.4308481620689 - 256.4308481620689 - - - s819 - 264.04662126793284 - 264.04662126793284 - - - s157 - 273.10200640607025 - 273.10200640607025 - - - s119 - 274.51621996844335 - 274.51621996844335 - - - s319 - 282.51621996844335 - 282.51621996844335 - - - s36 - 299.9804691650163 - 299.9804691650163 - - - s319 - 329.04935287251357 - 329.04935287251357 - - - s36 - 351.85286137449634 - 351.85286137449634 - - - s754 - 373.98880499567497 - 373.98880499567497 - - - s819 - 376.22487297317474 - 376.22487297317474 - - - s108 - 380.69700892817434 - 380.69700892817434 - - 382.69700892817434 - - - 328.4075230509729 - noDriver - v - 0.0 - - s707 - 13.152946437965905 - 13.152946437965905 - - - s426 - 54.26255602015483 - 54.26255602015483 - - - s159 - 62.806559765472365 - 62.806559765472365 - - - s471 - 67.80655976547237 - 67.80655976547237 - - - s828 - 88.99617986588946 - 88.99617986588946 - - - s426 - 120.94927048323038 - 120.94927048323038 - - - s471 - 135.8153392305489 - 135.8153392305489 - - - s779 - 163.11002735846125 - 163.11002735846125 - - - s903 - 171.35623860969656 - 171.35623860969656 - - - s159 - 179.60244986093187 - 179.60244986093187 - - - s828 - 180.60244986093187 - 180.60244986093187 - - - s868 - 205.8413087891798 - 205.8413087891798 - - - s877 - 217.2430630401712 - 217.2430630401712 - - - s707 - 227.44110206735675 - 227.44110206735675 - - - s548 - 246.85758990630436 - 246.85758990630436 - - - s903 - 256.0771343635972 - 256.0771343635972 - - - s548 - 258.313202341097 - 258.313202341097 - - - s868 - 263.6983671482315 - 263.6983671482315 - - - s779 - 277.7340359958497 - 277.7340359958497 - - - s877 - 297.1505238347973 - 297.1505238347973 - - 328.4075230509729 - - - 408.22566978561275 - noDriver - v - 0.0 - - s713 - 4.47213595499958 - 4.47213595499958 - - - s113 - 17.625082392965485 - 17.625082392965485 - - - s282 - 52.61079376203729 - 52.61079376203729 - - - s843 - 80.61079376203729 - 80.61079376203729 - - - s566 - 85.70981327563007 - 85.70981327563007 - - - s713 - 92.41801720812944 - 92.41801720812944 - - - s277 - 96.02356848359344 - 96.02356848359344 - - - s113 - 102.34812380393019 - 102.34812380393019 - - - s196 - 103.76233736630329 - 103.76233736630329 - - - s282 - 106.92461502647167 - 106.92461502647167 - - - s843 - 126.62233063006389 - 126.62233063006389 - - - s336 - 130.22788190552788 - 130.22788190552788 - - - s81 - 143.3808283434938 - 143.3808283434938 - - - s336 - 169.32307188563948 - 169.32307188563948 - - - s205 - 169.32307188563948 - 169.32307188563948 - - - s566 - 181.85303597178114 - 181.85303597178114 - - - s494 - 190.33831734601972 - 190.33831734601972 - - - s494 - 212.81052240026395 - 212.81052240026395 - - - s473 - 217.81052240026395 - 217.81052240026395 - - - s81 - 229.21227665125534 - 229.21227665125534 - - - s739 - 235.9204805837547 - 235.9204805837547 - - - s196 - 243.1315831346827 - 243.1315831346827 - - - s138 - 253.1814587558036 - 253.1814587558036 - - - s205 - 265.2230533345959 - 265.2230533345959 - - - s277 - 269.46569402171514 - 269.46569402171514 - - - s165 - 271.7017619992149 - 271.7017619992149 - - - s473 - 281.9973921402019 - 281.9973921402019 - - - s604 - 288.40051637763474 - 288.40051637763474 - - - s316 - 300.40051637763474 - 300.40051637763474 - - - s138 - 317.66319287926683 - 317.66319287926683 - - - s143 - 327.09717401132343 - 327.09717401132343 - - - s165 - 345.5362629259092 - 345.5362629259092 - - - s604 - 346.95047648828233 - 346.95047648828233 - - - s739 - 352.33564129541685 - 352.33564129541685 - - - s252 - 362.18449909721295 - 362.18449909721295 - - - s252 - 374.99074757207865 - 374.99074757207865 - - - s316 - 382.60652067794257 - 382.60652067794257 - - - s143 - 394.772045738539 - 394.772045738539 - - 408.22566978561275 - - - 402.0655718646335 - noDriver - v - 0.0 - - s142 - 23.706539182259394 - 23.706539182259394 - - - s301 - 37.12294704725814 - 37.12294704725814 - - - s171 - 40.12294704725814 - 40.12294704725814 - - - s301 - 62.145662592803376 - 62.145662592803376 - - - s949 - 64.38173057030316 - 64.38173057030316 - - - s239 - 84.63018730161974 - 84.63018730161974 - - - s663 - 99.19040708018078 - 99.19040708018078 - - - s142 - 104.57557188731528 - 104.57557188731528 - - - s663 - 110.40652378216058 - 110.40652378216058 - - - s935 - 117.6866336714411 - 117.6866336714411 - - - s635 - 131.7223025190593 - 131.7223025190593 - - - s239 - 132.7223025190593 - 132.7223025190593 - - - s733 - 138.1074673261938 - 138.1074673261938 - - - s171 - 144.1074673261938 - 144.1074673261938 - - - s544 - 161.99601114619213 - 161.99601114619213 - - - s949 - 172.1940501733777 - 172.1940501733777 - - - s846 - 178.59717441081054 - 178.59717441081054 - - - s733 - 196.95473416149636 - 196.95473416149636 - - - s541 - 208.00009517868364 - 208.00009517868364 - - - s846 - 216.24630642991895 - 216.24630642991895 - - - s544 - 223.31737424178442 - 223.31737424178442 - - - s960 - 254.57437345795998 - 254.57437345795998 - - - s705 - 259.95953826509447 - 259.95953826509447 - - - s935 - 270.58968407782913 - 270.58968407782913 - - - s382 - 279.64506921596654 - 279.64506921596654 - - - s635 - 282.80734687613494 - 282.80734687613494 - - - s596 - 283.80734687613494 - 283.80734687613494 - - - s541 - 298.9400928265565 - 298.9400928265565 - - - s960 - 330.00454196057467 - 330.00454196057467 - - - s555 - 336.71274589307404 - 336.71274589307404 - - - s948 - 339.71274589307404 - 339.71274589307404 - - - s596 - 355.99156648917375 - 355.99156648917375 - - - s382 - 360.99156648917375 - 360.99156648917375 - - - s555 - 385.0331970495164 - 385.0331970495164 - - - s948 - 392.84344672542306 - 392.84344672542306 - - - s705 - 396.9665523510407 - 396.9665523510407 - - 402.0655718646335 - - - 270.59504407131124 - noDriver - v - 0.0 - - s40 - 2.0 - 2.0 - - - s140 - 27.80697580112788 - 27.80697580112788 - - - s328 - 34.13153112146464 - 34.13153112146464 - - - s792 - 68.36601665871203 - 68.36601665871203 - - - s485 - 72.60865734583132 - 72.60865734583132 - - - s40 - 90.41315116059617 - 90.41315116059617 - - - s574 - 98.41315116059617 - 98.41315116059617 - - - s140 - 114.96609651784303 - 114.96609651784303 - - - s485 - 122.96609651784303 - 122.96609651784303 - - - s27 - 125.20216449534281 - 125.20216449534281 - - - s328 - 126.6163780577159 - 126.6163780577159 - - - s933 - 143.7336208263396 - 143.7336208263396 - - - s792 - 146.89589848650797 - 146.89589848650797 - - - s968 - 153.60410241900735 - 153.60410241900735 - - - s131 - 162.82364687630024 - 162.82364687630024 - - - s933 - 163.82364687630024 - 163.82364687630024 - - - s93 - 166.65207400104643 - 166.65207400104643 - - - s574 - 175.87161845833933 - 175.87161845833933 - - - s977 - 192.84218120681646 - 192.84218120681646 - - - s968 - 195.84218120681646 - 195.84218120681646 - - - s250 - 210.1600022700928 - 210.1600022700928 - - - s93 - 211.5742158324659 - 211.5742158324659 - - - s250 - 221.77225485965147 - 221.77225485965147 - - - s27 - 221.77225485965147 - 221.77225485965147 - - - s131 - 235.66469884910128 - 235.66469884910128 - - - s977 - 248.03401572595428 - 248.03401572595428 - - 270.59504407131124 - - - 486.5272538263305 - noDriver - v - 0.0 - - s384 - 28.792360097775937 - 28.792360097775937 - - - s735 - 57.21770090487973 - 57.21770090487973 - - - s123 - 83.6184584697679 - 83.6184584697679 - - - s470 - 99.27093431226643 - 99.27093431226643 - - - s384 - 102.27093431226643 - 102.27093431226643 - - - s603 - 120.38170458854127 - 120.38170458854127 - - - s470 - 135.9058792848013 - 135.9058792848013 - - - s189 - 149.24754334892765 - 149.24754334892765 - - - s123 - 178.40230282315414 - 178.40230282315414 - - - s897 - 185.47337063501962 - 185.47337063501962 - - - s189 - 197.8426875118726 - 197.8426875118726 - - - s823 - 202.8426875118726 - 202.8426875118726 - - - s603 - 217.16050857514895 - 217.16050857514895 - - - s735 - 238.7938162279329 - 238.7938162279329 - - - s988 - 243.8928357415257 - 243.8928357415257 - - - s897 - 254.18846588251267 - 254.18846588251267 - - - s530 - 255.18846588251267 - 255.18846588251267 - - - s355 - 273.07700970251096 - 273.07700970251096 - - - s988 - 303.1602276154936 - 303.1602276154936 - - - s133 - 324.5611621745263 - 324.5611621745263 - - - s944 - 352.14739062279375 - 352.14739062279375 - - - s823 - 357.14739062279375 - 357.14739062279375 - - - s774 - 371.18305947041193 - 371.18305947041193 - - - s133 - 398.10888350608445 - 398.10888350608445 - - - s530 - 409.5106377570758 - 409.5106377570758 - - - s944 - 427.00349344161174 - 427.00349344161174 - - - s774 - 441.76831650184516 - 441.76831650184516 - - - s355 - 469.06300462975753 - 469.06300462975753 - - 486.5272538263305 - - - 289.47107873465933 - noDriver - v - 0.0 - - s840 - 12.083045973594572 - 12.083045973594572 - - - s793 - 32.69857410168288 - 32.69857410168288 - - - s71 - 36.82167972730054 - 36.82167972730054 - - - s276 - 49.82167972730054 - 49.82167972730054 - - - s838 - 56.52988365979991 - 56.52988365979991 - - - s71 - 81.70924028382825 - 81.70924028382825 - - - s958 - 102.22752481251145 - 102.22752481251145 - - - s838 - 128.7039294022589 - 128.7039294022589 - - - s591 - 140.10568365325028 - 140.10568365325028 - - - s591 - 141.10568365325028 - 141.10568365325028 - - - s840 - 143.10568365325028 - 143.10568365325028 - - - s826 - 146.26796131341865 - 146.26796131341865 - - - s276 - 148.50402929091845 - 148.50402929091845 - - - s236 - 151.66630695108682 - 151.66630695108682 - - - s958 - 154.8285846112552 - 154.8285846112552 - - - s350 - 162.4443577171191 - 162.4443577171191 - - - s793 - 163.4443577171191 - 163.4443577171191 - - - s746 - 180.64900825120435 - 180.64900825120435 - - - s505 - 199.75398142574716 - 199.75398142574716 - - - s350 - 210.1942879346577 - 210.1942879346577 - - - s746 - 221.59604218564908 - 221.59604218564908 - - - s788 - 231.44489998744518 - 231.44489998744518 - - - s236 - 248.44489998744518 - 248.44489998744518 - - - s788 - 272.1514391697046 - 272.1514391697046 - - - s505 - 279.4315490589851 - 279.4315490589851 - - - s826 - 282.25997618373134 - 282.25997618373134 - - 289.47107873465933 - - - 390.9556916303036 - noDriver - v - 0.0 - - s980 - 28.635642126552707 - 28.635642126552707 - - - s281 - 29.635642126552707 - 29.635642126552707 - - - s755 - 53.82241537144836 - 53.82241537144836 - - - s659 - 71.51422138440249 - 71.51422138440249 - - - s472 - 81.51422138440249 - 81.51422138440249 - - - s980 - 112.32006498590121 - 112.32006498590121 - - - s871 - 118.64462030623797 - 118.64462030623797 - - - s472 - 138.56947915140924 - 138.56947915140924 - - - s439 - 153.8665376921876 - 153.8665376921876 - - - s871 - 174.11499442350419 - 174.11499442350419 - - - s439 - 182.3612056747395 - 182.3612056747395 - - - s299 - 201.4661788492823 - 201.4661788492823 - - - s554 - 218.01912420652914 - 218.01912420652914 - - - s755 - 247.22528793954962 - 247.22528793954962 - - - s76 - 252.88214218904199 - 252.88214218904199 - - - s554 - 264.28389644003335 - 264.28389644003335 - - - s659 - 284.67997449440446 - 284.67997449440446 - - - s874 - 295.86031438190344 - 295.86031438190344 - - - s299 - 317.7920265813647 - 317.7920265813647 - - - s281 - 336.2311154959505 - 336.2311154959505 - - - s874 - 340.3542211215682 - 340.3542211215682 - - - s76 - 377.3542211215682 - 377.3542211215682 - - 390.9556916303036 - - - 394.44755042700376 - noDriver - v - 0.0 - - s763 - 5.0 - 5.0 - - - s101 - 30.0 - 30.0 - - - s259 - 39.21954445729288 - 39.21954445729288 - - - s289 - 64.29941686526179 - 64.29941686526179 - - - s970 - 70.62397218559855 - 70.62397218559855 - - - s259 - 83.66237699600384 - 83.66237699600384 - - - s608 - 92.26470226304647 - 92.26470226304647 - - - s608 - 107.29799864141938 - 107.29799864141938 - - - s639 - 111.77013459641896 - 111.77013459641896 - - - s289 - 124.80853940682425 - 124.80853940682425 - - - s101 - 131.51674333932363 - 131.51674333932363 - - - s763 - 147.13724269113692 - 147.13724269113692 - - - s465 - 153.8454466236363 - 153.8454466236363 - - - s160 - 164.66210045002825 - 164.66210045002825 - - - s921 - 166.89816842752805 - 166.89816842752805 - - - s465 - 184.89816842752805 - 184.89816842752805 - - - s118 - 197.70441690239375 - 197.70441690239375 - - - s160 - 204.91551945332174 - 204.91551945332174 - - - s266 - 221.04003494991883 - 221.04003494991883 - - - s118 - 225.1631405755365 - 225.1631405755365 - - - s266 - 242.96763439030136 - 242.96763439030136 - - - s610 - 247.090740015919 - 247.090740015919 - - - s493 - 250.696291291383 - 250.696291291383 - - - s639 - 264.0379553555093 - 264.0379553555093 - - - s534 - 267.0379553555093 - 267.0379553555093 - - - s534 - 289.0379553555093 - 289.0379553555093 - - - s820 - 301.844203830375 - 301.844203830375 - - - s493 - 312.660857656767 - 312.660857656767 - - - s204 - 327.89240386849485 - 327.89240386849485 - - - s921 - 334.6006078009942 - 334.6006078009942 - - - s610 - 350.1247824972543 - 350.1247824972543 - - - s820 - 356.1247824972543 - 356.1247824972543 - - - s970 - 361.22380201084707 - 361.22380201084707 - - - s204 - 381.44755042700376 - 381.44755042700376 - - 394.44755042700376 - - - 287.40979606964413 - noDriver - v - 0.0 - - s391 - 35.17101079013795 - 35.17101079013795 - - - s251 - 60.72487546849922 - 60.72487546849922 - - - s257 - 65.72487546849922 - 65.72487546849922 - - - s569 - 73.53512514440587 - 73.53512514440587 - - - s514 - 83.73316417159144 - 83.73316417159144 - - - s251 - 122.73316417159144 - 122.73316417159144 - - - s884 - 139.22558667406207 - 139.22558667406207 - - - s569 - 142.38786433423044 - 142.38786433423044 - - - s257 - 145.99341560969444 - 145.99341560969444 - - - s976 - 147.40762917206754 - 147.40762917206754 - - - s863 - 152.50664868566034 - 152.50664868566034 - - - s391 - 156.9787846406599 - 156.9787846406599 - - - s55 - 163.30333996099668 - 163.30333996099668 - - - s55 - 173.5989701019837 - 173.5989701019837 - - - s156 - 177.5989701019837 - 177.5989701019837 - - - s156 - 186.5989701019837 - 186.5989701019837 - - - s701 - 196.49846503859536 - 196.49846503859536 - - - s884 - 200.97060099359493 - 200.97060099359493 - - - s976 - 219.97060099359493 - 219.97060099359493 - - - s701 - 231.37235524458632 - 231.37235524458632 - - - s863 - 239.18260492049296 - 239.18260492049296 - - - s514 - 252.5242689846193 - 252.5242689846193 - - 287.40979606964413 - - - 281.96609870972685 - noDriver - v - 0.0 - - s857 - 38.47076812334269 - 38.47076812334269 - - - s918 - 45.68187067427066 - 45.68187067427066 - - - s255 - 52.08499491170351 - 52.08499491170351 - - - s908 - 72.70052303979182 - 72.70052303979182 - - - s348 - 112.66300544516798 - 112.66300544516798 - - - s857 - 134.8666087563425 - 134.8666087563425 - - - s981 - 140.52346300583486 - 140.52346300583486 - - - s348 - 141.52346300583486 - 141.52346300583486 - - - s570 - 147.84801832617163 - 147.84801832617163 - - - s918 - 153.67897022101693 - 153.67897022101693 - - - s296 - 167.28044072975237 - 167.28044072975237 - - - s296 - 178.46078061725132 - 178.46078061725132 - - - s136 - 186.07655372311524 - 186.07655372311524 - - - s908 - 188.90498084786142 - 188.90498084786142 - - - s255 - 207.01575112413627 - 207.01575112413627 - - - s835 - 220.05415593454157 - 220.05415593454157 - - - s436 - 222.29022391204137 - 222.29022391204137 - - - s981 - 230.892549179084 - 230.892549179084 - - - s835 - 238.95480692738255 - 238.95480692738255 - - - s436 - 250.1351468148815 - 250.1351468148815 - - - s136 - 273.1351468148815 - 273.1351468148815 - - - s570 - 278.96609870972685 - 278.96609870972685 - - 281.96609870972685 - - - 274.99622529611145 - noDriver - v - 0.0 - - s589 - 17.08800749063506 - 17.08800749063506 - - - s618 - 27.13788311175595 - 27.13788311175595 - - - s576 - 45.52265942260618 - 45.52265942260618 - - - s53 - 46.52265942260618 - 46.52265942260618 - - - s939 - 53.8027693118867 - 53.8027693118867 - - - s618 - 55.21698287425979 - 55.21698287425979 - - - s883 - 59.21698287425979 - 59.21698287425979 - - - s53 - 76.93702802092915 - 76.93702802092915 - - - s333 - 84.21713791020967 - 84.21713791020967 - - - s883 - 100.6183573770664 - 100.6183573770664 - - - s821 - 107.68942518893188 - 107.68942518893188 - - - s939 - 116.29175045597451 - 116.29175045597451 - - - s405 - 120.29175045597451 - 120.29175045597451 - - - s576 - 141.7626610095584 - 141.7626610095584 - - - s926 - 180.36317914079598 - 180.36317914079598 - - - s333 - 203.44997190202636 - 203.44997190202636 - - - s589 - 212.66951635931926 - 212.66951635931926 - - - s926 - 246.66951635931926 - 246.66951635931926 - - - s821 - 250.79262198493691 - 250.79262198493691 - - - s405 - 272.99622529611145 - 272.99622529611145 - - 274.99622529611145 - - - 490.3700946145897 - noDriver - v - 0.0 - - s115 - 9.055385138137417 - 9.055385138137417 - - - s736 - 18.055385138137417 - 18.055385138137417 - - - s736 - 62.83261149261364 - 62.83261149261364 - - - s86 - 70.44838459847755 - 70.44838459847755 - - - s995 - 79.88236573053415 - 79.88236573053415 - - - s616 - 85.26753053766865 - 85.26753053766865 - - - s170 - 107.82855888302561 - 107.82855888302561 - - - s115 - 142.75705727617157 - 142.75705727617157 - - - s170 - 151.97660173346446 - 151.97660173346446 - - - s349 - 159.25671162274497 - 159.25671162274497 - - - s128 - 164.6418764298795 - 164.6418764298795 - - - s995 - 170.6418764298795 - 170.6418764298795 - - - s818 - 183.68028124028478 - 183.68028124028478 - - - s616 - 186.68028124028478 - 186.68028124028478 - - - s128 - 196.87832026747034 - 196.87832026747034 - - - s243 - 207.50846608020498 - 207.50846608020498 - - - s520 - 225.75675367109963 - 225.75675367109963 - - - s86 - 234.2420350453382 - 234.2420350453382 - - - s559 - 244.2420350453382 - 244.2420350453382 - - - s243 - 273.66991298446254 - 273.66991298446254 - - - s559 - 287.7055818320807 - 287.7055818320807 - - - s818 - 296.3079070991233 - 296.3079070991233 - - - s318 - 313.33729346504975 - 313.33729346504975 - - - s397 - 330.3666798309762 - 330.3666798309762 - - - s460 - 373.32014302080523 - 373.32014302080523 - - - s349 - 393.93567114889356 - 393.93567114889356 - - - s318 - 396.17173912639333 - 396.17173912639333 - - - s978 - 399.33401678656173 - 399.33401678656173 - - - s605 - 412.93548729529715 - 412.93548729529715 - - - s397 - 416.54103857076115 - 416.54103857076115 - - - s978 - 430.14250907949656 - 430.14250907949656 - - - s520 - 433.14250907949656 - 433.14250907949656 - - - s605 - 439.2252716097948 - 439.2252716097948 - - - s460 - 470.3700946145897 - 470.3700946145897 - - 490.3700946145897 - - - 359.47784720775707 - noDriver - v - 0.0 - - s72 - 18.681541692269406 - 18.681541692269406 - - - s95 - 41.52886100986113 - 41.52886100986113 - - - s381 - 43.52886100986113 - 43.52886100986113 - - - s95 - 90.1443090930878 - 90.1443090930878 - - - s646 - 95.5294739002223 - 95.5294739002223 - - - s72 - 108.94588176522103 - 108.94588176522103 - - - s634 - 112.10815942538942 - 112.10815942538942 - - - s369 - 128.87121403962962 - 128.87121403962962 - - - s687 - 155.29090366687544 - 155.29090366687544 - - - s634 - 176.48052376729254 - 176.48052376729254 - - - s997 - 190.37296775674236 - 190.37296775674236 - - - s687 - 211.39676379837098 - 211.39676379837098 - - - s997 - 226.52950974879255 - 226.52950974879255 - - - s646 - 227.52950974879255 - 227.52950974879255 - - - s67 - 239.61255572238713 - 239.61255572238713 - - - s631 - 244.61255572238713 - 244.61255572238713 - - - s654 - 265.42120776907194 - 265.42120776907194 - - - s67 - 295.83502042056307 - 295.83502042056307 - - - s954 - 305.05456487785597 - 305.05456487785597 - - - s654 - 327.1452869122305 - 327.1452869122305 - - - s381 - 339.5146037890835 - 339.5146037890835 - - - s631 - 343.1201550645475 - 343.1201550645475 - - - s369 - 346.2824327247159 - 346.2824327247159 - - - s954 - 354.09268240062255 - 354.09268240062255 - - 359.47784720775707 - - - 343.25036057595435 - noDriver - v - 0.0 - - s728 - 36.069377593742864 - 36.069377593742864 - - - s801 - 58.20532121492152 - 58.20532121492152 - - - s452 - 70.41187683065522 - 70.41187683065522 - - - s219 - 84.44754567827341 - 84.44754567827341 - - - s801 - 97.60049211623932 - 97.60049211623932 - - - s507 - 102.60049211623932 - 102.60049211623932 - - - s33 - 125.68728487746972 - 125.68728487746972 - - - s452 - 132.7583526893352 - 132.7583526893352 - - - s219 - 141.24363406357378 - 141.24363406357378 - - - s728 - 146.24363406357378 - 146.24363406357378 - - - s376 - 153.5237439528543 - 153.5237439528543 - - - s974 - 162.7432884101472 - 162.7432884101472 - - - s152 - 163.7432884101472 - 163.7432884101472 - - - s33 - 167.7432884101472 - 167.7432884101472 - - - s354 - 172.7432884101472 - 172.7432884101472 - - - s152 - 177.21542436514676 - 177.21542436514676 - - - s325 - 177.21542436514676 - 177.21542436514676 - - - s376 - 183.29818689544499 - 183.29818689544499 - - - s752 - 197.3338557430632 - 197.3338557430632 - - - s354 - 207.3837313641841 - 207.3837313641841 - - - s477 - 214.999504470048 - 214.999504470048 - - - s477 - 258.82871847167024 - 258.82871847167024 - - - s606 - 260.24293203404335 - 260.24293203404335 - - - s974 - 274.45560243759525 - 274.45560243759525 - - - s325 - 308.2934510689725 - 308.2934510689725 - - - s606 - 317.5129955262654 - 317.5129955262654 - - - s507 - 317.5129955262654 - 317.5129955262654 - - - s752 - 332.8100540670438 - 332.8100540670438 - - 343.25036057595435 - - - 312.6369400188925 - noDriver - v - 0.0 - - s581 - 14.560219778561036 - 14.560219778561036 - - - s195 - 46.324980127098215 - 46.324980127098215 - - - s88 - 67.5146002275153 - 67.5146002275153 - - - s98 - 79.5561948063076 - 79.5561948063076 - - - s271 - 91.5977893850999 - 91.5977893850999 - - - s581 - 96.5977893850999 - 96.5977893850999 - - - s195 - 106.5977893850999 - 106.5977893850999 - - - s479 - 115.65317452323731 - 115.65317452323731 - - - s479 - 127.35787443395694 - 127.35787443395694 - - - s506 - 131.35787443395694 - 131.35787443395694 - - - s393 - 138.97364753982083 - 138.97364753982083 - - - s393 - 139.97364753982083 - 139.97364753982083 - - - s506 - 141.38786110219394 - 141.38786110219394 - - - s88 - 156.944210288298 - 156.944210288298 - - - s271 - 160.10648794846637 - 160.10648794846637 - - - s856 - 173.99893193791618 - 173.99893193791618 - - - s167 - 175.4131455002893 - 175.4131455002893 - - - s856 - 182.4131455002893 - 182.4131455002893 - - - s153 - 189.12134943278866 - 189.12134943278866 - - - s413 - 196.19241724465414 - 196.19241724465414 - - - s455 - 201.19241724465414 - 201.19241724465414 - - - s98 - 222.59335180368683 - 222.59335180368683 - - - s153 - 236.04697585076053 - 236.04697585076053 - - - s455 - 252.32579644686024 - 252.32579644686024 - - - s413 - 266.53846685041214 - 266.53846685041214 - - - s167 - 286.23618245400434 - 286.23618245400434 - - 312.6369400188925 - - - 281.9509120017061 - noDriver - v - 0.0 - - s61 - 4.123105625617661 - 4.123105625617661 - - - s533 - 7.123105625617661 - 7.123105625617661 - - - s464 - 34.78173899749632 - 34.78173899749632 - - - s248 - 43.38406426453895 - 43.38406426453895 - - - s305 - 48.38406426453895 - 48.38406426453895 - - - s533 - 67.25202652865215 - 67.25202652865215 - - - s305 - 78.4323664161511 - 78.4323664161511 - - - s221 - 80.66843439365088 - 80.66843439365088 - - - s568 - 94.98625545692724 - 94.98625545692724 - - - s221 - 121.06306507773783 - 121.06306507773783 - - - s248 - 124.22534273790622 - 124.22534273790622 - - - s947 - 131.50545262718674 - 131.50545262718674 - - - s464 - 139.99073400142532 - 139.99073400142532 - - - s575 - 150.2863641424123 - 150.2863641424123 - - - s568 - 171.3813872521413 - 171.3813872521413 - - - s967 - 179.44364500043986 - 179.44364500043986 - - - s790 - 190.84539925143125 - 190.84539925143125 - - - s967 - 214.19063431128876 - 214.19063431128876 - - - s61 - 230.7435796685356 - 230.7435796685356 - - - s947 - 238.55382934444225 - 238.55382934444225 - - - s575 - 250.59542392323453 - 250.59542392323453 - - - s790 - 259.81496838052743 - 259.81496838052743 - - 281.9509120017061 - - - 355.9292192049986 - noDriver - v - 0.0 - - s753 - 2.23606797749979 - 2.23606797749979 - - - s561 - 18.99912259174 - 18.99912259174 - - - s285 - 23.99912259174 - 23.99912259174 - - - s535 - 34.19716161892557 - 34.19716161892557 - - - s753 - 45.19716161892557 - 45.19716161892557 - - - s693 - 54.25254675706299 - 54.25254675706299 - - - s664 - 61.46364930799096 - 61.46364930799096 - - - s664 - 81.71210603930754 - 81.71210603930754 - - - s729 - 84.71210603930754 - 84.71210603930754 - - - s693 - 95.7574670564948 - 95.7574670564948 - - - s285 - 98.7574670564948 - 98.7574670564948 - - - s161 - 99.7574670564948 - 99.7574670564948 - - - s561 - 126.9604080739657 - 126.9604080739657 - - - s480 - 127.9604080739657 - 127.9604080739657 - - - s521 - 131.56595934942968 - 131.56595934942968 - - - s535 - 158.58447152164226 - 158.58447152164226 - - - s403 - 169.2146173343769 - 169.2146173343769 - - - s403 - 183.35675295810785 - 183.35675295810785 - - - s253 - 201.71431270879367 - 201.71431270879367 - - - s161 - 204.87659036896204 - 204.87659036896204 - - - s480 - 213.36187174320062 - 213.36187174320062 - - - s521 - 216.524149403369 - 216.524149403369 - - - s899 - 228.68967446396545 - 228.68967446396545 - - - s105 - 243.1118795658214 - 243.1118795658214 - - - s461 - 252.9607373676175 - 252.9607373676175 - - - s461 - 273.0853491651156 - 273.0853491651156 - - - s253 - 280.89559884102226 - 280.89559884102226 - - - s899 - 313.14462983421646 - 313.14462983421646 - - - s105 - 314.14462983421646 - 314.14462983421646 - - - s729 - 342.58755514087227 - 342.58755514087227 - - 355.9292192049986 - - - 273.8401761336663 - noDriver - v - 0.0 - - s907 - 13.0 - 13.0 - - - s177 - 16.0 - 16.0 - - - s456 - 25.4339811320566 - 25.4339811320566 - - - s513 - 30.4339811320566 - 30.4339811320566 - - - s177 - 58.218869110956206 - 58.218869110956206 - - - s982 - 69.62062336194758 - 69.62062336194758 - - - s585 - 83.22209387068303 - 83.22209387068303 - - - s907 - 97.11453786013283 - 97.11453786013283 - - - s351 - 119.96185717772455 - 119.96185717772455 - - - s585 - 144.47715852198706 - 144.47715852198706 - - - s351 - 159.77421706276542 - 159.77421706276542 - - - s523 - 166.0987723831022 - 166.0987723831022 - - - s982 - 169.70432365856618 - 169.70432365856618 - - - s456 - 172.70432365856618 - 172.70432365856618 - - - s882 - 192.95278038988278 - 192.95278038988278 - - - s322 - 215.0435024242573 - 215.0435024242573 - - - s882 - 223.98777433425647 - 223.98777433425647 - - - s513 - 229.64462858374884 - 229.64462858374884 - - - s322 - 240.8249684712478 - 240.8249684712478 - - - s523 - 261.6336205179326 - 261.6336205179326 - - 273.8401761336663 - - - 477.9799980859526 - noDriver - v - 0.0 - - s762 - 8.246211251235321 - 8.246211251235321 - - - s762 - 28.271195645736107 - 28.271195645736107 - - - s799 - 31.271195645736107 - 31.271195645736107 - - - s562 - 33.5072636232359 - 33.5072636232359 - - - s624 - 57.10811106564779 - 57.10811106564779 - - - s741 - 81.27420301283694 - 81.27420301283694 - - - s517 - 83.27420301283694 - 83.27420301283694 - - - s741 - 116.07664194655038 - 116.07664194655038 - - - s738 - 119.68219322201438 - 119.68219322201438 - - - s799 - 128.90173767930727 - 128.90173767930727 - - - s837 - 143.11440808285917 - 143.11440808285917 - - - s517 - 168.17433625514252 - 168.17433625514252 - - - s448 - 172.4169769422618 - 172.4169769422618 - - - s562 - 175.57925460243018 - 175.57925460243018 - - - s757 - 178.74153226259855 - 178.74153226259855 - - - s738 - 190.05524076158332 - 190.05524076158332 - - - s710 - 199.27478521887622 - 199.27478521887622 - - - s624 - 216.53746172050828 - 216.53746172050828 - - - s710 - 220.53746172050828 - 220.53746172050828 - - - s876 - 259.4476146371957 - 259.4476146371957 - - - s917 - 268.6671590944886 - 268.6671590944886 - - - s757 - 289.2584193764626 - 289.2584193764626 - - - s700 - 311.2811349220078 - 311.2811349220078 - - - s448 - 334.6263699818653 - 334.6263699818653 - - - s797 - 340.95092530220205 - 340.95092530220205 - - - s700 - 354.55239581093747 - 354.55239581093747 - - - s116 - 357.3808229356837 - 357.3808229356837 - - - s876 - 366.6003673929766 - 366.6003673929766 - - - s917 - 375.5446393029757 - 375.5446393029757 - - - s875 - 376.5446393029757 - 376.5446393029757 - - - s77 - 378.7807072804755 - 378.7807072804755 - - - s875 - 390.09441577946023 - 390.09441577946023 - - - s162 - 404.65463555802125 - 404.65463555802125 - - - s116 - 416.31653934771185 - 416.31653934771185 - - - s902 - 426.51457837489744 - 426.51457837489744 - - - s797 - 441.7461245866252 - 441.7461245866252 - - - s162 - 450.6903964966244 - 450.6903964966244 - - - s77 - 452.6903964966244 - 452.6903964966244 - - - s837 - 464.7734424702189 - 464.7734424702189 - - - s902 - 465.7734424702189 - 465.7734424702189 - - 477.9799980859526 - - - 335.8680636761366 - noDriver - v - 0.0 - - s650 - 12.206555615733702 - 12.206555615733702 - - - s839 - 14.442623593233492 - 14.442623593233492 - - - s615 - 40.461847255748864 - 40.461847255748864 - - - s658 - 52.6273723163453 - 52.6273723163453 - - - s186 - 69.59793506482244 - 69.59793506482244 - - - s839 - 81.63952964361474 - 81.63952964361474 - - - s644 - 90.24185491065737 - 90.24185491065737 - - - s650 - 107.24185491065737 - 107.24185491065737 - - - s445 - 112.34087442425015 - 112.34087442425015 - - - s615 - 164.42734099667183 - 164.42734099667183 - - - s992 - 167.5896186568402 - 167.5896186568402 - - - s644 - 173.5896186568402 - 173.5896186568402 - - - s445 - 184.76995854433915 - 184.76995854433915 - - - s996 - 184.76995854433915 - 184.76995854433915 - - - s572 - 187.59838566908533 - 187.59838566908533 - - - s186 - 194.00150990651818 - 194.00150990651818 - - - s443 - 200.0842724368164 - 200.0842724368164 - - - s658 - 205.0842724368164 - 205.0842724368164 - - - s73 - 230.40225023916074 - 230.40225023916074 - - - s992 - 259.6084139721812 - 259.6084139721812 - - - s996 - 277.4969577921795 - 277.4969577921795 - - - s572 - 287.5468334133004 - 287.5468334133004 - - - s443 - 320.10447460549983 - 320.10447460549983 - - - s73 - 329.15985974363724 - 329.15985974363724 - - 335.8680636761366 - - - 423.30439195123336 - noDriver - v - 0.0 - - s503 - 36.76955262170047 - 36.76955262170047 - - - s518 - 51.63562136901898 - 51.63562136901898 - - - s423 - 54.797899029187356 - 54.797899029187356 - - - s126 - 69.01056943273925 - 69.01056943273925 - - - s642 - 70.42478299511234 - 70.42478299511234 - - - s642 - 106.03377062464205 - 106.03377062464205 - - - s537 - 107.44798418701514 - 107.44798418701514 - - - s126 - 118.07812999974979 - 118.07812999974979 - - - s891 - 119.07812999974979 - 119.07812999974979 - - - s503 - 136.16613749038484 - 136.16613749038484 - - - s454 - 142.5692617278177 - 142.5692617278177 - - - s518 - 149.8493716170982 - 149.8493716170982 - - - s891 - 178.6937818208101 - 178.6937818208101 - - - s647 - 186.75603956910865 - 186.75603956910865 - - - s630 - 209.95086657859505 - 209.95086657859505 - - - s454 - 212.77929370334124 - 212.77929370334124 - - - s959 - 239.02810320015462 - 239.02810320015462 - - - s647 - 258.82709307337797 - 258.82709307337797 - - - s668 - 260.82709307337797 - 260.82709307337797 - - - s537 - 269.0733043246133 - 269.0733043246133 - - - s423 - 279.27134335179886 - 279.27134335179886 - - - s258 - 284.27134335179886 - 284.27134335179886 - - - s959 - 295.6730976027902 - 295.6730976027902 - - - s59 - 297.90916558029 - 297.90916558029 - - - s668 - 323.46303025865126 - 323.46303025865126 - - - s258 - 342.6984143203226 - 342.6984143203226 - - - s59 - 360.50290813508747 - 360.50290813508747 - - - s630 - 388.82251265210004 - 388.82251265210004 - - 423.30439195123336 - - - - - diff --git a/jsprit-examples/src/main/java/examples/CVRPExample.java b/jsprit-examples/src/main/java/jsprit/examples/CVRPExample.java similarity index 87% rename from jsprit-examples/src/main/java/examples/CVRPExample.java rename to jsprit-examples/src/main/java/jsprit/examples/CVRPExample.java index 56120f84..d6bd6444 100644 --- a/jsprit-examples/src/main/java/examples/CVRPExample.java +++ b/jsprit-examples/src/main/java/jsprit/examples/CVRPExample.java @@ -14,11 +14,11 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package examples; +package jsprit.examples; -import readers.ChristofidesReader; -import basics.VehicleRoutingProblem; -import basics.io.VrpXMLWriter; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.io.VrpXMLWriter; +import jsprit.instance.reader.ChristofidesReader; public class CVRPExample { diff --git a/jsprit-examples/src/main/java/examples/CompareAlgorithmExample.java b/jsprit-examples/src/main/java/jsprit/examples/CompareAlgorithmExample.java similarity index 81% rename from jsprit-examples/src/main/java/examples/CompareAlgorithmExample.java rename to jsprit-examples/src/main/java/jsprit/examples/CompareAlgorithmExample.java index 50a53adc..ab7860b2 100644 --- a/jsprit-examples/src/main/java/examples/CompareAlgorithmExample.java +++ b/jsprit-examples/src/main/java/jsprit/examples/CompareAlgorithmExample.java @@ -14,18 +14,20 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package examples; +package jsprit.examples; import java.io.File; -import readers.SolomonReader; -import algorithms.GreedySchrimpfFactory; -import algorithms.SchrimpfFactory; -import analysis.AlgorithmSearchProgressChartListener; -import analysis.StopWatch; -import basics.VehicleRoutingAlgorithm; -import basics.VehicleRoutingProblem; -import basics.algo.VehicleRoutingAlgorithmListeners.Priority; +import jsprit.analysis.toolbox.AlgorithmSearchProgressChartListener; +import jsprit.analysis.toolbox.StopWatch; +import jsprit.core.algorithm.VehicleRoutingAlgorithm; +import jsprit.core.algorithm.box.GreedySchrimpfFactory; +import jsprit.core.algorithm.box.SchrimpfFactory; +import jsprit.core.algorithm.listener.VehicleRoutingAlgorithmListeners.Priority; +import jsprit.core.algorithm.termination.IterationWithoutImprovementTermination; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.instance.reader.SolomonReader; + public class CompareAlgorithmExample { @@ -82,7 +84,7 @@ public class CompareAlgorithmExample { vra_greedy.searchSolutions(); - vra_greedy.setPrematureBreak(40); + vra_greedy.setPrematureAlgorithmTermination(new IterationWithoutImprovementTermination(40)); vra_greedy.searchSolutions(); diff --git a/jsprit-examples/src/main/java/examples/ConfigureAlgorithmInCodeInsteadOfPerXml.java b/jsprit-examples/src/main/java/jsprit/examples/ConfigureAlgorithmInCodeInsteadOfPerXml.java similarity index 84% rename from jsprit-examples/src/main/java/examples/ConfigureAlgorithmInCodeInsteadOfPerXml.java rename to jsprit-examples/src/main/java/jsprit/examples/ConfigureAlgorithmInCodeInsteadOfPerXml.java index 96497237..e8b53de6 100644 --- a/jsprit-examples/src/main/java/examples/ConfigureAlgorithmInCodeInsteadOfPerXml.java +++ b/jsprit-examples/src/main/java/jsprit/examples/ConfigureAlgorithmInCodeInsteadOfPerXml.java @@ -14,30 +14,30 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package examples; +package jsprit.examples; import java.io.File; import java.util.Collection; +import jsprit.analysis.toolbox.SolutionPlotter; +import jsprit.analysis.toolbox.SolutionPrinter; +import jsprit.core.algorithm.VehicleRoutingAlgorithm; +import jsprit.core.algorithm.io.AlgorithmConfig; +import jsprit.core.algorithm.io.VehicleRoutingAlgorithms; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.io.VrpXMLWriter; +import jsprit.core.problem.job.Service; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; +import jsprit.core.problem.vehicle.Vehicle; +import jsprit.core.problem.vehicle.VehicleImpl; +import jsprit.core.problem.vehicle.VehicleImpl.Builder; +import jsprit.core.problem.vehicle.VehicleType; +import jsprit.core.problem.vehicle.VehicleTypeImpl; +import jsprit.core.util.Coordinate; +import jsprit.core.util.Solutions; + import org.apache.commons.configuration.XMLConfiguration; -import util.Coordinate; -import util.Solutions; -import algorithms.VehicleRoutingAlgorithms; -import analysis.SolutionPlotter; -import analysis.SolutionPrinter; -import analysis.SolutionPrinter.Print; -import basics.Service; -import basics.VehicleRoutingAlgorithm; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblemSolution; -import basics.io.AlgorithmConfig; -import basics.io.VrpXMLWriter; -import basics.route.Vehicle; -import basics.route.VehicleImpl; -import basics.route.VehicleImpl.Builder; -import basics.route.VehicleType; -import basics.route.VehicleTypeImpl; public class ConfigureAlgorithmInCodeInsteadOfPerXml { @@ -97,11 +97,11 @@ public class ConfigureAlgorithmInCodeInsteadOfPerXml { /* * get the best */ - VehicleRoutingProblemSolution bestSolution = Solutions.getBest(solutions); + VehicleRoutingProblemSolution bestSolution = Solutions.bestOf(solutions); new VrpXMLWriter(problem, solutions).write("output/problem-with-solution.xml"); - SolutionPrinter.print(bestSolution,Print.VERBOSE); + SolutionPrinter.print(bestSolution); /* * plot diff --git a/jsprit-examples/src/main/java/examples/CostMatrixExample.java b/jsprit-examples/src/main/java/jsprit/examples/CostMatrixExample.java similarity index 78% rename from jsprit-examples/src/main/java/examples/CostMatrixExample.java rename to jsprit-examples/src/main/java/jsprit/examples/CostMatrixExample.java index c0893047..196ea236 100644 --- a/jsprit-examples/src/main/java/examples/CostMatrixExample.java +++ b/jsprit-examples/src/main/java/jsprit/examples/CostMatrixExample.java @@ -14,28 +14,27 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package examples; +package jsprit.examples; import java.io.File; import java.util.Collection; -import util.Solutions; -import util.VehicleRoutingTransportCostsMatrix; -import algorithms.GreedySchrimpfFactory; -import algorithms.VehicleRoutingAlgorithms; -import analysis.SolutionPlotter; -import analysis.SolutionPrinter; -import analysis.SolutionPrinter.Print; -import basics.Service; -import basics.VehicleRoutingAlgorithm; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblem.FleetSize; -import basics.VehicleRoutingProblemSolution; -import basics.costs.VehicleRoutingTransportCosts; -import basics.route.Vehicle; -import basics.route.VehicleImpl; -import basics.route.VehicleType; -import basics.route.VehicleTypeImpl; +import jsprit.analysis.toolbox.SolutionPlotter; +import jsprit.analysis.toolbox.SolutionPrinter; +import jsprit.core.algorithm.VehicleRoutingAlgorithm; +import jsprit.core.algorithm.io.VehicleRoutingAlgorithms; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.VehicleRoutingProblem.FleetSize; +import jsprit.core.problem.cost.VehicleRoutingTransportCosts; +import jsprit.core.problem.job.Service; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; +import jsprit.core.problem.vehicle.Vehicle; +import jsprit.core.problem.vehicle.VehicleImpl; +import jsprit.core.problem.vehicle.VehicleType; +import jsprit.core.problem.vehicle.VehicleTypeImpl; +import jsprit.core.util.Solutions; +import jsprit.core.util.VehicleRoutingTransportCostsMatrix; + /** * Illustrates how you can use jsprit with an already compiled distance and time matrix. @@ -110,9 +109,9 @@ public class CostMatrixExample { Collection solutions = vra.searchSolutions(); - SolutionPrinter.print(Solutions.getBest(solutions), Print.VERBOSE); + SolutionPrinter.print(Solutions.bestOf(solutions)); - SolutionPlotter.plotSolutionAsPNG(vrp, Solutions.getBest(solutions), "output/yo.png", "po"); + SolutionPlotter.plotSolutionAsPNG(vrp, Solutions.bestOf(solutions), "output/yo.png", "po"); } diff --git a/jsprit-examples/src/main/java/examples/MultipleDepotExample.java b/jsprit-examples/src/main/java/jsprit/examples/MultipleDepotExample.java similarity index 76% rename from jsprit-examples/src/main/java/examples/MultipleDepotExample.java rename to jsprit-examples/src/main/java/jsprit/examples/MultipleDepotExample.java index 1ec0017c..d6c0e35e 100644 --- a/jsprit-examples/src/main/java/examples/MultipleDepotExample.java +++ b/jsprit-examples/src/main/java/jsprit/examples/MultipleDepotExample.java @@ -14,28 +14,29 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package examples; +package jsprit.examples; import java.io.File; import java.util.Arrays; import java.util.Collection; -import util.Coordinate; -import util.Solutions; -import algorithms.VehicleRoutingAlgorithms; -import analysis.AlgorithmSearchProgressChartListener; -import analysis.SolutionPlotter; -import analysis.SolutionPrinter; -import analysis.StopWatch; -import basics.VehicleRoutingAlgorithm; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblem.FleetSize; -import basics.VehicleRoutingProblemSolution; -import basics.algo.VehicleRoutingAlgorithmListeners.Priority; -import basics.io.VrpXMLReader; -import basics.route.Vehicle; -import basics.route.VehicleImpl; -import basics.route.VehicleTypeImpl; +import jsprit.analysis.toolbox.AlgorithmSearchProgressChartListener; +import jsprit.analysis.toolbox.SolutionPlotter; +import jsprit.analysis.toolbox.SolutionPrinter; +import jsprit.analysis.toolbox.StopWatch; +import jsprit.core.algorithm.VehicleRoutingAlgorithm; +import jsprit.core.algorithm.io.VehicleRoutingAlgorithms; +import jsprit.core.algorithm.listener.VehicleRoutingAlgorithmListeners.Priority; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.VehicleRoutingProblem.FleetSize; +import jsprit.core.problem.io.VrpXMLReader; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; +import jsprit.core.problem.vehicle.Vehicle; +import jsprit.core.problem.vehicle.VehicleImpl; +import jsprit.core.problem.vehicle.VehicleTypeImpl; +import jsprit.core.util.Coordinate; +import jsprit.core.util.Solutions; + public class MultipleDepotExample { @@ -109,8 +110,8 @@ public class MultipleDepotExample { vra.getAlgorithmListeners().addListener(new AlgorithmSearchProgressChartListener("output/progress.png")); Collection solutions = vra.searchSolutions(); - SolutionPrinter.print(Solutions.getBest(solutions)); - SolutionPlotter.plotSolutionAsPNG(vrp, Solutions.getBest(solutions), "output/p01_solution.png", "p01"); + SolutionPrinter.print(Solutions.bestOf(solutions)); + SolutionPlotter.plotSolutionAsPNG(vrp, Solutions.bestOf(solutions), "output/p01_solution.png", "p01"); } diff --git a/jsprit-examples/src/main/java/examples/MultipleDepotExampleWithPenaltyVehicles.java b/jsprit-examples/src/main/java/jsprit/examples/MultipleDepotExampleWithPenaltyVehicles.java similarity index 79% rename from jsprit-examples/src/main/java/examples/MultipleDepotExampleWithPenaltyVehicles.java rename to jsprit-examples/src/main/java/jsprit/examples/MultipleDepotExampleWithPenaltyVehicles.java index 14a0db9f..306128eb 100644 --- a/jsprit-examples/src/main/java/examples/MultipleDepotExampleWithPenaltyVehicles.java +++ b/jsprit-examples/src/main/java/jsprit/examples/MultipleDepotExampleWithPenaltyVehicles.java @@ -14,31 +14,31 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package examples; +package jsprit.examples; import java.io.File; import java.util.Arrays; import java.util.Collection; -import util.Coordinate; -import util.Solutions; -import algorithms.VehicleRoutingAlgorithms; -import analysis.AlgorithmSearchProgressChartListener; -import analysis.SolutionPlotter; -import analysis.SolutionPrinter; -import analysis.SolutionPrinter.Print; -import analysis.StopWatch; -import basics.VehicleRoutingAlgorithm; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblem.FleetSize; -import basics.VehicleRoutingProblemSolution; -import basics.algo.VehicleRoutingAlgorithmListeners.Priority; -import basics.io.VrpXMLReader; -import basics.route.PenaltyVehicleType; -import basics.route.Vehicle; -import basics.route.VehicleImpl; -import basics.route.VehicleType; -import basics.route.VehicleTypeImpl; +import jsprit.analysis.toolbox.AlgorithmSearchProgressChartListener; +import jsprit.analysis.toolbox.SolutionPlotter; +import jsprit.analysis.toolbox.SolutionPrinter; +import jsprit.analysis.toolbox.StopWatch; +import jsprit.core.algorithm.VehicleRoutingAlgorithm; +import jsprit.core.algorithm.io.VehicleRoutingAlgorithms; +import jsprit.core.algorithm.listener.VehicleRoutingAlgorithmListeners.Priority; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.VehicleRoutingProblem.FleetSize; +import jsprit.core.problem.io.VrpXMLReader; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; +import jsprit.core.problem.vehicle.PenaltyVehicleType; +import jsprit.core.problem.vehicle.Vehicle; +import jsprit.core.problem.vehicle.VehicleImpl; +import jsprit.core.problem.vehicle.VehicleType; +import jsprit.core.problem.vehicle.VehicleTypeImpl; +import jsprit.core.util.Coordinate; +import jsprit.core.util.Solutions; + public class MultipleDepotExampleWithPenaltyVehicles { @@ -137,8 +137,8 @@ public class MultipleDepotExampleWithPenaltyVehicles { vra.getAlgorithmListeners().addListener(new AlgorithmSearchProgressChartListener("output/progress.png")); Collection solutions = vra.searchSolutions(); - SolutionPrinter.print(Solutions.getBest(solutions),Print.VERBOSE); - SolutionPlotter.plotSolutionAsPNG(vrp, Solutions.getBest(solutions), "output/p08_solution.png", "p08"); + SolutionPrinter.print(Solutions.bestOf(solutions)); + SolutionPlotter.plotSolutionAsPNG(vrp, Solutions.bestOf(solutions), "output/p08_solution.png", "p08"); } diff --git a/jsprit-examples/src/main/java/examples/PickupAndDeliveryExample.java b/jsprit-examples/src/main/java/jsprit/examples/PickupAndDeliveryExample.java similarity index 82% rename from jsprit-examples/src/main/java/examples/PickupAndDeliveryExample.java rename to jsprit-examples/src/main/java/jsprit/examples/PickupAndDeliveryExample.java index 436c6c28..30399f20 100644 --- a/jsprit-examples/src/main/java/examples/PickupAndDeliveryExample.java +++ b/jsprit-examples/src/main/java/jsprit/examples/PickupAndDeliveryExample.java @@ -14,24 +14,23 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package examples; +package jsprit.examples; import java.io.File; import java.util.Collection; -import algorithms.VehicleRoutingAlgorithms; -import algorithms.selectors.SelectBest; -import analysis.AlgorithmSearchProgressChartListener; -import analysis.Plotter; -import analysis.Plotter.Label; -import analysis.SolutionPlotter; -import analysis.SolutionPrinter; -import analysis.SolutionPrinter.Print; -import basics.VehicleRoutingAlgorithm; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblemSolution; -import basics.VehicleRoutingProblem.Constraint; -import basics.io.VrpXMLReader; +import jsprit.analysis.toolbox.AlgorithmSearchProgressChartListener; +import jsprit.analysis.toolbox.Plotter; +import jsprit.analysis.toolbox.Plotter.Label; +import jsprit.analysis.toolbox.SolutionPlotter; +import jsprit.analysis.toolbox.SolutionPrinter; +import jsprit.core.algorithm.VehicleRoutingAlgorithm; +import jsprit.core.algorithm.io.VehicleRoutingAlgorithms; +import jsprit.core.algorithm.selector.SelectBest; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.io.VrpXMLReader; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; + public class PickupAndDeliveryExample { @@ -91,7 +90,7 @@ public class PickupAndDeliveryExample { /* * print solution */ - SolutionPrinter.print(solution, Print.VERBOSE); + SolutionPrinter.print(solution); /* * Plot solution. diff --git a/jsprit-examples/src/main/java/examples/PickupAndDeliveryExample2.java b/jsprit-examples/src/main/java/jsprit/examples/PickupAndDeliveryExample2.java similarity index 83% rename from jsprit-examples/src/main/java/examples/PickupAndDeliveryExample2.java rename to jsprit-examples/src/main/java/jsprit/examples/PickupAndDeliveryExample2.java index e3e92132..9b0a1292 100644 --- a/jsprit-examples/src/main/java/examples/PickupAndDeliveryExample2.java +++ b/jsprit-examples/src/main/java/jsprit/examples/PickupAndDeliveryExample2.java @@ -14,27 +14,26 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package examples; +package jsprit.examples; import java.io.File; import java.util.Collection; +import jsprit.analysis.toolbox.AlgorithmSearchProgressChartListener; +import jsprit.analysis.toolbox.Plotter; +import jsprit.analysis.toolbox.Plotter.Label; +import jsprit.analysis.toolbox.SolutionPlotter; +import jsprit.analysis.toolbox.SolutionPrinter; +import jsprit.core.algorithm.VehicleRoutingAlgorithm; +import jsprit.core.algorithm.io.VehicleRoutingAlgorithms; +import jsprit.core.algorithm.selector.SelectBest; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.io.VrpXMLReader; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; + import org.apache.log4j.Level; import org.apache.log4j.Logger; -import algorithms.VehicleRoutingAlgorithms; -import algorithms.selectors.SelectBest; -import analysis.AlgorithmSearchProgressChartListener; -import analysis.Plotter; -import analysis.Plotter.Label; -import analysis.SolutionPlotter; -import analysis.SolutionPrinter; -import analysis.SolutionPrinter.Print; -import basics.VehicleRoutingAlgorithm; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblemSolution; -import basics.VehicleRoutingProblem.Constraint; -import basics.io.VrpXMLReader; public class PickupAndDeliveryExample2 { @@ -96,7 +95,7 @@ public class PickupAndDeliveryExample2 { /* * print solution */ - SolutionPrinter.print(solution, Print.VERBOSE); + SolutionPrinter.print(solution); /* * Plot solution. diff --git a/jsprit-examples/src/main/java/examples/RefuseCollectionExample.java b/jsprit-examples/src/main/java/jsprit/examples/RefuseCollectionExample.java similarity index 86% rename from jsprit-examples/src/main/java/examples/RefuseCollectionExample.java rename to jsprit-examples/src/main/java/jsprit/examples/RefuseCollectionExample.java index eb31e006..ec7843ce 100644 --- a/jsprit-examples/src/main/java/examples/RefuseCollectionExample.java +++ b/jsprit-examples/src/main/java/jsprit/examples/RefuseCollectionExample.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package examples; +package jsprit.examples; import java.io.BufferedReader; import java.io.File; @@ -22,26 +22,26 @@ import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.Collection; -import java.util.HashMap; import java.util.Map; -import util.Solutions; -import util.VehicleRoutingTransportCostsMatrix; -import util.VehicleRoutingTransportCostsMatrix.Builder; -import algorithms.GreedySchrimpfFactory; -import analysis.SolutionPrinter; -import analysis.SolutionPrinter.Print; -import basics.Service; -import basics.VehicleRoutingAlgorithm; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblem.FleetSize; -import basics.VehicleRoutingProblemSolution; -import basics.costs.VehicleRoutingTransportCosts; -import basics.io.VrpXMLWriter; -import basics.route.Driver; -import basics.route.Vehicle; -import basics.route.VehicleImpl; -import basics.route.VehicleTypeImpl; +import jsprit.analysis.toolbox.SolutionPrinter; +import jsprit.core.algorithm.VehicleRoutingAlgorithm; +import jsprit.core.algorithm.box.GreedySchrimpfFactory; +import jsprit.core.algorithm.termination.IterationWithoutImprovementTermination; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.VehicleRoutingProblem.FleetSize; +import jsprit.core.problem.cost.VehicleRoutingTransportCosts; +import jsprit.core.problem.driver.Driver; +import jsprit.core.problem.io.VrpXMLWriter; +import jsprit.core.problem.job.Service; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; +import jsprit.core.problem.vehicle.Vehicle; +import jsprit.core.problem.vehicle.VehicleImpl; +import jsprit.core.problem.vehicle.VehicleTypeImpl; +import jsprit.core.util.Solutions; +import jsprit.core.util.VehicleRoutingTransportCostsMatrix; +import jsprit.core.util.VehicleRoutingTransportCostsMatrix.Builder; + /** @@ -197,10 +197,10 @@ public class RefuseCollectionExample { VehicleRoutingProblem vrp = vrpBuilder.build(); VehicleRoutingAlgorithm vra = new GreedySchrimpfFactory().createAlgorithm(vrp); - vra.setPrematureBreak(100); + vra.setPrematureAlgorithmTermination(new IterationWithoutImprovementTermination(100)); Collection solutions = vra.searchSolutions(); - SolutionPrinter.print(Solutions.getBest(solutions),Print.VERBOSE); + SolutionPrinter.print(Solutions.bestOf(solutions)); new VrpXMLWriter(vrp, solutions).write("output/refuseCollectionExampleSolution.xml"); diff --git a/jsprit-examples/src/main/java/examples/SimpleDepotBoundedPickupAndDeliveryExample.java b/jsprit-examples/src/main/java/jsprit/examples/SimpleDepotBoundedPickupAndDeliveryExample.java similarity index 78% rename from jsprit-examples/src/main/java/examples/SimpleDepotBoundedPickupAndDeliveryExample.java rename to jsprit-examples/src/main/java/jsprit/examples/SimpleDepotBoundedPickupAndDeliveryExample.java index 11b8ddeb..be7f8d51 100644 --- a/jsprit-examples/src/main/java/examples/SimpleDepotBoundedPickupAndDeliveryExample.java +++ b/jsprit-examples/src/main/java/jsprit/examples/SimpleDepotBoundedPickupAndDeliveryExample.java @@ -14,32 +14,29 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package examples; +package jsprit.examples; import java.io.File; import java.util.Collection; -import util.Coordinate; -import util.Solutions; -import algorithms.SchrimpfFactory; -import analysis.Plotter; -import analysis.SolutionPlotter; -import analysis.SolutionPrinter; -import analysis.Plotter.Label; -import analysis.SolutionPrinter.Print; -import basics.Delivery; -import basics.Pickup; -import basics.Service; -import basics.VehicleRoutingAlgorithm; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblem.Constraint; -import basics.VehicleRoutingProblemSolution; -import basics.io.VrpXMLWriter; -import basics.route.Vehicle; -import basics.route.VehicleImpl; -import basics.route.VehicleImpl.Builder; -import basics.route.VehicleType; -import basics.route.VehicleTypeImpl; +import jsprit.analysis.toolbox.Plotter; +import jsprit.analysis.toolbox.Plotter.Label; +import jsprit.analysis.toolbox.SolutionPrinter; +import jsprit.core.algorithm.VehicleRoutingAlgorithm; +import jsprit.core.algorithm.box.SchrimpfFactory; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.io.VrpXMLWriter; +import jsprit.core.problem.job.Delivery; +import jsprit.core.problem.job.Pickup; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; +import jsprit.core.problem.vehicle.Vehicle; +import jsprit.core.problem.vehicle.VehicleImpl; +import jsprit.core.problem.vehicle.VehicleImpl.Builder; +import jsprit.core.problem.vehicle.VehicleType; +import jsprit.core.problem.vehicle.VehicleTypeImpl; +import jsprit.core.util.Coordinate; +import jsprit.core.util.Solutions; + public class SimpleDepotBoundedPickupAndDeliveryExample { @@ -99,11 +96,11 @@ public class SimpleDepotBoundedPickupAndDeliveryExample { /* * get the best */ - VehicleRoutingProblemSolution bestSolution = Solutions.getBest(solutions); + VehicleRoutingProblemSolution bestSolution = Solutions.bestOf(solutions); new VrpXMLWriter(problem, solutions).write("output/problem-with-solution.xml"); - SolutionPrinter.print(bestSolution,Print.VERBOSE); + SolutionPrinter.print(bestSolution); /* * plot diff --git a/jsprit-examples/src/main/java/examples/SimpleEnRoutePickupAndDeliveryExample.java b/jsprit-examples/src/main/java/jsprit/examples/SimpleEnRoutePickupAndDeliveryExample.java similarity index 82% rename from jsprit-examples/src/main/java/examples/SimpleEnRoutePickupAndDeliveryExample.java rename to jsprit-examples/src/main/java/jsprit/examples/SimpleEnRoutePickupAndDeliveryExample.java index 5d88c6d9..ff23e046 100644 --- a/jsprit-examples/src/main/java/examples/SimpleEnRoutePickupAndDeliveryExample.java +++ b/jsprit-examples/src/main/java/jsprit/examples/SimpleEnRoutePickupAndDeliveryExample.java @@ -14,30 +14,28 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package examples; +package jsprit.examples; import java.io.File; import java.util.Arrays; import java.util.Collection; -import util.Coordinate; -import util.Solutions; -import algorithms.SchrimpfFactory; -import analysis.Plotter; -import analysis.SolutionPlotter; -import analysis.SolutionPrinter; -import analysis.SolutionPrinter.Print; -import basics.Service; -import basics.Shipment; -import basics.VehicleRoutingAlgorithm; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblemSolution; -import basics.io.VrpXMLWriter; -import basics.route.Vehicle; -import basics.route.VehicleImpl; -import basics.route.VehicleImpl.Builder; -import basics.route.VehicleType; -import basics.route.VehicleTypeImpl; +import jsprit.analysis.toolbox.Plotter; +import jsprit.analysis.toolbox.SolutionPrinter; +import jsprit.core.algorithm.VehicleRoutingAlgorithm; +import jsprit.core.algorithm.box.SchrimpfFactory; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.io.VrpXMLWriter; +import jsprit.core.problem.job.Shipment; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; +import jsprit.core.problem.vehicle.Vehicle; +import jsprit.core.problem.vehicle.VehicleImpl; +import jsprit.core.problem.vehicle.VehicleImpl.Builder; +import jsprit.core.problem.vehicle.VehicleType; +import jsprit.core.problem.vehicle.VehicleTypeImpl; +import jsprit.core.util.Coordinate; +import jsprit.core.util.Solutions; + public class SimpleEnRoutePickupAndDeliveryExample { @@ -102,11 +100,11 @@ public class SimpleEnRoutePickupAndDeliveryExample { /* * get the best */ - VehicleRoutingProblemSolution bestSolution = Solutions.getBest(solutions); + VehicleRoutingProblemSolution bestSolution = Solutions.bestOf(solutions); new VrpXMLWriter(problem, solutions).write("output/shipment-problem-with-solution.xml"); - SolutionPrinter.print(bestSolution,Print.VERBOSE); + SolutionPrinter.print(bestSolution); /* * plot diff --git a/jsprit-examples/src/main/java/examples/SimpleEnRoutePickupAndDeliveryWithDepotBoundedDeliveriesExample.java b/jsprit-examples/src/main/java/jsprit/examples/SimpleEnRoutePickupAndDeliveryWithDepotBoundedDeliveriesExample.java similarity index 83% rename from jsprit-examples/src/main/java/examples/SimpleEnRoutePickupAndDeliveryWithDepotBoundedDeliveriesExample.java rename to jsprit-examples/src/main/java/jsprit/examples/SimpleEnRoutePickupAndDeliveryWithDepotBoundedDeliveriesExample.java index 71017292..69e24dc0 100644 --- a/jsprit-examples/src/main/java/examples/SimpleEnRoutePickupAndDeliveryWithDepotBoundedDeliveriesExample.java +++ b/jsprit-examples/src/main/java/jsprit/examples/SimpleEnRoutePickupAndDeliveryWithDepotBoundedDeliveriesExample.java @@ -14,32 +14,29 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package examples; +package jsprit.examples; import java.io.File; -import java.util.Arrays; import java.util.Collection; -import util.Coordinate; -import util.Solutions; -import algorithms.SchrimpfFactory; -import analysis.Plotter; -import analysis.SolutionPlotter; -import analysis.SolutionPrinter; -import analysis.SolutionPrinter.Print; -import basics.Delivery; -import basics.Service; -import basics.Shipment; -import basics.VehicleRoutingAlgorithm; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblemSolution; -import basics.VehicleRoutingProblem.Constraint; -import basics.io.VrpXMLWriter; -import basics.route.Vehicle; -import basics.route.VehicleImpl; -import basics.route.VehicleImpl.Builder; -import basics.route.VehicleType; -import basics.route.VehicleTypeImpl; +import jsprit.analysis.toolbox.Plotter; +import jsprit.analysis.toolbox.SolutionPrinter; +import jsprit.core.algorithm.VehicleRoutingAlgorithm; +import jsprit.core.algorithm.box.SchrimpfFactory; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.VehicleRoutingProblem.Constraint; +import jsprit.core.problem.io.VrpXMLWriter; +import jsprit.core.problem.job.Delivery; +import jsprit.core.problem.job.Shipment; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; +import jsprit.core.problem.vehicle.Vehicle; +import jsprit.core.problem.vehicle.VehicleImpl; +import jsprit.core.problem.vehicle.VehicleImpl.Builder; +import jsprit.core.problem.vehicle.VehicleType; +import jsprit.core.problem.vehicle.VehicleTypeImpl; +import jsprit.core.util.Coordinate; +import jsprit.core.util.Solutions; + public class SimpleEnRoutePickupAndDeliveryWithDepotBoundedDeliveriesExample { @@ -118,11 +115,11 @@ public class SimpleEnRoutePickupAndDeliveryWithDepotBoundedDeliveriesExample { /* * get the best */ - VehicleRoutingProblemSolution bestSolution = Solutions.getBest(solutions); + VehicleRoutingProblemSolution bestSolution = Solutions.bestOf(solutions); new VrpXMLWriter(problem, solutions).write("output/mixed-shipments-services-problem-with-solution.xml"); - SolutionPrinter.print(bestSolution,Print.VERBOSE); + SolutionPrinter.print(bestSolution); /* * plot diff --git a/jsprit-examples/src/main/java/examples/SimpleExample.java b/jsprit-examples/src/main/java/jsprit/examples/SimpleExample.java similarity index 78% rename from jsprit-examples/src/main/java/examples/SimpleExample.java rename to jsprit-examples/src/main/java/jsprit/examples/SimpleExample.java index f24d15c1..66353b22 100644 --- a/jsprit-examples/src/main/java/examples/SimpleExample.java +++ b/jsprit-examples/src/main/java/jsprit/examples/SimpleExample.java @@ -14,27 +14,27 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package examples; +package jsprit.examples; import java.io.File; import java.util.Collection; -import util.Coordinate; -import util.Solutions; -import algorithms.SchrimpfFactory; -import analysis.SolutionPlotter; -import analysis.SolutionPrinter; -import analysis.SolutionPrinter.Print; -import basics.Service; -import basics.VehicleRoutingAlgorithm; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblemSolution; -import basics.io.VrpXMLWriter; -import basics.route.Vehicle; -import basics.route.VehicleImpl; -import basics.route.VehicleImpl.Builder; -import basics.route.VehicleType; -import basics.route.VehicleTypeImpl; +import jsprit.analysis.toolbox.SolutionPlotter; +import jsprit.analysis.toolbox.SolutionPrinter; +import jsprit.core.algorithm.VehicleRoutingAlgorithm; +import jsprit.core.algorithm.box.SchrimpfFactory; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.io.VrpXMLWriter; +import jsprit.core.problem.job.Service; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; +import jsprit.core.problem.vehicle.Vehicle; +import jsprit.core.problem.vehicle.VehicleImpl; +import jsprit.core.problem.vehicle.VehicleImpl.Builder; +import jsprit.core.problem.vehicle.VehicleType; +import jsprit.core.problem.vehicle.VehicleTypeImpl; +import jsprit.core.util.Coordinate; +import jsprit.core.util.Solutions; + public class SimpleExample { @@ -93,11 +93,11 @@ public class SimpleExample { /* * get the best */ - VehicleRoutingProblemSolution bestSolution = Solutions.getBest(solutions); + VehicleRoutingProblemSolution bestSolution = Solutions.bestOf(solutions); new VrpXMLWriter(problem, solutions).write("output/problem-with-solution.xml"); - SolutionPrinter.print(bestSolution,Print.VERBOSE); + SolutionPrinter.print(bestSolution); /* * plot diff --git a/jsprit-examples/src/main/java/examples/SimpleVRPWithBackhaulsExample.java b/jsprit-examples/src/main/java/jsprit/examples/SimpleVRPWithBackhaulsExample.java similarity index 77% rename from jsprit-examples/src/main/java/examples/SimpleVRPWithBackhaulsExample.java rename to jsprit-examples/src/main/java/jsprit/examples/SimpleVRPWithBackhaulsExample.java index 57d547db..9f42a5af 100644 --- a/jsprit-examples/src/main/java/examples/SimpleVRPWithBackhaulsExample.java +++ b/jsprit-examples/src/main/java/jsprit/examples/SimpleVRPWithBackhaulsExample.java @@ -14,32 +14,30 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package examples; +package jsprit.examples; import java.io.File; import java.util.Collection; -import util.Coordinate; -import util.Solutions; -import algorithms.SchrimpfFactory; -import analysis.Plotter; -import analysis.SolutionPlotter; -import analysis.SolutionPrinter; -import analysis.Plotter.Label; -import analysis.SolutionPrinter.Print; -import basics.Delivery; -import basics.Pickup; -import basics.Service; -import basics.VehicleRoutingAlgorithm; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblem.Constraint; -import basics.VehicleRoutingProblemSolution; -import basics.io.VrpXMLWriter; -import basics.route.Vehicle; -import basics.route.VehicleImpl; -import basics.route.VehicleImpl.Builder; -import basics.route.VehicleType; -import basics.route.VehicleTypeImpl; +import jsprit.analysis.toolbox.Plotter; +import jsprit.analysis.toolbox.Plotter.Label; +import jsprit.analysis.toolbox.SolutionPrinter; +import jsprit.core.algorithm.VehicleRoutingAlgorithm; +import jsprit.core.algorithm.box.SchrimpfFactory; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.VehicleRoutingProblem.Constraint; +import jsprit.core.problem.io.VrpXMLWriter; +import jsprit.core.problem.job.Delivery; +import jsprit.core.problem.job.Pickup; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; +import jsprit.core.problem.vehicle.Vehicle; +import jsprit.core.problem.vehicle.VehicleImpl; +import jsprit.core.problem.vehicle.VehicleImpl.Builder; +import jsprit.core.problem.vehicle.VehicleType; +import jsprit.core.problem.vehicle.VehicleTypeImpl; +import jsprit.core.util.Coordinate; +import jsprit.core.util.Solutions; + public class SimpleVRPWithBackhaulsExample { @@ -101,11 +99,11 @@ public class SimpleVRPWithBackhaulsExample { /* * get the best */ - VehicleRoutingProblemSolution bestSolution = Solutions.getBest(solutions); + VehicleRoutingProblemSolution bestSolution = Solutions.bestOf(solutions); new VrpXMLWriter(problem, solutions).write("output/problem-with-solution.xml"); - SolutionPrinter.print(bestSolution,Print.VERBOSE); + SolutionPrinter.print(bestSolution); /* * plot diff --git a/jsprit-examples/src/main/java/examples/SolomonExample.java b/jsprit-examples/src/main/java/jsprit/examples/SolomonExample.java similarity index 85% rename from jsprit-examples/src/main/java/examples/SolomonExample.java rename to jsprit-examples/src/main/java/jsprit/examples/SolomonExample.java index d72997bc..9aaa823c 100644 --- a/jsprit-examples/src/main/java/examples/SolomonExample.java +++ b/jsprit-examples/src/main/java/jsprit/examples/SolomonExample.java @@ -14,20 +14,20 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package examples; +package jsprit.examples; import java.io.File; import java.util.Collection; -import readers.SolomonReader; -import algorithms.VehicleRoutingAlgorithms; -import algorithms.selectors.SelectBest; -import analysis.SolutionPlotter; -import analysis.SolutionPrinter; -import analysis.SolutionPrinter.Print; -import basics.VehicleRoutingAlgorithm; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblemSolution; +import jsprit.analysis.toolbox.SolutionPlotter; +import jsprit.analysis.toolbox.SolutionPrinter; +import jsprit.core.algorithm.VehicleRoutingAlgorithm; +import jsprit.core.algorithm.io.VehicleRoutingAlgorithms; +import jsprit.core.algorithm.selector.SelectBest; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; +import jsprit.instance.reader.SolomonReader; + public class SolomonExample { @@ -86,7 +86,7 @@ public class SolomonExample { /* * print solution */ - SolutionPrinter.print(solution, Print.VERBOSE); + SolutionPrinter.print(solution); /* * Plot solution. diff --git a/jsprit-examples/src/main/java/examples/SolomonR101Example.java b/jsprit-examples/src/main/java/jsprit/examples/SolomonR101Example.java similarity index 85% rename from jsprit-examples/src/main/java/examples/SolomonR101Example.java rename to jsprit-examples/src/main/java/jsprit/examples/SolomonR101Example.java index d08b4a61..f89d2171 100644 --- a/jsprit-examples/src/main/java/examples/SolomonR101Example.java +++ b/jsprit-examples/src/main/java/jsprit/examples/SolomonR101Example.java @@ -14,20 +14,20 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package examples; +package jsprit.examples; import java.io.File; import java.util.Collection; -import readers.SolomonReader; -import algorithms.VehicleRoutingAlgorithms; -import algorithms.selectors.SelectBest; -import analysis.SolutionPlotter; -import analysis.SolutionPrinter; -import analysis.SolutionPrinter.Print; -import basics.VehicleRoutingAlgorithm; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblemSolution; +import jsprit.analysis.toolbox.SolutionPlotter; +import jsprit.analysis.toolbox.SolutionPrinter; +import jsprit.core.algorithm.VehicleRoutingAlgorithm; +import jsprit.core.algorithm.io.VehicleRoutingAlgorithms; +import jsprit.core.algorithm.selector.SelectBest; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; +import jsprit.instance.reader.SolomonReader; + public class SolomonR101Example { @@ -86,7 +86,7 @@ public class SolomonR101Example { /* * print solution */ - SolutionPrinter.print(solution, Print.VERBOSE); + SolutionPrinter.print(solution); /* * Plot solution. diff --git a/jsprit-examples/src/main/java/examples/VRPWithBackhaulsExample.java b/jsprit-examples/src/main/java/jsprit/examples/VRPWithBackhaulsExample.java similarity index 81% rename from jsprit-examples/src/main/java/examples/VRPWithBackhaulsExample.java rename to jsprit-examples/src/main/java/jsprit/examples/VRPWithBackhaulsExample.java index ceb1c62c..5105b27e 100644 --- a/jsprit-examples/src/main/java/examples/VRPWithBackhaulsExample.java +++ b/jsprit-examples/src/main/java/jsprit/examples/VRPWithBackhaulsExample.java @@ -14,28 +14,23 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package examples; +package jsprit.examples; import java.io.File; import java.util.Collection; -import algorithms.VehicleRoutingAlgorithms; -import algorithms.selectors.SelectBest; -import analysis.AlgorithmSearchProgressChartListener; -import analysis.Plotter; -import analysis.SolutionPlotter; -import analysis.SolutionPrinter; -import analysis.Plotter.Label; -import analysis.SolutionPrinter.Print; -import basics.VehicleRoutingAlgorithm; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblemSolution; -import basics.VehicleRoutingProblem.Constraint; -import basics.costs.VehicleRoutingActivityCosts; -import basics.io.VrpXMLReader; -import basics.route.Driver; -import basics.route.TourActivity; -import basics.route.Vehicle; +import jsprit.analysis.toolbox.AlgorithmSearchProgressChartListener; +import jsprit.analysis.toolbox.Plotter; +import jsprit.analysis.toolbox.Plotter.Label; +import jsprit.analysis.toolbox.SolutionPrinter; +import jsprit.core.algorithm.VehicleRoutingAlgorithm; +import jsprit.core.algorithm.io.VehicleRoutingAlgorithms; +import jsprit.core.algorithm.selector.SelectBest; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.VehicleRoutingProblem.Constraint; +import jsprit.core.problem.io.VrpXMLReader; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; + public class VRPWithBackhaulsExample { @@ -96,7 +91,7 @@ public class VRPWithBackhaulsExample { /* * print solution */ - SolutionPrinter.print(solution, Print.VERBOSE); + SolutionPrinter.print(solution); /* * Plot solution. diff --git a/jsprit-examples/src/main/java/examples/VRPWithBackhaulsExample2.java b/jsprit-examples/src/main/java/jsprit/examples/VRPWithBackhaulsExample2.java similarity index 82% rename from jsprit-examples/src/main/java/examples/VRPWithBackhaulsExample2.java rename to jsprit-examples/src/main/java/jsprit/examples/VRPWithBackhaulsExample2.java index 598b2431..8e611a48 100644 --- a/jsprit-examples/src/main/java/examples/VRPWithBackhaulsExample2.java +++ b/jsprit-examples/src/main/java/jsprit/examples/VRPWithBackhaulsExample2.java @@ -14,24 +14,23 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package examples; +package jsprit.examples; import java.io.File; import java.util.Collection; -import algorithms.VehicleRoutingAlgorithms; -import algorithms.selectors.SelectBest; -import analysis.AlgorithmSearchProgressChartListener; -import analysis.Plotter; -import analysis.Plotter.Label; -import analysis.SolutionPlotter; -import analysis.SolutionPrinter; -import analysis.SolutionPrinter.Print; -import basics.VehicleRoutingAlgorithm; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblemSolution; -import basics.VehicleRoutingProblem.Constraint; -import basics.io.VrpXMLReader; +import jsprit.analysis.toolbox.Plotter; +import jsprit.analysis.toolbox.Plotter.Label; +import jsprit.analysis.toolbox.SolutionPlotter; +import jsprit.analysis.toolbox.SolutionPrinter; +import jsprit.core.algorithm.VehicleRoutingAlgorithm; +import jsprit.core.algorithm.io.VehicleRoutingAlgorithms; +import jsprit.core.algorithm.selector.SelectBest; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.VehicleRoutingProblem.Constraint; +import jsprit.core.problem.io.VrpXMLReader; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; + public class VRPWithBackhaulsExample2 { @@ -94,7 +93,7 @@ public class VRPWithBackhaulsExample2 { /* * print solution */ - SolutionPrinter.print(solution, Print.VERBOSE); + SolutionPrinter.print(solution); /* * Plot solution. diff --git a/jsprit-instances/src/main/java/readers/ChristofidesReader.java b/jsprit-instances/src/main/java/jsprit/instance/reader/ChristofidesReader.java similarity index 92% rename from jsprit-instances/src/main/java/readers/ChristofidesReader.java rename to jsprit-instances/src/main/java/jsprit/instance/reader/ChristofidesReader.java index 75c6d000..1ad414d9 100644 --- a/jsprit-instances/src/main/java/readers/ChristofidesReader.java +++ b/jsprit-instances/src/main/java/jsprit/instance/reader/ChristofidesReader.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package readers; +package jsprit.instance.reader; import java.io.BufferedReader; @@ -22,18 +22,17 @@ import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.VehicleRoutingProblem.FleetSize; +import jsprit.core.problem.job.Service; +import jsprit.core.problem.vehicle.Vehicle; +import jsprit.core.problem.vehicle.VehicleImpl; +import jsprit.core.problem.vehicle.VehicleTypeImpl; +import jsprit.core.util.Coordinate; + import org.apache.log4j.Logger; -import readers.ChristofidesReader; -import util.Coordinate; -import basics.route.Vehicle; -import basics.route.VehicleImpl; -import basics.route.VehicleType; -import basics.route.VehicleTypeImpl; -import basics.Service; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblem.FleetSize; /** * Reader that reads Christophides, Mingozzi and Toth instances. diff --git a/jsprit-instances/src/main/java/readers/CordeauReader.java b/jsprit-instances/src/main/java/jsprit/instance/reader/CordeauReader.java similarity index 93% rename from jsprit-instances/src/main/java/readers/CordeauReader.java rename to jsprit-instances/src/main/java/jsprit/instance/reader/CordeauReader.java index b738d02c..77d1214a 100644 --- a/jsprit-instances/src/main/java/readers/CordeauReader.java +++ b/jsprit-instances/src/main/java/jsprit/instance/reader/CordeauReader.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package readers; +package jsprit.instance.reader; import java.io.BufferedReader; @@ -24,19 +24,18 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.VehicleRoutingProblem.FleetSize; +import jsprit.core.problem.job.Service; +import jsprit.core.problem.vehicle.PenaltyVehicleType; +import jsprit.core.problem.vehicle.VehicleImpl; +import jsprit.core.problem.vehicle.VehicleImpl.Builder; +import jsprit.core.problem.vehicle.VehicleTypeImpl; +import jsprit.core.util.Coordinate; + import org.apache.log4j.Logger; -import readers.CordeauReader; -import util.Coordinate; -import basics.VehicleRoutingProblem.FleetSize; -import basics.route.PenaltyVehicleType; -import basics.route.VehicleImpl; -import basics.route.VehicleImpl.Builder; -import basics.route.VehicleType; -import basics.route.VehicleTypeImpl; -import basics.Service; -import basics.VehicleRoutingProblem; /** * Reader that reads instances developed by: diff --git a/jsprit-instances/src/main/java/readers/FigliozziReader.java b/jsprit-instances/src/main/java/jsprit/instance/reader/FigliozziReader.java similarity index 92% rename from jsprit-instances/src/main/java/readers/FigliozziReader.java rename to jsprit-instances/src/main/java/jsprit/instance/reader/FigliozziReader.java index 02dff2c4..5ead2c58 100644 --- a/jsprit-instances/src/main/java/readers/FigliozziReader.java +++ b/jsprit-instances/src/main/java/jsprit/instance/reader/FigliozziReader.java @@ -14,26 +14,25 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package readers; +package jsprit.instance.reader; import java.util.List; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.VehicleRoutingProblem.Builder; +import jsprit.core.problem.cost.VehicleRoutingTransportCosts; +import jsprit.core.problem.driver.Driver; +import jsprit.core.problem.vehicle.Vehicle; +import jsprit.core.util.CrowFlyCosts; +import jsprit.core.util.Locations; + import org.apache.log4j.Logger; -import util.CrowFlyCosts; -import util.Locations; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblem.Builder; -import basics.costs.VehicleRoutingTransportCosts; -import basics.route.Driver; -import basics.route.Vehicle; public class FigliozziReader { public static class TDCosts implements VehicleRoutingTransportCosts { - private static Logger log = Logger.getLogger(TDCosts.class); - private List timeBins; private List speed; diff --git a/jsprit-instances/src/main/java/readers/LiLimReader.java b/jsprit-instances/src/main/java/jsprit/instance/reader/LiLimReader.java similarity index 88% rename from jsprit-instances/src/main/java/readers/LiLimReader.java rename to jsprit-instances/src/main/java/jsprit/instance/reader/LiLimReader.java index 5c4462ea..e5a755f9 100644 --- a/jsprit-instances/src/main/java/readers/LiLimReader.java +++ b/jsprit-instances/src/main/java/jsprit/instance/reader/LiLimReader.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package readers; +package jsprit.instance.reader; import java.io.BufferedReader; @@ -26,17 +26,18 @@ import java.util.Collection; import java.util.HashMap; import java.util.Map; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.VehicleRoutingProblem.Builder; +import jsprit.core.problem.job.Shipment; +import jsprit.core.problem.solution.route.activity.TimeWindow; +import jsprit.core.problem.vehicle.Vehicle; +import jsprit.core.problem.vehicle.VehicleImpl; +import jsprit.core.problem.vehicle.VehicleTypeImpl; +import jsprit.core.util.Coordinate; +import jsprit.core.util.Locations; + import org.apache.log4j.Logger; -import util.Coordinate; -import util.Locations; -import basics.Shipment; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblem.Builder; -import basics.route.TimeWindow; -import basics.route.Vehicle; -import basics.route.VehicleImpl; -import basics.route.VehicleTypeImpl; /** * test instances for the capacitated vrp with pickup and deliveries and time windows. @@ -106,6 +107,8 @@ public class LiLimReader { private double depotOpeningTime; private double depotClosingTime; + + private int fixCosts = 0; public LiLimReader(Builder vrpBuilder) { customers = new HashMap(); @@ -113,11 +116,18 @@ public class LiLimReader { this.vrpBuilder = vrpBuilder; } + public LiLimReader(Builder builder, int fixCosts) { + customers = new HashMap(); + relations = new ArrayList(); + this.vrpBuilder = builder; + this.fixCosts = fixCosts; + } + public void read(String filename){ readShipments(filename); buildShipments(); VehicleTypeImpl type = VehicleTypeImpl.Builder.newInstance("type", vehicleCapacity) - .setCostPerDistance(1.0).build(); + .setCostPerDistance(1.0).setFixedCost(fixCosts).build(); Vehicle vehicle = VehicleImpl.Builder.newInstance("vehicle") .setEarliestStart(depotOpeningTime).setLatestArrival(depotClosingTime) .setLocationCoord(customers.get(depotId).coord).setType(type).build(); diff --git a/jsprit-instances/src/main/java/readers/LuiShenReader.java b/jsprit-instances/src/main/java/jsprit/instance/reader/LuiShenReader.java similarity index 91% rename from jsprit-instances/src/main/java/readers/LuiShenReader.java rename to jsprit-instances/src/main/java/jsprit/instance/reader/LuiShenReader.java index 4c5e2022..67e374d3 100644 --- a/jsprit-instances/src/main/java/readers/LuiShenReader.java +++ b/jsprit-instances/src/main/java/jsprit/instance/reader/LuiShenReader.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package readers; +package jsprit.instance.reader; import java.io.BufferedReader; @@ -22,20 +22,19 @@ import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.VehicleRoutingProblem.FleetComposition; +import jsprit.core.problem.VehicleRoutingProblem.FleetSize; +import jsprit.core.problem.job.Service; +import jsprit.core.problem.solution.route.activity.TimeWindow; +import jsprit.core.problem.vehicle.Vehicle; +import jsprit.core.problem.vehicle.VehicleImpl; +import jsprit.core.problem.vehicle.VehicleTypeImpl; +import jsprit.core.util.Coordinate; + import org.apache.log4j.Logger; -import readers.LuiShenReader; -import util.Coordinate; -import basics.Service; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblem.FleetComposition; -import basics.VehicleRoutingProblem.FleetSize; -import basics.route.TimeWindow; -import basics.route.Vehicle; -import basics.route.VehicleImpl; -import basics.route.VehicleType; -import basics.route.VehicleTypeImpl; public class LuiShenReader { diff --git a/jsprit-instances/src/main/java/readers/SolomonReader.java b/jsprit-instances/src/main/java/jsprit/instance/reader/SolomonReader.java similarity index 92% rename from jsprit-instances/src/main/java/readers/SolomonReader.java rename to jsprit-instances/src/main/java/jsprit/instance/reader/SolomonReader.java index d9bc15d1..a03e0d79 100644 --- a/jsprit-instances/src/main/java/readers/SolomonReader.java +++ b/jsprit-instances/src/main/java/jsprit/instance/reader/SolomonReader.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package readers; +package jsprit.instance.reader; import java.io.BufferedReader; @@ -22,19 +22,18 @@ import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.VehicleRoutingProblem.FleetSize; +import jsprit.core.problem.job.Service; +import jsprit.core.problem.solution.route.activity.TimeWindow; +import jsprit.core.problem.vehicle.Vehicle; +import jsprit.core.problem.vehicle.VehicleImpl; +import jsprit.core.problem.vehicle.VehicleTypeImpl; +import jsprit.core.util.Coordinate; + import org.apache.log4j.Logger; -import readers.SolomonReader; -import util.Coordinate; -import basics.route.TimeWindow; -import basics.route.Vehicle; -import basics.route.VehicleImpl; -import basics.route.VehicleType; -import basics.route.VehicleTypeImpl; -import basics.Service; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblem.FleetSize; /** * Reader that reads the well-known solomon-instances. diff --git a/jsprit-instances/src/main/java/readers/Taillard.java b/jsprit-instances/src/main/java/jsprit/instance/reader/Taillard.java similarity index 99% rename from jsprit-instances/src/main/java/readers/Taillard.java rename to jsprit-instances/src/main/java/jsprit/instance/reader/Taillard.java index 498d3156..0367806a 100644 --- a/jsprit-instances/src/main/java/readers/Taillard.java +++ b/jsprit-instances/src/main/java/jsprit/instance/reader/Taillard.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package readers; +package jsprit.instance.reader; //package instances; // //import java.io.BufferedReader; diff --git a/jsprit-instances/src/main/java/util/Instances.java b/jsprit-instances/src/main/java/jsprit/instance/util/Instances.java similarity index 98% rename from jsprit-instances/src/main/java/util/Instances.java rename to jsprit-instances/src/main/java/jsprit/instance/util/Instances.java index 93e14f96..8efe9b4f 100644 --- a/jsprit-instances/src/main/java/util/Instances.java +++ b/jsprit-instances/src/main/java/jsprit/instance/util/Instances.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package util; +package jsprit.instance.util; import java.io.BufferedReader; import java.io.File; @@ -26,10 +26,12 @@ import java.util.Arrays; import java.util.Collection; import java.util.List; -import readers.ChristofidesReader; -import readers.CordeauReader; -import readers.SolomonReader; -import basics.VehicleRoutingProblem; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.util.BenchmarkInstance; +import jsprit.instance.reader.ChristofidesReader; +import jsprit.instance.reader.CordeauReader; +import jsprit.instance.reader.SolomonReader; + public class Instances { diff --git a/jsprit-instances/src/test/java/readers/ChristophidesReaderTest.java b/jsprit-instances/src/test/java/jsprit/instance/reader/ChristophidesReaderTest.java similarity index 93% rename from jsprit-instances/src/test/java/readers/ChristophidesReaderTest.java rename to jsprit-instances/src/test/java/jsprit/instance/reader/ChristophidesReaderTest.java index a03cfeab..008899c2 100644 --- a/jsprit-instances/src/test/java/readers/ChristophidesReaderTest.java +++ b/jsprit-instances/src/test/java/jsprit/instance/reader/ChristophidesReaderTest.java @@ -14,16 +14,17 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package readers; +package jsprit.instance.reader; import static org.junit.Assert.assertEquals; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.VehicleRoutingProblem.FleetSize; +import jsprit.core.problem.job.Service; +import jsprit.core.problem.vehicle.Vehicle; +import jsprit.instance.reader.ChristofidesReader; import org.junit.Test; -import basics.Service; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblem.FleetSize; -import basics.route.Vehicle; public class ChristophidesReaderTest { diff --git a/jsprit-instances/src/test/java/readers/CordeauReaderTest.java b/jsprit-instances/src/test/java/jsprit/instance/reader/CordeauReaderTest.java similarity index 95% rename from jsprit-instances/src/test/java/readers/CordeauReaderTest.java rename to jsprit-instances/src/test/java/jsprit/instance/reader/CordeauReaderTest.java index f5cd0fe3..35f2304f 100644 --- a/jsprit-instances/src/test/java/readers/CordeauReaderTest.java +++ b/jsprit-instances/src/test/java/jsprit/instance/reader/CordeauReaderTest.java @@ -14,17 +14,18 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package readers; +package jsprit.instance.reader; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.VehicleRoutingProblem.FleetSize; +import jsprit.core.problem.job.Service; +import jsprit.core.problem.vehicle.Vehicle; +import jsprit.instance.reader.CordeauReader; import org.junit.Test; -import basics.Service; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblem.FleetSize; -import basics.route.Vehicle; public class CordeauReaderTest { diff --git a/jsprit-instances/src/test/java/readers/LuiShenReaderTest.java b/jsprit-instances/src/test/java/jsprit/instance/reader/LuiShenReaderTest.java similarity index 88% rename from jsprit-instances/src/test/java/readers/LuiShenReaderTest.java rename to jsprit-instances/src/test/java/jsprit/instance/reader/LuiShenReaderTest.java index 20c87bf6..651cb7bf 100644 --- a/jsprit-instances/src/test/java/readers/LuiShenReaderTest.java +++ b/jsprit-instances/src/test/java/jsprit/instance/reader/LuiShenReaderTest.java @@ -14,16 +14,17 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package readers; +package jsprit.instance.reader; import static org.junit.Assert.assertEquals; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.VehicleRoutingProblem.FleetComposition; +import jsprit.core.problem.VehicleRoutingProblem.FleetSize; +import jsprit.instance.reader.LuiShenReader; import org.junit.Before; import org.junit.Test; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblem.FleetComposition; -import basics.VehicleRoutingProblem.FleetSize; public class LuiShenReaderTest { diff --git a/jsprit-instances/src/test/java/readers/SolomonReaderTest.java b/jsprit-instances/src/test/java/jsprit/instance/reader/SolomonReaderTest.java similarity index 94% rename from jsprit-instances/src/test/java/readers/SolomonReaderTest.java rename to jsprit-instances/src/test/java/jsprit/instance/reader/SolomonReaderTest.java index 9ad40926..ade886d0 100644 --- a/jsprit-instances/src/test/java/readers/SolomonReaderTest.java +++ b/jsprit-instances/src/test/java/jsprit/instance/reader/SolomonReaderTest.java @@ -14,16 +14,17 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . ******************************************************************************/ -package readers; +package jsprit.instance.reader; import static org.junit.Assert.assertEquals; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.VehicleRoutingProblem.FleetSize; +import jsprit.core.problem.job.Service; +import jsprit.core.problem.vehicle.Vehicle; +import jsprit.instance.reader.SolomonReader; import org.junit.Test; -import basics.Service; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblem.FleetSize; -import basics.route.Vehicle; public class SolomonReaderTest {