Dijkstra找不到正确的路径

时间:2016-03-25 15:48:00

标签: c# algorithm dijkstra

我已经实现了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 <0。 w&lt; 1。

编辑2:如果有人看到这个并且犯了与我相同的错误:我只是意识到我是按顺序排序邻居的重量而不是减少,这就是为什么我的路径不正确。我改为:

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

并且算法按预期工作。

1 个答案:

答案 0 :(得分:2)

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

将其转换为查找可能的最大路径,但即使您可以修改算法也可以正常工作,只要您可以执行上述操作,这项工作就无济于事。