Código MATLAB para aprendizado de máquina - algoritmo de otimização de baleia baseado em melhoria de estratégia mista (6)

- Algoritmo de otimização de baleia aprimorado com base em estratégias mistas

o código

Nomenclatura geral do código: os seguintes códigos estão em ordem
insira a descrição da imagem aqui

1、

clear;
clc;
%% A和a的变化图
dim = 1;
Max_iter = 500;
% figure;
for t = 1:Max_iter
    origin_a = 2-t*((2)/Max_iter);
    if t <= 0.5*Max_iter
        a = 1+cos(pi*t/Max_iter);
    else
        a = cos(pi*(t-0.5*Max_iter)/Max_iter);
    end
    
    A = 2*a*rand(1, dim)-a;

    plot(t, a, 'r.-', t, origin_a, 'k.-');
    hold on;
    plot(t, A, 'b.', 'MarkerSize', 16);
    hold on;
end
xlabel '迭代次数'; ylabel '参数取值';
legend('提出的a', '原始的a', 'A');


2、

function [fitnessgbest, gbest, BestCost] = ABC(X, N, MaxIt, lb, ub, dim, fobj)

%% 问题设定
VarSize = [1, dim];

%% ABC参数
nPop = N;                   % 蜂群大小
nOnlooker = nPop;        % 侦察蜂个数
L = round(0.6*dim*nPop); % 探索极值限制参数
a = 1;                              % 加速度系数上限

%% 初始化
% 产生初始种群
for i = 1:nPop
    fitness(i) = fobj(X(i, :));
end
[bestfitness, bestindex] = min(fitness);
gbest = X(bestindex, :);
fitnessgbest = bestfitness;
% 丢解计数器
C = zeros(nPop, 1);
% 保存最优函数值的数组
BestCost = zeros(MaxIt, 1);

%% ABC迭代
for it = 1:MaxIt
    % 引领蜂
    for i = 1:nPop
        % 随机选择不等于i的k
        K = [1:i-1 i+1:nPop];
        k = K(randi([1 numel(K)]));
        % 定义加速度系数
        phi = a*unifrnd(-1, +1, VarSize);
        % 新的蜜蜂位置
        newbee_X(i, :) = X(i, :)+phi.*(X(i, :)-X(k, :));
        % 边界处理
        newbee_X(i, :) = max(newbee_X(i, :), lb);
        newbee_X(i, :) = min(newbee_X(i, :), ub);
        % 新的蜜蜂函数值
        newbee_fitness(i) = fobj(newbee_X(i, :));
        % 比较
        if newbee_fitness(i) <= fitness(i)
            X(i, :) = newbee_X(i, :);
            fitness(i) = newbee_fitness(i);
        else
            C(i) = C(i)+1;
        end
    end
    % 计算适应度值和选择概率
    F = zeros(nPop, 1);
    MeanCost = mean(fitness);
    for i = 1:nPop
        % 将函数值转换为适应度
        if fitness(i) >= 0
            F(i) = 1/(1+fitness(i));
        else
            F(i) = 1+abs(fitness(i));
        end
    end
    P = F/sum(F);
    % 跟随蜂
    for m = 1:nOnlooker
        % 选择食物源
        i = RouletteWheelSelection(P);
        % 随机选择不等于i的k
        K = [1:i-1 i+1:nPop];
        k = K(randi([1 numel(K)]));
        % 定义加速度系数
        phi = a*unifrnd(-1, +1, VarSize);
        % 新的蜜蜂位置
        newbee_X(i, :) = X(i, :)+phi.*(X(i, :)-X(k, :));
        % 边界处理
        newbee_X(i, :) = max(newbee_X(i, :), lb);
        newbee_X(i, :) = min(newbee_X(i, :), ub);
        % 新的蜜蜂函数值
        newbee_fitness(i) = fobj(newbee_X(i, :));
        % 比较
        if newbee_fitness(i) <= fitness(i)
            X(i, :) = newbee_X(i, :);
            fitness(i) = newbee_fitness(i);
        else
            C(i) = C(i) + 1;
        end
    end
    % 侦察蜂
    for i = 1:nPop
        if C(i) >= L    % 超出探索极值参数
            maxPos = max(X(i, :));
            minPos = min(X(i, :));
            for j = 1:numel(X(i, :))
                X(i, j) = minPos+rand*(maxPos-minPos);
            end
            fitness(i) = fobj(X(i, :));
            C(i) = 0;
        end
    end
    % 更新每轮最优解
    for i = 1:nPop
        if fitness(i) <= fitnessgbest
            gbest = X(i, :);
            fitnessgbest = fitness(i);
        end
    end
    % 保存每轮最优解
    BestCost(it) = fitnessgbest;
    % 显示迭代信息
    disp(['ABC: At iteration ', num2str(it), ' ,the best fitness is ', num2str(BestCost(it))]);
end
    
% %% 结果显示
% figure;
% % plot(BestCost, 'LineWidth', 2);
% semilogy(BestCost, 'r', 'LineWidth', 2);
% xlabel('Iteration');
% ylabel('Best Cost');
% grid on;

3、

function [fmin, best_pos, Curve] = BOA(X, N, Max_iter, lb, ub, dim, fobj)

%% BOA参数
p = 0.8;                            % 开关概率
power_exponent = 0.1;
sensory_modality = 0.01;

for i = 1:N
    fitness(i) = fobj(X(i, :));
end

% 最优解
[fmin, I] = min(fitness);
best_pos = X(I, :);
S = X;

