蚁群算法的应用——求解二元函数的极值

仅作自己学习使用


1 蚁群算法相关知识点

1.1 蚁群算法的特点

  • 蚁群算法是一种模拟蚂蚁寻找食物的过程的仿生优化算法,理由是蚂蚁有能力在没有任何提示的情况下找到从巢穴到事物源的最短路径,并且能随环境的变化,适应性地搜索新的路径,产生新的路径选择。
  • 在蚂蚁搜索过程中,有一个重要的物质信息素,这是蚂蚁之间进行信息交换的主要途径。蚂蚁在搜索的过程中,会在走过的路径上留下信息素,路径上的信息素会随着时间地推移而逐渐地蒸发,而单只蚂蚁能够携带的信息素总量是确定的,因此同一只蚂蚁,选择长的路径会导致长的路径上的平均信息素浓度比短的路径更低。后来的蚂蚁在选择某条路径的概率与它感知到的路径上的信息素浓度有关,蚂蚁会选择它面临的几条路径上信息素浓度最高的那条路径。因此当一条路径上通过的蚂蚁越来越多时,该条路径上的信息素浓度也越来越高,从而以后的蚂蚁选择该条路径的概率就更高,又会导致该条路径上通过的蚂蚁数量更多,从而使信息素浓度更高,这就是蚁群算法中一个重要的机制——正反馈机制,在这样一个机制的运作下,最终可以找到从巢穴到事物源的最短路径。
    在这里插入图片描述
    如图所示:蚁群从A到B事先并不知道哪条路径最优,所以在第一次搜索时,每条路径都有机会被搜索到,一段时间后,距离较远路径上的信息素残留越来越少,而距离最近路径上的信息素越来越密,直到最后找到一条最优路径时,算法结束。
  • 蚁群算法具有分布式计算、无中心控制和分布式个体之间间接通信的特征。
  • 蚁群算法是一种本质上的并行算法。对于人工蚂蚁,每只蚂蚁搜索的过程彼此独立,仅通过信息激素进行通信,所以蚁群算法可以看作是一个分布式的多智能体系统,这使得算法具有较强的全局搜索能力。

1.2 人工蚁群算法的优化过程

  • 相较真实蚂蚁,人工蚁群具有一定的记忆能力,记得自己走过的路径。
  • 人工蚁群释放的信息素的数量使其生成解的质量的函数,也就是说解的质量与信息素浓度有关
            以旅行商问题(TSP)为例,假设m只蚂蚁在图的相邻节点间移动,从而协作异步地得到问题的解。每只蚂蚁的一步转移概率由图中的每条边上的两类参数决定:一是信息素含量(τ,tao),也称为信息素痕迹;而是能见度,即先验函数值(η)。
            信息素的更新方式有两种:一是挥发,也就是所有路径上的信息素以一定的比率减少,模拟自然界信息素随时间挥发的过程;二是增强,给具有给优秀的边增加一定浓度的信息素。
            蚂蚁向下一个目标的运动是通过一个随机原则来实现的(类似于遗传算法中的轮盘赌选择算子),利用当前节点存储的信息,计算下一步可达节点的概率,并按此概率来选择下一步节点。
  • 在算法的初始时刻,将m只蚂蚁随机地放到n座城市,同时将m只蚂蚁的禁忌表tabu的第一个元素设置为它当前所在的城市。此时各路径上的信息素浓度相同,将0时刻各条路径上的信息素浓度都给一个相同的较小的常数,接下来,每只蚂蚁根据路径上残留的信息素浓度和启发式信息(两个节点间的距离)独立地选择下一座城市:
    论文截图

1.3 算法流程图

蚁群算法流程图

2 问题

在这里插入图片描述
函数的图像:
在这里插入图片描述

3 MatLab代码

%% 利用蚁群算法(ACO)求解函数的最小值
% f(x,y) = 20*(x^2 - y^2)^2 - (1-y)^2 - 3*(1+y)^2 + 0.3;

clear
clc
m = 20;     % 蚂蚁数量
G = 200;    % 最大迭代次数
rho = 0.8;  % 信息素蒸发程度
p0 = 0.2;   % 转移概率常数
xMax = 5;   % 搜索x的最大值
xMin = -5;  % 搜索x的最小值
yMax = 5;   % 搜索y的最大值
yMin = -5;  % 搜索y的最小值
X = zeros(m,2);     % m只蚂蚁的初始位置
tau = zeros(m,1);   % 每只蚂蚁的适应度值(函数值)
trace = zeros(G,1); % 每代蚂蚁的最优适应度
for i = 1:m
    X(i,1) = (xMin + (xMax - xMin)*rand);
    X(i,2) = (yMin + (yMax - yMin)*rand);
    tau(i) = GetTau(X(i,1),X(i,2));
