在r(i.graph)中创建一个受限制的关联矩阵

时间:2015-08-19 20:49:40

标签: r algorithm graph igraph bipartite

我想为二分图(N = M = 200)创建一个(N * M) - 置信矩阵。 但是,必须考虑以下限制:

  • 每列i(1,...,200)的列总和为g = 10
  • 每行的行总和为h = 10
  • 无多边(发生率矩阵中的值仅取值[0:1]

到目前为止我已经

(31*100+2*10)/(31+2)

有人有解决方案吗?

1 个答案:

答案 0 :(得分:0)

这是实现你想要的一种方式。首先是算法的想法,然后是R中的实现。

两步算法理念

你想要一个0和1的矩阵,每行加起来为10,每列加起来为10。

第1步:首先,创建一个简单的解决方案,如下所示: 对于前10个元素,前10行有1个,然后是190个零。 第二组十行从第11个元素到第20个元素依次为1,依此类推。 换句话说,一个可行的解决方案是拥有一个所有0的200x200矩阵,其中10x10 1的密集矩阵对角嵌入,20次。

第2步:随机播放整行和整列。 在此shuffle中,将保留rowSum和columnSums。

在R

中实施

我使用较小的16x16矩阵来演示。在这种情况下,让我们说我们希望每行和每列加起来为4.(此colsum必须是整数可以被大整数矩阵维整除。)

n <- 4 #size of the smaller square
i <- c(1,1,1,1) #dense matrix of 1's
z <- c(0,0,0,0) #dense matrix of 0's

#create a feasible solution to start with:
m <- matrix(c(rep(c(i,z,z,z),n),
         rep(c(z,i,z,z),n),
         rep(c(z,z,i,z),n),
         rep(c(z,z,z,i),n)), 16,16)

#shuffle (Run the two lines following as many times as you like)
m <- m[sample(16), ] #shuffle rows
m <- m[ ,sample(16)] #shuffle columns

#verify that the sum conditions are not violated
colSums(m); rowSums(m)

#solution
print(m)

希望能帮助您推进二分图。