%% 迭代
for t = 1:Max_iter
    for i = 1:N
        % 计算与目标函数相关的每只蝴蝶的香味
        Fnew = fobj(S(i, :));
        FP = (sensory_modality*(Fnew^power_exponent));
        
        % 全局或局部搜索
        if rand < p
            dis = rand * rand * best_pos - X(i, :);        % Eq. (2) in paper
            S(i, :) = X(i, :)+dis*FP;
        else
            % 在附近随机找蝴蝶
            epsilon = rand;
            JK = randperm(N);
            dis = epsilon*epsilon*X(JK(1), :)-X(JK(2), :);
            S(i, :) = X(i, :)+dis*FP;                             % Eq. (3) in paper
        end
        
        % 边界处理
        S(i, :) = simplebounds(S(i, :), lb, ub);
        
        % 新的个体适应度值
        Fnew = fobj(S(i, :));  % Fnew represents new fitness values
        
        % If fitness improves (better Xutions found), update then
        if Fnew <= fitness(i)
            X(i, :) = S(i, :);
            fitness(i) = Fnew;
        end
        
        % 更新当前全局最优解
        if Fnew <= fmin
            best_pos = S(i, :);
            fmin = Fnew;
        end
    end
    
    Curve(t) = fmin;
    
    % 更新感觉因子
    sensory_modality = sensory_modality_NEW(sensory_modality, Max_iter);
    
    disp(['BOA: At iteration ', num2str(t), ' ,the best fitness is ', num2str(Curve(t))]);
end

% Boundary constraints
function s=simplebounds(s,Lb,Ub)
% Apply the lower bound
ns_tmp=s;
I=ns_tmp<Lb;
ns_tmp(I)=Lb;

% Apply the upper bounds
J=ns_tmp>Ub;
ns_tmp(J)=Ub;
% Update this new move
s=ns_tmp;
end

function y=sensory_modality_NEW(x, Ngen)
y = x+(0.025/(x*Ngen));
end

end


4、

%_________________________________________________________________________%
%  Whale Optimization Algorithm (WOA) source codes demo 1.0               %
%                                                                         %
%  Developed in MATLAB R2011b(7.13)                                       %
%                                                                         %
%  Author and programmer: Seyedali Mirjalili                              %
%                                                                         %
%         e-Mail: ali.mirjalili@gmail.com                                 %
%                 seyedali.mirjalili@griffithuni.edu.au                   %
%                                                                         %
%       Homepage: http://www.alimirjalili.com                             %
%                                                                         %
%   Main paper: S. Mirjalili, A. Lewis                                    %
%               The Whale Optimization Algorithm,                         %
%               Advances in Engineering Software , in press,              %
%               DOI: http://dx.doi.org/10.1016/j.advengsoft.2016.01.008   %
%                                                                         %
%_________________________________________________________________________%

% This function draw the benchmark functions

function func_plot(func_name)

[lb,ub,dim,fobj]=Get_Functions_details(func_name);

switch func_name 
    case 'F1' 
        x=-100:2:100; y=x; %[-100,100]
        
    case 'F2' 
        x=-100:2:100; y=x; %[-10,10]
        
    case 'F3' 
        x=-100:2:100; y=x; %[-100,100]
        
    case 'F4' 
        x=-100:2:100; y=x; %[-100,100]
    case 'F5' 
        x=-200:2:200; y=x; %[-5,5]
    case 'F6' 
        x=-100:2:100; y=x; %[-100,100]
    case 'F7' 
        x=-1:0.03:1;  y=x  %[-1,1]
    case 'F8' 
        x=-500:10:500;y=x; %[-500,500]
    case 'F9' 
        x=-5:0.1:5;   y=x; %[-5,5]    
    case 'F10' 
        x=-20:0.5:20; y=x;%[-500,500]
    case 'F11' 
        x=-500:10:500; y=x;%[-0.5,0.5]
    case 'F12' 
        x=-10:0.1:10; y=x;%[-pi,pi]
    case 'F13' 
        x=-5:0.08:5; y=x;%[-3,1]
    case 'F14' 
        x=-100:2:100; y=x;%[-100,100]
    case 'F15' 
        x=-5:0.1:5; y=x;%[-5,5]
    case 'F16' 
        x=-1:0.01:1; y=x;%[-5,5]
    case 'F17' 
        x=-5:0.1:5; y=x;%[-5,5]
    case 'F18' 
        x=-5:0.06:5; y=x;%[-5,5]
    case 'F19' 
        x=-5:0.1:5; y=x;%[-5,5]
    case 'F20' 
        x=-5:0.1:5; y=x;%[-5,5]        
    case 'F21' 
        x=-5:0.1:5; y=x;%[-5,5]
    case 'F22' 
        x=-5:0.1:5; y=x;%[-5,5]     
    case 'F23' 
        x=-5:0.1:5; y=x;%[-5,5]  
end    

    

L=length(x);
f=[];

for i=1:L
    for j=1:L
        if strcmp(func_name,'F15')==0 && strcmp(func_name,'F19')==0 && strcmp(func_name,'F20')==0 && strcmp(func_name,'F21')==0 && strcmp(func_name,'F22')==0 && strcmp(func_name,'F23')==0
            f(i,j)=fobj([x(i),y(j)]);
        end
        if strcmp(func_name,'F15')==1
            f(i,j)=fobj([x(i),y(j),0,0]);
        end
        if strcmp(func_name,'F19')==1
            f(i,j)=fobj([x(i),y(j),0]);
        end
        if strcmp(func_name,'F20')==1
            f(i,j)=fobj([x(i),y(j),0,0,0,0]);
        end       
        if strcmp(func_name,'F21')==1 || strcmp(func_name,'F22')==1 ||strcmp(func_name,'F23')==1
            f(i,j)=fobj([x(i),y(j),0,0]);
        end          
    end
