以下是灰狼算法的 Matlab 代码实现:
```matlab
function [bestSol, bestFit] = grey_wolf_optimizer(objFunc, dim, lb, ub, maxIter, numPack, alpha, beta, delta)
% 参数说明:
% objFunc:目标函数句柄
% dim:变量维度
% lb:变量下界
% ub:变量上界
% maxIter:最大迭代次数
% numPack:狼群数量
% alpha、beta、delta:灰狼算法参数
% 初始化狼群位置
positions = repmat(lb, numPack, dim) + rand(numPack, dim) .* repmat((ub-lb), numPack, 1);
% 初始化最优解和最优适应度值
bestSol = zeros(1, dim);
bestFit = inf;
% 迭代
for iter = 1:maxIter
% 计算适应度值
fitness = arrayfun(objFunc, positions);
% 更新最优解
[minFit, minIdx] = min(fitness);
if minFit < bestFit
bestSol = positions(minIdx, :);
bestFit = minFit;
end
% 计算每只狼的适应度排名
[sortedFit, rank] = sort(fitness);
% 确定 alpha、beta、delta 狼的位置
alphaPos = positions(rank(1), :);
betaPos = positions(rank(2), :);
deltaPos = positions(rank(3), :);
% 更新每只狼的位置
a = 2 - iter * (2 / maxIter); % 衰减系数
for i = 1:numPack
x = positions(i, :);
r1 = rand(); % 随机向量
r2 = rand(); % 随机向量
A1 = 2 * a * r1 - a; % alpha 狼成分
C1 = 2 * r2; % alpha 狼成分
D_alpha = abs(C1 * alphaPos - x); % alpha 狼距离向量
X1 = alphaPos - A1 * D_alpha; % alpha 狼位置更新
r1 = rand(); % 随机向量
r2 = rand(); % 随机向量
A2 = 2 * a * r1 - a; % beta 狼成分
C2 = 2 * r2; % beta 狼成分
D_beta = abs(C2 * betaPos - x); % beta 狼距离向量
X2 = betaPos - A2 * D_beta; % beta 狼位置更新
r1 = rand(); % 随机向量
r2 = rand(); % 随机向量
A3 = 2 * a * r1 - a; % delta 狼成分
C3 = 2 * r2; % delta 狼成分
D_delta = abs(C3 * deltaPos - x); % delta 狼距离向量
X3 = deltaPos - A3 * D_delta; % delta 狼位置更新
% 更新当前狼的位置
positions(i, :) = (X1 + X2 + X3) / 3;
% 边界处理
positions(i, :) = max(positions(i, :), lb);
positions(i, :) = min(positions(i, :), ub);
end
% 输出当前迭代结果
disp(['Iteration ', num2str(iter), ': Best Cost = ', num2str(bestFit)]);
end
end
```
使用方法:
定义目标函数句柄,例如 Rosenbrock 函数:
```matlab
objFunc = @(x) sum(100 * (x(2:end) - x(1:end-1).^2).^2 + (1 - x(1:end-1)).^2);
```
调用灰狼算法函数:
```matlab
dim = 2; % 变量维度
lb = [-5, -5]; % 下界
ub = [5, 5]; % 上界
maxIter = 100; % 最大迭代次数
numPack = 20; % 狼群数量
alpha = 2; % 灰狼算法参数
beta = 1.5; % 灰狼算法参数
delta = 0.5; % 灰狼算法参数
[bestSol, bestFit] = grey_wolf_optimizer(objFunc, dim, lb, ub, maxIter, numPack, alpha, beta, delta);
```
其中,`bestSol` 是最优解,`bestFit` 是最优适应度值。