Beispiel #1
0
        public static void Main(string[] args)
        {
            const int clusterSize = 8;
            const int maxLevel    = 2;
            const int height      = 128;
            const int width       = 128;

            //IPassability passability = new ExamplePassability();

            IPassability passability = new FakePassability(width, height);

            var concreteMap = ConcreteMapFactory.CreateConcreteMap(width, height, passability);

            var abstractMapFactory = new HierarchicalMapFactory();
            var absTiling          = abstractMapFactory.CreateHierarchicalMap(concreteMap, clusterSize, maxLevel, EntranceStyle.EndEntrance);
            //var edges = absTiling.AbstractGraph.Nodes.SelectMany(x => x.Edges.Values)
            //    .GroupBy(x => x.Info.Level)
            //    .ToDictionary(x => x.Key, x => x.Count());

            Func <Position, Position, List <IPathNode> > doHierarchicalSearch = (startPosition, endPosition)
                                                                                => HierarchicalSearch(absTiling, maxLevel, concreteMap, startPosition, endPosition);

            Func <Position, Position, List <IPathNode> > doRegularSearch = (startPosition, endPosition)
                                                                           => RegularSearch(concreteMap, startPosition, endPosition);

            Func <List <IPathNode>, List <Position> > toPositionPath = (path) =>
                                                                       path.Select(p =>
            {
                if (p is ConcretePathNode)
                {
                    var concretePathNode = (ConcretePathNode)p;
                    return(concreteMap.Graph.GetNodeInfo(concretePathNode.Id).Position);
                }

                var abstractPathNode = (AbstractPathNode)p;
                return(absTiling.AbstractGraph.GetNodeInfo(abstractPathNode.Id).Position);
            }).ToList();

            //Position startPosition2 = new Position(18, 0);
            //Position endPosition2 = new Position(20, 0);

            var points = Enumerable.Range(0, 2000).Select(_ =>
            {
                var pos1 = ((FakePassability)passability).GetRandomFreePosition();
                var pos2 = ((FakePassability)passability).GetRandomFreePosition();
                while (Math.Abs(pos1.X - pos2.X) + Math.Abs(pos1.Y - pos2.Y) < 10)
                {
                    pos2 = ((FakePassability)passability).GetRandomFreePosition();
                }

                return(Tuple.Create(pos1, pos2));
            }).ToArray();

            var searchStrategies = new[] { doRegularSearch, doHierarchicalSearch };

            foreach (var searchStrategy in searchStrategies)
            {
                var watch = Stopwatch.StartNew();
                for (int i = 0; i < points.Length; i++)
                {
                    Position startPosition2    = points[i].Item1;
                    Position endPosition2      = points[i].Item2;
                    var      regularSearchPath = searchStrategy(startPosition2, endPosition2);
                    var      posPath1          = toPositionPath(regularSearchPath);
                }

                var regularSearchTime = watch.ElapsedMilliseconds;
                Console.WriteLine(regularSearchTime);
            }
        }
Beispiel #2
0
        public static void Main2(string[] args)
        {
            const int clusterSize = 8;
            const int maxLevel    = 2;
            const int height      = 128;
            const int width       = 128;

            Position startPosition = new Position(17, 38);
            Position endPosition   = new Position(16, 18);

            // Prepare the abstract graph beforehand
            IPassability passability        = new FakePassability(width, height);
            var          concreteMap        = ConcreteMapFactory.CreateConcreteMap(width, height, passability);
            var          abstractMapFactory = new HierarchicalMapFactory();
            var          absTiling          = abstractMapFactory.CreateHierarchicalMap(concreteMap, clusterSize, maxLevel, EntranceStyle.EndEntrance);

            var watch             = Stopwatch.StartNew();
            var regularSearchPath = RegularSearch(concreteMap, startPosition, endPosition);
            var regularSearchTime = watch.ElapsedMilliseconds;

            watch = Stopwatch.StartNew();
            var hierarchicalSearchPath = HierarchicalSearch(absTiling, maxLevel, concreteMap, startPosition, endPosition);
            var hierarchicalSearchTime = watch.ElapsedMilliseconds;

            var pospath = hierarchicalSearchPath.Select(p =>
            {
                if (p is ConcretePathNode)
                {
                    var concretePathNode = (ConcretePathNode)p;
                    return(concreteMap.Graph.GetNodeInfo(concretePathNode.Id).Position);
                }

                var abstractPathNode = (AbstractPathNode)p;
                return(absTiling.AbstractGraph.GetNodeInfo(abstractPathNode.Id).Position);
            }).ToList();

#if !DEBUG
            Console.WriteLine("Regular search: " + regularSearchTime + " ms");
            Console.WriteLine("Number of nodes: " + regularSearchPath.Count);

            Console.WriteLine("Hierachical search: " + hierarchicalSearchTime + " ms");
            Console.WriteLine("Number of nodes: " + hierarchicalSearchPath.Count);
#endif

#if DEBUG
            //Console.WriteLine("Regular search: " + regularSearchTime + " ms");
            //Console.WriteLine($"{regularSearchPath.Count} path nodes");
            //PrintFormatted(concreteMap, absTiling, clusterSize, regularSearchPath);
            //Console.WriteLine();
            //Console.WriteLine();
            //Console.WriteLine();
            Console.WriteLine("Hierachical search: " + hierarchicalSearchTime + " ms");
            Console.WriteLine($"{hierarchicalSearchPath.Count} path nodes");
            PrintFormatted(concreteMap, absTiling, clusterSize, pospath);
            Console.WriteLine();
            Console.WriteLine();
            Console.WriteLine();

            Console.WriteLine("Press any key to quit...");
            Console.ReadKey();
#endif
        }
		public static void Main(string[] args)
        {
            // Prepare the abstract graph beforehand
			IPassability passability = new FakePassability(Width, Height);
            var tiling = TilingFactory.CreateTiling(Width, Height, passability);
            var wizard = new AbstractMapFactory();
			wizard.CreateHierarchicalMap(tiling, ClusterSize, MaxLevel, EntranceStyle.END_ENTRANCE);
			var absTiling = wizard.HierarchicalMap;
			var sw = Stopwatch.StartNew();
            var path1 = RegularSearch(tiling);
	        var elapsed = sw.ElapsedMilliseconds;
			

			Console.WriteLine("Regular search: " + elapsed + " ms");
			Console.WriteLine($"{path1.Count} path nodes");
			PrintFormatted(tiling, absTiling, ClusterSize, path1);

			Console.WriteLine();
            Console.WriteLine();
            Console.WriteLine();
			
			sw = Stopwatch.StartNew();
            var path2 = HierarchicalSearch(absTiling, MaxLevel, tiling);
	        elapsed = sw.ElapsedMilliseconds;
			Console.WriteLine("Hierachical search: " + elapsed + " ms");
			Console.WriteLine($"{path2.Count} path nodes");
			PrintFormatted(tiling, absTiling, ClusterSize, path2);

            Console.WriteLine();
            Console.WriteLine();
            Console.WriteLine();
            Console.WriteLine("Press any key to quit...");
            Console.ReadKey();
        }