我已经实现了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));
并且算法按预期工作。
答案 0 :(得分:2)
只需将所有权重w
更改为1.0 - w
,Dijkstras即可开箱即用。
将其转换为查找可能的最大路径,但即使您可以修改算法也可以正常工作,只要您可以执行上述操作,这项工作就无济于事。