之前记录了一下,常见的四种网络模型——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 += 2 # 增加一条边,度增加 2
p_k[ind] = (k_j + 1) / k_all
add_edge += 1
k.append(2)
p = 2 / k_all
p_k.append(p)
与未使用轮盘赌的BA网络相比,仅仅是优先连接部分发生改变,其他还是一样的。
不过,现在看来,构造BA的算法还是有一点问题,就是出现重复的边时,无法再增加一个连边,保证每个节点增加的边数一样。这时,可以在判断条件中增加一个条件:被选择点与新增加的点之间不可以存在连边,这样就完美实现了BA网络。