查找坐标列表是否形成循环

时间:2019-04-06 18:37:41

标签: python list graph-theory path-finding

因此,我有一个通常形成某种圆形形状的点的列表,除了通常很少有来自圆的分支,它们基本上只是从圆的边界沿特定方向行进的线。我想创建一个函数,当给出此坐标/点列表时,该函数将查找在这组点中是否存在完整路径。

我考虑过要创建一个起点,并确定是否存在不重复点的路径(即(1,1)->(2,1)->(1,1)不允许),并且可以回到起点但是,如果起点在圆的分支中,则此方法将无效。

例如,坐标列表

[[0, 0], [0, 1], [1, 2], [2, 3], [3, 3], [3, 4], [4, 4], [3, 2], [3, 1], [3, 0], [2, -1], [1, -1], [0, -1]] 

将形成完整的路径,而如果我取出[1, -1],则不会形成完整的路径。

1 个答案:

答案 0 :(得分:1)

您要寻找的是simple cycle。图论包networkx提供了一种在simple_cycles中查找那些的方法。我们需要做的只是创建图表的一小部分工作:

import networkx as nx

def has_simple_cycle(l, start):
    G = nx.DiGraph()
    G.add_edges_from((v1, v2) for v1 in l for v2 in l if v1 != v2 and max(abs(v1[0] - v2[0]), abs(v1[1] - v2[1])) <= 1)
    return any(start in c and len(c) > 2 for c in nx.simple_cycles(G))

在您给出的示例中:

In [26]: has_simple_cycle(l=[(0, 0), (0, 1), (1, 2), (2, 3), (3, 3), (3, 4), (4, 4), (3, 2), (3, 1), (3, 0), (2, -1), (1, -1), (0, -1)], start=(0, 0))
Out[26]: True

In [27]: has_simple_cycle(l=[(0, 0), (0, 1), (1, 2), (2, 3), (3, 3), (3, 4), (4, 4), (3, 2), (3, 1), (3, 0), (2, -1), (0, -1)], start=(0, 0))
Out[27]: False