以下是使用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 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录