我编写了一个脚本来在python中使用networkx构建有向图,我希望从头到尾获得所有可能的路径,包括循环。 例如,有一个有向图:
我想获得这些路径:
A-> B-> d
A-> B-> C-> d
A-> B-> C-> B-> d
A-> B-> C-> B-> C-> B-> d
...
据我所知,有很多算法可以找到2个节点之间没有循环的最短路径或路径,但我想找到带循环的路径。
有没有算法来实现这个目标?
很多
答案 0 :(得分:0)
如上所述,存在无限数量的此类路径。
但是,您仍然可以通过维护v
中可以从v
的起始节点到达的所有节点k
(以及您曾经达到k=1,2,...
的路径)来以懒惰的方式生成所有节点} v
的步骤;如果n-1
是您的目标节点,请记住它。
当您必须返回下一条路径时,(i)弹出第一个目标节点离开列表,以及(ii)为列表中的所有非目标节点生成下一个候选节点。如果列表中没有目标节点,请重复(ii)直到找到一个。
假设路径始终存在,该方法可以正常工作。如果您在n
步骤中找不到路径,其中class Node {
int steps
Node prev
Node(int steps=0, Node prev=null) {
prev = prev
steps = steps
}
}
class PathGenerator {
Queue<Node> nodes
Node start, target;
PathGenerator(Node start, Node target) {
start = start
target = target
nodes = new Queue<>()
nodes.add(start) // assume start.steps=0 and stat.prev=null
}
Node nextPath(int n) {
current_length = -1;
do {
node = nodes.poll()
current_length = node.steps
// expand to all others you can reach from node
for each u in node.neighbors()
list.add(new Node(node, node.steps+1))
// if node is the target, return the path
if (node == target)
return node
} while (current_length < n);
throw new Exception("no path of length <=n exists");
}
}
是节点数,则只需报告不存在路径。
这里是一个算法的伪代码,它生成从最短到最长的路径假设单位权重:
nodes
请注意,在最坏的情况下,列表%temp%
会呈指数级增长(想想如果您在完整的图表上运行会发生什么)。