生成所有可能的无向图

时间:2015-01-13 16:12:18

标签: python matlab matrix graph

使用关联矩阵生成所有可能的图形的有效解决方案是什么? 这些问题相当于生成所有可能的二进制三角矩阵。 我的第一个想法是使用python和itertools。例如,用于生成所有可能的4x4矩阵

for b in itertools.combinations_with_replacement((0,1), n-3):
    b_1=[i for i in b]
    for c in itertools.combinations_with_replacement((0,1), n-2):
        c_1=[i for i in c]
        for d in itertools.combinations_with_replacement((0,1), n-1):
            d_1=[i for i in d]

然后你创建矩阵添加相应的零数。 但这是不正确的,因为我们跳过了一些图表......

那么,有什么想法吗? 也许我可以使用R ^ n矩阵和R ^(n * n)向量之间的同构,并生成0和1的所有可能向量,然后将其切割成我的矩阵,但我认为这是一种更有效的解决方案。 / p>

谢谢

我添加了matlab选项卡,因为这是数值分析和matlab中的问题。

2 个答案:

答案 0 :(得分:1)

以下是使用生成所有简单图形的numpy的示例解决方案: 它首先生成上三角形部分iu的索引。循环将数字k转换为它的二进制表示,然后将其分配给上三角部分G[iu]

import numpy as np

n = 4
iu = np.triu_indices(n,1) # Start at first minor diagonal
G = np.zeros([n,n])

def dec2bin(k, bitlength=0):
    return [1 if digit=='1' else 0 for digit in bin(k)[2:].zfill(bitlength)]

for k in range(0,2**(iu[0].size)):
    G[iu] = dec2bin(k, iu[0].size)
    print(G)

答案 1 :(得分:1)

我假设你想要三角矩阵,对角线不需要为零。如果不是这样的话,可以很容易地修改代码。

n = 4; %// matrix size
vals = dec2bin(0:2^(n*(n+1)/2)-1)-'0'; %// each row of `vals` codes a matrix
mask = tril(reshape(1:n^2, n, n))>0; %// decoding mask
for v = vals.' %'// `for` picks one column each time
    matrix = zeros(n); %// initiallize to zeros
    matrix(mask) = v; %// decode into matrix
    disp(matrix) %// Do something with `matrix`
end

每次迭代都给出了一个可能的矩阵。例如,n=4的第一个矩阵是

matrix =
     0     0     0     0
     0     0     0     0
     0     0     0     0
     0     0     0     0

matrix =
     0     0     0     0
     0     0     0     0
     0     0     0     0
     0     0     0     1

matrix =
     0     0     0     0
     0     0     0     0
     0     0     0     0
     0     0     1     0

matrix =
     0     0     0     0
     0     0     0     0
     0     0     0     0
     0     0     1     1