智能优化算法——差分进化算法(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()
函数可以自行修改。