蚁群算法(ACO)

一、算法理论

蚁群算法是对自然界蚂蚁的寻径方式进行模拟而得出的一种仿生算法。蚂蚁在运动过程中,能够在它所经过的路径上留下信息素进行信息传递,而且蚂蚁在运动过程中能够感知这种物质,并以此来指导自己的运动方向。因此,由大量蚂蚁组成的蚁群的集体行为便表现出一种信息正反馈现象:某一路径上走过的蚂蚁越多,则后来者选择该路径的概率就越大。

二、蚁群算法的特点

1、并行

每只蚂蚁的搜索过程相互独立,所以蚁群算法可以看作一个分布式的多智能体系统,它在问题空间的多点同时开始独立的解搜索,不仅增加了算法的可靠性,也使得算法具有较强的全局搜索能力。

2、自组织

所谓的自组织就是没有外界干预,系统从无序到有序的变化过程。

3、鲁棒性

蚁群算法对初始路线的要求不高,即蚁群算法的求解结果不依赖于初始路线的选择,而且在搜索过程中不需要进行人工的调整。此外,蚁群算法的参数较少,设置简单,因而该算法易于应用到组合优化问题的求解。

4、正反馈

这一特点是蚁群算法的重要特征,它使得算法进化过程得以进行。体现在,蚂蚁能够最终找到最优路径,直接依赖于其在路径上信息素的堆积,而信息素的堆积是一个正反馈的过程。

三、基本蚁群算法

1、表述

在算法的初始时刻,将m只蚂蚁将m只蚂蚁随机地放到n 座城市,同时,将每只蚂蚁的禁忌表tabu的第一个元素设置为它当前所在的城市。此时各路径上的信息素量相等,设\tau_{ij}(0)=c(c为一较小的常数)在时刻t,蚂蚁k从城市i转移到城市j的概率为:p_{ij}^{k}(t)为:

 式中,J_{k}(i)=\left \{ 1,2,...,n \right \}-tabu_{k}表示蚂蚁k下一步允许选择的城市集合。禁忌表tabu_{k}记录了蚂蚁k当前走过的城市。当所有n座城市都加入禁忌表tabu_{k}中时,蚂蚁k便完成了一次周游,此时蚂蚁k所走过的路径便是TSP问题的一个可行解。

式中,\eta _{ij}是一个启发式因子,表示蚂蚁从城市i转移到城市j的期望程度。在蚁群算法中,\eta _{ij}通常取城市 i 与城市 j 之间距离的倒数。α 和 β分别表示信息素和期望启发式因子的相对重要程度。当所有蚂蚁完成一次周游后,各路径上的信息素根据下式更新:

 式中,p(0<p<1)表示路径上信息素的蒸发系数,1-p表示信息素的持久性系数;\Delta \tau _{ij}表示本次迭代中边ij上信息素的增量,即

 其中\Delta \tau _{ij}^{k}表示第k只蚂蚁在本次迭代中留在边ij上的信息素量,如果蚂蚁k没有经过边ij,则\Delta \tau _{ij}^{k}=0;\Delta \tau _{ij}^{k}可以表示为:

 其中Q为正常数,L_{k}表示第k只蚂蚁在本次周游中所走过路径的长度。

2、M.Dorigo 3种蚁群算法模型

(1)ant-cycle模型

(2)ant-quantity模型

(3)ant-density模型

三种模型其差别主要在于\Delta \tau _{ij}^{k}的表示。实验结果表明,ant-cycle模型比ant-quantity和ant-density模型有更好的性能。这是因为ant-cycle模型利用全局信息更新路径上的信息素量,而 ant-quantity和ant-density模型使用局部信息。

3、具体实现

4、算法流程图

 四、关键参数

