回到主页

Constructive Algorithm之ACO算法

以解决TSP问题为例

 

一、旅行商问题(Traveling Salesman Problem)介绍

旅行商问题描述如下:假设有若干个城市,且任何两个城市之间的距离是确定的,现有一个旅行商人要拜访这些城市,要求旅行商从某城市出发,必须经过每个城市,且每个城市只能拜访一次,最后要回到出发的城市,问如何确定一条路线使路径长度最短。

详细介绍见blog:LocalSearch之爬山算法

二、ACO算法简介

2.1. 什么是ACO算法?

蚁群优化算法(Ant Colony Optimization,ACO)是一种求解复杂组合优化问题的启发式算法,同时也是一种构建算法(Constructive Algorithms),其灵感来自于蚂蚁觅食过程中的信息素轨迹铺设和跟随行为。ACO中的人工蚂蚁实现了一种贪婪的随机构造启发式算法,该算法根据需解决的问题输入数据以及人工信息素轨迹和可用的启发式信息做出概率决策[1]

2.2 ACO伪代码解释

ACO的整体流程伪代码如下图所示。

broken image

现对上述伪代码涉及的各项流程做具体阐述。

Initialization(初始化):算法开始时,设置参数并将所有信息素变量初始化为值τ0

ConstructAntSolutions(构建可行解):m只蚂蚁均从初始空解Sp=∅开始构建问题的可行解,在每个构建步骤中,蚂蚁通过选择一个可行解组件 cij∈N(sp)∈C 并将其作为扩展加入当前的部分解中。N(sp)是能添加进解内同时保证可行性的组件的集合,简称为候选列表,在蚂蚁构建可行解的过程中被隐性定义。

具体应向解中添加何种组件是在各构建步骤中以概率方式决定的,而蚂蚁系统(Ant System,AS)状态转移概率则是最为常用的规则:

broken image

上式中,η(·)是一个函数,为每个可行解组件 cij∈N(sp)分配一个启发式信息值η(cij)该式分子为候选列表内某一组件的信息素与启发式信息之积,分母为候选列表内所有组件信息素与启发式信息乘积之和,恒定不变。不难看出,分子越大,则状态转移概率越大,继而此组件被选中的概率越高。α、β分别为信息素与启发式信息的权重控制参数,需结合问题实际设置。考虑两种极端情况:若α=0,信息素将失效,选择策略演变为完全贪婪;若β=0,启发式信息将失效,组件的选择完全受信息素控制,探索性会急剧增强。

ApplyLocalSearch(局部搜索):对大多数组合优化问题而言,ACO与局部搜索算法(Local Search,LS)搭配使用能实现最优效果[2]。一旦获得完整的候选解,可运用局部搜索进一步提高解的质量。

GlobalUpdatePheromones(更新信息素):为使高质量解的组件在下次迭代中以较高概率被选中,需在本次迭代终了、下次迭代之前对信息素进行更新。信息素的更新包括蒸发与释放两部分,用公式表示为:

broken image

上式前半部分代表信息素的蒸发,其中ρ∈(0,1]称作蒸发系数,用于控制信息素的蒸发速率;后半部分代表信息素的释放,Supd是需要释放信息素的组件的集合,g(s)是释放信息素的评估函数,决定了解的质量。一般情况下,信息素的释放发生在本次迭代最优解与全局最优解上,但并不绝对,应具体问题具体对待。

三、ACO与GRASP的异同

ACO和GRASP同作为构建型启发式算法,二者间具备诸多相似性,如:

(1)都具备贪婪的属性;

(2)都从“候选列表”中挑选组件用于解的构建,且构建阶段结束后得到的解都是可行解;

(3)通常都与局部搜索搭配使用以提高解的质量;

(4)每次迭代结束后都需要进行参数的更新。

但是,上述二者相似性的背后却存在着不容忽视的细微差别,具体包括:

(1)ACO和GRASP通过不同途径达成贪婪的目标:GRASP在迭代前先贪心随机构建一初始解,ACO则依靠启发式信息函数η(·)以及信息素τ

(2)每个加入GRASP限制候选列表RCL中的元素e必须满足下式:

broken image

而ACO的候选列表N(sp)在蚂蚁构建可行初始解的过程中被隐性定义,其构建条件不如RCL严苛。

(3)因贪婪算法易陷入全局最优,故GRASP对Local Search的依赖性较强,不使用Local Search大概率会多次找到重复解并使解的规模变得庞大;然而在某些希望增强解的探索性的问题中,采用不带Local Search的ACO甚至能收获更佳的效果。

(4)在GRASP中,每一次局部搜索结束后,首先更新Ai(使用每一个α值迭代运行历史以来所得的目标函数求解质量的平均值),并计算适应度qi=z*/Ai(z*为当前解的目标函数值),基于更新后的概率值,可以采用轮盘赌等方法选择出下次迭代过程使用的α值;在ACO中,每次迭代结束后需要更新的参数是信息素τ,这也是ACO特有的参数。

