【发布时间】: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,对吗?