end

surfc(x,y,f,'LineStyle','none');

end


5、

function G = Gconstant(iteration, max_it)
%% 计算引力常数(公式13)
alfa = 30;
G0 = 100;
G = G0*exp(-alfa*iteration/max_it);    % 公式28

6、

function [lb,ub,dim,fobj] = Get_Functions_details(F)


switch F
    case 'F1'
        fobj = @F1;
        lb=-100;
        ub=100;
        dim=30;
        
    case 'F2'
        fobj = @F2;
        lb=-10;
        ub=10;
        dim=30;
        
    case 'F3'
        fobj = @F3;
        lb=-100;
        ub=100;
        dim=30;
        
    case 'F4'
        fobj = @F4;
        lb=-100;
        ub=100;
        dim=30;
        
    case 'F5'
        fobj = @F5;
        lb=-30;
        ub=30;
        dim=30;
        
    case 'F6'
        fobj = @F6;
        lb=-100;
        ub=100;
        dim=30;
        
    case 'F7'
        fobj = @F7;
        lb=-1.28;
        ub=1.28;
        dim=30;
        
    case 'F8'
        fobj = @F8;
        lb=-500;
        ub=500;
        dim=30;
        
    case 'F9'
        fobj = @F9;
        lb=-5.12;
        ub=5.12;
        dim=30;
        
    case 'F10'
        fobj = @F10;
        lb=-32;
        ub=32;
        dim=30;
        
    case 'F11'
        fobj = @F11;
        lb=-600;
        ub=600;
        dim=30;
        
    case 'F12'
        fobj = @F12;
        lb=-50;
        ub=50;
        dim=30;
        
    case 'F13'
        fobj = @F13;
        lb=-50;
        ub=50;
        dim=30;
        
    case 'F14'
        fobj = @F14;
        lb=-65.536;
        ub=65.536;
        dim=2;
        
    case 'F15'
        fobj = @F15;
        lb=-5;
        ub=5;
        dim=4;
        
    case 'F16'
        fobj = @F16;
        lb=-5;
        ub=5;
        dim=2;
        
    case 'F17'
        fobj = @F17;
        lb=[-5,0];
        ub=[10,15];
        dim=2;
        
    case 'F18'
        fobj = @F18;
        lb=-2;
        ub=2;
        dim=2;
        
    case 'F19'
        fobj = @F19;
        lb=0;
        ub=1;
        dim=3;
        
    case 'F20'
        fobj = @F20;
        lb=0;
        ub=1;
        dim=6;     
        
    case 'F21'
        fobj = @F21;
        lb=0;
        ub=10;
        dim=4;    
        
    case 'F22'
        fobj = @F22;
        lb=0;
        ub=10;
        dim=4;    
        
    case 'F23'
        fobj = @F23;
        lb=0;
        ub=10;
        dim=4;            
end

end

% F1

function o = F1(x)
o=sum(x.^2);
end

% F2

function o = F2(x)
o=sum(abs(x))+prod(abs(x));
end

% F3

function o = F3(x)
dim=size(x,2);
o=0;
for i=1:dim
    o=o+sum(x(1:i))^2;
end
end

% F4

function o = F4(x)
o=max(abs(x));
end

% F5

function o = F5(x)
dim=size(x,2);
o=sum(100*(x(2:dim)-(x(1:dim-1).^2)).^2+(x(1:dim-1)-1).^2);
end

% F6

function o = F6(x)
o=sum(abs((x+.5)).^2);
end

% F7

function o = F7(x)
dim=size(x,2);
o=sum([1:dim].*(x.^4))+rand;
end

% F8

function o = F8(x)
o=sum(-x.*sin(sqrt(abs(x))));
end

% F9

function o = F9(x)
dim=size(x,2);
o=sum(x.^2-10*cos(2*pi.*x))+10*dim;
end

% F10

function o = F10(x)
dim=size(x,2);
o=-20*exp(-.2*sqrt(sum(x.^2)/dim))-exp(sum(cos(2*pi.*x))/dim)+20+exp(1);
end

% F11

function o = F11(x)
dim=size(x,2);
o=sum(x.^2)/4000-prod(cos(x./sqrt([1:dim])))+1;
end

% F12

function o = F12(x)
dim=size(x,2);
o=(pi/dim)*(10*((sin(pi*(1+(x(1)+1)/4)))^2)+sum((((x(1:dim-1)+1)./4).^2).*...
(1+10.*((sin(pi.*(1+(x(2:dim)+1)./4)))).^2))+((x(dim)+1)/4)^2)+sum(Ufun(x,10,100,4));
end

% F13

function o = F13(x)
dim=size(x,2);
o=.1*((sin(3*pi*x(1)))^2+sum((x(1:dim-1)-1).^2.*(1+(sin(3.*pi.*x(2:dim))).^2))+...
((x(dim)-1)^2)*(1+(sin(2*pi*x(dim)))^2))+sum(Ufun(x,5,100,4));
end

% F14

function o = F14(x)
aS=[-32 -16 0 16 32 -32 -16 0 16 32 -32 -16 0 16 32 -32 -16 0 16 32 -32 -16 0 16 32;,...
-32 -32 -32 -32 -32 -16 -16 -16 -16 -16 0 0 0 0 0 16 16 16 16 16 32 32 32 32 32];