关键参数设置原因
信息素启发式因子 α[l,4]α 的大小反映了蚁群在路径搜索中随机性因素作用的强度,其值越大,蚂蚁在选择以前走过的路径的可能性就越大,搜索的随机性就会减弱;而当启发式因子α的值过小时,则易使蚁群的搜索过早陷于局部最优。
期望启发因子 β[3,5]反映蚁群在搜索最优路径的过程中的先验性和确定性因素的作用强度。期望启发因子β的值越大,蚂蚁在某个局部点上选择局部最短路径的可能性就越大,虽然这个时候算法的收敛速度得以加快,但蚁群搜索最优路径的随机性减弱,而此时搜索易于陷入局部最优解。
信息素蒸发系数 ρ0-1ρ 表示信息素蒸发系数,1-ρ则表示信息素持久性系数。因此,ρ的取值范围应该是0~1之间的一个数,表示信息素的蒸发程度,它实际上反映了蚂蚁群体中个体之间相互影响的强弱。ρ 过小时,则表示以前搜索过的路径被再次选择的可能性过大,会影响到算法的随机性能和全局搜索能力;ρ 过大时,说明路径上的信息素挥发的相对变多,虽然可以提高算法的随机搜索性能和全局搜索能力,但过多无用搜索操作势必会降低算法的收敛速度。
蚂蚁数目 m10-50子集增大(即蚂蚁数量增多),可以提高蚁群算法的全局搜索能力以及算法的稳定性;但蚂蚁数目增大后,会使大量的曾被搜索过的解(路径)上的信息素的变化趋于平均,信息正反馈的作用不明显,虽然搜索的随机性得到了加强,但收敛速度减慢;反之,子集较小(蚂蚁数量少),特别是当要处理的问题规模比较大时,会使那些从来未被搜索到的解(路径)上的信息素减小到接近于0,搜索的随机性减弱,虽然收敛速度加快了,但会使算法的全局性能降低,算法的稳定性差,容易出现过早停滞现象。
信息素强度 Q 任意

对算法性能起着主要作用的是信息启发式因子α、期望启发式因子β和信息素挥发因子ρ这三个参数,总信息量Q对算法性能的影响有赖于上述三个参数的选取,以及算法模型的选取。例如,在ant-cycle模型和ant-quantity模型中,总信息量Q所起的作用显然是有很大差异的,即随着问题规模的不同,其影响程度也将不同。相关人员研究结果表明:总信息量 Q 对 ant-cycle 模型蚁群算法的性能没有明显的影响。因此,在算法参数的选择上,参数Q不必作特别的考虑,可以任意选取。

最大进化代数G100~500蚁群算法运行到指定的进化代数之后就停止运行,并将当前群体中的最佳个体作为所求问题的最优解输出。

五、改进的蚁群算法

针对基本蚂蚁算法一般需要较长的搜索时间和容易出现停滞现象等不足,很多学者在此基础上提出改进算法,提高了算法性能和效率。

1、精英蚂蚁系统

该算法将已经发现的最好的解称之为T^{bs}(best-so-far),而该路径在修改信息素轨迹时,人工释放额外的信息素,以增加正反馈的效果。相应的信息素修改公式为

 式中e是调整T^{bs}影响权重的参数,而\Delta \tau_{ij}^{bs}由下式给出:

 其中L_{bs}是已知最优路径T^{bs}的长度

2、最大最小蚂蚁系统

 为了克服基本蚁群系统中可能出现的停滞现象,主要有三方面的不同:

(1)每次循环之后,只有一只蚂蚁进行信息素更新

这只蚂蚁可能是找出当前循环中最优解的蚂蚁(迭代最优的蚂蚁),也可能是找出从实验开始以来最优解的蚂蚁(全局最优的蚂蚁);而在蚂蚁
系统中,对所有蚂蚁走过的路径都进行信息素更新。

(2)每个解元素信息素范围有限制

为避免搜索的停滞,在每个解元素(TSP中是每条边)上的信息素轨迹量的值域范围被限制在[\tau _{min},\tau _{max}]区间内;而在蚂蚁系统中信息素轨迹量不被限制,使得一些路径上的轨迹量远高于其他边,从而蚂蚁都沿着同条路径移动,阻止了进一步搜索更优解的行为。

(3)初始化时将信息素初始化为\tau _{max}

为使蚂蚁在算法的初始阶段能够更多地搜索新的解决方案,将信息素初始化为\tau _{max};而在蚂蚁系统中没有这样的设置。

3、基于排序的蚁群算法

在该算法中,每个蚂蚁释放的信息素按照它们不同的等级进行挥发,另外类似于精英蚁群算法,精英蚂蚁在每次循环中释放更多的信息素。在修改信息素路径前,蚂蚁按照它们的旅行长度进行排名(短的靠前),蚂蚁释放信息素的量要和蚂蚁的排名相乘。在每次循环中,只有排名前w-1位的蚂蚁和精英蚂蚁才允许在路径上释放信息素。己知的最优路径给以最强的反馈,和系数w相乘;而排名第r位的蚂蚁则乘以系数“w-r”(≥0)。信息素如下式所示:

 式中,L{r}是排名为第r位的蚂蚁的旅行路径的长度。

4、自适应蚁群算法

基于蚁群系统的信息素正反馈,可能让算法早熟,停滞。最大最小蚁群算法将各个路径上的信息量更新限制在固定的范围内,虽然在一定程度上避免了“早熟”停滞现象,但在分解分布较分散时会导致收敛速度变慢。以上方法的共同缺点在于:它们都按一种固定不变的模式去更新信息量和确定每次路径的选择概率。所以有了基于调节信息素挥发度的自适应蚁群算法。

