【优化求解】基于混合正弦余弦和变异选择改进蝗虫优化算法实现目标最优求解matlab代码

132 阅读2分钟

 ​1 简介

针对蝗虫优化算法(GOA)全局寻优能力不足,易陷入局部最优,寻优精度较低等问题,提出融合正弦余弦和变异选择的蝗虫优化算法(SC-MGOA).首先,在位置更新处根据转换概率选择不同的位置更新方式来增加种群的多样性,同时弥补GOA算法全局搜索能力不足的缺陷;其次,为更好的协调算法的全局探索和局部开发,对引入的正弦余弦机制进行改进;最后,在一定概率下针对最优解进行变异,并利用贪婪法则择优保留,使算法能够跳出局部最优,提高算法的收敛精度.选取10个测试函数进行3组测试,结果表明了不同改进策略的有效性,还证明了SC-MGOA算法相对于其他比较算法在寻优精度,寻优速度和鲁棒性等方面的优越性.

2 部分代码

function [TargetFitness,TargetPosition,Convergence_curve,Trajectories,fitness_history, position_history] = GOA(N, Max_iter, lb,ub, dim, fobj)

disp('GOA is now estimating the global optimum for your problem....')

flag = 0;
if size(ub, 1)==1
ub = ones(dim,1)*ub;
lb = ones(dim,1)*lb;
end

if (rem(dim,2)~=0) % 此算法应使用偶数个变量运行。这一行用来处理奇数个变量
dim = dim+1;
ub = [ub; 100];
lb = [lb; -100];
flag = 1;
end

%% 初始化蝗虫种群
GrassHopperPositions = initialization(N, dim, ub, lb);
GrassHopperFitness = zeros(1, N);

fitness_history = zeros(N, Max_iter);
position_history = zeros(N, Max_iter, dim);
Convergence_curve = zeros(1, Max_iter);
Trajectories = zeros(N, Max_iter);

cMax = 1;
cMin = 0.00004;
% 计算初始种群的适应度值
for i = 1:size(GrassHopperPositions, 1)
if flag == 1        % 奇数个变量,最后一维变量不参加计算
GrassHopperFitness(i)=fobj(GrassHopperPositions(i, 1:end-1));
else
GrassHopperFitness(i) = fobj(GrassHopperPositions(i, :));
end
fitness_history(i) = GrassHopperFitness(i);
position_history(i, 1, :) = GrassHopperPositions(i, :);
Trajectories(:, 1) = GrassHopperPositions(:, 1);
end

[sorted_fitness, sorted_indexes] = sort(GrassHopperFitness);

% 找到第一代最优个体
for newindex = 1:N
Sorted_grasshopper(newindex, :) = GrassHopperPositions(sorted_indexes(newindex),:);
end

TargetPosition = Sorted_grasshopper(1, :);
TargetFitness = sorted_fitness(1);

%% 迭代寻优
l = 2; 
while l < Max_iter+1

c = cMax-l*((cMax-cMin)/Max_iter);      % Eq. (2.8) in the paper

for i = 1:size(GrassHopperPositions,1)
temp = GrassHopperPositions';
for k = 1:2:dim
S_i = zeros(2, 1);
for j = 1:N
if i ~= j
Dist = distance(temp(k:k+1, j), temp(k:k+1, i));        % 计算两蝗虫个体位置的距离

r_ij_vec = (temp(k:k+1, j)-temp(k:k+1, i))/(Dist+eps);    % (xj-xi)/dij in Eq. (2.7)
xj_xi = 2+rem(Dist, 2);        % |xjd - xid| in Eq. (2.7) 

s_ij = ((ub(k:k+1) - lb(k:k+1))*c/2)*S_func(xj_xi).*r_ij_vec;   % The first part inside the big bracket in Eq. (2.7)
S_i = S_i+s_ij;
end
end
S_i_total(k:k+1, :) = S_i;
end
X_new = c * S_i_total'+ (TargetPosition);       % Eq. (2.7) in the paper      
GrassHopperPositions_temp(i, :) = X_new'; 
end
% 蝗虫位置
GrassHopperPositions = GrassHopperPositions_temp;

for i = 1:size(GrassHopperPositions,1)
% 边界处理
Tp = GrassHopperPositions(i, :)>ub';
Tm = GrassHopperPositions(i, :)<lb';
GrassHopperPositions(i, :) = (GrassHopperPositions(i, :).*(~(Tp+Tm)))+ub'.*Tp+lb'.*Tm;

% 计算适应度值
if flag == 1
GrassHopperFitness(i) = fobj(GrassHopperPositions(i, 1:end-1));
else
GrassHopperFitness(i) = fobj(GrassHopperPositions(i, :));
end
fitness_history(i, l) = GrassHopperFitness(i);
position_history(i, l, :) = GrassHopperPositions(i, :);

Trajectories(:, l) = GrassHopperPositions(:, 1);

% 更新目标值
if GrassHopperFitness(i) < TargetFitness
TargetPosition = GrassHopperPositions(i, :);
TargetFitness = GrassHopperFitness(i);
end
end

Convergence_curve(l) = TargetFitness;
disp(['In iteration #', num2str(l), ' , target''s objective = ', num2str(TargetFitness)])

l = l + 1;
end


if (flag == 1)
TargetPosition = TargetPosition(1:dim-1);
end

3 仿真结果

4 参考文献

[1]林杰, and 何庆. "融合正弦余弦和变异选择的蝗虫优化算法." 小型微型计算机系统 42.4(2021):8.

博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。