我试图在覆盖所有边缘的图形上获取路径,并且只遍历它们一次。 这意味着只有两个"结束"点 - 将具有奇数个附加节点。这些端点要么具有一个连接边,要么是环的一部分并且具有3个连接。
所以在下面的简单情况下,我需要按照1-2-3-4-5(或5-4-3-2-1)的顺序遍历节点:
在下面更复杂的情况下,路径将是1-2-3-4-2(或1-2-4-3-2):
下面也是一个有效图表,有2个终点:1-2-4-3-2-5
我试图找到解决此问题的算法名称,并认为这是“中国邮递员问题”,但是根据https://github.com/rkistner/chinese-postman/blob/master/postman.py上的代码执行此操作并没有&# 39; t提供我预期的结果。
Eulerian路径看起来几乎是需要的,但networkx implementation只适用于封闭(循环)网络。
我还查看了Hamiltonian Path - 并尝试了networkx algorithm - 但不支持图表类型。
理想情况下,我希望使用Python和networkx来实现这一点,并且可能有一个简单的解决方案已经是库的一部分,但我似乎无法找到它。
答案 0 :(得分:3)
您正在寻找只访问每个边缘的Eulerian Path。您可以使用Fleury's algorithm生成路径。 Fleury的算法具有 O(E ^ 2)时间复杂度,如果您需要更高效的算法检查Hierholzer's algorithm而不是 O(E)。
对于实现此目的的networkx库,还有一个未合并的拉取请求:https://github.com/networkx/networkx/pull/1878
来源易于使用 - https://raw.githubusercontent.com/humberto-ortiz/networkx/eulerpath/networkx/algorithms/euler.py
对于networkx 1.11,.edge_iter
必须替换为KiteConnect = require('kiteconnect').KiteConnect;
答案 1 :(得分:0)
这被称为图的 Eulerian Path。它现在已作为 eulerian_path()
添加到 NetworkX。