(5)ACO含有population(种群)的概念,GRASP则针对individual(个体)求解。

四、用ACO解决TSP

4.1解决思路

AS是文献中提出的第一个ACO算法,是以TSP为应用实例提出的。TSP 是一个典型的NP-hard组合优化问题,在蚁群优化中是一个非常重要的问题,常被用作测试新想法和算法变体的基准。

用ACO解决TSP问题的伪代码如下所示:

broken image

伪代码的基本流程如下:

(1)信息素取值初始化

(2)重复以下步骤直到符合算法停止标准

(3)对每个蚂蚁k∈{1,...,m},通过轮盘赌方式以概率P0i在可选城市集S中选择城市i

(4)重复以下步骤直到可选城市集S变为空集:以概率pij在集合S中选择城市j,然后将城市j从S中去掉并将i更新为j

(5)更新信息素值

4.2 matlab代码实现(代码见文末链接)

matlab代码与伪代码之间的对应如下:

broken image

4.3实验结果展示

对TSP问题中的Berlin8算例进行分析,参数设定最大迭代次数MaxIter=1、不改进迭代次数noIter=50、LS选择了VND算法、选择策略为bestImprove、信息素权重α=1、启发式信息权重β=1。得到的部分结果如下图所示。

broken image

从实验结果中可以看出ACO算法路径构建部分的过程。先随机选中了节点4;然后根据状态转移概率和轮盘赌策略,选中了下一个节点1,当前解变为4,1,候选列表CL中则去掉节点1;重复以上步骤直至CL为空,构建就完成了,此时的目标值为3403。接着用VND的局部搜索算法,对这个解进行扰动,扰动后的目标值为2551。

对种群中的每一个ant都进行这样的构建和局部搜索,然后更新信息素、记录全局最优解,再进入下一次迭代。

4.4实验结果对比

① 下图是对ACO算法是否采用了VND局部搜索的对比(信息素权重α=1,启发式信息权重β=1):

broken image

与不选用局部搜索的几次实验结果相比,采用VND局部搜索能在较少的迭代次数里得到更好的解。

② 以Berlin8为例,在不采用VND的情况下,将β的值设置为0,得到的部分结果如下图所示。

broken image

可以看出在构建可行解时,选择下一节点的概率都是相同的,蚁群陷入纯粹的随机搜索,很难找到最优解。对比实验结果如下图所示。

broken image

五、小结

本文介绍了蚁群优化算法(Ant Colony Optimization,ACO)的基本原理,并对比了ACO和GRASP这两种构建型启发式算法的异同。最后结合实例,在Matlab中运用ACO算法解决了TSP问题。

附录(蚂蚁系统拓展)

一、 蚂蚁系统的改进算法

除了蚂蚁系统(AS)外还有其他改进的ACO算法,包括:精华蚂蚁系统(EAS),基于排列的蚂蚁系统(ASrank)和最大最小蚂蚁系统(MMAS),与AS的不同在于信息素的释放规则,信息素蒸发方式与AS一致。

1.精华蚂蚁系统(EAS)

2.基于排列的蚂蚁系统(ASrank

3.最大最小蚂蚁系统(MMAS)

二、改进ACO算法介绍

1. 精华蚂蚁系统

它的思想是对算法从开始到目前为止找到的最优路径实施一种额外的强化手段。信息素更新:

我们将目前为止找到的最优路径记为Tbest,对其进行强化是通过向Tbest中每一条边增加 e/Cbs大小的信息素。其中e是一个参数,它定义了给予路径的权值大小,Cbs代表了最优路径Tbest的长度,信息素释放规则为:

broken image

2. 基于排列的蚂蚁系统

在算法中,蚂蚁释放的信息素大小随着蚂蚁在排列中的先后次序逐渐减少。此外,与EAS算法类似,通常至今最优蚂蚁都会在每次迭代中释放最多的信息素。信息素更新:

在信息素更新之前,蚂蚁根据他们构建出来的路径长度按递增的顺序排列,而蚂蚁将要释放的信息素大小的权值取决于该蚂蚁排列次序r。如果路径的长度相同,可以随意地处理。在每一次迭代中,只有排列在最前的(w-1)只蚂蚁和生成了至今最优路径的蚂蚁(这只蚂蚁不一定出现在算法的当前迭代蚂蚁集合中)才允许释放信息素。至今最优路径将获得最多的反馈信息素,其权值为w(也就是得到的信息素大小为w乘以1/Cbs)。信息素更新规则为:

broken image

3. 最大最小蚂蚁系统

最大最小蚂蚁系统(MMAS)在AS算法的基础上引入了4项主要的改进。(1)首先,它强调了对最优路径的开发:只有迭代最优蚂蚁(iteration best ant),也就是在当前迭代中构建出最优路径的蚂蚁,或者是至今最优蚂蚁,才被允许释放信息素。然而,由于某些边上的信息素增长过快,这种策略可能会导致停滞现象的出现,即所有的蚂蚁都搜索同一-条路径,尽管这些边所在的路径也许是比较好的,却常常不是最优的路径。(2)为了抵消这种影响,MMAS提出了另外一项修改,就是把信息素大小的取值范围限制在一个区间[τminmax]。(3)第三,信息素的初始值被设定为其取值范围的上界,并与一个较小的信息素蒸发速率相结合,目的是使得算法能在最初的搜索步骤中探索更多可能的路径。(4)最后,在MMAS中,每当系统到达了停滞状态,或者在一定数量的迭代过程中不再有更优的路径出现,那么所有的信息素值都会被重新初始化。蚂蚁按照如下规则释放新的信息素:

broken image

被允许释放信息素的蚂蚁可以是至今最优的蚂蚁,或者是当前迭代最优的蚂蚁。一般而言,在MMAS中,迭代最优更新规则和至今最优更新规则会被轮流使用。显然,使用这两种规则中的某种的相对频率将影响到算法的贪心度:如果信息素一直通过至今最优蚂蚁来进行更新,那么搜索进程很快会收敛到Tbest附近。然而,如果只使用迭代最优蚂蚁来更新信息素,那么能够获取新信息素的边的数目将会增加,从而减少搜索的导向性。

在最大最小蚂蚁系统MMAS中,任何一条边可能存放的信息素大小都被限制在minmax]的范围内,以避免算法陷入停滞状态。特别是,这个信息素限制规则的作用是把位于城市i的蚂蚁选择城市j作为下一个访问城市的概率P。限制在区间[Pmin,Pmax]内,其中有0min≤Pij≤Pmax≤1。只有当蚂蚁k只剩下一个可选的城市时,才会有Pmin=Pmax=1。