for j=1:25
    bS(j)=sum((x'-aS(:,j)).^6);
end
o=(1/500+sum(1./([1:25]+bS))).^(-1);
end

% F15

function o = F15(x)
aK=[.1957 .1947 .1735 .16 .0844 .0627 .0456 .0342 .0323 .0235 .0246];
bK=[.25 .5 1 2 4 6 8 10 12 14 16];bK=1./bK;
o=sum((aK-((x(1).*(bK.^2+x(2).*bK))./(bK.^2+x(3).*bK+x(4)))).^2);
end

% F16

function o = F16(x)
o=4*(x(1)^2)-2.1*(x(1)^4)+(x(1)^6)/3+x(1)*x(2)-4*(x(2)^2)+4*(x(2)^4);
end

% F17

function o = F17(x)
o=(x(2)-(x(1)^2)*5.1/(4*(pi^2))+5/pi*x(1)-6)^2+10*(1-1/(8*pi))*cos(x(1))+10;
end

% F18

function o = F18(x)
o=(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

% F19

function o = F19(x)
aH=[3 10 30;.1 10 35;3 10 30;.1 10 35];cH=[1 1.2 3 3.2];
pH=[.3689 .117 .2673;.4699 .4387 .747;.1091 .8732 .5547;.03815 .5743 .8828];
o=0;
for i=1:4
    o=o-cH(i)*exp(-(sum(aH(i,:).*((x-pH(i,:)).^2))));
end
end

% F20

function o = F20(x)
aH=[10 3 17 3.5 1.7 8;.05 10 17 .1 8 14;3 3.5 1.7 10 17 8;17 8 .05 10 .1 14];
cH=[1 1.2 3 3.2];
pH=[.1312 .1696 .5569 .0124 .8283 .5886;.2329 .4135 .8307 .3736 .1004 .9991;...
.2348 .1415 .3522 .2883 .3047 .6650;.4047 .8828 .8732 .5743 .1091 .0381];
o=0;
for i=1:4
    o=o-cH(i)*exp(-(sum(aH(i,:).*((x-pH(i,:)).^2))));
end
end

% F21

function o = F21(x)
aSH=[4 4 4 4;1 1 1 1;8 8 8 8;6 6 6 6;3 7 3 7;2 9 2 9;5 5 3 3;8 1 8 1;6 2 6 2;7 3.6 7 3.6];
cSH=[.1 .2 .2 .4 .4 .6 .3 .7 .5 .5];

o=0;
for i=1:5
    o=o-((x-aSH(i,:))*(x-aSH(i,:))'+cSH(i))^(-1);
end
end

% F22

function o = F22(x)
aSH=[4 4 4 4;1 1 1 1;8 8 8 8;6 6 6 6;3 7 3 7;2 9 2 9;5 5 3 3;8 1 8 1;6 2 6 2;7 3.6 7 3.6];
cSH=[.1 .2 .2 .4 .4 .6 .3 .7 .5 .5];

o=0;
for i=1:7
    o=o-((x-aSH(i,:))*(x-aSH(i,:))'+cSH(i))^(-1);
end
end

% F23

function o = F23(x)
aSH=[4 4 4 4;1 1 1 1;8 8 8 8;6 6 6 6;3 7 3 7;2 9 2 9;5 5 3 3;8 1 8 1;6 2 6 2;7 3.6 7 3.6];
cSH=[.1 .2 .2 .4 .4 .6 .3 .7 .5 .5];

o=0;
for i=1:10
    o=o-((x-aSH(i,:))*(x-aSH(i,:))'+cSH(i))^(-1);
end
end

function o=Ufun(x,a,k,m)
o=k.*((x-a).^m).*(x>a)+k.*((-x-a).^m).*(x<(-a));
end

7、

%% This function calculates the accelaration of each agent in gravitational field. eq.7-10,21.
function a = Gfield(M, X, G, Rnorm, Rpower, ElitistCheck, iteration, max_it)
%% 计算了重力场中每个个体的加速度
[N, dim] = size(X);
final_per = 2;     % 在上一次迭代中,只有2%的个体对其他个体施加力。

% 总的力计算
if ElitistCheck == 1
    kbest = final_per+(1-iteration/max_it)*(100-final_per);   % 公式21kbest
    kbest = round(N*kbest/100);
else
    kbest = N;         % 公式9
end
[Ms, ds] = sort(M, 'descend');

for i = 1:N
    E(i, :) = zeros(1, dim);
    for ii = 1:kbest
        j = ds(ii);
        if j ~= i
            R = norm(X(i, :)-X(j, :), Rnorm);    % 欧几里德距离
            for k = 1:dim
                E(i, k) = E(i, k)+rand*(M(j))*((X(j, k)-X(i, k))/(R^Rpower+eps));
                % 注意,Mp(i)/Mi(i)=1
            end
        end
    end
end

% 加速度
a = E.*G;          % 注意,Mp(i)/Mi(i)=1



8、

%% Gravitational Search Algorithm.
function [Fbest, Lbest, Curve] = GSA(X, N, Max_iter, lb, ub, dim, fobj)
%V:   速度.
%a:   加速度.
%M:   质量.  Ma=Mp=Mi=M;
%dim: 测试函数的维数.
%N:   种群规模.
%X:   种群位置.
%R:   搜索空间中代理之间的距离.
%[low-up]: 搜索空间的允许范围.
%Rnorm:  公式8中的标准值.
%Rpower:7中R的幂.

Rnorm = 2;
ElitistCheck = 1; 
Rpower = 1;
% 初始化进化曲线
Curve = zeros(1, Max_iter);

V = zeros(N, dim);

%% 迭代寻优
for iter = 1:Max_iter
    for i = 1:N
        % 边界处理
        Flag4ub = X(i, :) > ub;
        Flag4lb = X(i, :) < lb;
        X(i, :) = (X(i, :).*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb;
        % 计算适应度值
        fitness(i) = fobj(X(i, :));
    end
    % 计算最小的适应度值
    [best, best_X]=min(fitness);
    if iter == 1
        Fbest = best;
        Lbest=X(best_X, :);
    end
    if best < Fbest
        Fbest = best;
        Lbest=X(best_X, :);
    end
    
    Curve(iter) = Fbest;
    
    % 根据公式14-20计算M
    [M] = massCalculation(fitness);
    
    % 根据公式13计算引力常数
    G = Gconstant(iter, Max_iter);
    
    % 计算根据公式7-10,21计算重力场中的加速度
    a = Gfield(M, X, G, Rnorm, Rpower, ElitistCheck, iter, Max_iter);
    
    % 根据公式11-12进行个体的位置移动
    [X, V] = move(X, a, V);
    
    disp(['GSA: At iteration ', num2str(iter), ' ,the best fitness is ', num2str(Fbest)]);
end %iter


9、

function [Alpha_score, Alpha_pos, Convergence_curve] = GWO(Positions, N, Max_iter, lb, ub, dim, fobj)
%% 灰狼优化算法
% 初始化alpha, beta和delta_pos
Alpha_pos = zeros(1, dim);
Alpha_score = inf;  % 将此更改为-inf以解决最大化问题
Beta_pos = zeros(1,dim);
Beta_score = inf;    % 将此更改为-inf以解决最大化问题
Delta_pos = zeros(1,dim);
Delta_score = inf;   % 将此更改为-inf以解决最大化问题
% 初始化种群位置
Convergence_curve = zeros(1, Max_iter);  % 收敛曲线
l = 0;    % 循环计数器
% 主要循环
while l < Max_iter
    for i = 1:N
        % 边界处理
        Flag4ub = Positions(i, :)>ub;
        Flag4lb = Positions(i, :)<lb;
        Positions(i, :) = (Positions(i, :).*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb;
%         Positions(i, :) = max(Positions(i, :), lb);
%         Positions(i, :) = min(Positions(i, :), ub);
        % 计算每个种群的目标函数
        fitness = fobj(Positions(i, :));
        % 更新Alpha, Beta和Delta
        if fitness < Alpha_score
            Alpha_score = fitness;        % 更新alpha
            Alpha_pos = Positions(i, :);
        end
        if fitness > Alpha_score && fitness < Beta_score
            Beta_score = fitness;           % 更新beta
            Beta_pos = Positions(i, :);
        end
        if fitness > Alpha_score && fitness > Beta_score && fitness < Delta_score
            Delta_score = fitness;          % 更新delta
            Delta_pos = Positions(i, :);
        end
    end
    a = 2-l*((2)/Max_iter);      % a从2线性减小到0    
    % 更新包括omegas在内的种群的位置
    for i = 1:N
        for j = 1:dim
            r1 = rand();             % r1是[0,1]中的随机数
            r2 = rand();             % r2是[0,1]中的随机数
            
            A1 = 2*a*r1-a;        % 公式(4)
            C1 = 2*r2;               % 公式(5)
            
            D_alpha = abs(C1*Alpha_pos(j)-Positions(i, j));  % 公式(6-第一部分
            X1 = Alpha_pos(j)-A1*D_alpha;   % 公式 (7)-第一部分
            
            r1 = rand();
            r2 = rand();
            
            A2 = 2*a*r1-a;         % 公式(4)
            C2 = 2*r2;                % 公式(5)
            
            D_beta = abs(C2*Beta_pos(j)-Positions(i, j));   % 公式(6-第二部分
            X2 = Beta_pos(j)-A2*D_beta;       % 公式 (7)-第二部分
            
            r1 = rand();
            r2 = rand();
            
            A3 = 2*a*r1-a;        % 公式 (4)
            C3 = 2*r2;               % 公式 (5)
            
            D_delta = abs(C3*Delta_pos(j)-Positions(i, j)); % 公式(6-第三部分
            X3 = Delta_pos(j)-A3*D_delta;      % 公式 (7)-第三部分
            
            Positions(i, j)=(X1+X2+X3)/3;       % 公式 (8)
        end
    end
    l = l+1;
    Convergence_curve(l) = Alpha_score;
    disp(['GWO: At iteration ', num2str(l), ' ,the best fitness is ', num2str(Alpha_score)]);
end




10、

% This function initialize the first population of search agents
function Positions = initialization(SearchAgents_no, dim, ub, lb)

Boundary_no= size(ub, 2); % numnber of boundaries

% If the boundaries of all variables are equal and user enter a signle
% number for both ub and lb
if Boundary_no==1
    Positions = rand(SearchAgents_no, dim).*(ub-lb)+lb;
end

% If each variable has a different lb and ub
if Boundary_no > 1
    for i=1:dim
        ub_i = ub(i);
        lb_i = lb(i);
        Positions(:, i) = rand(SearchAgents_no, 1).*(ub_i-lb_i)+lb_i;
    end
end

11、

function [M] = massCalculation(fit)
%% 计算每个个体的质量(公式14-20)
Fmax = max(fit);
Fmin = min(fit);
Fmean = mean(fit);
[i, N] = size(fit);

if Fmax == Fmin
    M = ones(N, 1);
else
    
best = Fmin; worst = Fmax;              %eq.17-18.

M = (fit-worst)./(best-worst);          %eq.15,  
end

M=M./sum(M);                    %eq. 16.

12、

% GSA code v1.1.
% Generated by Esmat Rashedi, 2010. 
% "	E. Rashedi, H. Nezamabadi-pour and S. Saryazdi,
%揋SA: A Gravitational Search Algorithm�, Information sciences, vol. 179,
%no. 13, pp. 2232-2248, 2009."
%
%This function updates the velocity and position of agents.
function [X,V]=move(X,a,V)

%movement.
[N,dim]=size(X);
V=rand(N,dim).*V+a; %eq. 11.
X=X+V; %eq. 12.

13、

function [Leader_score, Leader_pos, Curve] = MSWOA(X, N, Max_iter, lb, ub, dim, fobj)

%% MSWOA参数
limit = 10;
p = sobolset(dim);
% 计算适应度值
for i = 1:N
    X(i, :) = p(i, :).*(ub-lb)+lb;
    fitness(i) = fobj(X(i, :));
end
% 初始化领导者的位置和适应度值
[bestfitness, bestindex] = min(fitness);
Leader_pos = X(bestindex, :);
Leader_score = bestfitness; 
% 初始化进化曲线
Curve = zeros(1, Max_iter);
t = 0;       % 迭代次数计数器
count = 0;

%% 迭代寻优
while t < Max_iter    
    % 计数超过limit阈值
    if count > limit
        % 对最优个体进行柯西变异
        X_new = Leader_pos.*(1+trnd(1, 1, dim));
        % 更新
        fit = fobj(X_new);
        if fit < Leader_score
            Leader_pos = X_new;
            Leader_score = fit;
            X(bestindex, :) = X_new;
            fitness(i) = fit;
        end
    end
%     a=2-t*((2)/Max_iter);    % 式(2.3)中,a从2线性减小到0
    % 非线性时变因子
    if t <= 0.5*Max_iter
        a = 1+cos(pi*t/Max_iter);
    else
        a = cos(pi*(t-0.5*Max_iter)/Max_iter);
    end
    % 自适应权值
    w = 2/pi*tan(t/Max_iter);
    a2=-1+t*((-1)/Max_iter);  % a2从-1-2线性递减,用以计算公式(3.12)中的t 
    % 更新种群位置
    for i = 1:N
        r1 = rand();    % r1是[0,1]中的随机数
        r2 = rand();    % r2是[0,1]中的随机数
        
        A = 2*a*r1-a;       % 公式(2.3) 
        C = 2*r2;             % 公式(2.4) 
        
        b = 1;                         % 公式(2.5)里的参数
        l = (a2-1)*rand+1;       %  公式(2.5)里的参数
        
        p = rand();        % 公式(2.6)里的p
        
        for j = 1:dim
            if p < 0.5
                if abs(A) >= 1
                    %% 随机性学习策略
                    % 随机选择不等于i的k
                    K = [1:i-1 i+1:N];
                    k = K(randi([1 numel(K)]));
                    % 学习产生新个体
                    if fitness(k) < fitness(i)
                        X_new = X(i, :)+rand*(X(i, :)-X(k, :));
                    else
                        X_new = X(i, :)+rand*(X(k, :)-X(i, :));
                    end
                    % 判断随机学习产生的新个体是否优于当前个体
                    fit = fobj(X_new);
                    if fit < fitness(i)
                        X(i, :) = X_new;
                        fitness(i) = fit;
                    end
                    % 更新个体位置
                    rand_leader_index = floor(N*rand()+1);
                    X_rand = X(rand_leader_index, :);
                    D_X_rand = abs(C*X_rand(j)-X(i,j));          % 公式(2.7)
                    X(i, j) = w*X_rand(j)-A*D_X_rand;                % 公式(2.8)
                elseif abs(A) < 1
                    D_Leader = abs(C*Leader_pos(j)-X(i, j));     % 公式(2.1)
                    X(i, j) = w*Leader_pos(j)-A*D_Leader;               % 公式(2.2)
                end
            else
                distance2Leader = abs(Leader_pos(j)-X(i, j));
                % 公式(2.5)
                X(i, j) = distance2Leader*exp(b.*l).*cos(l.*2*pi)+(1-w)*Leader_pos(j);
            end
        end
    end
    for i = 1:N
        % 边界处理
        Flag4ub = X(i, :) > ub;
        Flag4lb = X(i, :) < lb;
        X(i, :) = (X(i, :).*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb;
        % 计算适应度
        fitness(i) = fobj(X(i, :));
    end
    % 记录上一次的最优解
    Last_Leader_score = Leader_score;
    % 初始化领导者的位置和适应度值
    [bestfitness, bestindex] = min(fitness);
    if bestfitness < Leader_score
        Leader_pos = X(bestindex, :);
        Leader_score = bestfitness;
    end
    if Leader_score == Last_Leader_score
        count = count+1;        % 无变化计数加1
    else
        count = 0;                   % 有变化计数赋为0
    end
    t = t+1;
    Curve(t) = Leader_score;
    
    disp(['MSWOA: At iteration ', num2str(t), ' ,the best fitness is ', num2str(Leader_score)]);
end




14、

function [fitnessgbest, gbest, zz] = PSO(X, N, maxgen, lb, ub, dim, fobj)

%% 参数初始化
c1 = 2;                           % 社会认知参数
c2 = 2;                           % 自我认知参数
Vmax = 2;                      % 最大速度
Vmin = -2;                      % 最小速度
ub = 100;                 % 位置最大值
lb = -100;                   % 位置最小值
Wmax = 0.8; Wmin = 0.2;
V = rand(N, dim).*(Vmax-Vmin)+Vmin;
for i = 1:N
    fitness(i) = fobj(X(i, :));
end
%% 
[bestfitness, bestindex] = min(fitness);
gbest = X(bestindex, :);                      % 群体最优极值
zbest = X;                         % 个体最优极值
fitnessgbest = bestfitness;     % 种群最优适应度值
fitnesszbest = fitness;           % 个体最优适应度值

%% 初始结果显示
disp(['初始位置:' , num2str(gbest)]);
disp(['初始函数值:', num2str(fitnessgbest)]);

%% 迭代寻优
for i = 1:maxgen
    W = Wmax-((Wmax-Wmin)/maxgen)*i;
    for j=1:N
        % 速度更新
        V(j, :) = W*V(j, :) + c1*rand*(zbest(j, :) - X(j, :)) + c2*rand*(gbest - X(j, :));
        V(j,find(V(j,:)>Vmax)) = Vmax;
        V(j,find(V(j,:)<Vmin)) = Vmin;
        
        % 种群更新
        X(j,:) = X(j,:) + V(j,:);
        X(j,find(X(j,:)>ub)) = ub;
        X(j,find(X(j,:)<lb)) = lb;
        
        % 适应度值更新
        fitness(j) = fobj(X(j,:));
    end
    %% 个体和群体极值更新
    for j = 1:N
        % 个体最优更新
        if fitness(j) < fitnesszbest(j)
            zbest(j,:) = X(j,:);
            fitnesszbest(j) = fitness(j);
        end
        
        % 群体最优更新
        if fitness(j) < fitnessgbest
            gbest = X(j,:);
            fitnessgbest = fitness(j);
        end
    end
    %% 每一代群体最优值存入zz数组
    zz(i) = fitnessgbest;
    
    disp(['PSO: At iteration ', num2str(i), ' ,the best fitness is ', num2str(zz(i))]);
end
% %% 最终结果显示
% disp(['最终位置:' , num2str(gbest)]);
% disp(['最终函数值:', num2str(zz(end))]);
% %% 绘图
% figure;
% plot(zz, 'r', 'lineWidth', 2);          %  画出迭代图
% xlabel('迭代次数', 'fontsize', 12);
% ylabel('目标函数值', 'fontsize', 12);

15、

function i = RouletteWheelSelection(P)
    r = rand;
    C = cumsum(P);
    i = find(r <= C, 1, 'first');
end

16、

function [Leader_score, Leader_pos, Curve] = WOA(Positions, N, Max_iter, lb, ub, dim, fobj)
%% The Whale Optimization Algorithm
% 计算适应度值
for i = 1:N
    fitness(i) = fobj(Positions(i, :));
end
% 初始化领导者的位置和适应度值
[bestfitness, bestindex] = min(fitness);
Leader_pos = Positions(bestindex, :);
Leader_score = bestfitness; 
% 初始化进化曲线
Curve = zeros(1, Max_iter);
t = 0;       % 迭代次数计数器

%% 迭代寻优
while t < Max_iter    
    a=2-t*((2)/Max_iter);    % 式(2.3)中,a从2线性减小到0
    a2=-1+t*((-1)/Max_iter);  % a2从-1-2线性递减,用以计算公式(3.12)中的t 
    % 更新种群位置
    for i = 1:N
        r1 = rand();    % r1是[0,1]中的随机数
        r2 = rand();    % r2是[0,1]中的随机数
        
        A = 2*a*r1-a;       % 公式(2.3) 
        C = 2*r2;             % 公式(2.4) 
        
        b = 1;                         % 公式(2.5)里的参数
        l = (a2-1)*rand+1;       %  公式(2.5)里的参数
        
        p = rand();        % 公式(2.6)里的p
        
        for j = 1:dim
            if p < 0.5
                if abs(A) >= 1
                    rand_leader_index = floor(N*rand()+1);
                    X_rand = Positions(rand_leader_index, :);
                    D_X_rand = abs(C*X_rand(j)-Positions(i,j));          % 公式(2.7)
                    Positions(i, j) = X_rand(j)-A*D_X_rand;                % 公式(2.8)
                elseif abs(A) < 1
                    D_Leader = abs(C*Leader_pos(j)-Positions(i, j));     % 公式(2.1)
                    Positions(i, j) = Leader_pos(j)-A*D_Leader;               % 公式(2.2)
                end
            else
                distance2Leader = abs(Leader_pos(j)-Positions(i, j));
                % 公式(2.5)
                Positions(i, j) = distance2Leader*exp(b.*l).*cos(l.*2*pi)+Leader_pos(j);
            end
        end
    end
    for i = 1:N
        % 边界处理
        Flag4ub = Positions(i, :) > ub;
        Flag4lb = Positions(i, :) < lb;
        Positions(i, :) = (Positions(i, :).*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb;
        % 计算适应度
        fitness(i) = fobj(Positions(i, :));
    end
    % 初始化领导者的位置和适应度值
    [bestfitness, bestindex] = min(fitness);
    if bestfitness < Leader_score
        Leader_pos = Positions(bestindex, :);
        Leader_score = bestfitness;
    end
    t = t+1;
    Curve(t) = Leader_score;
    
    disp(['WOA: At iteration ', num2str(t), ' ,the best fitness is ', num2str(Leader_score)]);
end




17、

%% 清除环境变量
clear 
clc

%% 参数设置
N = 30;             % 种群规模
Function_name = 'F4';       % 从F1到F23的测试函数的名称(本文中的表123)
Max_iteration = 500;         % 最大迭代次数
% 加载所选基准函数的详细信息
[lb, ub, dim, fobj] = Get_Functions_details(Function_name);
% 初始化种群位置
X = initialization(N, dim, ub, lb);

[MSWOA_Best_score, MSWOA_Best_pos, MSWOA_Curve] = MSWOA(X, N, Max_iteration, lb, ub, dim, fobj);
[WOA_Best_score, WOA_Best_pos, WOA_Curve] = WOA(X, N, Max_iteration, lb, ub, dim, fobj);
[BOA_Best_score, BOA_Best_pos, BOA_Curve] = BOA(X, N, Max_iteration, lb, ub, dim, fobj);
[GWO_Best_score, GWO_Best_pos, GWO_Curve] = GWO(X, N, Max_iteration, lb, ub, dim, fobj);
[GSA_Best_score, GSA_Best_pos, GSA_Curve] = GSA(X, N, Max_iteration, lb, ub, dim, fobj);
[PSO_Best_score, PSO_Best_pos, PSO_Curve] = PSO(X, N, Max_iteration, lb, ub, dim, fobj);
[ABC_Best_score, ABC_Best_pos, ABC_Curve] = ABC(X, N, Max_iteration, lb, ub, dim, fobj);

%% 画图
% 1、画出所选基准函数的三维立体图形
figure;
func_plot(Function_name);
title(Function_name)
xlabel('x_1');
ylabel('x_2');
zlabel([Function_name,'( x_1 , x_2 )'])

% 2、画出目标函数值变化曲线图
figure;
t = 1:Max_iteration;
plot(t, MSWOA_Curve, 'r^-', t, WOA_Curve, 'ko-', t, BOA_Curve, 'bd-', t, GWO_Curve, 'cs-', ...
    t, GSA_Curve, 'mp-', t, PSO_Curve, 'k*-', t, ABC_Curve, 'gh-', ...
    'linewidth', 1.5, 'MarkerSize', 8, 'MarkerIndices', 1:50:Max_iteration);
title(Function_name)
xlabel('迭代次数');
ylabel('适应度值');
axis fill
grid on
box on
legend('MSWOA', 'WOA', 'BOA', 'GWO', 'GSA', 'PSO', 'ABC');
% h1 = axes('position', [0.4 0.3 0.2 0.3]);
% axis(h1);
% s = t(1:50);
% plot(h1, s, MSWOA_Curve(s), 'r^-', s, WOA_Curve(s), 'ko-', s, BOA_Curve(s), 'bd-', s, GWO_Curve(s), 'cs-', ...
%     s, GSA_Curve(s), 'mp-', s, PSO_Curve(s), 'k*-', s, ABC_Curve(s), 'gh-', ...
%     'linewidth', 1, 'MarkerSize', 6, 'MarkerIndices', 1:10:50);

%% 显示结果
disp(['MSWOA得到的最佳位置为 : ', num2str(MSWOA_Best_pos)]);
disp(['MSWOA得到的目标函数的最佳值为 : ', num2str(MSWOA_Best_score)]);
disp(['WOA得到的最佳位置为 : ', num2str(WOA_Best_pos)]);
disp(['WOA得到的目标函数的最佳值为 : ', num2str(WOA_Best_score)]);
disp(['BOA得到的最佳位置为 : ', num2str(BOA_Best_pos)]);
disp(['BOA得到的目标函数的最佳值为 : ', num2str(BOA_Best_score)]);
disp(['GWO得到的最佳位置为 : ', num2str(GWO_Best_pos)]);
disp(['GWO得到的目标函数的最佳值为 : ', num2str(GWO_Best_score)]);
disp(['GSA得到的最佳位置为 : ', num2str(GSA_Best_pos)]);
disp(['GSA得到的目标函数的最佳值为 : ', num2str(GSA_Best_score)]);
disp(['PSO得到的最佳位置为 : ', num2str(PSO_Best_pos)]);
disp(['PSO得到的目标函数的最佳值为 : ', num2str(PSO_Best_score)]);
disp(['ABC得到的最佳位置为 : ', num2str(ABC_Best_pos)]);
disp(['ABC得到的目标函数的最佳值为 : ', num2str(ABC_Best_score)]);

18、

clc;
clear;

%% 随机序列和Sobol序列对比
dim = 30;           % 维度
N = 500;
% Sobol序列
p = sobolset(dim);
for i = 1:N
    X(i, :) = p(i, :);
end
figure;
plot(X(:, 1), X(:, 2), 'b.', 'MarkerSize', 16);
xlabel '个体第一维度数值'; ylabel '个体第二维度数值';
title 'Sobol序列生成散点图';
% 随机序列
Y = rand(N, dim);
figure;
plot(Y(:, 1), Y(:, 2), 'b.', 'MarkerSize', 16);
xlabel '个体第一维度数值'; ylabel '个体第二维度数值';
title '随机生成个体散点图';


resultado

insira a descrição da imagem aqui
insira a descrição da imagem aqui
insira a descrição da imagem aqui
insira a descrição da imagem aqui
insira a descrição da imagem aqui
insira a descrição da imagem aqui
insira a descrição da imagem aqui
insira a descrição da imagem aqui

Acho que você gosta

Origin blog.csdn.net/weixin_44312889/article/details/128096894
Recomendado
Clasificación