无标度网络生成算法之简单轮盘算法

无标度网络生成算法之简单轮盘算法

简单轮盘算法

简单轮盘生成算法将轮盘赌算法和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=1nFi

其工作过程:设想群体全部个体的适当性分数可以用一张饼图来表示,群体中的每一个染色快指定饼图中的一个小块;块的大小与染色块的适应性函数成比例,适应性函数越高,其相应在饼图中的小块所占面积也越大。

为了选取饼图中的一个染色块,可以旋转这个轮子,直到轮盘停止时,看指针停止的位置。指针停止在哪一块,就选择与之对应的那个染色块。

在这里插入图片描述

具体操作:

  1. 计算出群体中每个个体的适应度 F i , i = 1 , 2 , ⋯   , M F_{i},i=1,2,\cdots,M Fii=1,2,,M,其中 M M M是群体大小;

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

    P i = F i / ∑ i = 1 n F i P_{i}=F_{i} / \sum\limits_{i=1}^{n} F_{i} Pi=Fi/i=1nFi

  3. 计算出每个个体的累计概率:
    q i = ∑ j = 1 i P ( x j ) q_{i}=\sum\limits_{j=1}^{i} P\left(x_{j}\right) qi=j=1iP(xj)

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

  5. 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[k1]<rq[k] 成立;

  6. 重复步骤4,5 共 M M M次;

例如,以下表为例,采用轮盘赌选择法的选择概率计算:

个体1234567891011
适应度2.01.81.61.41.21.00.80.60.40.20.1
选择概率0.180.160.150.130.110.090.070.060.030.020.0
累计概率0.180.340.490.620.730.820.890.950.981.001.00

如果产生的随机数是0.81,则6号个体被选中。

我们可以明显地看出

  1. 从个体选择概率理解,适应度数值越高,它被选中的概率就越大。

  2. 累积概率把各个个体的概率使用不同长度的线段来表示,这些线段组合成一条直线,直线的长度为1(各个个体概率之和),这样在该直线中,某段的线段最长,就代表该个体被选中的概率越大。

    注意:

    (一)任意选择所有个体的一个排列序列(这个序列可以随便排,因为是某线段之间的长度为代表某个体的选择概率)
    (二)任意个体的累积概率为该个体对应的前几项数据的累加和。

    这样,如果某个个体的适应度数值高,它所对应的个体选择概率就会越大,通过累积概率转换后对应的线段会越长。

  3. 对于适应度值较大的个体,对应的线段长度会长,这样随机产生的数字落在此区间的概率就大,该个体被选中的概率也大。同时,对于适应度较小的个体,线段长度会相对较短,随机数字在该区间的概率相对较小,但是也有被选中的可能,避免了适应度数值较小的个体被直接淘汰的问题。

我们从中也可以看出,轮盘赌算法与个体的排列顺序有关。

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) 如何选择某个个体

  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(vk1)<xP(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=1kp(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=1iwj

小结

在轮盘中取样过程分为两步:

  • 首先,产生一个随机数 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} σ(k1)<rσk

采用节点权值 w w w 来代替节点的度的优势在于:

在某个节点被选中并更新节点的概率密度的过程中,部分节点的累计概率密度并没有变,因而不需要重复计算。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值