信息素的初始化与重新初始化:在算法开始时,所有边上的信息素机始值都被设定为信息素上界的一个估计值。这种信息素初始化的方式,连同一个取值小的信息素蒸发参数,使得不同边上的信息素之间的差异只能够缓慢地增加,因此在算法的初始阶段,MMAS具有很强的探索性。随着算法的执行,某些路径被选择的概率很小,为了增加探索这些路径的可能性,在MMAS中,信息素量将会偶尔地被重新初始化。典型地,当算法接近停滞状态(通过对各条边的信息素大小的统计来测定)时,或者在指定次数的迭代中未能得到一条更优的路径时就会触发信息素的重新初始化。

三、 蚂蚁系统的拓展:蚁群算法(ACS)

蚁群系统(ant colony system,ACS)与AS的不同之处主要体现在3个面。(1)第一,它采用了一种更具积极性的行为选择规则,从而能比AS更好地开发利用蚂蚁所积累的搜索经验。(2)第二,信息素蒸发和信息素释放动作只在至今最优路径的边上执行。(3)第三,蚂蚁每一次使用边(i,j)从城市i移动到城市j后,它就会去掉该边上一定量的信息素,以增加探索其余路径的可能性。

1.路径构建

在ACS中,位于城市i的蚂蚁k,根据伪随机比例(pseudorandom proportional )规则选择城市j作为下一个访问的城市。这个规则由如下式子给出:

broken image

蚂蚁选择当前可能的最优移动方式的概率是q0,这种最优的移动方式是根据信息素的积累量和启发式信息值求出的(在这种情况下,蚂蚁继续开发已知的知识)。同时,蚂蚁以(1-q0)的概率有偏向性地探索各条边。通过调整参数q0,我们可以调节算法对新路径的探索度,从而决定算法是应该集中搜索至今最优路径附近的区域,还是应该探索其他区域。

2.全局信息素更新

在ACS中,只有一只蚂蚁(至今最优蚂蚁)被允许在每一次迭代之后释放信息素。这样,ACS的信息素更新规则由下面的式子给出:

broken image

需要特别注意的是,在ACS的信息素更新规则中,无论是信息素蒸发动作还是信息素释放动作,都只在构成Tbest的边上执行而不是像AS那样应用到整个系统的所有边上。

3.局部信息素更新

除了局部信息素更新规则外,ACS还采用了一个局部信息素更新规则。在路径构建过程中,蚂蚁每经过一条边都将立刻调用这条规则更新该边上的信息素:

broken image

局部信息素的作用在于,蚂蚁每一次经过边,改边上的信息素就会减少,从而使得其他蚂蚁选中改边的概率减少。这将增加探索未使用过边的机会,增加探索性,使算法不会陷入停滞状态。

【囿于作者的学术水平,本文的诸多表述或许不够严谨,用途仅限于优化算法入门者的非正式学术交流,不足之处还望各位读者指正。】

参考文献

[1] GendreauM, Potvin J Y. Handbook of Metaheuristics[M]. Switzerland: SpringerNature,2019.

[2]M. Dorigo, T. Stützle, Ant Colony Optimization (MIT Press, Cambridge, 2004)

相关资料

作者:宋博文 张雨沁 妥亚方(附录部分)

校对:陈慧敏