用免疫克隆算法求二元函數的最優值
求下面函數的最小值(最優解)
Goldstein-Price
函數:
f1(x)=[1+(x1+x2+1)2(19-14x1+3x12-14x2+6x1x2+3x22)]*[30+(2x1-3x2)2(18-32x1+12x12+48x2-36x1x2+27x22)]
-2≤x1,x2≤2
要求:(1)用免疫克隆算法編程求解問題
編程語言用MATLAB
或C
或Java
輸出問題的最優解、並繪圖顯示
代碼:bestvalue.m
clear all;
clc;
figure
[x,y]=meshgrid(-2:0.01:2,-2:0.01:2);
z=(1+((x+y+1).^2).*(19-14.*x+3.*x.^2-14.*y+6.*x.*y+3.*y.^2)).*(30+(2.*x-3.*y).^2.*(18-32.*x+12.*x.^2+48.*y-36.*x.*y+27.*y.^2));
mesh(x,y,z)
xlabel('x')
ylabel('y')
hold on
%初始化
D=2; %免疫個體維數
NP=50; %免疫個體數目
Xs=4; %上限
Xx=-4; %下限
G=50; %最大免疫代數
pm=0.7; %變異概率
alfa=2; %激勵度參數
belta=1; %激勵度參數
detas=0.2; %相似度閾值
gen=0; %免疫代數
Nc1=5; %克隆個數
deta0=0.5*Xs; %鄰域范圍初值
%初始種群
f=rand(D,NP)*(Xs-Xx)+Xx;
for np=1:NP
MSLL(np)=fun(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
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=fun(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)=fun(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=sum(ndc)/NP/2;
end
bMSLL=alfa*bMSLL-belta*bND;
%免疫種群與新生種群合並
f1=[af,bf];
MSLL=[aMSLL,bMSLL];
[SortfMSLL,Index]=sort(MSLL);
Sortf=f1(:,Index);
gen=gen+1;
trace(gen)=fun(Sortf(:,1));
end
%輸出優化結果
Bestf=Sortf(:,1);
trace(end);
disp('最優值為:')
disp(trace(end))
disp('最優個體為:')
disp(Bestf)
plot3(Bestf(1), Bestf(2), trace(end),'bo','linewidth',1.5)
figure
plot(trace)
xlabel('迭代次數')
ylabel('目標函數值')
title('親和度進化曲線')
%親和度函數
%目標函數
function v=fun(x)
v=((1+(x(1)+x(2)+1).^2).*(19-14.*x(1)+3.*x(1).^2-14.*x(2)+6.*x(1).*x(2)+3.*x(2).^2)).*(30+(2.*x(1)-3.*x(2)).^2.*(18-32.*x(1)+12.*x(1).^2+48.*x(2)-36.*x(1).*x(2)+27.*x(2).^2));
end
結果: