利用Warshall转移闭包思想,快速迭代获得可达矩阵,详细步骤演示


论文写作或者计算需要帮助可发邮件到 hwstu # sohu.com 把 #替换成@,请说清来意,不必拐弯抹角,浪费相互之间的时间。

返回首页


此处输入要素的个数:


传递闭包Warshall方法简要介绍

  ① 在集合X上的二元关系R的传递闭包是包含R的X上的最小的传递关系。R的传递闭包在数字图像处理的图像和视觉基础、图的连通性描述等方面都是基本概念。一般用B表示定义在具有n个元素的集合X上关系R的n×n二值矩阵,则传递闭包的矩阵B+可如下计算: B+ = B + B2 + B3 + ……+ (B)n

   ② 式中矩阵运算时所有乘法都用逻辑与代替,所有加法都用逻辑或代替。上式中的操作次序为B,B(B),B(BB),B(BBB),……,所以在运算的每一步我们只需简单地把现有结果乘以B。

  

  Warshall在1962年提出了一个求关系的传递闭包的有效算法。

  其具体过程如下,设在n个元素的有限集上关系R的关系矩阵为M:
  (1)置新矩阵A=M;
  (2)置k=1;
  (3)对所有i如果A[i,k]=1,则对j=1..n执行:
     A[i,j]←A[i,j]∨A[k,j];
  (4)k增1;
  (5)如果k≤n,则转到步骤(3),否则停止。
  所得的矩阵A即为关系R的传递闭包t(R)的关系矩阵。
  在《离散数学》中都提及了该算法。

  Warshall算法映射到有向图中

  设关系R的关系图为G,设图G的所有顶点为u1,u2,…,un,则t(R)的关系图可用该方法得到:若G中任意两顶点ui和uj之间有一条路径且没有ui到uj的弧,则在图G中增加一条从ui到uj的弧,将这样改造后的图记为G’,则G’即为t(R)的关系图。G’的邻接矩阵A应满足:若图G中存在从ui到uj路径,即ui与uj连通,则A[i,j]=1,否则A[i,j]=0。

   这样,求t(R)的问题就变为求图G中每一对顶点间是否连通的问题。

  相乘矩阵,就为所有节点的关系图,也就是当前条件下的关系矩阵。 

  对于相乘矩阵,进行迭代,迭代的过程为,行取值,然后计算值中对应的每一行的值取并集,得到当前行的关系集合。

  取完所有行,得到了一个新的转移矩阵再对转移矩阵进行进行求解。

  本处获得可达矩阵的流程为:

  (1) 设置求解矩阵

  (2)判断求解出的转移矩阵是否跟求解矩阵一致,如果一致,则得到的矩阵为原始矩阵的可达矩阵,如果不一致进行 Warshall迭代求解。

  假定矩阵为5*5的布尔矩阵,假定第一行A[0,0]=1,A[0,1]=1,A[0,2]=1,A[0,3]=1,A[0,4]=1,

  Warshall迭代求解过程第一行的值如下:A0=A[0]∨A[1]∨A[2]∨A[3]∨A[4]。

  其它行同理。

  快速迭代函数的代码量非常少,同时如果数据结构合理,一次集合运算的运算量非常的小。

  Warshall的迭代次数比逐次平方法的运行效率要高很多。如果图中的顶点是有序的排列,只要进行一次Warshall快速迭代运算就可以获得可达矩阵。因此要更快的获得可达矩阵,可以先对图进行排序。

  目前的通过多次快速迭代求可达矩阵,其效率也是非常的差的,它还不是一个线性算法,在已经研究的方法中通过Gabow算法先获得回路列表,根据回路列表进行传递闭包的快速迭代是最快的。具体步骤请看

 


显示的是一个随机 12 * 12 的方阵



  
                                 1
                                   
               1          1      
               1                  
                              1   
1                      1         
1       1                        
                  1               
   1                            1
   1             1               
                           1      
               1                  