end
step = 1;           % 局部搜索步长
P = zeros(G,m);     % 每代中各只蚂蚁的状态转移概率
for NC = 1:G
    lambda = 1/NC;  % ?
    [Tau_best,BestIndex] = min(tau);  % Tau_best:最小的函数值;BestIndex:最小的函数值对应的蚂蚁编号
    %% 计算状态转移概率(根据当前这代蚂蚁中最优的适应度值更新本代蚂蚁中的状态转移概率) 
    for i = 1:m
        P(NC,i) = (Tau_best-tau(i))/Tau_best;
    end
    %% 更新每只的位置
    for i = 1:m
        if P(NC,i) < p0
            % 局部搜索
            temp1 = X(i,1) + (2*rand-1)*step*lambda;
            temp2 = X(i,2) + (2*rand-1)*step*lambda;
        else
            % 全局搜索
            temp1 = X(i,1) + (xMax-xMin)*(rand-0.5);
            temp2 = X(i,2) + (xMax-xMin)*(rand-0.5);
        end
        %% 边界处理
        if temp1 < xMin
            temp1 = xMin;
        end
        if temp1 > xMax 
            temp1 = xMax;
        end
        if temp2 < yMin
            temp2 = yMin;
        end
        if temp2 < yMax
            temp2 = yMax;
        end
        %% 判断蚂蚁当前位置的状态是否更优
        if GetTau(temp1,temp2) < GetTau(X(i,1),X(i,2))
            X(i,1) = temp1;
            X(i,2) = temp2;
        end
    end
    %% 更新信息素
    for i = 1:m
        tau(i) = (1-rho)*tau(i) + GetTau(X(i,1),X(i,2));
    end
    [value,index] = min(tau);
    trace(NC) = GetTau(X(index,1),X(index,2));
end
[minValue,minIndex] = min(tau);
minX = min(minIndex,1);
minY = min(minIndex,2);
figure(color=[1 1 1])
plot(trace,LineWidth=2,Color=[1, 0.6, 0]);
title("适应度进化曲线")
xlabel('搜索次数')
ylabel("适应度值")

%% 绘图
figure(color=[1 1 1])
X = -5:0.1:5;
Y = -5:0.1:5;
N = length(X);
for i = 1:N
    for j = 1:N
        Z(i,j) = 20*(X(i)^2 - Y(j)^2)^2 - (1-Y(j))^2 - 3*(1+Y(j))^2 + 0.3;
    end
end
colormap parula
mesh(X,Y,Z)
xlabel("x");
ylabel("y");
hold on
scatter3(minX, minY, GetTau(minX,minY), 50, 'r', 'filled'); 
hold off;
%% 适应度函数
function fxy = GetTau(x,y)
    fxy = 20*(x^2 - y^2)^2 - (1-y)^2 - 3*(1+y)^2 + 0.3;
end

4 效果图

4.1 最小值在函数图像中

在这里插入图片描述图中红色的点就是找到的最小值点。

4.2 历代迭代图

在这里插入图片描述

5 总结

%% TODO

  • 24
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
蚁群算法(Ant Colony Optimization)是一种模拟蚂蚁觅食行为的启发式优化算法。它可以用于求解多元函数极值问题。以下是使用MATLAB实现蚁群算法求解多元函数极值的大致步骤: 1. 定义目标函数:首先,根据实际问题定义一个多元函数作为目标函数。例如,可以定义一个二元函数 f(x, y)。 2. 初始化蚂蚁群:确定蚂蚁数量、迭代次数、信息素参数等初始设置。 3. 初始化信息素矩阵:创建一个与目标函数维度相同的矩阵,用于记录蚂蚁在搜索过程中留下的信息素。 4. 蚂蚁行为模拟:在每次迭代中,每只蚂蚁按照一定规则选择下一个位置,并更新信息素矩阵。 5. 更新信息素:根据每只蚂蚁的路径和其对应的目标函数值,更新信息素矩阵。 6. 判断终止条件:根据设定的终止条件,判断是否达到停止搜索的条件。如果满足条件,则输出最优解;否则,返回步骤4。 在MATLAB中实现蚁群算法求解多元函数极值可以参考以下伪代码: ```matlab function [bestSolution, bestValue] = antColonyOptimization() % 步骤1:定义目标函数 % ... % 步骤2:初始化蚂蚁群 % ... % 步骤3:初始化信息素矩阵 % ... for iteration = 1:maxIterations % 步骤4:蚂蚁行为模拟 % ... % 步骤5:更新信息素 % ... % 步骤6:判断终止条件 % ... end % 输出最优解及其对应的函数值 % ... end ``` 请注意,以上只是一个大致的框架,具体实现需要根据目标函数问题的特点进行调整。此外,蚁群算法还可以进一步优化,例如通过引入局部搜索算子、改变信息素更新规则等方法,提高算法的性能和收敛速度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

亲爱的老吉先森

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

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

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

打赏作者

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

抵扣说明:

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

余额充值