Scratch编程学算法系列之蚁群算法解旅行商问题(TSP)

内容分享2周前发布
1 0 0

Scratch编程学算法系列之蚁群算法解旅行商问题(TSP)

笔者曾在所著的《Scratch编程与算法》一书的第九章(项目九)中,用遗传算法解城市旅行商(TSP)问题,本文准备用另一种比较高效的蚁群算法试一试。

一、关于蚁群算法的背景与原理简介

【算法背景】

蚁群算法是一种用来寻找优化路径的概率型算法。它由意大利学者Marco Dorigo于1992年在他的博士论文中提出,其灵感来源于蚂蚁在寻找食物过程中发现路径的行为。

他们在研究蚂蚁觅食的过程中,发现单个蚂蚁的行为比较简单,但是蚁群整体却可以体现一些智能的行为。例如蚁群可以在不同的环境下,寻找最短到达食物源的路径。这是由于蚁群内的蚂蚁可以通过某种信息机制实现信息的传递。后又经进一步研究发现,蚂蚁会在其经过的路径上释放一种可以称之为“信息素”的物质,蚁群内的蚂蚁对“信息素”具有感知能力,它们会沿着“信息素”浓度较高路径行走,而每只路过的蚂蚁都会在路上留下“信息素”,这就形成一种类似正反馈的机制,这样经过一段时间后,整个蚁群就会沿着最短路径到达食物源了。

【核心思想】

将蚁群算法应用于解决优化问题的基本思路为:用蚂蚁的行走路径表明待优化问题的可行解,整个蚂蚁群体的所有路径构成待优化问题的解空间。路径较短的蚂蚁释放的信息素量较多,随着时间的推进,较短的路径上累积的信息素浓度逐渐增高,选择该路径的蚂蚁个数也愈来愈多。最终,整个蚂蚁会在正反馈的作用下聚焦到最佳的路径上,此时对应的便是待优化问题的最优解。

【实现方式】

蚂蚁找到最短路径要归功于信息素和环境,假设有两条路可从蚁窝通向食物,开始时两条路上的蚂蚁数量差不多:当蚂蚁到达终点之后会立即返回,距离短的路上的蚂蚁往返一次时间短,重复频率快,在单位时间里往返蚂蚁的数目就多,留下的信息素也多,会吸引更多蚂蚁过来,会留下更多信息素。而距离长的路正相反,因此越来越多的蚂蚁聚集到最短路径上来。

蚂蚁具有的智能行为得益于其简单行为规则,该规则让其具有多样性和正反馈。在觅食时,多样性使蚂蚁不会走进死胡同而无限循环,是一种创新能力;正反馈使优良信息保存下来,是一种学习强化能力。两者的巧妙结合使智能行为涌现,如果多样性过剩,系统过于活跃,会导致过多的随机运动,陷入混沌状态;如果多样性不够,正反馈过强,会导致僵化,当环境变化时蚁群不能相应调整。

【算法特色】

与其他优化算法相比,蚁群算法具有以下几个特点:

(1)采用正反馈机制,使得搜索过程不断收敛,最终逼近最优解。

(2)每个个体可以通过释放信息素来改变周围的环境,且每个个体能够感知周围环境的实时变化,个体间通过环境进行间接地通讯。

(3)搜索过程采用分布式计算方式,多个个体同时进行并行计算,大大提高了算法的计算能力和运行效率。

(4)启发式的概率搜索方式不容易陷入局部最优,易于寻找到全局最优解。

【应用范围】

该算法应用于其他组合优化问题,如旅行商问题、指派问题、Job—shop调度问题、车辆路由问题、图着色问题和网络路由问题等。最近几年,该算法在网络路由中的应用受到越来越多学者的关注,并提出了一些新的基于蚂蚁算法的路由算法。同传统的路由算法相比较,该算法在网络路由中具有信息分布式性、动态性、随机性和异步性等特点,而这些特点正好能满足网络路由的需要。

二、解决TSP的编程实现

【核心算法流程】

初始化:设置有关参数创建距离矩阵和信息素矩阵;

路径构建:每只蚂蚁根据信息素和启发函数以及轮盘赌选择,依次选择下一个城市,以构成一个完整线路;

一群蚂蚁选完后来,信息素更新:即挥发旧信息素,沉积新信息素;

迭代优化:重复上述过程直到达到收敛或达到最大迭代次数;

优化路径的呈现:画路径、呈现城市番号和位置。

【技术要点】

生成城市数据、计算线路长度、画出线路呈现城市番号和位置的程序与书中遗传算法中的差不多。

Scratch编程学算法系列之蚁群算法解旅行商问题(TSP)

Scratch编程学算法系列之蚁群算法解旅行商问题(TSP)

Scratch编程学算法系列之蚁群算法解旅行商问题(TSP)

Scratch编程学算法系列之蚁群算法解旅行商问题(TSP)

Scratch编程学算法系列之蚁群算法解旅行商问题(TSP)

1.与遗传算法中一样,由于与python等编程语言相比,Scratch没有矩阵工具,就需要使用“长列表”来平替。矩阵第i行j列的项,在长列表里面位于第(i-1)×列数+j项,可用一个两重循环实现。

以计算距离矩阵为例,看这种长列表取代矩阵的算法:

