matlab实现用免疫克隆算法求二元函数的最优值(附源码)
用免疫克隆算法求二元函数的最优值
求下面函数的最小值(最优解)
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
结果:
作者:天际使徒
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!