• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

matlab实现用免疫克隆算法求二元函数的最优值(附源码)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

用免疫克隆算法求二元函数的最优值

求下面函数的最小值(最优解)

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 CJava

​ 输出问题的最优解、并绘图显示

​ 代码: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

结果:




鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
极化码的matlab仿真(3)——SC译码(2)发布时间:2022-07-18
下一篇:
Matlab解释器模式发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap