/// <summary> /// Metodo de busca do menor caminho. /// </summary> /// <param name="startNode">Node de ida</param> /// <param name="target">Ponto de chegada</param> /// <param name="path">Pontos de Caminhos</param> /// <param name="minDistance">Distancia minima achada</param> public void PathFinder(Node startNode, string target, PathGraph path, ref int minDistance) { // Para cada vizinho de um ponto de ida foreach (var neighbor in startNode.neighborList) { //Calcule soma da distancia atual ate ao vizinho int DistanceToCompare = path.TotalDistance + neighbor.Distance; // Se a soma e' maior do que distancia menor despreza o caminho. if (DistanceToCompare >= minDistance) { continue; } // Se ja passou pelo este vizinho, despreza o caminho. if (path.Nodes.Split(',').Contains(neighbor.Name)) { continue; } /* Se este vizinho e' o ponto de chegada final, * guarda o valor da distancia */ if (neighbor.Name.Equals(target)) { minDistance = DistanceToCompare; continue; } Node neighborNode = new Node(); neighborNode.GetNodeByName(neighbor.Name); /* Se o vizinho e' uma folha ("A" ou "F") * Checa se nao e' o ponto de chegada final, despreza o caminho. */ if (neighborNode.IsLeaf) { if (!neighborNode.Name.Equals(target)) { continue; } } /* Continue a busca */ PathGraph newPath = new PathGraph(path.Nodes, path.TotalDistance); newPath.TotalDistance += neighbor.Distance; newPath.Nodes += "," + neighbor.Name; PathFinder(neighborNode, target, newPath, ref minDistance); } }
/// <summary> /// Esse metodo calculo a distancia /// do caminho minimo. /// </summary> /// <param name="start"> Ponto de ida</param> /// <param name="target">Ponto de chegada</param> /// <returns>Menor distancia</returns> public int MinimumDistance(string start, string target) { if (start == target) { return(0); } Node StartNode = new Node(); StartNode.GetNodeByName(start); PathGraph path = new PathGraph(start); int minDistance = Int32.MaxValue; PathFinder(StartNode, target, path, ref minDistance); return(minDistance); }