如何在 networkx 中找到几何子图的最近邻居?

How to find nearest neighbours of geometric subgraphs in networkx?

当我在 python 中使用 NetworkX 生成随机几何图形时,生成的图形并不总是连接的。要更改此 属性 我想确定单独的子图并在每个子图中找到最接近最大子图中节点的两个节点以连接它们。 最好我还希望能够确定第二个最近的和第三个等等。

networkx 中是否有可以执行此操作的实用程序。如果不是,你知道解决这个问题的最有效的数学方法吗? (也许随机 select 每个图中的两个点,然后执行 k-d 树算法 - 问题仍然是至少对于较小的子图我需要对所有节点执行算法?!?!)

如果你能告诉我 networkx 中是否存在可以完成工作的东西,或者告诉我实现这种例程的最有效方法,那就太好了。

I would like to determine the separate subgraphs

这是在图中寻找最大派系的问题。这是一组顶点,彼此都可以到达,但不能从集合外的任何顶点到达。

这是算法的伪代码

LOOP
    CONSTRUCT empty current set
    SELECT V arbitrary vertex
    add V to current set
    remove V from graph
    LOOP      // while set is growing
        added_to_set = false
        LOOP V over vertices in graph
            LOOP Vset over current set
                IF Vset connected to V
                     add V to current set
                     remove V from graph
                     added_to_set = true
                     break;
        IF added_to_set == false
           break;    // the set is maximal
    ADD current set to list of sets
    IF graph has no remaining vertices
       OUTPUT sets found
       STOP

有关此代码的 C++ 实现,请参阅 https://github.com/JamesBremner/PathFinder2/blob/dbd6ff06edabd6a6d35d5eb10ed7972dc2d779a6/src/cPathFinder.cpp#L483

处的代码

find the node in each respective subgraph that is closest to a node in the largest subgraph

可能最好也是最简单的方法是计算子图中每对节点之间的距离,保留最接近的一对。

如果您对近似答案感到满意并且子图不重叠,那么您可以

calculate center of gravity of largest subgraph
compare distances of subgraph nodes to center of gravity ( instead of with every node in largest subgraph )