第 1 次迭代
        当前0号要素 子 的可达集合(子,亥 )现在求子,亥每个可达集合后的并集
           0号要素 子 的可达集合子,亥
           11号要素 亥 的可达集合巳,亥
        根据并集,得到当前0号要素 子 的可达集合(子,亥,巳 )
        当前1号要素 丑 的可达集合(丑 )现在求丑每个可达集合后的并集
           1号要素 丑 的可达集合丑
        根据并集,得到当前1号要素 丑 的可达集合(丑 )
        当前2号要素 寅 的可达集合(寅,巳,酉 )现在求寅,巳,酉每个可达集合后的并集
           2号要素 寅 的可达集合寅,巳,酉
           5号要素 巳 的可达集合子,巳,申
           9号要素 酉 的可达集合丑,午,酉
        根据并集,得到当前2号要素 寅 的可达集合(寅,巳,酉,丑,午,子,申 )
        当前3号要素 卯 的可达集合(卯,巳 )现在求卯,巳每个可达集合后的并集
           3号要素 卯 的可达集合卯,巳
           5号要素 巳 的可达集合子,巳,申
        根据并集,得到当前3号要素 卯 的可达集合(卯,巳,子,申 )
        当前4号要素 辰 的可达集合(辰,戌 )现在求辰,戌每个可达集合后的并集
           4号要素 辰 的可达集合辰,戌
           10号要素 戌 的可达集合酉,戌
        根据并集,得到当前4号要素 辰 的可达集合(辰,戌,酉 )
        当前5号要素 巳 的可达集合(子,巳,申 )现在求子,巳,申每个可达集合后的并集
           0号要素 子 的可达集合子,亥,巳
           5号要素 巳 的可达集合子,巳,申
           8号要素 申 的可达集合丑,申,亥
        根据并集,得到当前5号要素 巳 的可达集合(子,巳,申,丑,亥 )
        当前6号要素 午 的可达集合(子,卯,午 )现在求子,卯,午每个可达集合后的并集
           0号要素 子 的可达集合子,亥,巳
           3号要素 卯 的可达集合卯,巳,子,申
           6号要素 午 的可达集合子,卯,午
        根据并集,得到当前6号要素 午 的可达集合(子,卯,午,巳,申,亥 )
        当前7号要素 未 的可达集合(午,未 )现在求午,未每个可达集合后的并集
           6号要素 午 的可达集合子,卯,午,巳,申,亥
           7号要素 未 的可达集合午,未
        根据并集,得到当前7号要素 未 的可达集合(午,未,子,卯,巳,申,亥 )
        当前8号要素 申 的可达集合(丑,申,亥 )现在求丑,申,亥每个可达集合后的并集
           1号要素 丑 的可达集合丑
           8号要素 申 的可达集合丑,申,亥
           11号要素 亥 的可达集合巳,亥
        根据并集,得到当前8号要素 申 的可达集合(丑,申,亥,巳 )
        当前9号要素 酉 的可达集合(丑,午,酉 )现在求丑,午,酉每个可达集合后的并集
           1号要素 丑 的可达集合丑
           6号要素 午 的可达集合子,卯,午,巳,申,亥
           9号要素 酉 的可达集合丑,午,酉
        根据并集,得到当前9号要素 酉 的可达集合(丑,午,酉,子,卯,巳,申,亥 )
        当前10号要素 戌 的可达集合(酉,戌 )现在求酉,戌每个可达集合后的并集
           9号要素 酉 的可达集合丑,午,酉,子,卯,巳,申,亥
           10号要素 戌 的可达集合酉,戌
        根据并集,得到当前10号要素 戌 的可达集合(酉,戌,丑,午,子,卯,巳,申,亥 )
        当前11号要素 亥 的可达集合(巳,亥 )现在求巳,亥每个可达集合后的并集
           5号要素 巳 的可达集合子,巳,申,丑,亥
           11号要素 亥 的可达集合巳,亥
        根据并集,得到当前11号要素 亥 的可达集合(巳,亥,子,申,丑 )

第 1 次迭代 得到的转移矩阵如下:
  
1             1                1
   1                              
1 1 1       1 1    1 1      
1       1    1       1         
            1             1 1   
1 1          1       1       1
1       1    1 1    1       1
1       1    1 1 1 1       1
   1          1       1       1
