C# Dijkstra找不到正确的路径
我已经实现了Dijkstra算法来寻找无向加权图中的最大权路径。不幸的是,它并不是在所有情况下都返回最佳路径。如果能帮我弄清楚我做错了什么,我将不胜感激。我盯着这个代码看太久了C# Dijkstra找不到正确的路径,c#,algorithm,dijkstra,C#,Algorithm,Dijkstra,我已经实现了Dijkstra算法来寻找无向加权图中的最大权路径。不幸的是,它并不是在所有情况下都返回最佳路径。如果能帮我弄清楚我做错了什么,我将不胜感激。我盯着这个代码看太久了 graph.AddConnection("A", "B", .5); graph.AddConnection("A", "J", .2); graph.AddConnection("A", "F", .63); graph.AddConnection("A"
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;
}
}
}
该算法正在按预期工作。只要将所有权重
w
更改为1.0-w
,Dijkstras就会立即工作
将其转换为最大路径可能会起作用,但即使您可以修改算法以使其起作用,如果您只需执行上述操作,所做的努力也将付之东流。只需将所有权重
w
更改为1.0-w
,Dijkstras将立即生效
将其转换为最大路径可能会起作用,但即使您可以修改算法以使其起作用,如果您只需执行上述操作,那么所做的努力也是徒劳的。您搜索的是最小权重路径,而不是最大权重路径,这就像搜索gpsas Boo said的最长路径一样-Dijkstra为您提供了最小长度路径。如果你想将其调整为最大值,并且你在路径中可能遇到的最大值为1.0,你必须从1.0中减去边的权重,并将其作为值输入到算法中。我的权重限制为0
queue.OrderByDescending(n => n.DistanceFromStart).FirstOrDefault(
n => !double.IsPositiveInfinity(n.DistanceFromStart));