1 简介
融合遗传算法和模拟退火算法可以克服遗传算法局部搜索能力差的缺点,达到兼顾算法全局和局部搜索能力的目的。模拟退火部分是对经过遗传操作的个体重新计算适应度并以一定的概率替换旧个体形成新种群。
2 部分代码
clc clear % 参数定义 maxgen=4000; % 进化代数,即迭代次数 sizepop=100; % 种群规模 fselect='roulette'; % 染色体的选择方法,您可以选择:锦标赛法- 'tournament';轮盘赌法-'roulette' fcode='float'; % 编码方法,您可以选择:浮点法-'float';grey法则--'grey';二进制法-'binary' pcross=[0.7]; % 交叉概率选择,0和1之间 fcross='float'; % 交叉方法选择,您可以选择: 浮点交叉-'float';单点交叉-'simple';均匀交叉-'uniform' pmutation=[0.05]; % 变异概率选择,0和1之间 fmutation='float'; % 变异方法选择,您可以选择:浮点法-'float';单点法-'simple'; N=50; %维数 lenchrom=rep([1],[1,N]); % 每个变量的字串长度,如果是浮点变量,则长度都为1 %lenchorm=300; bound=rep([-100,100],[N,1]); % 变量取值范围 BEST=[]; %存放最优解 XX=[]; %记录多次实验最优解对应的x值 FN=[]; %记录每次实验的计算次数 % 目标函数(本算法以目标函数值为适应度) %x=1:1:N; %AimFunc(x); for M=1:1:100 % 随机产生一个种群 nn=0; x=[]; for i=1:sizepop individuals.chrom(i,:)=Code(lenchrom,fcode,bound); % 编码(binary和grey的编码结果为一个实数,float的编码结果为一个实数向量) x=Decode(lenchrom,bound,individuals.chrom(i,:),fcode); % 解码(binary和grey的解码结果为一个二进制串,float的解码结果为一个实数向量) % 计算适应度 % 修改处 % individuals.fitness(i)=AimFunc(x,heli,id_data,0); individuals.fitness(i)=AimFunc3(x); % 染色体的适应度 nn=nn+1; % FN=[FN;nn]; %将所有的函数值放在一个矩阵中 end % 找最好的染色体 [bestfitness, bestindex]=min(individuals.fitness); bestchrom=individuals.chrom(bestindex,:); % 最好的染色体 avgfitness=sum(individuals.fitness)/sizepop; % 染色体的平均适应度 % 记录每一代进化中最好的适应度和平均适应度 trace=[avgfitness bestfitness]; % 设置模拟退火算法参数 T=100; % 初始温度 a=0.98; % 温度降低参数 kkk=1; % 记录模拟退火次数 % 进化开始 for i=1:maxgen % 选择 individuals=Select(individuals,sizepop,fselect); avgfitness=sum(individuals.fitness)/sizepop; % 交叉 [ret1,ret2]=Cross(pcross,lenchrom,individuals.chrom,sizepop,fcross,[i maxgen],fcode,bound,individuals.fitness,bestfitness,avgfitness,nn); individuals.chrom=ret1; nn=ret2; % 变异 [ret1,ret2]=Mutation(pmutation,lenchrom,individuals.chrom,sizepop,fmutation,[i maxgen],fcode,bound,individuals.fitness,bestfitness,avgfitness,nn); individuals.chrom=ret1; nn=ret2; % 计算适应度 for j=1:sizepop x=Decode(lenchrom,bound,individuals.chrom(j,:),fcode); %解码 % 修改处 individuals.fitness(j)=AimFunc3(x); nn=nn+1; end % 找到最小和最大适应度的染色体及它们在种群中的位置 [newbestfitness,newbestindex]=min(individuals.fitness); [worestfitness,worestindex]=max(individuals.fitness); % 代替上一次进化中最好的染色体 if bestfitness>newbestfitness bestfitness=newbestfitness; bestchrom=individuals.chrom(newbestindex,:); else bh=bestfitness-newbestfitness; cc(kkk)=bh/T; aa(kkk)=exp(bh/T); if exp(1000*bh/T)>rand kkk=kkk+1; bestfitness=newbestfitness; bestchrom=individuals.chrom(newbestindex,:); end end T=T*a; %温度降低 individuals.chrom(worestindex,:)=bestchrom; individuals.fitness(worestindex)=bestfitness; avgfitness=sum(individuals.fitness)/sizepop; % 记录每一代进化中最好的适应度和平均适应度 trace=[trace;avgfitness bestfitness]; x=Decode(lenchrom,bound,bestchrom,fcode); end BEST=[BEST;bestfitness]; FN=[FN;nn]; XX=[XX;x]; end % 画出适应度曲线 hfig=findobj('Tag','trace'); % See if it is open if ishandle(hfig) figure(hfig); else hfig=figure('Tag','trace'); end figure(hfig); [r c]=size(trace); plot([1:r]',trace(:,1),'r-',[1:r]',trace(:,2),'b--'); title(['适应度曲线 ' '终止代数=' num2str(maxgen)]); xlabel('进化代数');ylabel('适应度'); legend('平均适应度','最佳适应度'); % axis([1 r 0 1]) %disp('适应度 变量'); %x=Decode(lenchrom,bound,bestchrom,fcode); % 窗口显示 %disp([bestfitness x]); disp('最优解集合'); BEST disp('实验次数集合'); FN disp('最优解对应的x的矩阵'); XX Final=[BEST FN XX]; %disp('组合') %Final xlswrite('fitness3(50维)',Final);
3 仿真结果
4 参考文献
[1]刘瑞瑞. 基于遗传模拟退火算法的三维离线装箱优化问题研究. Diss. 吉林大学.
部分理论引用网络文献,若有侵权联系博主删除。
5 MATLAB代码与数据下载地址
见博客主页