求解下面图形中的问题![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/3875d20e0b7705027e46c1316837d6d7.png)
%%%%%%%%%%%%%%%%%f(x,y)=(1+((x+y+1)^2)*(19-14*x+3*x*x-14*y+6*x*y+3*y*y))*(30+((2*x-3*y)^2)*(18-32*x+12*x*x+48*y-*x*y+27*y*y))%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%用GA算法求解问题%%%%%%%%%%%
clear all;
clc;
x=-2:0.01:2;
y=-2:0.01:2;
N=size(x,2);
for i = 1:N
for j = 1:N
z(i,j)=(1+((x(i)+y(j)+1).^2)*(19-14*x(i)+3*x(i)*x(i)-14*y(j)+6*x(i)*y(j)+3*y(j)*y(j)))*(30+((2*x(i)-3*y(j)).^2)*(18-32*x(i)+12*x(i)*x(i)+48*y(j)-36*x(i)*y(j)+27*y(j)*y(j)));
end
end
mesh(x,y,z)
xlabel('x')
ylabel('y')
采用君主法遗传算法进行求解
%%%%%%%%%%%%%用GA算法求解问题%%%%%%%%%%%
%%%%%%%%%%%%%%%%%f(x,y)=(1+((x+y+1)^2)*(19-14*x+3*x*x-14*y+6*x*y+3*y*y))*(30+((2*x-3*y)^2)*(18-32*x+12*x*x+48*y-*x*y+27*y*y))%%%%%%%%%%%%%%%%
clear all;
close all;
clc;
NP=100;
D=2;
Xs=2;
Xx=-2;
G=1000;
f=zeros(D,NP);
nf=zeros(D,NP);
Pc=0.8;
Pm=0.1;
f=rand(D,NP)*(Xs-Xx)+Xx;
for np=1:NP
MSLL(np)=func(f(:,np));
end
[SortMSLL,Index] = sort(MSLL);
Sortf=f(:,Index);
for gen = 1:G
Emper = Sortf(:,1);%君主染色体
NoPoint = round(D*Pc);
PoPoint=randi([1 D],NoPoint,NP/2);
nf = Sortf;
for i = 1:NP/2
nf(:,2*i-1)=Emper;
nf(:,2*i)=Sortf(:,2*i);
for k = 1:NoPoint
nf(PoPoint(k,i),2*i-1)=nf(PoPoint(k,i),2*i);
nf(PoPoint(k,i),2*i)=Emper(PoPoint(k,i));
end
end
for m = 1:NP
for n = 1:D
r = rand(1,1);
if r<Pm
nf(n,m)=rand(1,1)*(Xs-Xx)+Xx;
end
end
end
for np = 1:NP
NMSLL(np)=func(nf(:,np));
end
[NSortMSLL,Index]=sort(NMSLL);
NSortf=nf(:,Index);
f1 = [Sortf,NSortf];
MSLL1=[SortMSLL,NSortMSLL];
[SortMSLL1,Index]=sort(MSLL1);
Sortf1=f1(:,Index);
SortMSLL=SortMSLL1(1:NP);
Sortf=Sortf1(:,1:NP);
trace(gen)=SortMSLL(1);
end
Bestf=Sortf(:,1)
trace(end)
figure
plot(trace)
xlabel('迭代次数 m')
ylabel('目标函数值')
title('适应度进化曲线')
结果如图所示
采用PSO算法编程求解问题
%%%%%%%%%%%%%采用PSO算法编程求解问题%%%%%%%%%%%%%
clear all;
close all;
clc;
N=100;
D=2;
T=200;
c1=1.5;
c2=1.5;
w=0.8;
Xmax=2;
Xmin=-2;
Vmax=1;
Vmin=-1;
%%%%%%%%%%%%%%%%%%%初始化种群个体%%%%%%%%%%%%%%%%%%%
x=rand(N,D)*(Xmax-Xmin)+Xmin;
v=rand(N,D)*(Vmax-Vmin)+Vmin;
%%%%%%%%%%%%%%%初始化个体最优位置和最优解%%%%%%%%%%%
p=x;
pbest=ones(N,1);
for i = 1:N
pbest(i) = func(x(i,:));
end
%%%%%%%%%%%初始化全局最优位置和最优值%%%%%%%%%%%%%%%
g=ones(1,D);
gbest=inf;
for i = 1:N
if (pbest(i) < gbest)
g=p(i,:);
gbest=pbest(i);
end
end
gb=ones(1,T);
%%%%%%%%%%%%按照公式依次迭代直到满足精度或者迭代次数
for i = 1:T
for j = 1:N
%%%%%%%%%%%更新个体最优位置和最优解%%%%%%%
if(func(x(j,:))<pbest(j))
p(j,:)=x(j,:);
pbest(j)=func(x(j,:));
end
%%%%%%%%%%%%更新全局最优位置和最优值%%%%%%%
if(pbest(j)<gbest)
g=p(j,:);
gbest=pbest(j);
end
%%%%%%%%%%更新位置和速度值%%%%%%%%%%%%%%%%
v(j,:)=w*v(j,:)+c1*rand*(p(j,:)-x(j,:))+c2*rand*(g-x(j,:));
x(j,:)=x(j,:)+v(j,:);
%%%%%%%%边界条件处理%%%%%%%%%%%%%%%%%%%%%%
for ii = 1:D
if (v(j,ii)>Vmax)|(v(j,ii)<Vmin)
v(j,ii)=rand*(Vmax-Vmin)+Vmin;
end
if(x(j,ii)>Xmax)|(x(j,ii)<Xmin)
x(j,ii)=rand*(Xmax-Xmin)+Xmin;
end
end
end
%%%%%%%%%%%%%%%%%%记录历代全局最优值%%%%%%%%%%
gb(i)=gbest;
end
g;
figure
plot(gb)
xlabel('迭代次数')
ylabel('适应度值')
title('适应度进化曲线2')
结果如下:
用IA算法编程求解问题
%%%%%%%%使用IA算法解决问题%%%%%%%%%%%%%%%%
clear all;
close all;
clc;
D=2;
NP=100;
Xs=2;
Xx=-2;
G=500;
pm=0.7;
alfa=1;
belta=1;
detas=0.2;
gen=0;
Nc1=10;
deta0=1*Xs;
%%%%%%%%%%%%%%%%%%%%%初始种群%%%%%%%%%%%%%%%
f=rand(D,NP)*(Xs-Xx)+Xx;
for np = 1:NP
MSLL(np) = func(f(:,np));
end
%%%%%%%%%%%%计算个体浓度和激励度%%%%%%%%%%%%%%%%%%
for np = 1:NP
for j = 1:NP
nd(j)=sum(sqrt((f(:,np)-f(:,j)).^2));
if nd(j)<detas
nd(j)=1;
else
nd(j)=0;
end
end
ND(np)=sum(nd)/NP;
end
MSLL = alfa*MSLL-belta*ND;
%%%%%%%%%%%%%%%%%%激励度按升序排列%%%%%%%%%%%%%%%%%%%%%%%%%
[SortMSLL,Index]=sort(MSLL);
Sortf=f(:,Index);
%%%%%%%%%%%%%%%%%%%免疫循环%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
while gen <G
for i = 1:NP/2
%%%%%%%%%%%%%选激励前NP/2的个体进行免疫%%%%%%%%%%%%
a=Sortf(:,i);
Na=repmat(a,1,Nc1);
deta = deta0/gen;
for j =1:Nc1
for ii = 1:D
%%%%%%%%%%%%%%变异%%%%%%%%%%%%%%%%
if rand < pm
Na(ii,j)=Na(ii,j)+(rand-0.5)*deta;
end
%%%%%%%%%%边界条件处理%%%%%%%%%%%
if (Na(ii,j)>Xs)|(Na(ii,j)<Xx)
Na(ii,j)=rand*(Xs-Xx)+Xx;
end
end
end
Na(:,1)=Sortf(:,i);
%%%%%%%%%%%%克隆抑制,保留亲和度最高的个体%%%%%%%%%
for j=1:Nc1
NaMSLL(j)=func(Na(:,j));
end
[NaSortMSLL,Index]=sort(NaMSLL);
aMSLL(i)=NaSortMSLL(1);
NaSortf=Na(:,Index);
af(:,i)=NaSortf(:,1);
end
%%%%%%%%%%免疫种群激励度%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for np=1:NP/2
for j = 1:NP/2
nda(j) = sum(sqrt((af(:,np)-af(:,j)).^2));
if nda(j) < detas
nda(j)=1;
else
nda(j)=0;
end
end
aND(np)=sum(nda)/NP/2;
end
aMSLL = alfa * aMSLL - belta*aND;
%%%%%%%%%%%%%%%种群刷新%%%%%%%%%%%%%%%%%%%%%%%%%%
bf = rand(D,NP/2)*(Xs-Xx)+Xx;
for np = 1:NP/2
bMSLL(np) = func(bf(:,np));
end
%%%%%%%%%%%%%%新生成种群激励度%%%%%%%%%%%%%%%%
for np = 1:NP/2
for j = 1:NP/2
ndc(j)=sum(sqrt((bf(:,np)-bf(:,j)).^2));
if ndc(j) < detas
ndc(j) =1;
else
ndc(j) = 0 ;
end
end
bND(np) = sum(ndc)/NP/2;
end
bMSLL=alfa*bMSLL-belta*bND;
%%%%%%%%%%%%免疫种群与新生种群合并%%%%%%%%%%%%%%%
f1=[af,bf];
MSLL1=[aMSLL,bMSLL];
[SortMSLL,Index]=sort(MSLL1);
Sortf=f1(:,Index);
gen = gen+1;
trace(gen)=func(Sortf(:,1));
end
%%%%%%%%%%%%%%%输出优化结果%%%%%%%%%%%%%%%%%%%%%%
Bestf=Sortf(:,1);
trace(end);
figure,plot(trace)
xlabel('迭代次数')
ylabel('目标函数值')
title('亲和度进化曲线')