/// <summary> /// Find optimal running route through cougar /// </summary> /// <param name="geometry"></param> private static void RunCougarFinder(Geometry geometry) { geometry = new DropBuildings().Transform(geometry); geometry = new DropWater().Transform(geometry); OutputPolygons("275765", geometry); geometry = new OnlyTraversable().Transform(geometry); geometry = new CollapseParkingLots().Transform(geometry); var cougar = geometry.Relations.First(x => x.Id == "275765"); var ways = new LabelWaysInRelation().Transform(cougar, geometry); ways = new SplitBisectedWays().Transform(ways); DebugOut(ways, "labeledWays.json"); var targetNodes = new HashSet <Node>(); foreach (var way in ways) { if (way.Tags["rfInPolygon"] == "in") { targetNodes.Add(way.Nodes.First()); targetNodes.Add(way.Nodes.Last()); } } var graph = new GraphBuilder(new RequiredEdgeGraphFilter(), new ReasonablyEnjoyableRunningCost()).BuildGraph(ways.ToArray(), out var originalEdgeWays); new GraphSummaryOutputter(outputLocation).OutputGraph(graph, originalEdgeWays, "reducedGraph.json"); var requiredCost = graph.RequiredEdgeCost(); // lazy route var lazyRouteFinder = new RouteFinder <Node>(new LazyGraphAugmenter <Node>()); var lazyRoute = lazyRouteFinder.GetRoute(graph); var lazyRouteCost = lazyRoute.Select(x => x.Distance).Sum(); // do regular route (rebuilds graph) graph = new GraphBuilder(new RequiredEdgeGraphFilter(), new ReasonablyEnjoyableRunningCost()).BuildGraph(ways.ToArray(), out originalEdgeWays); var greedRouteFinder = new RouteFinder <Node>(new GreedyGraphAugmenter <Node>()); var route = greedRouteFinder.GetRoute(graph); var routeCost = route.Select(x => x.Distance).Sum(); //new RouteCoverageOutputter(outputLocation).OutputGraph(route, originalEdgeWays, "greedyRouteCoverage.json"); new RouteDetailOutputter(ways, outputLocation, "lazyRouteCoverage.json", "instructions.txt").DescribeRoutesAsWays(lazyRoute); Console.WriteLine($"Required running: {requiredCost}"); Console.WriteLine($"Lazy Route: {lazyRouteCost}"); Console.WriteLine($"Greedy Route: {routeCost}"); Console.Read(); }