蚁群算法解决TSP问题详细讲解(含python代码)

(一)TSP问题

TSP问题:旅行商问题,即TSP问题(Traveling Salesman Problem),给定一组城市和每对城市之间的距离,商家从其中一个城市出发,要求每个城市都要经过且每个城市经过一次,最后回到起点城市,求解商家访问这些城市的最短路径。

(二)蚁群算法

(1)蚁群算法简单介绍

蚁群算法简介:蚁群算法是对自然界蚂蚁的寻径方式进行模似而得出的一种仿生算法:蚂蚁在运动过程中,能够在它所经过的路径上留下信息素(pheromone)的物质进行信息传递,而且蚂蚁在运动过程中能够感知这种物质,并以此指导自己的运动方向。

当有很多蚂蚁觅食时,刚开始每个蚂蚁会随机选择一条路径,并在该路径中释放信息素,路径短的蚂蚁要比路径长的更先到达目的地,往返的频率也更快,所有该路径上的信息素更浓。信息素也会随着时间会有部分挥发。当下一代蚂蚁觅食时,下一代蚂蚁会选择信息素浓度高的路径走,而选择该路径的蚂蚁最多,又会释放更多的信息素,因此由大量蚂蚁组成的蚁群集体行为便表现出一种信息正反馈现象:某一路径上走过的蚂蚁越多,则后来者选择该路径的概率就越大。蚁群算法具有分布计算、信息正反馈和启发式搜索的特征,本质上是进化算法中的一种启发式全局优化算法。

(2)蚁群算法解决TSP问题基本原理

在蚁群算法中,蚂蚁的行走路径表示待优化问题的可行解,整个蚂蚁群体的所有路径构成待优化问题的解空间。算法基本原理如下:

(1)根据具体问题设置蚂蚁种群数量AntCount,分头并行搜索。
(2)每只蚂蚁完成一次周游后,在行进的路上释放信息素,信息素量与解的质量成正比。
(3)蚂蚁路径的选择(当前城市i到下一城市j)根据信息素浓度Tij,同时考虑两点之间的距离 η \eta ηij( η \eta ηij为城市i和城市j之间距离的倒数),采用随机的局部搜索策略。这使得距离较短的边,其上的信息素量较大,后来的蚂蚁选择该边的概率也较大。
(4)每只蚂蚁只能走合法路线(经过每个城市1次且仅1次),为此设置禁忌表(即以前走过的城市列表)来控制。
(5)所有蚂蚁都搜索完一次就是迭代一次,每迭代一次就对所有的边做一次信息素更新,原来的蚂蚁死掉,新的蚂蚁进行新一轮搜索。注意,同一代的蚂蚁互相之间不会受到之前蚂蚁留下的信息素浓度的影响,计算到下一城市j的概率时所用到T是上一代蚂蚁留下的信息素。第一代蚂蚁用的信息素是初始值为1,所有城市之间信息素浓度一样。
(6)更新信息素包括原有信息素的蒸发和经过的路径上信息素的增加。
(7)达到预定的迭代步数,或出现停滞现象(所有蚂蚁都选择同样的路径,解不再变化),则算法结束,以当前最优解作为问题的最优解。

(3)蚁群算法的核心步骤

3.1 路径构建

路径构建包括初始城市的选择和下一个到达城市的选择。每个蚂蚁都随机选择一个城市作为其出发城市,并维护一个路径记忆表(候选集列表candidate,是一个Antcount-citycount二维矩阵),用来存放蚂蚁依次经过的城市。

蚂蚁在当前所在城市选择下一个城市时,转移概率 p i j pij pij是有两部分组成,一个是信息素浓度Tij,另一个是当前城市到下一城市的距离 η \eta ηij。 α \alpha α是信息素重要程度因子, β \beta β是启发函数重要程度因子。其中t时刻,蚂蚁k从i城市到j城市的转移概率是按照下列公式来进行计算的:

式中
在这里插入图片描述

3.2 信息素更新

迭代过程中,问题空间中的所有路径上的信息素都会发生改变。其中第一部分是信息素的蒸发, ρ \rho ρ(rho)是挥发因子,代表信息素的挥发速度。然后,所有的蚂蚁根据自己构建的路径长度在它们本轮经过的边上释放信息素,公式如下:

在这里插入图片描述

等式右边第一部分代表了信息素自身挥发后剩余的信息素,第二部分是每只蚂蚁经过城市i到城市j留下的信息素。在一次迭代中,每只蚂蚁经过城市i到城市j都会留下信息素,在该次迭代结束后,所有蚂蚁留下的信息素总和即为该路径信息素的增量。注意,同一代的蚂蚁互相之间不会受到之前蚂蚁留下的信息素浓度的影响,计算到下一城市j的概率时所用到T是上一代所有蚂蚁留下的信息素。

(三)代码分析

(1)设置参数

#蚂蚁数量
AntCount = 100
#城市数量
city_count = len(city_name)
alpha = 1  # 信息素重要程度因子
beta = 2  # 启发函数重要程度因子
rho = 0.1 #挥发速度
iter = 0  # 迭代初始值
MAX_iter = 200  # 最大迭代值

(2)距离矩阵

建立一个citycount-citycount二维数组,存放每对城市之间的距离。注意,因为要根据距离矩阵求启发函数 η \eta ηij( η \eta ηij为城市i和城市j之间距离的倒数),所有距离矩阵的对角线不能为0,我把对角线设置为10000,其实只要不为零就可以。

#Distance距离矩阵
city_count = len(city_name)
Distance = np.zeros((city_count, city_count))
for i in range(city_count):
    for j in range(city_count):
        if i != j:
            Distance[i][j] = math.sqrt((city_condition[i][0] - city_condition[j][0]) ** 2 + (city_condition[i][1] - city_condition[j][1]) ** 2)
        else:
            Distance[i][j] = 100000

(3)设置信息素矩阵和蚂蚁路径矩阵

建立一个citycount-citycount二维的信息素矩阵pheromonetable,存放每对城市之间的信息素。初始信息素矩阵,全是为1组成的矩阵。在每次迭代之后,更新该信息素矩阵。

建立一个AntCount-city_count二维矩阵candidate,在每次迭代中,存放所有蚂蚁的路径(一只蚂蚁一个路径)。

建立一个MAX_iter-city_count二维矩阵path_best,存放的是相应的,每次迭代后的最优路径,每次迭代只有一个值。

建立一个一维数组distance_best,存放每次迭代的最优距离。

# 初始信息素矩阵,全是为1组成的矩阵
pheromonetable = np.ones((city_count
评论 49
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值