无标度网络生成算法之简单轮盘算法
简单轮盘算法
简单轮盘生成算法将轮盘赌算法和BA无标度网络结合,生成无标度网络。
轮盘赌基本原理
参考:http://blog.sina.com.cn/s/blog_67c17d1c01017hyt.html
轮盘赌算法:
轮盘赌算法的基本思想是 个体被选中的概率与其适应度函数值成正比;
设群体大小为 n n n,个体 i i i的适应度为 F i F_{i} Fi,则个体被选中遗传到下一代群体的概率为
P i = F i / ∑ i = 1 n F i P_{i}=F_{i} / \sum\limits_{i=1}^{n} F_{i} Pi=Fi/i=1∑nFi
其工作过程:设想群体全部个体的适当性分数可以用一张饼图来表示,群体中的每一个染色快指定饼图中的一个小块;块的大小与染色块的适应性函数成比例,适应性函数越高,其相应在饼图中的小块所占面积也越大。
为了选取饼图中的一个染色块,可以旋转这个轮子,直到轮盘停止时,看指针停止的位置。指针停止在哪一块,就选择与之对应的那个染色块。
具体操作:
-
计算出群体中每个个体的适应度 F i , i = 1 , 2 , ⋯ , M F_{i},i=1,2,\cdots,M Fi,i=1,2,⋯,M,其中 M M M是群体大小;
-
计算出每一个个体被遗传到下一代群体中的概率:
P i = F i / ∑ i = 1 n F i P_{i}=F_{i} / \sum\limits_{i=1}^{n} F_{i} Pi=Fi/i=1∑nFi
-
计算出每个个体的累计概率:
q i = ∑ j = 1 i P ( x j ) q_{i}=\sum\limits_{j=1}^{i} P\left(x_{j}\right) qi=j=1∑iP(xj) -
在区间 [ 0 , 1 ] [0,1] [0,1]内产生一个均匀分布的伪随机数 r r r;
-
若 r < q i r<q_{i} r<qi,则选择个体 i i i;否则,选择个体 k k k,使得 q [ k − 1 ] < r ≤ q [ k ] q[k-1]<r\le q[k] q[k−1]<r≤q[k] 成立;
-
重复步骤4,5 共 M M M次;
例如,以下表为例,采用轮盘赌选择法的选择概率计算:
个体 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
---|---|---|---|---|---|---|---|---|---|---|---|
适应度 | 2.0 | 1.8 | 1.6 | 1.4 | 1.2 | 1.0 | 0.8 | 0.6 | 0.4 | 0.2 | 0.1 |
选择概率 | 0.18 | 0.16 | 0.15 | 0.13 | 0.11 | 0.09 | 0.07 | 0.06 | 0.03 | 0.02 | 0.0 |
累计概率 | 0.18 | 0.34 | 0.49 | 0.62 | 0.73 | 0.82 | 0.89 | 0.95 | 0.98 | 1.00 | 1.00 |
如果产生的随机数是0.81,则6号个体被选中。
我们可以明显地看出
-
从个体选择概率理解,适应度数值越高,它被选中的概率就越大。
-
累积概率把各个个体的概率使用不同长度的线段来表示,这些线段组合成一条直线,直线的长度为1(各个个体概率之和),这样在该直线中,某段的线段最长,就代表该个体被选中的概率越大。
注意:
(一)任意选择所有个体的一个排列序列(这个序列可以随便排,因为是某线段之间的长度为代表某个体的选择概率)
(二)任意个体的累积概率为该个体对应的前几项数据的累加和。这样,如果某个个体的适应度数值高,它所对应的个体选择概率就会越大,通过累积概率转换后对应的线段会越长。
-
对于适应度值较大的个体,对应的线段长度会长,这样随机产生的数字落在此区间的概率就大,该个体被选中的概率也大。同时,对于适应度较小的个体,线段长度会相对较短,随机数字在该区间的概率相对较小,但是也有被选中的可能,避免了适应度数值较小的个体被直接淘汰的问题。
我们从中也可以看出,轮盘赌算法与个体的排列顺序有关。
C++代码实现:
int RouletteWheelSelection(){
srand(0);
//定义rand
double m = rand()/double(RAND_MAX);
//产生一个[0,1)的随机值
int Probability_Total = 0;
int Selection = 0;
for(int i = 0;i < SIZE; i++){//SIZE是个体数量的大小
Probability_Total = Probability_Total + Probability[i];
if(Probability_Total >= m){
Selection = i;
break;
}
}
return Selection;
}
轮盘赌小结
轮盘赌的核心在于两个该概率和个体选择策略:
(1) 个体选择概率
(2) 累计概率
(3) 如何选择某个个体
- 个体选择概率:适应度值越高,其被选择的概率就越大.
- 累计概率:线段表示
- 选择:生成 [ 0 , 1 ] [0,1] [0,1]区间的随机数,看看该数字落在那个区间。
轮盘生成算法
模拟轮盘赌:穿行创建有n个节点的无标度幂律图
给定一个包含 k k k个节点的集合 { v 1 , v 2 , … , v k } \left\{v_{1}, v_{2}, \ldots, v_{k}\right\} {v1,v2,…,vk},当产生了一个新节点 v ( k + 1 ) v_{(k+1)} v(k+1),这个节点需要与 { v 1 , v 2 , … , v k } \left\{v_{1}, v_{2}, \ldots, v_{k}\right\} {v1,v2,…,vk}中的 m m m个节点建立连接,对于这个新节点需要建立的每一条连接,都与现有网络中的节点的概率成正比。
p ( v i ) = deg ( v i ) ∑ i = 1 k deg ( v i ) p\left(v_{i}\right)=\frac{\operatorname{deg}\left(v_{i}\right)}{\sum_{i=1}^{k} \operatorname{deg}\left(v_{i}\right)} p(vi)=∑i=1kdeg(vi)deg(vi)
简单轮盘算法(Simple Roulette Wheel, Simple-RW)采用优先连接机制来选择目标节点。该算法随机选择一个节点的主要思想如下:一个轮盘即为一系列具有一定选择概率的节点。随机选择一个节点时,首先需要产生一个0 到 1 之间的随机数, 然后选择一个累计概率满足不等式
P
(
v
k
−
1
)
<
x
≤
P
(
v
k
)
P\left(v_{k-1}\right)<x \leq P\left(v_{k}\right)
P(vk−1)<x≤P(vk) 的节点
v
k
v_{k}
vk 进行连接操作。其中
P
(
v
k
)
P\left(v_{k}\right)
P(vk)表 示 该 节点的累计概率密度,满足公式 。
P
(
v
k
)
=
∑
i
=
1
k
p
(
v
i
)
P\left(v_{k}\right)=\sum_{i=1}^{k} p\left(v_{i}\right)
P(vk)=i=1∑kp(vi)
当网络中需要添加一个新的节点时,与这个网络对应的轮盘也要相应的增加节点。所以,无论何时在网络中加入一条边,这条边两端的节点的概率都会随其度的增加而相应的增加,而且为了保证整体的概率为 1 ,这个轮盘中的所有节点的概率都需要进行更新。因此,在每次的选择之后轮盘都需要进行调整,累计概率
P
P
P 也需
要在每次循环后重新计算。由于公式
p
(
v
i
)
=
deg
(
v
i
)
∑
i
=
1
k
deg
(
v
i
)
p\left(v_{i}\right)=\frac{\operatorname{deg}\left(v_{i}\right)}{\sum_{i=1}^{k} \operatorname{deg}\left(v_{i}\right)}
p(vi)=∑i=1kdeg(vi)deg(vi)中的分母是常量,为了去除该分母以避免对
p
(
v
i
)
p\left(v_{i}\right)
p(vi) 的重复计算,可以将轮盘中的节点的概率
p
(
v
1
)
,
…
,
p
(
v
n
)
p\left(v_{1}\right), \ldots, p\left(v_{n}\right)
p(v1),…,p(vn) 转换为节点对应的权值
w
1
,
…
,
w
n
w_{1}, \ldots, w_{n}
w1,…,wn, 其中,
w
i
=
deg
(
v
i
)
=
S
n
×
p
(
v
i
)
w_{i}=\operatorname{deg}\left(v_{i}\right)=S_{n} \times p\left(v_{i}\right)
wi=deg(vi)=Sn×p(vi) 。同理可知,可以通过计算每个节点对应的部分和
σ
1
,
…
,
σ
n
\sigma_{1},\ldots,\sigma_{n}
σ1,…,σn 来代替累计概率
P
(
v
i
)
P(v_{i})
P(vi) ,其中
σ
i
=
S
n
×
P
(
v
i
)
=
∑
j
=
1
i
w
j
\sigma_{i}=S_{n} \times P\left(v_{i}\right)=\sum_{j=1}^{i} w_{j}
σi=Sn×P(vi)=j=1∑iwj
小结
在轮盘中取样过程分为两步:
- 首先,产生一个随机数 r ∈ [ 1 , S n ] r \in\left[1, S_{n}\right] r∈[1,Sn];
- 然后,从轮盘中选择一个节点 v k v_{k} vk , 其中 v k v_{k} vk 满足 σ ( k − 1 ) < r ≤ σ k \sigma_{(k-1)}<r \leq \sigma_{k} σ(k−1)<r≤σk
采用节点权值 w w w 来代替节点的度的优势在于:
在某个节点被选中并更新节点的概率密度的过程中,部分节点的累计概率密度并没有变,因而不需要重复计算。