文章目录

  • 一、理论基础
  • 二、案例背景
    • 1、问题描述
    • 2、解题思路及步骤
  • 三、MATLAB程序实现
    • 1、清空环境变量
    • 2、初始化参数
    • 3、构建解空间
    • 4、迭代寻优
    • 5、结果显示
    • 6、绘图
  • 四、参考文献

生物学家研究发现,蚂蚁在寻找食物时,会在其经过的路径上释放一种信息素,并能够感知其他蚂蚁释放的信息素。信息素浓度的大小表示路径的远近,浓度越高,表明对应的路径距离越短。通常,蚂蚁会以较大的概率优先选择信息素浓度较高的路径,并释放一定量的信息素,这样就形成一个正反馈。最终,蚂蚁能够找到一条从巢穴到食物源的最佳路径,即最短距离。同时,生物学家还发现,路径上的信息素浓度会随着时间的推移而逐渐衰减
将蚁群算法(ant colony algorithm,ACA)应用于解决优化问题的基本思路为:用蚂蚁的行走路径表示待优化问题的可行解,整个蚂蚁群体的所有路径构成待优化问题的解空间。路径较短的蚂蚁释放的信息素量较多,随着时间的推移,较短的路径上累积的信息素浓度逐渐增高,选择该路径的蚂蚁数量也越来越多。最终,整个蚂蚁会在正反馈的作用下集中到最佳的路径上,此时对应的便是待优化问题的最优解。

【优化求解】基于蚁群算法求解目标最优_matlab

2、解题思路及步骤

【优化求解】基于蚁群算法求解目标最优_matlab_02

三、MATLAB程序实现

利用MATLAB提供的函数,可以方便地在MATLAB环境下实现上述步骤。

1、清空环境变量

程序运行之前,清除工作空间Workspace中的变量及Command Window中的命令。具体程序如下:

%% 清空环境变量
clear all
clc
  • 1.
  • 2.
  • 3.

2、初始化参数

在计算之前,需要对参数进行初始化。同时,为了加快程序的执行速度,对于程序中涉及的一些过程变量,需要预分配其存储容量。具体程序如下:

%% 初始化参数
m = 300;                    % 蚂蚁数量
iter_max = 80;              % 最大迭代次数
Rho = 0.9;                  % 信息素挥发因子
P0 = 0.2;                   % 转移概率常数
step = 0.05;                % 局部搜索步长
Tau = zeros(m, 1);          % 信息素矩阵
P = zeros(iter_max, m);     % 转移概率矩阵
trace = zeros(iter_max, 1); % 每代最优值
x_lower = -5;               % x范围下限
y_lower = -5;               % y范围下限
x_upper = 5;                % x范围上限
y_upper = 5;                % y范围上限
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

3、构建解空间

代码如下:

%% 构建解空间
ant = zeros(m, 2);   % 随机生成蚁群位置
for i = 1: m
    ant(i, 1) = x_lower + (x_upper - x_lower) * rand;
    ant(i, 2) = y_lower + (y_upper - y_lower) * rand;
    Tau(i) = F(ant(i, 1), ant(i, 2));     % 信息素
end
%% 绘图显示
[x, y] = meshgrid(x_lower:0.05:x_upper, y_lower:0.05:y_upper);
f = '20*(x.^2-y.^2).^2-(1-y.^2).^2-3*(1+y).^2+0.3';
z = eval(f);
figure(1);
mesh(x, y ,z)
hold on;
plot3(ant(:, 1), ant(:, 2), Tau, 'k*');
xlabel 'x'; ylabel 'y'; zlabel 'z';
title '蚁群初始位置';
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.

蚁群初始位置如图2所示。【优化求解】基于蚁群算法求解目标最优_matlab_03

图2 蚁群初始位置

4、迭代寻优

迭代寻优为整个算法的核心。首先计算状态转移概率;然后根据转移概率的值判断哪些蚂蚁需要进行局部搜索,哪些蚂蚁需要进行全局搜索,之后再进行搜索,搜索完了之后一定要进行边界处理,并更新蚂蚁的位置;最后,更新信息素,每次迭代保存最优解。

