群体智能优化算法-山羚羊优化算法(Mountain Gazelle Optimizer, MGO,含Matlab源代码)
摘要(Abstract)
山羚羊优化算法(MGO)是一种新的群体智能优化算法,受到山羚羊群体行为的启发,模拟了山羚羊在野外觅食、探索和躲避捕食者的行为模式。MGO 采用了动态搜索策略,包括个体搜索、信息共享、随机扰动和边界检查,以提高全局搜索能力和局部搜索精度。该算法适用于连续优化问题,如函数优化、工程优化和机器学习参数优化。本文提供 MGO 的 MATLAB 实现,并详细解析其工作原理。
算法介绍
1. 主要思想
山羚羊优化算法(MGO)基于山羚羊群的社会行为,主要包括以下核心概念:
- 山羚羊群体行为:在寻找最佳觅食地点时,山羚羊会根据过去经验、自身探索和群体信息调整位置。
- 信息共享:个体之间通过交流最佳觅食地点的信息来更新位置。
- 动态扰动:个体在一定程度上随机调整位置,以避免陷入局部最优。
- 边界处理:确保搜索个体不会超出定义的搜索空间范围。
2. 算法步骤
- 初始化种群:随机生成一组山羚羊个体,每个个体表示一个可能的解。
- 计算适应度值:评估每个个体在当前搜索空间中的表现。
- 更新山羚羊位置:
- 计算控制参数,模拟动态搜索行为。
- 采用不同策略调整位置,包括向最佳个体靠近、局部扰动、以及完全随机搜索。
- 边界检查:确保所有个体都在搜索空间范围内。
- 选择最优个体:根据适应度值选择最佳个体,形成新的种群。
- 重复上述步骤,直至满足终止条件(如达到最大迭代次数)。
MATLAB 代码实现
% 山羚羊优化算法(Mountain Gazelle Optimizer, MGO)
% 输入:
% N - 种群大小
% MaxIter - 最大迭代次数
% LB - 搜索空间下界
% UB - 搜索空间上界
% dim - 变量维度
% fobj - 目标优化函数
% 输出:
% BestF - 全局最优适应度值
% BestX - 最优解
% cnvg - 收敛曲线
function [BestF, BestX, cnvg] = MGO(N, MaxIter, LB, UB, dim, fobj)
% 统一变量边界格式
lb = ones(1, dim) .* LB;
ub = ones(1, dim) .* UB;
% 初始化山羚羊种群
X = initialization(N, dim, UB, LB);
% 初始化最优解
BestX = [];
BestFitness = inf; % 设定初始最优值为无穷大
% 计算初始种群适应度
for i = 1:N
Sol_Cost(i,:) = fobj(X(i,:)); % 计算每个个体的适应度
% 更新最优个体
if Sol_Cost(i,:) <= BestFitness
BestFitness = Sol_Cost(i,:);
BestX = X(i,:);
end
end
% 进入主循环,进行迭代优化
for Iter = 1:MaxIter
for i = 1:N
% 选择一个随机子集计算参考点 M
RandomSolution = randperm(N, ceil(N / 3));
M = X(randi([(ceil(N / 3)), N]), :) * floor(rand) + mean(X(RandomSolution, :)) .* ceil(rand);
% 计算动态系数
cofi = Coefficient_Vector(dim, Iter, MaxIter);
% 计算扰动向量
A = randn(1, dim) .* exp(2 - Iter * (2 / MaxIter));
D = (abs(X(i, :)) + abs(BestX)) * (2 * rand - 1);
% 更新个体位置
NewX = Solution_Imp(X, BestX, lb, ub, N, cofi, M, A, D, i);
% 计算新个体适应度,并进行边界检查
[NewX, Sol_CostNew] = Boundary_Check(NewX, fobj, LB, UB);
% 添加新的山羚羊到种群
X = [X; NewX];
Sol_Cost = [Sol_Cost; Sol_CostNew];
% 更新全局最优个体
[~, idbest] = min(Sol_Cost);
BestX = X(idbest, :);
end
% 选出前 N 个最优个体
[Sol_Cost, SortOrder] = sort(Sol_Cost);
X = X(SortOrder, :);
[BestFitness, idbest] = min(Sol_Cost);
BestX = X(idbest, :);
X = X(1:N, :);
Sol_Cost = Sol_Cost(1:N, :);
% 记录收敛曲线
cnvg(Iter) = BestFitness;
BestF = BestFitness;
end
end
%% **边界检查**
function [NewX, Sol_CostNew] = Boundary_Check(NewX, fobj, LB, UB)
for j = 1:4
NewX(j, :) = boundaryCheck(NewX(j, :), LB, UB);
Sol_CostNew(j, :) = fobj(NewX(j, :));
end
end
%% **计算动态系数**
function cofi = Coefficient_Vector(dim, Iter, MaxIter)
a2 = -1 + Iter * ((-1) / MaxIter);
u = randn(1, dim);
v = randn(1, dim);
cofi(1, :) = rand(1, dim);
cofi(2, :) = (a2 + 1) + rand;
cofi(3, :) = a2 .* randn(1, dim);
cofi(4, :) = u .* v .^ 2 .* cos((rand * 2) * u);
end
%% **种群初始化**
function [X] = initialization(N, dim, up, down)
if size(up, 1) == 1
X = rand(N, dim) .* (up - down) + down;
end
if size(up, 1) > 1
for i = 1:dim
high = up(i); low = down(i);
X(:, i) = rand(1, N) .* (high - low) + low;
end
end
end
%% **位置更新**
function NewX = Solution_Imp(X, BestX, lb, ub, N, cofi, M, A, D, i)
NewX(1, :) = (ub - lb) * rand + lb;
NewX(2, :) = BestX - abs((randi(2) * M - randi(2) * X(i, :)) .* A) .* cofi(randi(4), :);
NewX(3, :) = (M + cofi(randi(4), :)) + (randi(2) * BestX - randi(2) .* X((randi(N)), :)) .* cofi(randi(4), :);
NewX(4, :) = (X(i, :) - D) + (randi(2) * BestX - randi(2) * M) .* cofi(randi(4), :);
end
%% **边界修正**
function [X] = boundaryCheck(X, lb, ub)
for i = 1:size(X, 1)
FU = X(i, :) > ub;
FL = X(i, :) < lb;
X(i, :) = (X(i, :) .* (~(FU + FL))) + ub .* FU + lb .* FL;
end
end
总结
1. MGO 主要特点
✅ 动态系数调整,适应不同优化阶段。
✅ 多种搜索策略结合,提高全局搜索能力。
✅ 适用于高维复杂优化问题,如函数优化、特征选择等。
2. MGO 适用场景
- 函数优化问题
- 图像处理
- 深度学习超参数优化
- 路径规划问题