轮盘赌算法的实现
(1)基本原理
占比越大被选中的可能性就越大;各个个体被选中的概率与其适应度函数值大小成正比,它是为了防止适应度数值较小的个体被直接淘汰而提出的。
①个体选择概率:
适应度数值越高,它被选中的概率就越大。P=f/Σf
②累积概率:
把各个个体的概率使用不同长度的线段来表示,这些线段组合成一条直线,直线的长度为1。
(2)保留精英的轮盘赌策略
因为轮盘赌算法可能会失去上一代中的最优个体,通过复制最佳个体直接进入新一代种群,以防止通过遗传操作而导致种群中的最优个体消失。
轮盘赌选择并不要求对个体先按适应度值从大到小或者从小到大排列。
(3)实例1
function index=RouletteWheelSelection(V,m)
%用Roulette Wheel Selection法选择m个个体
% Input:
% V -----待挑选种群中每个个体的重要性指标(如适应度等)
% m -----选择的个体数
% Output:
% index -----挑选的m个体的位置索引
%Tips:当V为全零向量时,该算法无效,将随机选择个体;否则算法将从重要性指标不为0的个体中选择。
n=size(V,2);%待挑选的个体数
if max(V)==0&min(V)==0%如果V是全零向量,随机选择
index=ceil(rand(1,m)*n);
else
%将适应度为0的个体驱逐出待选择范围
temindex=find(V~=0);
n=length(temindex);%待挑选的个体数目降低
V=V(temindex);
index=zeros(1,m);
%[V,I]=sort(V,'descend');
V=cumsum(V)/sum(V);
pp=rand(1,m);
for i=1:m,
for j=1:n,
if pp(i)<V(j)
index(i)=j;
break
end
end
end
index=temindex(index);
end
(4)实例2
c=[900,80,200,100];%假设这是目标矩阵,需要对其进行选择
value_sum=sum(c);
cc=c./value_sum;
r=rand(1);
pc=cumsum(cc,2);%求累加和
tar=find(pc>=r);%返回pc中大于r的位置索引
chose_next=tar(1);%会返回多个大于r的元素的位置,但我们只取第一个元素
(5)实例3
clc;
clear all;
syd=[0.23 0.65 0.38 0.96 0.14 0.76 0.99 0.76 0.56 0.77];%模拟适应度值,数量为10个
%计算个体概率P
P=[];%个体概率按顺序存入数组P中
for i=1:length(syd)
P=[P syd(i)/sum(syd)];
end
%对P中各个个体做计算累加概率Q
%Q对应模拟各个体概率的一条直线,在直线上根据个体概率分成了10个段,段的宽度越长,随机被选中的概率就越大
Q=[];
Q(1)=P(1);
for j=2:length(P)
Q(j)=P(j)+Q(j-1);
end
%在[0,1]内产生一个均匀分布的随机数r
%若r≤Q(1),则第一个适应度值对应的个体被选中
%否则 若r满足Q(k-1)<=r<Q(k),则适应度值对应的个体j被选中
flage=1;%循环标志
count=1;%循环100次,判断各个个体被选中的次数
z1=0;%个体1统计变量
z2=0;%个体2统计变量
z3=0;%个体3统计变量
z4=0;%个体4统计变量
z5=0;%个体5统计变量
z6=0;%个体6统计变量
z7=0;%个体7统计变量
z8=0;%个体8统计变量
z9=0;%个体9统计变量
z10=0;%个体10统计变量
while(flage)
r=rand();%在[0 1]之间产生随机一个数
%判断该数字所在的区间
if r<=Q(1)
z1=z1+1;
else if r<=Q(2)
z2=z2+1;
else if r<=Q(3)
z3=z3+1;
else if r<=Q(4)
z4=z4+1;
else if r<=Q(5)
z5=z5+1;
else if r<=Q(6)
z6=z6+1;
else if r<=Q(7)
z7=z7+1;
else if r<=Q(8)
z8=z8+1;
else if r<=Q(9)
z9=z9+1;
else if r<=Q(10)
z10=z10+1;
end
end
end
end
end
end
end
end
end
end
if count==100
flage=0;
end
count=count+1;
end
num=[z1 z2 z3 z4 z5 z6 z7 z8 z9 z10]; %方便统计
num
(6)实例4
D = 5;
P = [1, 1, 1, 1, 1]./D; %占比概率(等概率矩阵)用来选择1~5
m = length(P);
num = 10000; %运行一万次
Select = zeros(1, num);
r = rand(1, num);
for i=1:num
sumP = 0;
j = ceil(m*rand); %产生1~m之间的随机整数
while sumP < r(i)
sumP = sumP + P(mod(j-1, m)+1);
j = j+1;
end
Select(i) = mod(j-2, m)+1;
end
average_S = mean(Select)