改进如下:

(1)在每次循环结束后求出最优解,并将其保留。

(2)自适应地改变ρ值

当问题规模比较大时,由于信息量的挥发系数ρ的存在,使那些从未被搜索到的信息量会减小到接近于 0,降低了算法的全局搜索能力;当ρ过大且解的信息量增大时,以前搜索过的解被选择的可能性过大,也会影响到算法的全局搜索能力;通过减小ρ虽然可以提高算法的全局搜索能力,但又会使算法的收敛速度降低。因此可以自适应地改变ρ的值。ρ的初始值ρ(t_{0})=1;当算法求得的最优值在N次循环内没有明显改进时,ρ减为:

 式中:\rho _{min}\rho的最小值,可以防止\rho过小而降低算法的收敛速度。

六、MATLAB仿真实例

%%%%%%%f(x,y)=20*(x^2-y^2)^2-(1-y)^2-3*(1+y)^2+0.3%%%%%%%
clear all;              %清除所有变量
close all;              %清图
clc;                    %清屏
x=-5:0.01:5;
y=-5:0.01:5;
N=size(x,2);
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
mesh(x,y,z)
xlabel('x')
ylabel('y')
%%%%%%%%%%%%%%%%%%%%蚁群算法求函数极值%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear all;               %清除所有变量
close all;               %清图
clc;                     %清屏
m=20;                    %蚂蚁个数
G_max=200;               %最大迭代次数
Rho=0.9;                 %信息素蒸发系数
P0=0.2;                  %转移概率常数
XMAX= 5;                 %搜索变量x最大值
XMIN= -5;                %搜索变量x最小值
YMAX= 5;                 %搜索变量y最大值
YMIN= -5;                %搜索变量y最小值
%%%%%%%%%%%%%%%%%随机设置蚂蚁初始位置%%%%%%%%%%%%%%%%%%%%%%
for i=1:m
    X(i,1)=(XMIN+(XMAX-XMIN)*rand);
    X(i,2)=(YMIN+(YMAX-YMIN)*rand);
    Tau(i)=func(X(i,1),X(i,2));