1 1    1    1 1    1 1    1
1 1    1    1 1    1 1 1 1
1 1          1       1       1
第 2 次迭代
        当前0号要素 子 的可达集合(子,巳,亥 )现在求子,巳,亥每个可达集合后的并集
           0号要素 子 的可达集合子,巳,亥
           5号要素 巳 的可达集合子,丑,巳,申,亥
           11号要素 亥 的可达集合子,丑,巳,申,亥
        根据并集,得到当前0号要素 子 的可达集合(子,巳,亥,丑,申 )
        当前1号要素 丑 的可达集合(丑 )现在求丑每个可达集合后的并集
           1号要素 丑 的可达集合丑
        根据并集,得到当前1号要素 丑 的可达集合(丑 )
        当前2号要素 寅 的可达集合(子,丑,寅,巳,午,申,酉 )现在求子,丑,寅,巳,午,申,酉每个可达集合后的并集
           0号要素 子 的可达集合子,巳,亥,丑,申
           1号要素 丑 的可达集合丑
           2号要素 寅 的可达集合子,丑,寅,巳,午,申,酉
           5号要素 巳 的可达集合子,丑,巳,申,亥
           6号要素 午 的可达集合子,卯,巳,午,申,亥
           8号要素 申 的可达集合丑,巳,申,亥
           9号要素 酉 的可达集合子,丑,卯,巳,午,申,酉,亥
        根据并集,得到当前2号要素 寅 的可达集合(子,丑,寅,巳,午,申,酉,卯,亥 )
        当前3号要素 卯 的可达集合(子,卯,巳,申 )现在求子,卯,巳,申每个可达集合后的并集
           0号要素 子 的可达集合子,巳,亥,丑,申
           3号要素 卯 的可达集合子,卯,巳,申
           5号要素 巳 的可达集合子,丑,巳,申,亥
           8号要素 申 的可达集合丑,巳,申,亥
        根据并集,得到当前3号要素 卯 的可达集合(子,卯,巳,申,丑,亥 )
        当前4号要素 辰 的可达集合(辰,酉,戌 )现在求辰,酉,戌每个可达集合后的并集
           4号要素 辰 的可达集合辰,酉,戌
           9号要素 酉 的可达集合子,丑,卯,巳,午,申,酉,亥
           10号要素 戌 的可达集合子,丑,卯,巳,午,申,酉,戌,亥
        根据并集,得到当前4号要素 辰 的可达集合(辰,酉,戌,子,丑,卯,巳,午,申,亥 )
        当前5号要素 巳 的可达集合(子,丑,巳,申,亥 )现在求子,丑,巳,申,亥每个可达集合后的并集
           0号要素 子 的可达集合子,巳,亥,丑,申
           1号要素 丑 的可达集合丑
           5号要素 巳 的可达集合子,丑,巳,申,亥
           8号要素 申 的可达集合丑,巳,申,亥
           11号要素 亥 的可达集合子,丑,巳,申,亥
        根据并集,得到当前5号要素 巳 的可达集合(子,丑,巳,申,亥 )
        当前6号要素 午 的可达集合(子,卯,巳,午,申,亥 )现在求子,卯,巳,午,申,亥每个可达集合后的并集
           0号要素 子 的可达集合子,巳,亥,丑,申
           3号要素 卯 的可达集合子,卯,巳,申,丑,亥
           5号要素 巳 的可达集合子,丑,巳,申,亥
           6号要素 午 的可达集合子,卯,巳,午,申,亥
           8号要素 申 的可达集合丑,巳,申,亥
           11号要素 亥 的可达集合子,丑,巳,申,亥
        根据并集,得到当前6号要素 午 的可达集合(子,卯,巳,午,申,亥,丑 )
        当前7号要素 未 的可达集合(子,卯,巳,午,未,申,亥 )现在求子,卯,巳,午,未,申,亥每个可达集合后的并集
           0号要素 子 的可达集合子,巳,亥,丑,申
           3号要素 卯 的可达集合子,卯,巳,申,丑,亥
           5号要素 巳 的可达集合子,丑,巳,申,亥
           6号要素 午 的可达集合子,卯,巳,午,申,亥,丑
           7号要素 未 的可达集合子,卯,巳,午,未,申,亥
           8号要素 申 的可达集合丑,巳,申,亥
           11号要素 亥 的可达集合子,丑,巳,申,亥
        根据并集,得到当前7号要素 未 的可达集合(子,卯,巳,午,未,申,亥,丑 )
        当前8号要素 申 的可达集合(丑,巳,申,亥 )现在求丑,巳,申,亥每个可达集合后的并集
           1号要素 丑 的可达集合丑
           5号要素 巳 的可达集合子,丑,巳,申,亥
           8号要素 申 的可达集合丑,巳,申,亥
           11号要素 亥 的可达集合子,丑,巳,申,亥
        根据并集,得到当前8号要素 申 的可达集合(丑,巳,申,亥,子 )
        当前9号要素 酉 的可达集合(子,丑,卯,巳,午,申,酉,亥 )现在求子,丑,卯,巳,午,申,酉,亥每个可达集合后的并集
           0号要素 子 的可达集合子,巳,亥,丑,申
           1号要素 丑 的可达集合丑
           3号要素 卯 的可达集合子,卯,巳,申,丑,亥
           5号要素 巳 的可达集合子,丑,巳,申,亥
           6号要素 午 的可达集合子,卯,巳,午,申,亥,丑
           8号要素 申 的可达集合丑,巳,申,亥,子
           9号要素 酉 的可达集合子,丑,卯,巳,午,申,酉,亥
           11号要素 亥 的可达集合子,丑,巳,申,亥
        根据并集,得到当前9号要素 酉 的可达集合(子,丑,卯,巳,午,申,酉,亥 )
        当前10号要素 戌 的可达集合(子,丑,卯,巳,午,申,酉,戌,亥 )现在求子,丑,卯,巳,午,申,酉,戌,亥每个可达集合后的并集
           0号要素 子 的可达集合子,巳,亥,丑,申
           1号要素 丑 的可达集合丑
           3号要素 卯 的可达集合子,卯,巳,申,丑,亥
           5号要素 巳 的可达集合子,丑,巳,申,亥
           6号要素 午 的可达集合子,卯,巳,午,申,亥,丑
           8号要素 申 的可达集合丑,巳,申,亥,子
           9号要素 酉 的可达集合子,丑,卯,巳,午,申,酉,亥
           10号要素 戌 的可达集合子,丑,卯,巳,午,申,酉,戌,亥
           11号要素 亥 的可达集合子,丑,巳,申,亥
        根据并集,得到当前10号要素 戌 的可达集合(子,丑,卯,巳,午,申,酉,戌,亥 )
        当前11号要素 亥 的可达集合(子,丑,巳,申,亥 )现在求子,丑,巳,申,亥每个可达集合后的并集
           0号要素 子 的可达集合子,巳,亥,丑,申
           1号要素 丑 的可达集合丑
           5号要素 巳 的可达集合子,丑,巳,申,亥
           8号要素 申 的可达集合丑,巳,申,亥,子
           11号要素 亥 的可达集合子,丑,巳,申,亥
        根据并集,得到当前11号要素 亥 的可达集合(子,丑,巳,申,亥 )

