2021-07-20

免疫优化算法:matlab

tic
clc;
close all;
clear all;
%% *-*-*-*-*-*-*-*-*-*-*-*-*-*-初始化*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
D=2;
NP=50;% 免疫个体数目;
Xs=4;% 变量上限;
Xx=-4;% 变量下限;
G=100;% 免疫代数;
Pm=0.7;% 变异概率;
alfa=1;% 激励度系数;
belta=0.2;% 激励度系数;
detas=1;% 相似度阈值;
gen=0;
Nc1=10;% 克隆个数;
deta0=1*Xs;%领域初始范围;
%% *-*-*-*-*-*-*-*-*-*-*-*-*-*-初始种群*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
f=rand(D,NP)*(Xs-Xx)+Xx;
for np=1:NP
    Fit(np)=func1(f(:,np));
end
%% *-*-*-*-*-*-*-*-*-*-计算个体浓度和激励度*-*-*-*-*-*-*-*-*-*-*-*-*-
% *-*-*-*-*-*-*-*-*-*-*基于欧氏距离计算每个抗体之间的距离*-*-*-*-*-*-*-*-*-*-
for np=1:NP
    for j=1:NP
        nd(j)=sum(sqrt((f(:,np)-f(:,j)).^2));
        % 抗体之间的相似度,当相似度小于阈值是才会为相似度赋值1,否则是0;
        if nd(j)<detas
            nd(j)=1;
        else
            nd(j)=0;
        end
    end
    % 计算抗体浓度;
    ND(np)=sum(nd)/NP;
end
% *-*-*-*-*-*-*-*-*-*激励度算子计算激励度*-*-*-*-*-*-*-*
% 激励系数与抗体组合,构成新的抗体;
Fit=alfa*Fit-belta*ND;
[SortFit,Index]=sort(Fit);
% 由小到大排序;
Sortf=f(:,Index);
%% *-*-*-*-*-*-*-*-*-*-*-*-*-免疫循环*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
while(gen<G)
    % 激励度前NP/2个个体免疫操作,根据实际需要,自行修改;
    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
            NaFit(j)=func1(Na(:,j));
        end
        [NaSortFit,Index]=sort(NaFit);
        aFit(i)=NaSortFit(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;
    end
    aFit=alfa*aFit-belta*aND;
    %% *-*-*-*-*-*-*-*-*-*-*-*-*-种群刷新*-*-*-*-*-*-*-*-*-*-*-*-*-*
    bf=rand(D,NP/2)*(Xs-Xx)+Xx;
    for np=1:NP/2
        bFit(np)=func1(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
    bFit=alfa*bFit-belta*bND;
    %% *-*-*-*-*-*-*-*-*-*-免疫种群与新生种群合并*-*-*-*-*-*-*-*-*-*-*
    f1=[af,bf];
    Fiti=[aFit,bFit];
    [SortFit,Index]=sort(Fiti);
    Sortf=f1(:,Index);
    gen=gen+1;
    trace(gen)=func1(Sortf(:,1));
    % 当每次运算的结果与前一次结果误差小于10^(-6),结束迭代;
    if gen>20 && (trace(gen)-trace(gen-1))<10^(-6)
        break
    end
end
Best_X=Sortf(:,1);
Aim_Functio=trace(end);
plot(trace)
xlabel("免疫次数");
ylabel("目标函数");
title("亲和度进化曲线");
disp("目标函数最小值为:"+trace(end))
disp("自变量取值为:"+Best_X)
disp("共迭代了:"+gen+"次")
toc
%% *-*-*-*-*-*结束*-*-*-*-*

function result = func1(x)
% result=sum(x.^2);
% result=3*cos(x(1)*x(2))+x(1)+x(2);
% result=x+10*sin(5*x)+7*cos(4*x);
% result=5*sin(x(1)*x(2))+x(1).^2+x(2).^2;
result=3*cos(x(1)*x(2))+x(1)+x(2);
end
上一篇:vue路由


下一篇:vue项目整合UEditor看这一篇就够了