end
step=0.1;                %局部搜索步长
for NC=1:G_max
    lamda=1/NC;
    [Tau_best,BestIndex]=min(Tau);
    %%%%%%%%%%%%%%%%%%计算状态转移概率%%%%%%%%%%%%%%%%%%%%
    for i=1:m
        P(NC,i)=(Tau(BestIndex)-Tau(i))/Tau(BestIndex);
    end
    %%%%%%%%%%%%%%%%%%%%%%位置更新%%%%%%%%%%%%%%%%%%%%%%%%
    for i=1:m
           %%%%%%%%%%%%%%%%%局部搜索%%%%%%%%%%%%%%%%%%%%%%
        if P(NC,i)<P0
            temp1=X(i,1)+(2*rand-1)*step*lamda;
            temp2=X(i,2)+(2*rand-1)*step*lamda;
        else
            %%%%%%%%%%%%%%%%全局搜索%%%%%%%%%%%%%%%%%%%%%%%
             temp1=X(i,1)+(XMAX-XMIN)*(rand-0.5);
             temp2=X(i,2)+(YMAX-YMIN)*(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 func(temp1,temp2)<func(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)+func(X(i,1),X(i,2));
    end
    [value,index]=min(Tau);
    trace(NC)=func(X(index,1),X(index,2));
end
[min_value,min_index]=min(Tau);
minX=X(min_index,1);                           %最优变量
minY=X(min_index,2);                           %最优变量
minValue=func(X(min_index,1),X(min_index,2));  %最优值
figure
plot(trace)
xlabel('搜索次数');
ylabel('适应度值');
title('适应度进化曲线')

源自《智能优化算法及其MATLAB实例(第2版)》

  • 35
    点赞
  • 81
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
蚁群算法(Ant Colony Optimization,ACO)是一种模拟蚂蚁寻找食物的行为进行优化的算法。下面是一个在C#中实现蚁群算法的示例代码: ```csharp using System; using System.Collections.Generic; class AntColonyOptimization { private int numAnts; // 蚂蚁数量 private int numCities; // 城市数量 private double[,] distanceMatrix; // 城市间距离矩阵 private double[,] pheromoneMatrix; // 信息素矩阵 private double alpha; // 信息素重要程度因子 private double beta; // 启发式因子 private double evaporationRate; // 信息素挥发率 private double initialPheromone; // 初始信息素浓度 private int maxIterations; // 最大迭代次数 public AntColonyOptimization(int numAnts, int numCities, double[,] distanceMatrix, double alpha, double beta, double evaporationRate, double initialPheromone, int maxIterations) { this.numAnts = numAnts; this.numCities = numCities; this.distanceMatrix = distanceMatrix; this.alpha = alpha; this.beta = beta; this.evaporationRate = evaporationRate; this.initialPheromone = initialPheromone; this.maxIterations = maxIterations; InitializePheromoneMatrix(); } private void InitializePheromoneMatrix() { pheromoneMatrix = new double[numCities, numCities]; for (int i = 0; i < numCities; i++) { for (int j = 0; j < numCities; j++) { pheromoneMatrix[i, j] = initialPheromone; } } } public List<int> FindShortestPath() { List<int> shortestPath = null; double shortestDistance = double.MaxValue; for (int iteration = 0; iteration < maxIterations; iteration++) { List<List<int>> antPaths = ConstructAntPaths(); UpdatePheromoneMatrix(antPaths); foreach (var path in antPaths) { double distance = CalculatePathDistance(path); if (distance < shortestDistance) { shortestDistance = distance; shortestPath = path; } } EvaporatePheromoneMatrix(); } return shortestPath; } private List<List<int>> ConstructAntPaths() { List<List<int>> antPaths = new List<List<int>>(); for (int ant = 0; ant < numAnts; ant++) { List<int> path = new List<int>(); bool[] visited = new bool[numCities]; int currentCity = new Random().Next(numCities); path.Add(currentCity); visited[currentCity] = true; while (path.Count < numCities) { int nextCity = ChooseNextCity(currentCity, visited); path.Add(nextCity); visited[nextCity] = true; currentCity = nextCity; } antPaths.Add(path); } return antPaths; } private int ChooseNextCity(int currentCity, bool[] visited) { double[] probabilities = new double[numCities]; double totalProbability = 0; for (int city = 0; city < numCities; city++) { if (!visited[city]) { probabilities[city] = Math.Pow(pheromoneMatrix[currentCity, city], alpha) * Math.Pow(1.0 / distanceMatrix[currentCity, city], beta); totalProbability += probabilities[city]; } } double randomValue = new Random().NextDouble(); for (int city = 0; city < numCities; city++) { if (!visited[city]) { probabilities[city] /= totalProbability; if (randomValue <= probabilities[city]) { return city; } randomValue -= probabilities[city]; } } return -1; } private void UpdatePheromoneMatrix(List<List<int>> antPaths) { for (int i = 0; i < numCities; i++) { for (int j = 0; j < numCities; j++) { if (i != j) { pheromoneMatrix[i, j] *= (1 - evaporationRate); foreach (var path in antPaths) { if (path.Contains(i) && path.Contains(j)) { pheromoneMatrix[i, j] += 1.0 / CalculatePathDistance(path); } } } } } } private void EvaporatePheromoneMatrix() { for (int i = 0; i < numCities; i++) { for (int j = 0; j < numCities; j++) { pheromoneMatrix[i, j] *= (1 - evaporationRate); } } } private double CalculatePathDistance(List<int> path) { double distance = 0; for (int i = 0; i < path.Count - 1; i++) { distance += distanceMatrix[path[i], path[i + 1]]; } return distance; } } ``` 上述代码实现了一个AntColonyOptimization类,可以用于解决旅行商问题。其中numAnts表示蚂蚁数量,numCities表示城市数量,distanceMatrix表示城市间距离矩阵,alpha和beta分别表示信息素重要程度因子和启发式因子,evaporationRate表示信息素挥发率,initialPheromone表示初始信息素浓度,maxIterations表示最大迭代次数。 你可以根据需要修改以上代码,并使用以下示例进行测试: ```csharp class Program { static void Main(string[] args) { int numAnts = 10; int numCities = 5; double[,] distanceMatrix = new double[,] { { 0, 2, 1, 3, 4 }, { 2, 0, 4, 1, 2 }, { 1, 4, 0, 5, 2 }, { 3, 1, 5, 0, 3 }, { 4, 2, 2, 3, 0 } }; double alpha = 1.0; double beta = 2.0; double evaporationRate = 0.5; double initialPheromone = 1.0; int maxIterations = 100; AntColonyOptimization aco = new AntColonyOptimization(numAnts, numCities, distanceMatrix, alpha, beta, evaporationRate, initialPheromone, maxIterations); List<int> shortestPath = aco.FindShortestPath(); Console.WriteLine("Shortest Path: " + string.Join(" -> ", shortestPath)); Console.WriteLine("Shortest Distance: " + aco.CalculatePathDistance(shortestPath)); } } ``` 希望对你有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值