% 案例五:多目标多变量带约束函数的最大值
%{
主程序:用遗传算法求解 y1=x1.*x1+x2.*x2-x1.*x2-2*x2.*x3-3*x1.*x3
y2=x1.*x1+x3.*x3-x1.*x2-x2.*x3-x1.*x3
在满足-5<x1<12、-6<x2<5、-3<x3<10
且x1+x2>2*x3、x1.*x1+x2>=-x3约束条件下的最小值
%}
%% 清空环境变量
clear
close all
clc
%% 初始化遗传算法参数
%初始化参数
nvars=3; %变量个数
lb=[-5 -6 -3]; %每个变量的范围下限 如果x没有下限 则输入-inf 比如lb=[-5 -6 -inf]
ub=[12 5 10]; %每个变量的范围上限 如果x没有上限 则输入inf 比如ub=[12 5 inf]
maxgen=1000; %进化代数,即迭代次数
sizepop=50; %种群规模
pcross=0.8; %交叉概率选择,0和1之间
pmutation=0.2; %变异概率选择,0和1之间
lenchrom=ones(1,nvars); %每个变量的字串长度,如果是浮点变量,则长度都为1
bound=[lb;ub]';
individuals=struct('fitness',zeros(1,sizepop), 'chrom',[]); %将种群信息定义为一个结构体
avgfitness=[]; %每一代种群的平均适应度
bestfitness=[]; %每一代种群的最佳适应度
bestchrom=[]; %适应度最好的染色体
%% 初始化种群计算适应度值
% 初始化种群
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=[avgfitness bestfitness];
%% 迭代寻优
% 进化开始
for i=1:maxgen
i
% 选择
individuals=select(individuals,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);
% 计算适应度
for j=1:sizepop
x=individuals.chrom(j,:); %解码
individuals.fitness(j)=fun(x);
end
%找到最小和最大适应度的染色体及它们在种群中的位置
[newbestfitness,newbestindex]=min(individuals.fitness);
[worestfitness,worestindex]=max(individuals.fitness);
% [y y1(i) y2(i)]=fun(individuals.chrom(newbestindex,:));
% 代替上一次进化中最好的染色体
if bestfitness>newbestfitness
bestfitness=newbestfitness;
bestchrom=individuals.chrom(newbestindex,:);
end
individuals.chrom(worestindex,:)=bestchrom;
individuals.fitness(worestindex)=bestfitness;
avgfitness=sum(individuals.fitness)/sizepop;
trace=[trace;avgfitness bestfitness]; %记录每一代进化中最好的适应度和平均适应度
end
%进化结束
g_best=bestchrom;
[bestfitness,bestfitness1,bestfitness2]=fun(g_best);
%% 结果分析
[r c]=size(trace);
% figure(1)
% hand1=plot([1:r]',trace(:,2))
% set(hand1,'linestyle','-','linewidth',1.5)
% hold on
% hand2=plot([1:r]',trace(:,1))
% set(hand2,'color','r','linestyle','-','linewidth',1.5)
% xlabel('进化代数');ylabel('最佳/平均适应度');xlim([1 maxgen]);
% legend('最佳适应度','平均适应度')
% title('适应度曲线','fontsize',12);
% hold off
figure(1)
hand1=plot([1:r]',trace(:,2));
set(hand1,'linestyle','-','linewidth',1.5)
xlabel('进化代数');ylabel('最佳适应度');xlim([1 maxgen]);
title('适应度曲线','fontsize',12);
hold off
% figure(2)
% scatter(y1,y2,'r*')
% xlabel('y1')
% ylabel('y2')
% grid minor
disp('最优解')
disp(g_best)
disp('最优值')
disp([bestfitness1,bestfitness2])