轮盘赌策略的复制实现
复制也叫选择操作
下面介绍一下轮盘赌算法
产生一个随机数 :
然后将每个时间进行一个排序
然后做一个比较大的值:比如max*1.2=
再拿该值减去每一个数据
这么一看显然,目标函数值越小,存活下来的概率越大,那么如何将这些新的数据和前面随机数来比较呢?需要变成0-1之间的数
1.将新的数据求和
2.新数依次除以求和数
该部分程序实现要在主程序中完成
%初始化算法参数
crossRate=0.5;%交叉概率
muteRate=0.3; %变异概率
maxGeneration=1; %最大迭代次数
nowGeneration=0; %当前迭代代数
optChrome=chrome1; %最优迭代方案
optFitness=finishT;
%迭代循环程序-包含终止条件
while nowGeneration<maxGeneration
%1.复制操作
chromes=copyChromes(chromes,dt); %根据此函数,使用轮盘赌策略把chromes复制一下,形成新的chromes
%2.交叉操作
disp(['generation:' int2str(nowGeneration)]);
disp(chromes);
chromes=crossChromes(chromes,crossRate);
disp(chromes);
%3.变异操作
%chromes=muteChromes(chromes);
nowGeneration=nowGeneration+1;
Step2
:复制程序设计:
Step2.1
:计算种群每条染色体的适应度值
‐
数组,
fitnesses
Step2.2
:将适应度数组升序排序,同时保留对应适应度值的编码序号,利用
sortrows函数;
Step2.3
:获得每个染色体的遗传参考值、归一化值、累积概率值;
Step2.4
:从现有的
pop
【
20
】个染色体中根据轮盘赌选择
pop
【
20
】个染色体,形成新种群
%复制操作
function outChromes=copyChromes(inChromes,data)
outChromes=zeros(size(inChromes)); %根据inchromes生成同等规模的outchromes
%step1:计算每条染色体的适应度值,放到数组中
pop=size(inChromes,1); %种群数为输入染色体的行数
fitnesses=zeros(pop,1); %将每条染色体的适应度值存起来,用于存储每条染色体的适应度值
for i=1:pop
sch=createSchedule(data,inChromes(i,:)); %对种群中的第i条染色体计算其详细的调度方案
fit=fitness(sch);
fitnesses(i)=fit;
end
[fit2,chromeId]=sortrows(fitnesses,1); %如[b c]=sortrows(a,1),则b为a数列第一列由小到大排序,c为排序后的数值对应原来的数组中的行号,所以这里fit2是排序后的适应度值(从小到大排序),chromeId是在原来chrome中的行号
maxVal=max(fit2)*1.2; %排序完后需要我们的选择参考值,1.2为自己选择,fit3为我们得到的选择参考值
fit3=maxVal-fit2;
sumFit=sum(fit3); %求得参考值的和
oneFit=fit3/sumFit; %归一化处理
finalFit=zeros(pop,1);
for i=1:pop
finalFit(i)=sum(oneFit(1:i)); %求累加得到累积概率值
end
%轮盘赌算法的实现
for i=1:pop
midVal=rand(); %生成0-1之间的随机数,然后和finalfit(i)做对比,如果第一个就比它小,就选这个目标函数值对应的染色体放到新的种群中去
if midVal<finalFit(1)
outChromes(i,:)=inChromes(chromeId(1),:);
else
for j=1:pop-1
if midVal>=finalFit(j)&&midVal<finalFit(j+1)
outChromes(i,:)=inChromes(chromeId(j+1),:);
break;
end
end
end
end
end