浅谈如何使用python复杂网络选择任意子节点计算出该任意子节点之间的最短连通距离,只用于记录,不是教程不是教程不是教程!!!
首先要明白,复杂网络任意子节点的网络最短距离是最小生成树的一种,但和传统意义上的prim或kruskal算法求解最小生成树的方法略微不同。
传统意义上的prim或kruskal算法,选择的是遍历该网络图/树形图中的所有节点,在不生成环形的情况下选择每两个节点集之间的最短距离(权值),生成最小生成树。要了解prim算法或kruskal算法的原理流程,详情请见:
最小生成树(Kruskal(克鲁斯卡尔)和Prim(普里姆))算法动画演示_哔哩哔哩_bilibili
而在本道开放性的实验题型中,并没有类似于prim或者kruskal之类的最小生成树通解,因为本题需要的是 复杂网络任意子节点的网络最短距离,并不是遍历整个网络图的所有节点输出最小生成树。复杂网络中任意子节点的网络最短距离,实际上是求解该几个子节点组成的子网络的最小生成树。
所以现在问题变成了:
如何求解这几个子节点组成的子网络的最小生成树?
本次实验以任意子节点数量n = 5来举例。
要了解这个问题,首先要把网络拓扑图/树形图转化为邻接矩阵,本次以一个六节点的带权无向图为例。
如图所示,右图为该带权无向图,左边为该图的邻接矩阵,若两点可达,则设m为邻接矩阵,i为行号,j为列号,m[i][j]为两点之间的权值;若两点不可达,则m[i][j]为0。
通过这个邻接矩阵我们可以得出两点之间的权值与连线情况,而任意n=5个子节点组成的子网络实际上就是该邻接矩阵中的对应节点组成的邻接矩阵。如n=1,3,4,5,6,实际上就是把行数=2(2,0,0,0,4,6),列数=2(2,0,0,0,4,6)的元组从该邻接矩阵中剔除,留下由节点1,3,4,5,6组成的邻接矩阵,同理可以延伸到更大的网络矩阵,比如从34x34的邻接矩阵中抽出由5个节点组成的邻接矩阵,也是类似的情况。
现在让我们回到这个问题: 如何求解这几个子节点组成的子网络的最小生成树?
让我来简单地陈述一下算法流程:
- 得到带权无向图的邻接矩阵
- 将对角线全设为0(自身到自身的距离),两点不可达时设置为Infinity,这里的无穷大也可以是一个远大于邻接矩阵权值的数,如99,999,1024等,根据你的邻接矩阵权值选择。该矩阵为一跳矩阵