我有一个180x180的邻接矩阵,我试图生成所有可能的组合以使用NetworkX进行工作。

我想顺序删除图表的各个部分,然后确定对新编辑的图表的整体效率的影响。

在此视图中,一组可能的组合是彼此相邻的所有节点集,以及从假定子图彼此连续直到子图的所有子图可能组合。

运行所有组合的蛮力方法太慢,对于超过15个的任何删除序列,其运行时间约为21小时。因此,我们仅通过查看彼此相邻的组合来解决此问题。

基本上,代码需要执行以下操作:


导入包含二进制邻接矩阵的csv,其中1表示物理连续性(在本例中为大脑)
导入到networkx图形
确定距离最长为1的所有组合集....换句话说,如果两个节点或两个节点集的两端相距大于1,则它们将被忽略
为每个可能的组合生成这些节点集的列表


这是基本问题

假设大脑区域的物理空间包括几个大致像这样坐着的区域...假设这些是装饰平面的不规则多边形

1 2 3 4 5

6 7 8 9

10 11

我们可以将其设为邻接矩阵,其中1表示区域共享边界,0表示区域在物理上没有边界

+--+---------------------------------+
|  | 1  2  3  4  5  6  7  8  9  10 11|
+--+---------------------------------+
|1 | 0  1  0  0  0  1  0  0  0  0  0 |
|2 | 1  0  1  0  0  0  1  1  0  0  0 |
|3 | 0  1  0  1  0  0  0  1  1  0  0 |
|4 | 0  0  1  0  1  0  0  0  1  0  0 |
|5 | 0  0  0  1  0  0  0  0  1  0  0 |
|6 | 1  0  0  0  0  0  1  0  0  1  0 |
|7 | 0  1  0  0  0  1  0  1  0  1  1 |
|8 | 0  1  1  0  0  0  1  0  1  0  1 |
|9 | 0  0  1  1  0  0  0  1  0  0  0 |
|10| 0  0  0  0  0  1  1  0  0  0  1 |
|11| 0  0  0  0  0  0  1  1  0  1  0 |
+--+---------------------------------+


基本上,邻接矩阵代表大脑的彼此相邻的部分……我们要仔细研究并生成这些节点的分组列表,这些列表以单个节点开始,并随着与请注意,我们不希望这些组合彼此不物理接触.....

例如,这样的列表将有1,2,.... 11
还有1 + 2和7 + 8等
最终我们将拥有2 + 7 + 8和6 + 7 + 8 + 10,因为所有这些节点相互接触并形成一个连接的组件
因为他们不共享边界​​,所以不允许1-11,因为他们不触摸边界,所以不允许4 + 5 + 10

之所以如此重要,是因为我们是脑外科医师,并且为了生存而删除了部分图...即脑图....但是您永远都不会删除彼此不相邻的节点...我们正在尝试使用图形定义我们可以进行的手术....因此我们需要使用python生成在现实世界中有意义的节点删除的所有可能组合...二进制邻接矩阵表示物理空间中的现实

一旦我有了一个节点删除的合理组合列表,我就有了采用不同熊猫数据帧的代码....将节点和边缘清零,然后创建一个networkx图,我们在该图上运行效率指标.....我只是需要一种方法来确定所有可能的毗连组件集,以便我们不会在解剖上令人难以置信的组合

我考虑解决此问题的方式是在networkx中使用某种连续的组件功能,但是无论如何我都无法从图中导出连接的组件的所有可能组合

本质上,代码会像这样

boundary=pd.read_csv(adjacency.csv)
G=networkx.from_pandas_adjacency(boundary)
combo="something to iterate the graph g to create a list of all connected components"


for row in combo:
        values = row
        datasafe=pandas.read_csv("connections.csv", index_col=0)
        datasafe.loc[values, :] = 0

        datasafe[values] = 0

        g=networkx.from_pandas_adjacency(datasafe)
        h=networkx.from_pandas_adjacency(datasafe)
        le=local_efficiency(g)
        LE_list.append(le)
        ge=global_efficiency(h)
        GE_list.append(ge)
output=pandas.DataFrame(list(zip(combo, GE_list,LE_list)))
output.to_csv('multi.csv',index=None)


请注意,我们使用一个csv来确定列表,并在不同的CSV上使用该列表

在此先感谢...这是您正在解决的重要问题,它将挽救生命

最佳答案

您连接的组件的正确命名为complete subgraph(不要与真正的connected components混为一谈)。您的问题称为clique problemnetworkx有几种算法可以解决此问题:
networkx cliques

您的问题可以通过以下功能解决:networkx.algorithms.clique.enumerate_all_cliques

请注意,此函数会返回所有可能的派系,并且长度也为1和2(即每个节点和每个边),因此您应该过滤1-2个长度的派系。例如,对于您的图形,此函数返回:

list(nx.enumerate_all_cliques(G))

[[0],
 [1],
 [2],
 [3],
 [4],
 [5],
 [6],
 [7],
 [8],
 [9],
 [10],
 [0, 1],
 [0, 5],
 [1, 2],
 [1, 6],
 [1, 7],
 [2, 3],
 [2, 7],
 [2, 8],
 [3, 4],
 [3, 8],
 [4, 8],
 [5, 6],
 [5, 9],
 [6, 7],
 [6, 9],
 [6, 10],
 [7, 8],
 [7, 10],
 [9, 10],
 [1, 2, 7],
 [1, 6, 7],
 [2, 3, 8],
 [2, 7, 8],
 [3, 4, 8],
 [5, 6, 9],
 [6, 7, 10],
 [6, 9, 10]]


但是如果我们过滤掉所有无用的派系,我们将得到:

list(filter(lambda x: len(x) > 2, nx.enumerate_all_cliques(G)))

[[1, 2, 7],
 [1, 6, 7],
 [2, 3, 8],
 [2, 7, 8],
 [3, 4, 8],
 [5, 6, 9],
 [6, 7, 10],
 [6, 9, 10]]

10-08 08:13
查看更多