MATLAB实现鲸鱼算法优化Ackley函数
以下是使用MATLAB实现鲸鱼算法对Ackley's Function函数进行寻优的示例代码:
% 定义Ackley's Function函数
ackley = @(x) -20 * exp(-0.2 * sqrt(0.5 * (x(1)^2 + x(2)^2))) ...
- exp(0.5 * (cos(2 * pi * x(1)) + cos(2 * pi * x(2)))) + exp(1) + 20;
% 初始化鲸鱼算法的参数
numWhales = 10; % 鲸鱼数量
maxIterations = 100; % 最大迭代次数
a = 2; % 尾巴上的常数
A = 2; % 搜索范围缩放因子
% 随机生成初始位置
dim = 2; % 优化问题的维度
lowerBound = -5; % 变量的下界
upperBound = 5; % 变量的上界
positions = lowerBound + (upperBound - lowerBound) * rand(numWhales, dim);
% 初始化最佳位置和最佳适应度
bestPosition = positions(1, :);
bestFitness = ackley(bestPosition);
% 开始迭代
for iter = 1:maxIterations
% 更新每条鲸鱼的位置
for i = 1:numWhales
% 生成随机向量
r1 = rand(1, dim);
r2 = rand(1, dim);
% 更新位置
A_i = 2 * A * r1 - A; % Equation (3)
C_i = 2 * r2; % Equation (4)
l = (a - 1) * rand(1, dim) + 1; % Equation (5)
p = rand(); % Equation (6)
if p < 0.5
if abs(A_i) < 1
positions(i, :) = bestPosition - A_i .* abs(C_i .* bestPosition - positions(i, :));
else
j = randi([1, numWhales]);
positions(i, :) = positions(j, :) - A_i .* abs(C_i .* positions(j, :) - positions(i, :));
end
else
distanceToBest = abs(bestPosition - positions(i, :));
positions(i, :) = distanceToBest .* exp(l) .* cos(2 * pi .* l) + bestPosition; % Equation (7)
end
end
% 修正超出边界的位置
positions(positions < lowerBound) = lowerBound;
positions(positions > upperBound) = upperBound;
% 计算每条鲸鱼的适应度
fitness = zeros(numWhales, 1);
for i = 1:numWhales
fitness(i) = ackley(positions(i, :));
% 更新最佳位置和最佳适应度
if fitness(i) < bestFitness
bestFitness = fitness(i);
bestPosition = positions(i, :);
end
end
% 显示当前迭代的结果
fprintf('Iteration %d: Best Fitness = %f\n', iter, bestFitness);
end
% 输出最优解和最优适应度
fprintf('Best Position: (%f, %f)\n', bestPosition(1), bestPosition(2));
fprintf('Best Fitness: %f\n', bestFitness);
注意,这只是鲸鱼算法的一种实现方式,你可以根据自己的需求进行修改和优化。
原文地址: https://www.cveoy.top/t/topic/S6K 著作权归作者所有。请勿转载和采集!