Exemplo n.º 1
0
        public void TestFindShortestPath1()
        {
            Graph             graph             = DataGenerator.GenerateTestCityGraph();
            DijkstraAlgorithm dijkstraAlgorithm = new DijkstraAlgorithm(graph);

            Vertex   startVertex = graph.Vertices[0]; // 10;0
            Vertex   endVertex   = graph.Vertices[8]; // 0;0
            PathInfo pathInfo    = dijkstraAlgorithm.FindShortestPath(startVertex, endVertex);

            Assert.AreEqual(5, pathInfo.Path.Length);
            Assert.AreEqual(10, pathInfo.TotalLength);

            startVertex = graph.Vertices[1]; // 10;10
            endVertex   = graph.Vertices[2]; // 10;11
            pathInfo    = dijkstraAlgorithm.FindShortestPath(startVertex, endVertex);
            Assert.AreEqual(2, pathInfo.Path.Length);
            Assert.AreEqual(1, pathInfo.TotalLength);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Осуществляет поиск кратчайшего пути до необходимого типа постройки в «городе».
        /// Если построек такого типа несколько, то возвращает путь только до той, который оказался самым кратчайшим.
        /// Если не удалось найти, то возвращает пустой путь.
        /// </summary>
        /// <param name="graph">Граф, соответствующий городу, в котором будем искать путь.</param>
        /// <param name="startPoint">Стартовая точка, из которой ищем путь.</param>
        /// <param name="institutionType">Тип постройки, к которой ищем путь.</param>
        /// <returns>Объект с информацией о найденном или не найденном пути.</returns>
        public static PathInfo FindPathTo(Graph graph, Vertex startPoint, InstitutionType institutionType)
        {
            PathInfo shortestPath       = PathInfo.CreateEmptyPath();
            float    shortestPathLength = float.MaxValue;

            /**
             * Для нахождения вершин в графе, которые соответствуют нужной нам постройке,
             * осуществляется проход по всем вершинам, и ищется объект нужного нам типа.
             * Далее вызывается алгоритм Дейкстры до найденной вершины. Так повторяется до тех пор, пока
             * не пройдемся по всем нужным нам вершинам. Далее среди всех найденных путей ищется тот, который
             * является наикратчайшим.
             */

            foreach (Vertex vertex in graph.Vertices)
            {
                // Стартовая точка не может оказаться конечной.
                if (vertex == startPoint)
                {
                    continue;
                }

                Institution institution = vertex.Tag as Institution;
                if (institution != null && institution.GetInstitutionType() == institutionType)
                {
                    DijkstraAlgorithm dijkstraAlgorithm = new DijkstraAlgorithm(graph);
                    PathInfo          pathInfo          = dijkstraAlgorithm.FindShortestPath(startPoint, vertex);

                    if (pathInfo.IsEmptyPath())
                    {
                        continue;
                    }
                    if (pathInfo.TotalLength > shortestPathLength)
                    {
                        continue;
                    }

                    // На слишком малых расстояниях между узлами, может быть проблема, что дистанция одинаковая.
                    // Поэтому в таких случаях берем элемент с наименьшим числом узлов.
                    if (pathInfo.TotalLength == shortestPathLength)
                    {
                        if (pathInfo.Path.Length < shortestPath.Path.Length)
                        {
                            shortestPath       = pathInfo;
                            shortestPathLength = pathInfo.TotalLength;
                        }
                    }
                    else
                    {
                        shortestPath       = pathInfo;
                        shortestPathLength = pathInfo.TotalLength;
                    }
                }
            }

            return(shortestPath);
        }
        public void ShoertPathWithoutPath()
        {
            var dijkstraAlgorithmt = new DijkstraAlgorithm();
            var path = dijkstraAlgorithmt.FindShortestPath(cityLS, cityNF, GetNeighboardhood(routes));


            Assert.Null(path.Distance);
            List <CityEntity> nodeVisitExpected = new List <CityEntity>();

            Assert.Equal(nodeVisitExpected, path.NodeVisit);
        }
        public void ShoertPathWStoBC()
        {
            var dijkstraAlgorithmt = new DijkstraAlgorithm();
            var path = dijkstraAlgorithmt.FindShortestPath(cityWS, cityBC, GetNeighboardhood(routes));


            Assert.Equal(5, path.Distance);
            List <CityEntity> nodeVisitExpected = new List <CityEntity> {
                cityWS, citySF, cityLV, cityBC
            };

            Assert.Equal(nodeVisitExpected, path.NodeVisit);
        }