典型JSP车间调度问题学习8

轮盘赌策略的复制实现

 

复制也叫选择操作 

下面介绍一下轮盘赌算法

产生一个随机数 :

然后将每个时间进行一个排序 

然后做一个比较大的值:比如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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值