目的:
有若干个备选方案,而且每个方案都有自己的潜力分值,但是在选择的时候并不完全按照分值的高低来选,而是有一定的概率接受,分值高的接受概率高,分值较低接受的概率也低。
思想:
各个个体的选择概率和其适应度值成比例,适应度越大,选中概率也越大。但实际在进行轮盘赌选择时个体的选择往往不是依据个体的选择概率,而是根据“累积概率”来进行选择。
引入“适应度”与“累积概率”的概念,其中每个部分被选中的概率与其适应度值成比例。设某一部分x(i)的适应度值表示为f(xi),该部分被选中的概率为p(xi),累积概率为q(xi),对应的计算公式如下:
累积概率表示每个个体之前所有个体的选择概率之和。
用一个抽奖的粒子,看看累积概率。
奖项 | 参与奖 | 三等奖 | 二等奖 | 一等奖 |
抽中概率 | 0.4 | 0.3 | 0.2 | 0.1 |
累积概率 | 0.4 | 0.7 | 0.9 | 1 |
过程:
- 计算每个个体的被选中概率p(xi)
- 计算每个部分的累积概率q(xi)
- 随机生成一个数组m,数组中的元素取值范围在0和1之间,并将其按从小到大的方式进行排序。若累积概率q(xi)大于数组中的元素m[i],则个体x(i)被选中,若小于m[i],则比较下一个个体x(i+1)直至选出一个个体为止。
测试代码
以上边的抽奖问题测试
clc;clear;
fitvalue=[4 3 2 1]; %奖项对应的适应度值
totalf=sum(fitvalue); %适应值之和
p=fitvalue./totalf; %单个个体被选中的概率
q=cumsum(p); %每个个体的累积概率
c1=0; %用于存放编号1被选中的次数
c2=0; %用于存放编号2被选中的次数
c3=0; %用于存放编号3被选中的次数
c4=0; %用于存放编号4被选中的次数
while c1+c2+c3+c4<=9996
fitin=1;
newin=1;
m=sort(rand(4,1)); %生成一组从小到大排列的随机数组
while newin<=4
if q(fitin)>m(newin)
s(newin)=fitin; %s用来存放每次被选中的个体的编号
switch s(newin)
case 1
c1=c1+1;
case 2
c2=c2+1;
case 3
c3=c3+1;
case 4
c4=c4+1;
end
newin=newin+1;
else
fitin=fitin+1;
end
end
end
pc1=c1/(c1+c2+c3+c4);
pc2=c2/(c1+c2+c3+c4);
pc3=c3/(c1+c2+c3+c4);
pc4=c4/(c1+c2+c3+c4);
disp('***************************************')
disp(['抽中“参与奖”的次数为:',num2str(c1)]);
disp(['抽中“参与奖”的概率为:',num2str(pc1)]);
disp('***************************************')
disp(['抽中“三等奖”的次数为:',num2str(c2)]);
disp(['抽中“三等奖”的概率为:',num2str(pc2)]);
disp('***************************************')
disp(['抽中“二等奖”的次数为:',num2str(c3)]);
disp(['抽中“二等奖”的概率为:',num2str(pc3)]);
disp('***************************************')
disp(['抽中“一等奖”的次数为:',num2str(c4)]);
disp(['抽中“一等奖”的概率为:',num2str(pc4)]);
disp('***************************************')
测试结果:
结论:测试10000次,结果和设置的选中概率基本一致了。
应用:
遗传算法中,如果没有“依概率接受”,那么意味着每次都是按照分值的高低排序来选择,这样可能容易陷入局部最优,而无法获得全局最优解。使用了轮盘赌则可以更加修正陷入局部最优这个问题。
蚁群算法中,处理TSP问题时,用轮盘赌选择下一个城市。
小白一个,参照多篇,自我总结,侵删(私聊我),勿喷!!!