matlab基于蚁群算法求解目标最优

Posted 博主QQ2449341593

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了matlab基于蚁群算法求解目标最优相关的知识,希望对你有一定的参考价值。

文章目录

 

一,理论基础

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

2、解题思路及步骤

三、MATLAB程序实现

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

1、清空环境变量

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

%% 清空环境变量
clear all
clc

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范围上限

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 '蚁群初始位置';

蚁群初始位置如图2所示。
在这里插入图片描述

图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

迭代过程中蚂蚁的移动位置如图3所示。
在这里插入图片描述

图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)]);

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

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

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 '函数值';

蚁群最终位置如图4所示。
在这里插入图片描述wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

图4 蚁群最终位置

蚁群算法各代的函数值如图5所示。
在这里插入图片描述wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

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

四、参考文献

[1] 心升明月~~. 基于蚁群算法的旅行商问题(TSP)的优化. CSDN博客.
[2] 凯旋16668. 【啃书】《智能优化算法及其MATLAB实例》例5.2蚁群算法进行函数寻优. CSDN博客.
[3] 曲怪曲怪. 《智能算法》专栏. CSDN博客.
[4] 郁磊等. MATLAB智能算法30个案例分析(第2版)[M].北京航空航天大学出版社.2015年.

代码下载https://www.cnblogs.com/matlabxiao/p/14883637.html

以上是关于matlab基于蚁群算法求解目标最优的主要内容,如果未能解决你的问题,请参考以下文章

路径规划基于蚁群算法求解最短路径matlab

PSO算法、蚁群算法和遗传算法matlab求解函数最值问题,程序怎么编写?

优化PID基于matlab混沌改进的蚁群算法求解船舶锅炉压力控制PID优化问题含Matlab源码 2303期

优化PID基于matlab混沌改进的蚁群算法求解船舶锅炉压力控制PID优化问题含Matlab源码 2303期

优化覆盖基于matlab蚁群算法求解无线传感器覆盖优化问题含Matlab源码 1835期

单目标优化求解基于matlab被囊群算法(TSA)求解最优目标问题含Matlab源码 1567期