第一需要一个计算两点间距离的子程序供调用:

Scratch编程学算法系列之蚁群算法解旅行商问题(TSP)

第i点到第j点的距离放在距离矩阵的第i行第j列。

Scratch编程学算法系列之蚁群算法解旅行商问题(TSP)

更新信息素时也用到

Scratch编程学算法系列之蚁群算法解旅行商问题(TSP)

2.幂运算a^b用指对数运算平替:

Scratch编程学算法系列之蚁群算法解旅行商问题(TSP)

这在寻找下一个城市的子程序中,计算信息素和启发函数时,这个算法得到充分体现:

Scratch编程学算法系列之蚁群算法解旅行商问题(TSP)

从寻找下一个城市子程序的前半部分可见,蚂蚁要将当前城市与所有“未到达城市”中的每一个之间进行“信息素与距离启发函数的探索”,计算出每一个组合的备选可能性,即可能性=信息素×启发函数,放入一个列表“概率”里面。实则这时的可能性还不是真正意义上的概率,还需要进行归一化处理。

Scratch编程学算法系列之蚁群算法解旅行商问题(TSP)

3.有了当前城市与剩下的每一个未到达城市被选择的概率后来,怎么确定那个成为候选的下一个城市呢?按朴素的想法,就选那个概率最大的那个城市好了?实则蚁群算法不是这样选的,由于那样会陷入局部最优解。这就需要一个叫做轮盘赌选择法(np.random.choice)的机制。这也是蚁群算法中最核心的算法之一。

不过,Scratch没有类似于python的np.random.choice(X, p=probabilities)`的内置函数,我们只好自己来构造一个“轮盘赌选择”(Roulette Wheel Selection)子程序。

为此,第一我们要弄懂“轮盘赌选择”函数的底层算法原理,所谓“轮盘赌选择”(Roulette Wheel Selection),`带`p 参数时,其核心思想是:

(1). 把每个候选元素的概率看作“轮盘上的扇形面积”;

(2)整个轮盘的总面积为 1(概率之和必须等于 1);

(3). 随机生成一个 [0,1) 之间的数,这个数落在哪个扇形区域,就选择对应的那个元素。

举简单例子说明其数学逻辑:

假设候选集合为 `S = [s₀, s₁, …, sₙ₋₁]`,对应的概率为 `P = [p₀, p₁, …, pₙ₋₁]`,满足 `sum(P) = 1`

算法通过“累积概率”CDF,构建“区间边界”,再通过随机数命中区间来选择元素。例如:

列如 若 `P = [0.2, 0.5, 0.3]`,则累积概率CDF= `[0.2, 0.7, 1.0]`;

构建区间:`s₀ → [0, 0.2)`,`s₁ → [0.2, 0.7)`,`s₂ → [0.7, 1.0]`;

若随机生成 `r = 0.5`(落在 `[0.2, 0.7)`),则选择 `s₁`。

按照这个数学思路,我们用Scratch来实现它:

Scratch编程学算法系列之蚁群算法解旅行商问题(TSP)

每只蚂蚁生成一条线路的子程序:

Scratch编程学算法系列之蚁群算法解旅行商问题(TSP)

4.适当时机对信息素进行更新,蚁群算法的另一个重大机制是在一批蚂蚁选择过线路后来,一方面线路中每一段信息素会自然挥发,另一方面,根据每一个线路的长短,会对每一段添加信息素,距离越短意味着线路越优,添加的信息素越多,那么它被下一轮选中的可能性越大。

要实现信息素更新,就需要每一只蚂蚁选择一条线路,就要把线路和该线路的长度,分别放入一个列表,而前一个列表是长列表(矩阵)。

Scratch编程学算法系列之蚁群算法解旅行商问题(TSP)

Scratch编程学算法系列之蚁群算法解旅行商问题(TSP)

5.初始化(设初值)的程序:

Scratch编程学算法系列之蚁群算法解旅行商问题(TSP)

6.迭代程序:

Scratch编程学算法系列之蚁群算法解旅行商问题(TSP)

7.主程序:

Scratch编程学算法系列之蚁群算法解旅行商问题(TSP)

8.结果呈现,效率比遗传算法快得多:

Scratch编程学算法系列之蚁群算法解旅行商问题(TSP)

三、总结

.在蚁群算法的“选择下一个城市”逻辑中,该自定义函数完美契合核心需求:

(1).概率导向:信息素浓度高(信息素值大)、距离近(启发函数值大)的城市,会被赋予更高的概率,从而更容易被选中;

(2).随机性:即使是概率最高的城市,也不会 100% 被选中(随机数的不确定性),保证了算法的“探索性”(避免过早陷入局部最优);

(3).不过在高效性方面,Scratch比起其它编程语言,有其明显的局限性。,尤其在城市数量多、蚂蚁数量大的场景更是如此;

(4)概率归一化:是必须的;

(5).与“贪心选择”的区别:贪心选择会直接选概率最大的城市(确定性),而 轮盘赌选择保留了随机性,这是蚁群算法能跳出局部最优的关键。

(6)与遗传算法相比,效率更高。遗传算法是将将较优的两个线路,进行嫁接(交配),以期生出更优的线路,而在选优和嫁接的过程中,运算量较大。

© 版权声明

相关文章

暂无评论

none
暂无评论...