智能优化算法——差分进化算法(DE) MATLAB算法实现

智能优化算法——差分进化算法(DE)

Main

%_________________________________________________________________________
% --- 智能优化算法 ---                                                    
% 编码格式:UTF-8                                                         
%                                                                         
% 算法名称:                                                              
%   Differential Evolution (差分进化算法)                                 
%                                                                         
% 调用函数:                                                              
%   DE_fitness.m                                                          
%_________________________________________________________________________

%% 清空环境
clc;clear;
close all;

%% 参数设置
MaxIter = 300;                                          % 最大迭代次数
scale_factor_primary = 0.6;                             % 主要缩放因子
scale_factor_secondary_1 = 0.5;                         % 次要缩放因子1
scale_factor_secondary_2 = 0.3;                         % 次要缩放因子2
CrossRate = 0.8;                                        % 交叉概率
VarNum = 1;                                             % 变量个数
PopSize = 20;                                           % 种群规模 (一般为变量维数的5~10倍)
lb = [0];                                               % 变量下限
ub = [13.1];                                            % 变量下限
mutation_scheme = 1;                                    % 变异方案

Lb = repmat(lb,PopSize,1);
Ub = repmat(ub,PopSize,1);

% 简化变量名
F = scale_factor_primary;
F_1 = scale_factor_secondary_1;
F_2 = scale_factor_secondary_2;

Population = Lb+(Ub-Lb).*rand(PopSize,VarNum);
Fitness = zeros(PopSize,1);
FitnessTrial = Fitness;
FitnessRecord = zeros(MaxIter,VarNum+1);                % 迭代记录

t = 0;  % 迭代计数器

%% 计算适应度
for i = 1:PopSize
    Fitness(i) = DE_fitness(Population(i,1)); % 单/多变量需更改
end
clear i;

%% 适应度排序
[BestFitness,index] = max(Fitness);
BestVector = Population(index,:);

%% 循环
for t = 1:MaxIter
    
%% 变异
    Mutant = Population;
    for i = 1:PopSize
        PerMutation = randperm(PopSize);
        switch mutation_scheme
            case 1
                Mutant(i,:) = Population(PerMutation(1),:)+F*...
                (Population(PerMutation(2),:)-Population(PerMutation(3),:));
            case 2
                Mutant(i,:) = BestVector+F*...
                (Population(PerMutation(1),:)-Population(PerMutation(2),:));
            case 3
                Mutant(i,:) = Population(i,:)+F1*(BestVector-Population(PerMutation(1),:))+...
                F2*(Population(PerMutation(2),:)-Population(PerMutation(3),:));
            case 4
                Mutant(i,:) = BestVector+ ...
                F1*(Population(PerMutation(1),:)-Population(PerMutation(2),:))+...
                F2*(Population(PerMutation(3),:)-Population(PerMutation(4),:));
            case 5
                Mutant(i,:) = Population(PerMutation(1),:)+...
                F1*(Population(PerMutation(2),:)-Population(PerMutation(1),:))+...
                F2*(Population(PerMutation(4),:)-Population(PerMutation(5),:));
        end
        
        % 边界控制
        for k = 1:VarNum
            if Mutant(i,k) < Lb(i,k)
                Mutant(i,k) = Lb(i,k);
            elseif Mutant(i,k) > Ub(i,k);
                Mutant(i,k) = Ub(i,k);
            end
        end
        clear k;
    end
    clear i;
    
%% 交叉
    Mat_rand = rand(PopSize,VarNum);
    Trial = (Mat_rand>CrossRate).*Population+(Mat_rand<=CrossRate).*Mutant;
    
    for i = 1:PopSize
        FitnessTrial(i) = DE_fitness(Trial(i,1));    % 单/多变量需更改
    end
    clear i;
    
%% 选择
    Population(FitnessTrial>Fitness,:) = Trial(FitnessTrial>Fitness,:);
    Fitness(FitnessTrial>Fitness) = FitnessTrial(FitnessTrial>Fitness,:);
    [BestFitness,index] = max(Fitness);
    BestVector = Population(index,:);
    % 迭代记录
    for k = 1:VarNum
        FitnessRecord(t,k) = BestVector(k);
    end
    FitnessRecord(t,VarNum+1) = BestFitness;
    
end

Function

function fit = DE_fitness(x)
% 求最大值,若需求最小值可求倒值
% 输入参数
%   x:变量
% 输出参数
%   fit:适应度

    fit = (x + 10*sin(5*x) + 7*cos(4*x));
end

Tips

  • 多变量情况下需要更改VarNum和变量下限lb与变量上限ub,比如两个变量的上下限分别为(1,2) & (3,4),那么应该设置为lb = [1,3]; ub = [2,4]
  • 多变量情况下,计算适应度时需要更改为多个输入量;
  • DE_fitness()函数可以自行修改。
posted @ 2022-09-25 20:42  Mr_Wuuu5  阅读(417)  评论(0)    收藏  举报