【问题标题】:Dijkstra not finding correct pathDijkstra 没有找到正确的路径
【发布时间】:2016-07-13 09:38:22
【问题描述】:

我已经实现了 Dijkstra 算法以在无向加权图中找到最大权重路径。不幸的是,它不会在所有情况下都返回最佳路径。任何帮助都可以弄清楚我做错了什么。我盯着这段代码太久了。

        graph.AddConnection("A", "B", .5);
        graph.AddConnection("A", "J", .2);
        graph.AddConnection("A", "F", .63);
        graph.AddConnection("A", "Z", .92);
        graph.AddConnection("B", "C", .7);
        graph.AddConnection("B", "E", .112);
        graph.AddConnection("C", "D", .1);
        graph.AddConnection("F", "G", .21);
        graph.AddConnection("G", "D", .92);
        graph.AddConnection("J", "G", .56);
        graph.AddConnection("Z", "D", 0.99);

我正在尝试找到从 A 到 G 的最强路径,应该是: AZDG。相反,它正在输出 AFG。

private void ProcessGraph(Graph graph, string startingNode)
{
    bool finished = false;
    var queue = graph.Nodes.Values.ToList();
    while (!finished)
    {
        Node nextNode = queue.OrderBy(n => n.DistanceFromStart).FirstOrDefault(
        n => !double.IsPositiveInfinity(n.DistanceFromStart));
        if (nextNode != null)
        {
            var connections = node.Connections.Where(c => queue.Contains(c.Target));
            foreach (var connection in connections)
            {
              double distance = node.DistanceFromStart + connection.Distance;
              if (distance < connection.Target.DistanceFromStart)
                  connection.Target.DistanceFromStart = distance;
            }
            queue.Remove(nextNode);
        }
        else
        {
            finished = true;
        }
    }
}

编辑:权重限制为 0

编辑 2:如果有人看到这个并犯了和我一样的错误:我刚刚意识到我正在按递增顺序而不是递减顺序排列邻居的权重,这就是我的路径不正确的原因。我改为:

queue.OrderByDescending(n => n.DistanceFromStart).FirstOrDefault(
        n => !double.IsPositiveInfinity(n.DistanceFromStart));

并且算法按预期工作。

【问题讨论】:

  • 你搜索的是最小重量路径,而不是最大重量路径,这就像搜索 GPS 的最长路径
  • 正如 Boo 所说 - Dijkstra 为您提供最小长度路径。如果您想将其调整为最大值,并且您可以在路径中遇到的最大值为 1.0,则必须从 1.0 中减去边缘的权重并将其作为值输入算法。
  • 我的体重限制在 0
  • 似乎您正在尝试解决最长路径问题,这比最短路径问题要难得多,并且是 NP 完全的。 (除非您的图表是 DAG 或类似的东西)。
  • 如果我们限制了路径上的边数并且不允许循环,我们可以使用 Dijkstra,对吗?

标签: c# algorithm dijkstra


【解决方案1】:

只需将您的所有权重 w 更改为 1.0 - w,Dijkstras 即可开箱即用。

将其转换为找到最大路径可能可行,但即使您可以修改算法以使其正常工作,当您可以执行上述操作时,这些努力都是徒劳的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-04
    • 2011-02-18
    • 1970-01-01
    • 2021-02-22
    • 1970-01-01
    相关资源
    最近更新 更多