第 2 次迭代 得到的转移矩阵如下:
  
1 1          1       1       1
   1                              
1 1 1 1    1 1    1 1    1
1 1    1    1       1       1
1 1    1 1 1 1    1 1 1 1
1 1          1       1       1
1 1    1    1 1    1       1
1 1    1    1 1 1 1       1
1 1          1       1       1
1 1    1    1 1    1 1    1
1 1    1    1 1    1 1 1 1
1 1          1       1       1
第 3 次迭代
        当前0号要素 子 的可达集合(子,丑,巳,申,亥 )现在求子,丑,巳,申,亥每个可达集合后的并集
           0号要素 子 的可达集合子,丑,巳,申,亥
           1号要素 丑 的可达集合丑
           5号要素 巳 的可达集合子,丑,巳,申,亥
           8号要素 申 的可达集合子,丑,巳,申,亥
           11号要素 亥 的可达集合子,丑,巳,申,亥
        根据并集,得到当前0号要素 子 的可达集合(子,丑,巳,申,亥 )
        当前1号要素 丑 的可达集合(丑 )现在求丑每个可达集合后的并集
           1号要素 丑 的可达集合丑
        根据并集,得到当前1号要素 丑 的可达集合(丑 )
        当前2号要素 寅 的可达集合(子,丑,寅,卯,巳,午,申,酉,亥 )现在求子,丑,寅,卯,巳,午,申,酉,亥每个可达集合后的并集
           0号要素 子 的可达集合子,丑,巳,申,亥
           1号要素 丑 的可达集合丑
           2号要素 寅 的可达集合子,丑,寅,卯,巳,午,申,酉,亥
           3号要素 卯 的可达集合子,丑,卯,巳,申,亥
           5号要素 巳 的可达集合子,丑,巳,申,亥
           6号要素 午 的可达集合子,丑,卯,巳,午,申,亥
           8号要素 申 的可达集合子,丑,巳,申,亥
           9号要素 酉 的可达集合子,丑,卯,巳,午,申,酉,亥
           11号要素 亥 的可达集合子,丑,巳,申,亥
        根据并集,得到当前2号要素 寅 的可达集合(子,丑,寅,卯,巳,午,申,酉,亥 )
        当前3号要素 卯 的可达集合(子,丑,卯,巳,申,亥 )现在求子,丑,卯,巳,申,亥每个可达集合后的并集
           0号要素 子 的可达集合子,丑,巳,申,亥
           1号要素 丑 的可达集合丑
           3号要素 卯 的可达集合子,丑,卯,巳,申,亥
           5号要素 巳 的可达集合子,丑,巳,申,亥
           8号要素 申 的可达集合子,丑,巳,申,亥
           11号要素 亥 的可达集合子,丑,巳,申,亥
        根据并集,得到当前3号要素 卯 的可达集合(子,丑,卯,巳,申,亥 )
        当前4号要素 辰 的可达集合(子,丑,卯,辰,巳,午,申,酉,戌,亥 )现在求子,丑,卯,辰,巳,午,申,酉,戌,亥每个可达集合后的并集
           0号要素 子 的可达集合子,丑,巳,申,亥
           1号要素 丑 的可达集合丑
           3号要素 卯 的可达集合子,丑,卯,巳,申,亥
           4号要素 辰 的可达集合子,丑,卯,辰,巳,午,申,酉,戌,亥
           5号要素 巳 的可达集合子,丑,巳,申,亥
           6号要素 午 的可达集合子,丑,卯,巳,午,申,亥
           8号要素 申 的可达集合子,丑,巳,申,亥
           9号要素 酉 的可达集合子,丑,卯,巳,午,申,酉,亥
           10号要素 戌 的可达集合子,丑,卯,巳,午,申,酉,戌,亥
           11号要素 亥 的可达集合子,丑,巳,申,亥
        根据并集,得到当前4号要素 辰 的可达集合(子,丑,卯,辰,巳,午,申,酉,戌,亥 )
        当前5号要素 巳 的可达集合(子,丑,巳,申,亥 )现在求子,丑,巳,申,亥每个可达集合后的并集
           0号要素 子 的可达集合子,丑,巳,申,亥
           1号要素 丑 的可达集合丑
           5号要素 巳 的可达集合子,丑,巳,申,亥
           8号要素 申 的可达集合子,丑,巳,申,亥
           11号要素 亥 的可达集合子,丑,巳,申,亥
        根据并集,得到当前5号要素 巳 的可达集合(子,丑,巳,申,亥 )
        当前6号要素 午 的可达集合(子,丑,卯,巳,午,申,亥 )现在求子,丑,卯,巳,午,申,亥每个可达集合后的并集
           0号要素 子 的可达集合子,丑,巳,申,亥
           1号要素 丑 的可达集合丑
           3号要素 卯 的可达集合子,丑,卯,巳,申,亥
           5号要素 巳 的可达集合子,丑,巳,申,亥
           6号要素 午 的可达集合子,丑,卯,巳,午,申,亥
           8号要素 申 的可达集合子,丑,巳,申,亥
           11号要素 亥 的可达集合子,丑,巳,申,亥
        根据并集,得到当前6号要素 午 的可达集合(子,丑,卯,巳,午,申,亥 )
        当前7号要素 未 的可达集合(子,丑,卯,巳,午,未,申,亥 )现在求子,丑,卯,巳,午,未,申,亥每个可达集合后的并集
           0号要素 子 的可达集合子,丑,巳,申,亥
           1号要素 丑 的可达集合丑
           3号要素 卯 的可达集合子,丑,卯,巳,申,亥
           5号要素 巳 的可达集合子,丑,巳,申,亥
           6号要素 午 的可达集合子,丑,卯,巳,午,申,亥
           7号要素 未 的可达集合子,丑,卯,巳,午,未,申,亥
           8号要素 申 的可达集合子,丑,巳,申,亥
           11号要素 亥 的可达集合子,丑,巳,申,亥
        根据并集,得到当前7号要素 未 的可达集合(子,丑,卯,巳,午,未,申,亥 )
        当前8号要素 申 的可达集合(子,丑,巳,申,亥 )现在求子,丑,巳,申,亥每个可达集合后的并集
           0号要素 子 的可达集合子,丑,巳,申,亥
           1号要素 丑 的可达集合丑
           5号要素 巳 的可达集合子,丑,巳,申,亥
           8号要素 申 的可达集合子,丑,巳,申,亥
           11号要素 亥 的可达集合子,丑,巳,申,亥
        根据并集,得到当前8号要素 申 的可达集合(子,丑,巳,申,亥 )
        当前9号要素 酉 的可达集合(子,丑,卯,巳,午,申,酉,亥 )现在求子,丑,卯,巳,午,申,酉,亥每个可达集合后的并集
           0号要素 子 的可达集合子,丑,巳,申,亥
           1号要素 丑 的可达集合丑
           3号要素 卯 的可达集合子,丑,卯,巳,申,亥
           5号要素 巳 的可达集合子,丑,巳,申,亥
           6号要素 午 的可达集合子,丑,卯,巳,午,申,亥
           8号要素 申 的可达集合子,丑,巳,申,亥
           9号要素 酉 的可达集合子,丑,卯,巳,午,申,酉,亥
           11号要素 亥 的可达集合子,丑,巳,申,亥
        根据并集,得到当前9号要素 酉 的可达集合(子,丑,卯,巳,午,申,酉,亥 )
        当前10号要素 戌 的可达集合(子,丑,卯,巳,午,申,酉,戌,亥 )现在求子,丑,卯,巳,午,申,酉,戌,亥每个可达集合后的并集
           0号要素 子 的可达集合子,丑,巳,申,亥
           1号要素 丑 的可达集合丑
           3号要素 卯 的可达集合子,丑,卯,巳,申,亥
           5号要素 巳 的可达集合子,丑,巳,申,亥
           6号要素 午 的可达集合子,丑,卯,巳,午,申,亥
           8号要素 申 的可达集合子,丑,巳,申,亥
           9号要素 酉 的可达集合子,丑,卯,巳,午,申,酉,亥
           10号要素 戌 的可达集合子,丑,卯,巳,午,申,酉,戌,亥
           11号要素 亥 的可达集合子,丑,巳,申,亥
        根据并集,得到当前10号要素 戌 的可达集合(子,丑,卯,巳,午,申,酉,戌,亥 )
        当前11号要素 亥 的可达集合(子,丑,巳,申,亥 )现在求子,丑,巳,申,亥每个可达集合后的并集
           0号要素 子 的可达集合子,丑,巳,申,亥
           1号要素 丑 的可达集合丑
           5号要素 巳 的可达集合子,丑,巳,申,亥
           8号要素 申 的可达集合子,丑,巳,申,亥
           11号要素 亥 的可达集合子,丑,巳,申,亥
        根据并集,得到当前11号要素 亥 的可达集合(子,丑,巳,申,亥 )

第 3 次迭代 得到的转移矩阵如下:
  
1 1          1       1       1
   1                              
1 1 1 1    1 1    1 1    1
1 1    1    1       1       1
1 1    1 1 1 1    1 1 1 1
1 1          1       1       1
1 1    1    1 1    1       1
1 1    1    1 1 1 1       1
1 1          1       1       1
1 1    1    1 1    1 1    1
1 1    1    1 1    1 1 1 1
1 1          1       1       1

化学加平台
解释结构模型
感谢化学加提供单独服务器服务器!请大家多支持化学加平台,可以多介绍人关注化学加!
对解释结构模型在线计算有什么意见与建议请发电子邮件到, hwstu #sohu.com 把#替换成 @