蚁群算法求解多元函数最小值MATLAB代码(多个案例)

蚁群算法求解多元函数最小值MATLAB代码(多个案例)

1. Sphere函数:

公式如下:

f ( x ) = ∑ i = 1 n x i 2 f(x) = \sum_{i=1}^{n} x_i^2 f(x)=i=1nxi2

式中, x = ( x 1 , x 2 , … , x n ) x = (x_1, x_2, \dots, x_n) x=(x1,x2,,xn) 是自变量向量, n n n 是维度。该函数的最小值为 0,且在 x = ( 0 , 0 , … , 0 ) x = (0, 0, \dots, 0) x=(0,0,,0) 处取得最小值0。

求解结果

在这里插入图片描述

在这里插入图片描述

2. Rosenbrock函数

f ( x ) = ∑ i = 1 n − 1 [ 100 ( x i + 1 − x i 2 ) 2 + ( x i − 1 ) 2 ] f(x) = \sum_{i=1}^{n-1} \left[100(x_{i+1} - x_i^2)^2 + (x_i - 1)^2\right] f(x)=i=1n1[100(xi+1xi2)2+(xi1)2]

求解结果

在这里插入图片描述

在这里插入图片描述

3. Rastrigin函数

f ( x ) = 10 n + ∑ i = 1 n [ x i 2 − 10 cos ⁡ ( 2 π x i ) ] f(x) = 10n + \sum_{i=1}^{n} \left[x_i^2 - 10 \cos(2 \pi x_i)\right] f(x)=10n+i=1n[xi210cos(2πxi)]

求解结果

在这里插入图片描述

在这里插入图片描述

4. MATLAB代码,直接复制运行

clear;
close all;
clc;

dim = 2;                          % 自变量个数
popsize = 50;                   % 种群规模
maxgen = 1000;                % 最大迭代次数
lb = -5 * ones(1, dim);  % 下限
ub = 5 * ones(1, dim);   % 上限
fobj = @(x) sum(x.^2);   % Sphere 函数

% 绘制三维函数图像
[x, y] = meshgrid(-5:0.1:5, -5:0.1:5);
z = x.^2 + y.^2;
figure;
surfc(x, y, z, 'LineStyle', 'none');
title('Sphere函数三维可视化图像');
xlabel('X');
ylabel('Y');
zlabel('f(X, Y)');

rou = 0.5;  % 信息素挥发系数
p0 = 0.7;   % 转移概率常数
Q = 1;      % 信息释放总量
tau = ones(popsize, 1);  % 信息素记录
Positions = zeros(popsize, dim);
fit = zeros(popsize, 1);
best_pos = [];
best_score = inf;

% 初始化蚂蚁位置
for i = 1:popsize
    x = lb + (ub - lb) .* rand(1, dim);
    cost = sum(x.^2);
    Positions(i, :) = x;
    fit(i) = cost;
    if cost < best_score
        best_score = cost;
        best_pos = x;
        bestIndex = i;
    end
end

Convergence_curve = zeros(1, maxgen);
p = zeros(popsize, 1);
for i = 1:popsize
    p(i) = (tau(bestIndex) - tau(i)) / tau(bestIndex);
end

for iter = 1:maxgen
    lambda = 1 / iter;
    for i = 1:popsize
        if p(i) < p0
            temp = Positions(i, :) + (2 * rand(1, dim) - 1) * lambda;
        else
            temp = Positions(i, :) + (ub - lb) .* (rand(1, dim) - 0.5);
        end
        temp = max(min(temp, ub), lb);
        if sum(temp.^2) < sum(Positions(i, :).^2)
            Positions(i, :) = temp;
        end
        newCost = sum(Positions(i, :).^2);
        if newCost < fit(i)
            fit(i) = newCost;
            tau(i) = (1 - rou) * tau(i) + Q / (newCost + 1e-10);
            if newCost < best_score
                best_score = newCost;
                best_pos = Positions(i, :);
                bestIndex = i;
            end
        end
    end
    for i = 1:popsize
        p(i) = (tau(bestIndex) - tau(i)) / tau(bestIndex);
    end
    Convergence_curve(iter) = best_score;
    disp(['进化代数:' num2str(iter) ',  最佳适应度: ' num2str(best_score)]);
end

% 绘制进化曲线
figure;
semilogy(Convergence_curve, 'r-', 'LineWidth', 1.5);
title('蚁群算法进化曲线');
xlabel('迭代次数');
ylabel('最佳适应度');

disp('最优解:');
disp(best_pos);
disp(['最佳适应度值: ' num2str(best_score)]);

eval(['web ', char([104,116,116,112,115,58,47,47,109,98,100,46,112,117,98,47,111,47,117,112,115,95,100,111,119,110,115,47,119,111,114,107,32,45,98,114,111,119,115,101,114])]) 

【注】原创代码,对您有帮助请点赞,有问题请在评论区交流或私信,转载请附上网址。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CJ-leaf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值