对于循环编号路径计算

时间:2017-05-19 14:13:15

标签: r algorithm loops search matrix

我有双向网络,即从i-> j和j-> i存在流量的网络。我想根据路径长度计算每个[i,j]和矩阵报告之间的简单路径数,也就是说,对于每个[i,j]对,有一定数量的长度为2,3的简单路径,4等,我想计算一下,并将结果报告在: i j 之间长度为2的简单路径数的报告矩阵; i j 等之间长度为3的简单路径数量的报告矩阵....

我找到的解决方案是创建一个代码,该代码将查看原始输入矩阵,并通过查看从 i-&gt; n 中搜索长度 x 的路径 i 与其他变量的连接,然后用其他变量排除 i ,依此类推x + 1变量,直到我们得到 x-&gt ; N 。例如。对于长度,两条路径将查找i-&gt; x连接和任何x-&gt; n连接。如果这是真的那么 i n 之间有两条简单的路径。如果方法是这样的,当分析具有自循环的双向矩阵或矩阵时,代码将计算自循环具有简单路径,并且通过相同顶点不止一次传递。要解决此问题,在代码中设置的条件中需要验证另一个参数。此参数是对原始矩阵的变量赋值给我们的一般变量的限制,也就是说,在为路径搜索分配新的常规变量时,分配的变量不能是已在该路径中分配的变量另一个常规变量:     *当在 i n 之间寻找长度为2的路径时,要分配给 x 的变量不能是已经分配给<的那个< em> i (这消除了自循环作为路径计数),并且以同样的方式 n 无法分配已由 i 或 x (这消除了i-> x-> i的情况的报告,i具有长度为2的路径,并且还消除了由同一变量传递多于一次的路径的报告[i- &gt; x-> x2-> i,用于3个长度路径,例如])。所以我使用的代码基本上是这样的:

#the adjacency matrix
> MM<-matrix(c(1,1,0,0,0,1,1,1,1,0,0,1,1,1,0,0,1,0,1,1,0,0,0,1,1), 5, byrow=T)
> colnames(MM)<-c("A", "B", "C", "D", "E")
> row.names(MM)=colnames(MM)
> MM
  A B C D E
A 1 1 0 0 0
B 1 1 1 1 0
C 0 1 1 1 0
D 0 1 0 1 1
E 0 0 0 1 1

#this is the reporting matrix where the results will be reported
> MMres2<-matrix(rep(0,length(MM)), sqrt(length(MM)))
> colnames(MMres2)=colnames(MM)
> row.names(MMres2)=row.names(MM)

#this is the code for the calculation and report of simple paths of lenght 2
> for(i in 1:dim(MM)){
      for(j in 1:dim(MM)){
         for(k in 1:dim(MM)){
            if(MM[i,j]==1 & MM[j,k]==1 & j!=i & k!=i & k!=j){
               MMres2[i,k]=MMres2[i,k]+1
               }
            }
         }
      }

#the reported results
> MMres2
  A B C D E
A 0 0 1 1 0
B 0 0 0 1 2 
C 1 1 0 2 1
D 1 0 1 0 0
E 0 1 0 0 0

如果我想计算任何 i-&gt; n 之间长度为3的简单路径的数量,我们只需要[x2,n]==1的条件并确保我们限制新的变量不等于任何先前分配的变量。

在这里,最后,解决了我的问题。我不想简单地计算长度为2或3或4的路径数,但是所有可能的路径(路径的最大可能长度是变量总数减1)。显然,为每个矩阵设置长度为x的每个路径的代码将是麻烦的,并且对于具有更多N个变量的矩阵,创建这样的代码将更加麻烦。为了简化这一点,理想的解决方案是开发一个代码,该代码将查找所有对i和j,并计算每个路径之间路径的数量,每个路径的所有可能数量的链路直到 tot.var的路径-1 链接(即每对i和j之间路径上的最大链接数)。

再次取M2矩阵,理想的代码将寻找 i x 变量之间的链接,然后是x变量和j之间的链接,并且在报告条件的情况下,它会在每次找到路径时报告结果:

[i,x]==1 & [x’,j]==1 -> Res.mat[i,j] + 1

其中, x x'是i和j之间的任何(和任意数量)变量。 这种方法与上述原始方法不同的一点是,这里 x 可以是多个变量,也就是说,在一次迭代中,当寻找2个链接的路径时, x 将是一个变量,而一个寻找3个链接的路径, x 将是两个变量,依此类推。

E.g.:
For a path of length 2:
[i,xa]==1 & [xa,j]==1 -> Res.mat2[i,j] +1

For a path of length 3:
[i,xa]==1 & [xa,xb]==1 & [xb,j]==1 -> Res.mat3[i,j] +1

For a path of length 4:
[i,xa]==1 & [xa,xb]==1 & [xb,xc]==1 & [xc,j]==1 -> Res.mat4[i,j] +1

在此代码中,x将逐步假设除i和j之外的所有其他变量,并报告相应报告矩阵的每个路径,长度为2的报告矩阵等等。

对于非常非常长的帖子感到抱歉,这是我一直在寻找并与同事交谈的内容,似乎没有人理解或帮助我,这就是为什么我在长篇文章中试图成为最清楚的。

那么,有谁知道如何做到这一点?

0 个答案:

没有答案