常见网络模型——BA无标度网络(使用轮盘赌算法)(python)

之前记录了一下,常见的四种网络模型——ER、BA、WS、规则图,以及如何使用python实现,具体请移步:

https://blog.csdn.net/un357951/article/details/103514682

当时因为对轮盘赌算法还不熟悉,所以没有把轮盘赌算法和 BA无标度网络结合,现在记录一下,轮盘赌算法的学习笔记,以及应用到BA网络中去。

轮盘赌算法:

其基本思想是:个体被选中的概率与其适应度函数值成正比;

设群体大小为 n, 个体 i 的适应度为 Fi,则个体被选中遗传到下一代群体的概率为:

                                                                               

设想群体全部个体的适当性分数使用一个饼图来表示,

群体中每一个染色块指定饼图中的一个小块;块的大小与染色块的适应性分数成比例,适应性分数越高,其相应在饼图中对应的小块所占面积也越大。为了选取饼图中的一个染色块,可以旋转这个轮子,直到轮盘停止时,看指针停止的位置。指针停止在那一块,就选择与之对应的那个染色块

具体操作如下:

1、计算出群体中每个个体的适应度 fi,(i= 1,2,3,...,M),M是群体大小;

2、计算出每一个个体被遗传到下一代群体中的概率:

 3、计算出每个个体的累积概率:

4、在[0,1]区间内产生一个均匀分布的伪随机数 r;

5、若 r<qi,则选择个体 i;否则,选择个体 k,使得 q[k-1]<r≤q[k] 成立;

6、重复(4)、(5)共M次

当这个轮盘赌算法应用到BA网络中时,也是比较简单的。

    for i in range(t):
        m_0_t = m_0 + i       # t 时刻的节点数
        m_0_1 = m_0 + i - 1   # t-1 时刻的节点数
        G_BA.add_node(m_0_t)
        add_edge = 1
        while(add_edge<=m):
            sumFits = sum(p_k)
            rndPoint = random.uniform(0, sumFits)
            accumulator = 0.0
            for ind, val in enumerate(p_k):
                accumulator += val
                if accumulator >= rndPoint:
                    k_j = k[ind]
                    p_k_j = p_k[ind]
                    G_BA.add_edge(m_0_t, ind)
                    adjacentMatrix[m_0_t][ind] = 1
                    adjacentMatrix[ind][m_0_t] = 1
                    k[ind] = k_j + 1
                    k_all += 3  # 增加一条边,度增加 3
                    p_k[ind] = (k_j + 1) / k_all
                    add_edge += 1
        k.append(3)
        p = 3 / k_all
        p_k.append(p)

与未使用轮盘赌的BA网络相比,仅仅是优先连接部分发生改变,其他还是一样的。

不过,现在看来,构造BA的算法还是有一点问题,就是出现重复的边时,无法再增加一个连边,保证每个节点增加的边数一样。这时,可以在判断条件中增加一个条件:被选择点与新增加的点之间不可以存在连边,这样就完美实现了BA网络。

发布了6 篇原创文章 · 获赞 14 · 访问量 1857
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览