我有一个180x180的邻接矩阵,我试图生成所有可能的组合以使用NetworkX进行工作。
我要顺序删除图的各个部分,然后确定对新编辑图的全局效率的影响。
在此视图中,一组可能的组合是彼此相邻的所有节点集,以及从假定子图彼此相邻直到子图的所有可能的子图组合。
运行所有组合的蛮力方法太慢,对于超过15个的任何删除序列,其运行时间约为21小时。因此,我们仅通过查看彼此相邻的组合来解决此问题。
基本上,代码需要执行以下操作:
这是基本问题
假设大脑某个区域的物理空间包括几个大致像这样的区域...假设这些是装饰平面的不规则多边形
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图,我们在该图上运行效率指标。... .i只需要一种方法来确定所有可能的毗连组件集,这样我们就不会运行在解剖上不可行的组合
我想解决这个问题的方法是在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
提前感谢...这是您正在帮助解决的一个重要问题,它将挽救生命
答案 0 :(得分:1)
已连接的组件的正确命名为complete subgraph(不要混淆真实的connected components)。您的问题称为clique problem。 index
有几种解决此问题的算法:
networkx cliques
此功能可以解决您的问题:networkx.algorithms.clique.enumerate_all_cliques
请注意,此函数会返回所有可能的派系,长度也为1和2(即每个节点和每个边),因此您应该过滤1-2个长度派系。例如,对于您的图形,此函数返回:
networkx
但是如果我们过滤所有无用的派系,我们将得到:
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]]