【发布时间】:2015-10-19 20:04:05
【问题描述】:
假设我有一个非循环的有向图G 和节点a0, a1, a2, b0, b1, b2, c0, c1, c2,并且我知道每个节点到它的任何邻居的传出距离。我可以使用什么算法来找到任意两个节点之间小于给定长度的最长路径?
编辑:我查看了 Wikipedia page 的最长路径问题,但我不知道是使用“非循环图和关键路径”部分中概述的算法还是“参数化复杂性”部分中的算法.无论哪种情况,我都会遇到问题。在前者中,算法要求你有传入距离(我有传出距离),老实说,后者中的描述在实现方面超出了我的想象。
EDIT2:我完成的图表如下
graph = {
"a0": set(["a1", "b0])
"a1": set(["a2", "b1"])
"a2": set(["b2"])
"b0": set(["b1", "c0"])
"b1": set(["b2", "c1"])
"b2": set(["c2"])
"c0": set(["c1"])
"c1": set(["c2"])
"c2": set([])
}
我在单独的字典中也有传出距离,例如
edge_distance = {
"a0": 0
"a1": 4
"a2": 12
"b0": 2
"b1": 1
"b2": 4
"c0": 7
"c1": 2
"c2": 1
}
从技术上讲,我拥有传入距离的唯一节点是 c2
我要查找的路径是a0到c2
EDIT3:我的图表,拓扑排序:
c2 b2 c1 a2 b1 c0 a1 b0 a0
【问题讨论】:
-
DAG 有多大?即使在较大的 DAG 上强制执行此操作也不应该太糟糕。
-
您听说过 A* 搜索吗?这是一个修改了停止条件的 A Star Search 问题。与其停在第一个解决方案上,不如在失败前停在最后一个解决方案上。
-
我认为这已经足够接近你的问题了,几乎不需要额外的代码:stackoverflow.com/questions/17985202/… 关注 Aric 的帖子
-
维基百科说它的 NP 难。这意味着它很难。看起来有必要枚举所有不同节点对之间的所有路径,并尽早丢弃超过给定长度的那些。枚举 DAG 中两个节点之间的所有路径的算法是什么?在其他帖子中有一些关于此的信息,例如stackoverflow.com/questions/9535819/…
-
不,如果它是一个 DAG,它就不是 NP 难的。
标签: python dynamic graph dynamic-programming