%% 迭代寻优
for iter = 1:iter_max
    lamda = 1 / iter;
    [Tau_best, BestIndex] = max(Tau);
    %% 计算状态转移概率
    for i = 1:m
        P(iter, i) = (Tau_best - Tau(i)) / Tau_best;
    end
    %% 位置更新
    for i = 1:m
        %% 局部搜索
        if P(iter, i) < P0
            temp1 = ant(i, 1) + (2 * rand - 1) * step * lamda;
            temp2 = ant(i, 2) + (2 * rand - 1) * step * lamda;
        else
            %% 全局搜索
            temp1 = ant(i, 1) + (x_upper-x_lower)*(rand-0.5);
            temp2 = ant(i, 2) + (y_upper-y_lower)*(rand-0.5);
        end
        %% 边界处理
        if temp1 < x_lower
            temp1 = x_lower;
        elseif temp1 > x_upper
            temp1 = x_upper;
        end
        if temp2 < y_lower
            temp2 = y_lower;
        elseif temp2 > y_upper
            temp2 = y_upper;
        end
        %% 判断蚂蚁是否移动
        if fun(temp1, temp2) > fun(ant(i, 1), ant(i, 2))
            ant(i, 1) = temp1;
            ant(i, 2) = temp2;
        end
    end
    %% 迭代过程中蚂蚁移动图
    figure(2);
    mesh(x, y ,z);
    hold on;
    plot3(ant(:, 1), ant(:, 2), fun(ant(:, 1), ant(:, 2)), '*', 'color', [iter/iter_max, 0, 0]);
    hold off;
    xlabel 'x'; ylabel 'y';
    title '蚁群算法迭代过程中蚂蚁移动';
    pause(0.1)
    frame = getframe(gcf);
    imind = frame2im(frame);
    [imind, cm] = rgb2ind(imind, 256);
    if iter == 1
        imwrite(imind, cm, 'test.gif', 'gif', 'Loopcount', inf, 'DelayTime', 1e-4);
    else
        imwrite(imind, cm, 'test.gif', 'gif', 'WriteMode', 'append', 'DelayTime', 1e-4);
    end
    %% 更新信息素
    for i = 1: m
        Tau(i) = (1 - Rho) * Tau(i) + fun(ant(i, 1), ant(i, 2));
    end
    %% 保存最优解
    [value, index] = max(Tau);
    trace(iter) = fun(ant(index, 1), ant(index, 2));
end
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.

迭代过程中蚂蚁的移动位置如图3所示。【优化求解】基于蚁群算法求解目标最优_matlab_04

图3 迭代过程中蚂蚁的移动位置

5、结果显示

为了更为直观地对结果进行观察和分析,将寻找到的最优自变量及其最优函数值显示在Command Window中。具体程序如下:

%% 结果显示
[~, max_index] = max(Tau);
max_X = ant(max_index, 1);
max_Y = ant(max_index, 2);
max_value = fun(max_X, max_Y);
disp(['最优自变量:', num2str(ant(max_index, :))]);
disp(['最优函数值:', num2str(max_value)]);
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

由于各个蚂蚁的初始位置是随机生成的,因此每次运行的结果都会有所不同。某次运行的结果如下:

最优自变量:5  -0.0031313
最优函数值:12496.309
  • 1.
  • 2.
  •  

6、绘图

为了更为直观地对结果进行观察和分析,以图形的形式将结果显示出来,具体程序如下:

%% 绘图
figure;
mesh(x, y ,z);
hold on;
x = ant(:, 1);
y = ant(:, 2);
plot3(x, y ,eval(f), 'k*');
xlabel 'x'; ylabel 'y'; zlabel 'z';
title '蚁群最终位置';
figure;
plot(1:iter_max, trace, 'r', 'LineWidth', 2);
title '蚁群算法函数寻优';
xlabel '迭代次数'; ylabel '函数值';
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

蚁群最终位置如图4所示。【优化求解】基于蚁群算法求解目标最优_matlab_05【优化求解】基于蚁群算法求解目标最优_matlab_06

图4 蚁群最终位置

蚁群算法各代的函数值如图5所示。【优化求解】基于蚁群算法求解目标最优_matlab_07【优化求解】基于蚁群算法求解目标最优_matlab_08

图5 蚁群算法各代的函数值

四、参考文献


[2] 凯旋16668. 【啃书】《智能优化算法及其MATLAB实例》例5.2蚁群算法进行函数寻优. 优快云博客.
[3] 曲怪曲怪. 《智能算法》专栏. 优快云博客.
[4] 郁磊等. MATLAB智能算法30个案例分析(第2版)[M].北京航空航天大学出版社.2015年.