✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。
🍎个人主页:Matlab科研工作室
🍊个人信条:格物致知。
更多Matlab仿真内容点击👇
在日常生产生活中,会遇到各种各样的优化问题,例如,求到某地的“最短路径”或某种资源的“最大利用率”等。常规的解法是先通过数学建模的方式将这些问题转化成函数优化问题,之后再利用数学方法进行求解。由于所要求解的问题类型多种多样,因此,通过数学建模形成的目标函数会呈现出各种各样的数学特征,此时,采用数学方法很难求解。实数编码遗传算法由于其结构简单,在求解时不受具体问题的约束以及求解精度高等优点,自提出以来便在函数优化问题上得到了广泛使用。
%%遗传算法主函数
clc;
clear all;
close all;
warning off
%%遗传算法参数
maxgen=200; %进化代数,也即是迭代次数
sizepop=20; %种群规模,个体数,也即是染色体数
pcross=[0.6]; %交叉概率,[0,1]之间为什么写成数组的形式?
pmutation=[0.01];%变异概率,【0,1】之间
lenchrom=[1 1 1 1 1];%每个变量的字符串长度,如果是浮点型变量,则长度都为1
bound=[0,0.9*pi;
0,0.9*pi;
0,0.9*pi;
0,0.9*pi;
0,0.9*pi];
%%个初始化
individuals=struct('fitness',zeros(1,sizepop),'chrom',[]);%种群结构体
avgfitness=0;%种群平均适应度
bestfitness=0;%种群最佳适应度
bestchrom=[];%适应度最好的染色体
bf=[];%记录种群最佳适应度
af=[];%记录种群平均适应度
%%初始化种群
for i=1:sizepop
individuals.chrom(i,:)=Code(lenchrom,bound);%随机产生一个种群
x=individuals.chrom(i,:);
individuals.fitness(i)=fun(x);%计算染色体适应度
end %以上完成了初始化种群,并计算了初始化种群每个个体的适应度
%%找最好的染色体
[bestfitness bestindex]=min(individuals.fitness);%得到初始化种群的最小的适应度函数值和位置。(函数值最小,那么倒数也就是适应度就最大,在轮盘赌操作的时候再去倒数)
bestchrom=individuals.chrom(bestindex,:);%适应度最好,也就是函数值最小的染色体编号
avgfitness=sum(individuals.fitness)/sizepop;%染色体平均适应度
trace=[];%记录每一代进化中最好的适应度和平均适应度,可以用来绘图反映是否过早收敛
%%进化开始
for i=1:maxgen
%选择
individuals=Select(individuals,sizepop);%返回被选中的染色体sizepop条和对应被选中染色体的适应度
avgfitness=sum(individuals.fitness)/sizepop;%经过选择之后的种群的平均适应度
%交叉
individuals.chrom=Cross(pcross,lenchrom,individuals.chrom,sizepop,bound);%返回交叉后的染色体群
%变异
individuals.chrom=Mutation(pmutation,lenchrom,individuals.chrom,sizepop,[i,maxgen],bound);
%%非线性寻优,可以被注释掉,注释掉之后就是一般的遗传算法
%每进化10代,以所得值为初始值进行非线性寻优,这是将遗传算法和非线性规划的函数寻优算法结合起来,nonlinear
if(mod(i,10)==0)
individuals.chrom=nonlinear(individuals.chrom,sizepop);
end
%%计算适应度
for j=1:sizepop
x=individuals.chrom(j,:);
individuals.fitness(j)=fun(x);
end
%找到最优染色体及他们在种群中的位置
[newbestfitness,newbestindex]=min(individuals.fitness);
%进行更新,代替上一次进化中最好的染色体
if bestfitness>newbestfitness %如果新一代染色体的函数值小,也就是适应度高
bestfitness=newbestfitness; %那么把新的适应度赋值给bestfitness
bestchrom=individuals.chrom(newbestindex,:);%把新的当前最好的染色体给bestchrom
end
avgfitness=sum(individuals.fitness)/sizepop;
bf=[bf bestfitness];
af=[af avgfitness];
%trace=[trace,avgfitness bestfitness];%记录每一代进化中最好的适应度和平均适应度
end %进化结束
%绘制图像分析
[r,c]=size(bf);
plot([1:c],bf,'r-',[1:c],af,'b--','LineWidth',2);
title(['函数值曲线' '终止代数=' num2str(maxgen)]);
xlabel('进化代数');
ylabel('函数值');
ylim([1.5 8]);
legend('各代最佳值','各代平均值');
disp('函数值 变量');
grid on
%窗口显示
disp([bestfitness x]);
% %绘制图像分析
% [r c]=size(trace);%计算trace的行列
% figure(1)
% plot([1:r]',trace(:,1),'r-',[1:r]',trace(:,2),'b--');
% title(['函数值曲线' '终止代数=' num2str(maxgen)]);
% xlabel('进化代数');
% ylabel('函数值');
% legend('各代平均值','各代最佳值');
% disp('函数值 变量');
% grid on
% %窗口显示
% disp([bestfitness x]);
[1]王雪峰. 用于函数优化问题的实数编码遗传算法的改进及并行化实现[D]. 河北大学.
[2]张强, 邢长征. 基于遗传算法智能组卷实数编码的应用[J]. 科技信息, 2008.
❤️ 关注我领取海量matlab电子书和数学建模资料
❤️部分理论引用网络文献,若有侵权联系博主删除