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

问题描述

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

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

如果您能告诉我 networkx 中是否存在可以完成工作的内容,或者告诉我实现此类例程的最有效方法,那就太好了。

解决方法

我想确定单独的子图

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

这是算法的伪代码

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

中的代码

在每个子图中找到最接近一个节点的节点 最大的子图

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

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

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