TSP问题及蚁群算法理解与实现

本文详细介绍了如何使用蚁群算法解决旅行商问题(TSP),从TSP问题的理解,到蚁群算法的思想解析,再到个人的算法实现与Java编程实践。在实现过程中,采用了轮盘赌方法选择节点,并根据特定公式更新信息素矩阵。实验结果显示了算法的运行情况,同时讨论了可能出现的坏数据问题及其原因,期待同行的指正。
摘要由CSDN通过智能技术生成

一. TSP问题理解

tsp(Travelling Salesman Problem)问题是一个著名的NPC问题。
可以描述为:给定一个图G=(V,E)或<V ,E>,从图中的某一个顶点出发遍历所有的顶点且每个顶点只能被遍历一次后回到起点,即完成一个哈密尔顿环,在这个过程中要使得路径上的开销最小(此处的“开销”可以由边的权值、顶点之间的距离等来量化表示)

二.蚁群算法思想理解

蚁群算法的思想很好理解:模拟蚂蚁的行为。
通常蚂蚁在寻找食物的过程中,会沿途留下一些类似气味的东西以供后来者参考,在蚁群算法中,我们把它称为信息素。后来的蚂蚁会根据前面的蚂蚁留下的信息素的值来选择路径,从而获取最优的路径。
蚁群算法主要通过以下步骤完成:
1.初始化阶段:初始化蚂蚁的选路(我采用的是初始时蚂蚁随机选择)、初始化某些参数(比如信息素的挥发率、初始的信息素值等)
2.选择下一个节点:在这一个阶段,有专门研究选择下一个节点的算法的,在我的实验中采用的是轮盘赌的方法。后文会展开叙述。
3.更新信息素矩阵:根据上一只蚂蚁经过某条路径后留下的信息素,来更新信息素矩阵,为后面的蚂蚁导航。具体的选择方法后文会展开叙述。
4.检查结束标志,完成输出:结束标志通常来说有两种。一种是理想意义上的达到了收敛;另一种就是目前大多数采用的(也是我所采用的),就是设置一个迭代次数,假设在迭代次数完成的时候达到收敛。

三. 我的蚁群算法

通常来说,蚁群算法的起点终点是相同的(为了形成一个哈密尔顿环),而且起点是随机选择的。
我主要是为了自己在做的项目后面的任务,所以将最原始的TSP问题改成了下面的问题:
给定起点和终点,从起点出发,经过图中的每个点且只经过一次,到达终点,使得路径开销最小。


我采用是att48这个数据集,点是数据集中的48个不同的城市,边的开销是用两点间的欧式距离来表示的。
在开始我的蚁群之前,需要先解释一些代码中和后面都会用到的变量:
tabu表:禁忌表(这个名字也不知道是谁取的,特别中二)用来保存已经访问过的点。原因就是为了保证每个点只能被访问一次。tabu里的点就是不能再被访问的;
allowCities表:这个表里存放的是允许访问的点;
distance[ ][ ]:这个就是用来记录两点之间距离的数组;
firstCity:起点城市   lastCity:终点城市     ;--------起点和终点我采用的是在48个城市中产生40个随机数对
pheromone[ ][ ]:信息素矩阵,用来存放每两个点之间的路径的信息素值;
还有一些参数:
alpha,beta,rho ;  ----更新信息素矩阵的时候会用到一个概率计算公式(一会儿会贴出来)中的一些参数
MAX_GEN ;; -----迭代次数
中间过程保存变量:
tourLength:用来保存每只蚂蚁每次走过的路径
selectCity:用来保存当前选择的城市
保存结果所需变量:
besTour[ ]:保存最佳路径。每次迭代的时候只要最新的路径比原来短(更优)就更新;
bestLength:最小开销。


实现构思:
由于是java实现的,面向对象的思想很重要,所有大体上来说,需要实现两个类。
一个是针对蚂蚁对象所实现的类Ant,主要是实现单只蚂蚁完成的动作:初始化单只蚂蚁所需变量()、初始化信息素矩阵、初始化tabu、allowCities、选择下一个城市();
第二个类是针对由单只蚂蚁组成的类蚁群,该类中的每个对象都是一群蚂蚁(因此需要定义一个由蚂蚁对象组成的类,每只蚂蚁都需要完成Ant () 类中定义的功能)&#x
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值