问题描述
当我在 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 )