图 - 无法找到到节点的最小路由

时间:2014-10-14 19:15:14

标签: c# graph graph-traversal

我想找到节点成本最低的路线。 它找到了几条路线,但没有最低成本的路线。

我的类存储有关节点的信息:

public class Graph
{
    //public int[][] childNodes;
    //public Graph(int[][] nodes)
    //{
    //    this.childNodes = nodes;
    //}

    public List<Node> nodes = new List<Node>();
}

public class Node
{
    public Node(int node)
    {
        this.node = node;
    }

    public int node { get; set; }
    public List<Tuple<int,int>> endNodes = new List<Tuple<int,int>>();
}

public class Routes
{
    public int depth { get; set; }
    public int cost { get; set; }
    public List<string> nodes = new List<string>();
}

在元组中我有int,int - 第一个int是结束节点,第二个int是到这个节点的路由成本

遍历图的类:

public List<string> visited = new List<string>();
public List<Routes> routes = new List<Routes>();





   public void dfs2(Node node, List<Routes> routes, Routes route, int depth)
        {
            depth++;
            foreach (Tuple<int,int> childNode in g.nodes[node.node].endNodes)
            {
                string path = string.Format("{0}{1}", node.node, childNode.Item1);
                string pathReverse = string.Format("{0}{1}", childNode.Item1, node.node);
               // if (!visited.Contains(path)) // && !visited.Contains(pathReverse))
                if(!route.nodes.Contains(path)) // && !route.nodes.Contains(pathReverse))
                {
                    visited.Add(path);
                    if (childNode.Item1 == 6)
                    {
                        Routes newRoutes = new Routes();
                        newRoutes.depth = depth;
                        newRoutes.cost = route.cost + childNode.Item2;
                        newRoutes.nodes.AddRange(route.nodes);
                        newRoutes.nodes.Add(path);
                        routes.Add(newRoutes);
                    }
                    else
                    {
                        route.depth = depth;
                        route.cost += childNode.Item2; // 2;//childNode.
                        route.nodes.Add(path);

                        dfs2(g.nodes[childNode.Item1], routes, route, depth);
                    }
                    Debug.WriteLine("przeszedłem: " + path);

                }
            }
        }

在我的例子中,我想找到节点6的最低成本路线

1 个答案:

答案 0 :(得分:0)

如果没有简洁但完整的代码示例,很难提供一个好的答案。在你的问题中,我甚至没有看到任何可用的图形数据示例,更不用说清楚地描述会发生什么以及你想要发生什么。

那就是说,你可能有兴趣研究一种经典的寻路算法及其亲属: http://en.wikipedia.org/wiki/A*_search_algorithm

该算法的基本思想是,对于图中的每个边,您需要一个成本值,并且对于每个节点,您需要一种方法来估计目标的剩余成本。请注意,“剩余成本”估计可以设置为0,这将导致所有路径的呼吸优先搜索...缓慢,但它仍然会产生正确的结果(假设您的图形足够小,算法可以完成有用的时间)。如果您的数据有助于计算良好的估计值,那就更好了。

该算法通过跟踪当前节点的成本,并选择相邻节点来工作,其中当前成本加上相邻节点的成本加上从该节点到目的地的估计成本被最小化。按总成本(该节点的成本加估计成本)的节点排序列表被维护,以便在每次迭代时,总是可以选择成本最低的节点。如果当前路径加估计变得比某些其他受访节点的路径加估计更昂贵,则该算法有效地回溯到该较便宜的节点并从那里继续。

基本上,它正在探索图表,根据对剩余距离的有根据的猜测,追求看起来成本最低的路径。算法的性能取决于您实施“有根据的猜测”的程度。