利用蚁群算法解决旅行商问题
919106840637实验3
作为第三个实验,老师要求我们利用仿生智能算法来对旅行商问题TSP进行求解。可以选用遗传算法、蚁群算法、粒子群算法、鱼群算法等智能算法进行求解,我在这里选择的是蚁群算法。
实验语言
C++
实验内容
随机生成100个结点(或更多结点)的图,在任意两结点之间赋予一条边,然后在这些边上赋予随机代价。最后从遗传算法、蚁群算法、粒子群算法、鱼群算法(上课介绍过),以及蛙跳算法、萤火虫算法,蝙蝠算法(课上没有介绍过)等仿生类算法中选择一个算法在这个图上求解从一个结点开始,经过且只经过每个结点一次,最后返回起点的最短路径的问题。
按照实验内容,节点数最少要100个,经过实践发现花费时间太长了,于是写了个缩略版的只有20个节点的。
实验思想及部分代码
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <cstring>
#include <windows.h>
#include <vector>
#include <algorithm>
什么是蚁群算法?蚂蚁在移动的时候会在路径上留下信息素,其他蚂蚁在寻找去往目的地的路径时,常常会顺着信息素浓度高的路径移动,而最优路径往往能拥有最高浓度的信息素。蚁群算法就是结合这种特性,利用多个类似蚂蚁的智能体agent来获取问题的最优解。
TSP,即旅行商问题,又称TSP问题(Traveling Salesman Problem),是数学领域中著名问题之一。假设有一个旅行商人要拜访N个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求得的路径路程为所有路径之中的最小值。TSP问题是一个NPC问题。
关于蚁群算法可以参考这篇文章:蚁群算法
如何用蚁群算法求解旅行商问题?
- 初始化每个节点之间的信息素。信息素的初始化值为蚂蚁数量/当前最短路径(可以用贪心算法求解)。
- 随机投放蚂蚁至各个节点,蚂蚁数量一般为节点数量的1.5倍。
- 对于每只蚂蚁,寻找一条前进路径:根据当前蚂蚁所处节点与已经经过的节点,计算当前节点与剩余节点间的权重,其权重的算法可以参见上面所发的文章。然后根据权重不同来计算蚂蚁选择对应节点的概率,利用轮盘赌法来选择下一步的节点。
- 当所有蚂蚁选取好路径后,需要对节点间的信息素浓度进行更新,更新算法也可以参见上述文章。我在这使用的是0.5倍原信息素浓度加上该路径长度的倒数(所有经过这两个节点的蚂蚁的路径长度倒数之和)。
- 重复步骤2,直至达到一定的迭代次数。
这是蚂蚁判断下一个节点的代码
int decide_city(ant a){
int now = a.now_position;
vector<int> t = a.path;
float sum = 0;
float weight[100];
float p[100];
for(int i=0;i<100;i++){
weight[i] = 0.0;
p[i] = 0.0;
}
for