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 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

結果:




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM