shortest_simple_paths#

shortest_simple_paths(G, source, target, weight=None)[source]#

生成图 G 中从源到目标的所有简单路径,从最短路径开始。

简单路径是指没有重复节点的路径。

如果要使用加权最短路径搜索,则不允许有负权重。

Parameters:
GNetworkX 图
source节点

路径的起始节点

target节点

路径的结束节点

weight字符串或函数

如果是字符串,则是用作边权重的边属性的名称。

如果是函数,边的权重是函数返回的值。该函数必须接受三个位置参数:边的两个端点和该边的边属性字典。函数必须返回一个数字。

如果为 None,则所有边都被视为具有单位权重。默认值为 None。

Returns:
path_generator: 生成器

一个生成器,按从最短到最长的顺序生成简单路径列表。

Raises:
NetworkXNoPath

如果源和目标之间不存在路径。

NetworkXError

如果输入图中不包含源节点或目标节点。

NetworkXNotImplemented

如果输入图是 Multi[Di]Graph。

See also

all_shortest_paths
shortest_path
all_simple_paths

Notes

此过程基于 Jin Y. Yen 的算法 [1]。找到前 \(K\) 条路径需要 \(O(KN^3)\) 次操作。

References

[1]

Jin Y. Yen, “Finding the K Shortest Loopless Paths in a Network”, Management Science, Vol. 17, No. 11, Theory Series (Jul., 1971), pp. 712-716.

Examples

>>> G = nx.cycle_graph(7)
>>> paths = list(nx.shortest_simple_paths(G, 0, 3))
>>> print(paths)
[[0, 1, 2, 3], [0, 6, 5, 4, 3]]

您可以使用此函数高效地计算两个节点之间的 k 条最短/最佳路径。

>>> from itertools import islice
>>> def k_shortest_paths(G, source, target, k, weight=None):
...     return list(
...         islice(nx.shortest_simple_paths(G, source, target, weight=weight), k)
...     )
>>> for path in k_shortest_paths(G, 0, 3, 2):
...     print(path)
[0, 1, 2, 3]
[0, 6, 5, 4, 3]