蚁群算法求解TSP问题

蚁群算法的第一个算法就是蚂蚁系统,而蚂蚁系统有三种基本模型分别是

蚁周模型、蚁密模型、蚁量模型。三种模型的实现大致相同,主要区别是在信息素

的更新方式上。在用蚂蚁系统解决T SP问题时,蚁量模型和蚁密模型是蚂蚁在构建

一条合法路径的过程中进行信息素的更新的,当蚂蚁走过一条边之后,就对该边进

行信息素的更新,即为局部更新方式。而蚁周模型是在所有蚂蚁都构建了一条合

法路径之后才对各边进行信息素更新的,也即全局更新方式。

并且这三种模型中蚂蚁在自己所走过的路线上释放的信息素的量也是有所

不同的,在蚁密模型蚂蚁在自己所走过的路上释放的信息素是一个常量Q,而在蚁

量模型中蚂蚁在走过某条边上释放的信息素量等于Q/(该条边的长度);在蚁周

模型中蚂蚁是在完整的走过一条路线后再跟新的信息素,所以其蚂蚁在走过的每

条边上释放的信息素是相等的,都等于Q/(该条完整路线的总长度);

其中蚁周模型的性能是做好的,所以用其来解决TSP问题也很方便,在

用蚁周模型解决问题时该注意的绩点核心就是:

一、为每条路设置信息素的初始量。

二、合理的设置好蚁群算法中的各种影响参数(这个直接影响最后效果)。

三、利用轮盘选赌法为每只蚂蚁选择不重复的下一天边。

四、在一轮结束后计算每天边上的信息素增量。

五、更新全局的信息素

最后附上用蚁周模型解决TSP问题的简单实现版本代码及结果。

#include<iostream>
using namespace std;

int main()
{
	const int N = 10;//城市的个数
	const int M = 10;//每一轮中蚂蚁的个数
	const int RcMax = 2000;//迭代次数
	const int IN = 1;//信息素的初始量
	double graph[N][N];//城市图

	double add[N][N];//每一段的信息素增量数组
	int map[M][N];//每一只蚂蚁的所走的路线记录
	int vis[M][N];//记录每一只访问过的城市,0表示未访问,1表示以访问
	double expectVa[N][N];//每一段路径的期望值 = 1.0/距离
	double phe[N][N];//每一段路径上的信息素
	double MAX = 0x7fffffff;

	double alphe,betra,rout,Q;//alphe信息素的影响因子,betra路线距离的影响因子,rout信息素的保持度,Q用于计算每只蚂蚁在其路迹留下的信息素增量
	double bestSolution = MAX;//最短距离
	int bestWay[N];//最优路线

	//初始化变量参数和信息数组
	alphe = betra = 2;
	rout = 0.7;
	Q = 10;
	//初始化城市图  TODO
	for(int i = 0;i<N;i++ )
	{
		graph[i][i] = MAX;
	}
	for(int i = 0;i<N-1;i++ )
	{
		for(int j = i+1;j<N;j++ )
		{
			graph[i][j] = i+j;
			graph[j][i] = i+j;
		}
	}

	//初始化路线记录数组
	for(int i = 0;i<M;i++ )
	{
	 for(int j = 0;j<N;j++)
	 {
	  map[i][j] = -1;
	  vis[i][j] = 0;
	 }
	}
	//初始化期望值数组
	for(int i = 0;i<N;i++ )
	{
	 for(int j = 0;j<N;j++)
	 {
		 expectVa[i][j] = 1.0/graph[i][j];
	 }
	}
	//初始化信息素数组
	for(int i = 0;i<N;i++ )
	{
	 for(int j = 0;j<N;j++)
	 {
			  phe[i][j] = IN;
	 }
	}
	//迭代
	for(int y = 0; y<RcMax;y++)
	{
	 for(int i = 0;i<M;i++)//为每只蚂蚁分配起点
	 {
	  map[i][0] = (y+i)%N;
	  vis[i][ map[i][0]] = 1;
	 }
	//完成该轮中每一只蚂蚁的路线选择
	int s = 1;
	while(s<N)
	{
	  for(int i = 0;i<M;i++)
	  {
		  double psum = 0;
		  for(int j = 0;j<N;j++)
		  {
			  if(vis[i][j]==0)
		  {
			  psum += pow(phe[map[i][s-1]][j],alphe) * pow(expectVa[map[i][s-1]][j],betra);
		  }
		  }
		  double drand = (double)(rand())/(RAND_MAX+1);

		  double pro = 0;
		  int j;
		  for(j = 0;j<N;j++)
		  {
		   if(vis[i][j]==0)
		  {
			  pro += (pow(phe[map[i][s-1]][j],alphe) * pow(expectVa[map[i][s-1]][j],betra))/psum;
			  if(pro>=drand)
			  {
			  break;
			  }
		  }

		  }
		   vis[i][j] = 1;
		   map[i][s] = j;
	  }
	s++;
	}

	//保存最优路线
	double solution = 0;
	for(int i = 0;i<M;i++)
	{
		solution = 0;
		for(int a =0;a<N-1;a++)
		{
			solution+= graph[map[i][a]][map[i][a+1]];
		}
		if(solution<bestSolution)
		{
		 for(int j = 0;j<N;j++)
		 {
			 bestWay[j] = map[i][j];
		 }
		 bestSolution = solution;
		}
	}

	//计算每一只蚂蚁在其每一段路径上留下的信息素增量
	//初始化信息素增量数组
	for(int i = 0;i<N;i++)
	{
	 for(int j = 0;j<N;j++)
	 {
	  add[i][j] = 0;
	 }
	}

	for(int i = 0;i<M;i++)
	{
		//先算出每只蚂蚁的路线的总距离solu
		double solu = 0;
		for(int a =0;a<N-1;a++)
		{
			solu += graph[map[i][a]][map[i][a+1]];
		}
	 int j;
	 double d = Q/solu;
	 for( j = 0 ;j<N-1;j++)
	 {
		 add[map[i][j]][map[i][j+1]] += d;
	 }
	 //注意由于每一只蚂蚁的起始点是随机设置的,所以从终点到起点也要有增加信息素
	  add[map[i][N-1]][map[i][0]] += d;
	}

	//更新信息素
	for(int i=0;i<N;i++)
	{
	 for(int j = 0;j<N;j++)
	 {
		 phe[i][j] = phe[i][j]*rout + add[i][j];
		 //为信息素设置一个下限值和上限值
		if(phe[i][j]<0.0001)
		{
			phe[i][j] = 0.0001;
		}
		if(phe[i][j]>20)
		{
			phe[i][j] = 20;
		}
	 }
	}
	//恢复路线记录数组
	for(int i = 0;i<M;i++ )
	{
	 for(int j = 0;j<N;j++)
	 {
	  map[i][j] = -1;
	  vis[i][j] = 0;
	 }
	}
}

//输出最优路线结果
   for(int i = 0;i<N;i++ )
	{
		cout<<bestWay[i]<<endl;
	}
   cout<<"最优路线的总长度是:"<<bestSolution<<endl;
}

有7个城市(城市编号0到6,每两个城市之间的距离设置为两编号之和)的测试结果图:

有10个城市(城市编号0到6,每两个城市之间的距离设置为两编号之和)的测试结果图:

时间: 2024-10-09 14:39:08

蚁群算法求解TSP问题的相关文章

利用HTML5 Canvas和Javascript实现的蚁群算法求解TSP问题演示

HTML5提供了Canvas对象,为绘图应用提供了便利. Javascript可运行于浏览器中, 而不需要安装特定的编译器: 基于HTML5和Javascript语言, 可随时编写应用, 为算法测试带来便利. 针对TSP问题, 编写了Ant colony algorithm, 用于演示该算法, tsp_ant_colony_algorithm.html代码如下: <html> <head> <meta charset = "utf-8" / > &l

ACS蚁群算法求解对称TSP旅行商问题的JavaScript实现

本来以为在了解蚁群算法的基础上实现这道奇怪的算法题并不难,结果实际上大相径庭啊.做了近三天时间,才改成现在这能勉强拿的出手的模样.由于公式都是图片,暂且以截图代替那部分内容吧,mark一记. 蚁群算法解TSP问题的javascript实现 目录(又是神奇的手动目录..) 1 蚁群算法 (1)        蚁群AS算法简介 (2)        蚁群AS算法过程 (3)        蚁群AS算法TSP问题应用 (4)        蚁群算法应用于TSP步骤 2 蚁群系统(Ant Colony

蚁群算法求解迷宫最优路径问题

本段程序的基本思想是利用蚁群算法中的蚁周模型,来对全局的迷宫图进行信息素的跟新 和为每一只蚂蚁选择下一个方格. 一共会进行RcMax = 2000轮模拟(理论上模拟的次数越多结果 会越接近真实值),而在每一轮中会排除 M = 10只蚂蚁进行探路.同时在算法的回溯思想上采用的 是栈的数据结构来实现的.当栈最终为空时则表示无解.但同时这段程序的一缺点就是:由于我没在 算法中对每一轮的每只探路蚂蚁采用多线程的模式,所以整体的运行效率还不是很高.如读者有好的 思想或建议,请留言. #include<io

蚁群算法解决TSP问题

一.论述 1.算法来源 蚁群算法的基本原理来源于自然界蚂蚁觅食的最短路径原理,根据昆虫学家的观察,发现自然界的蚂蚁虽然视觉不发达,但它可以在没有任何提示的情况下找到从食物源到巢穴的最短路径,并且能在环境发生变化(如原有路径上有了障碍物)后,自适应地搜索新的最佳路径. 2.单个蚂蚁寻找路径 正反馈: 单个的蚂蚁为了避免自己迷路,它在爬行时,同时也会释放一种特殊的分泌物--信息素(Pheromone),而且它也能觉察到一定范围内的其它蚂蚁所分泌的信息素,并由此影响它自己的行为.当一条路上的信息素越来

蚁群算法求解旅行商问题(附c和matlab源代码)

前几天写了个模拟退火算法的程序,然后又陆陆续续看了很多群智能算法,发现很多旅行商问题都采用蚁群算法来求解,于是开始写蚁群算法的模板.网上关于蚁群算法的理论很多就不再这里赘述了,下面直接上代码和进行简单的比较. c代码: 1 #ifndef _CITY_H 2 #define _CITY_H 3 struct CITY 4 { 5 int id; 6 double x, y; 7 }; 8 #endif // !_CITY_H CITY.h 1 #ifndef _OPTION_H 2 #defin

蚁群算法(AntColonyOptimization,ACO)与TSP问题

对于小规模数据的TSP问题,我们可以使用动态规划快速的求解. 对于大规模数据的TSP问题,可以使用蚁群算法,模拟退火等近似算法进行求解. 蚁群算法是一种用来在图中寻找优化路径的机率型算法,最早Marco Dorigo提出. 它的灵感来源于蚁群寻找食物的过程,因为往往一只蚂蚁并没有太多“智能”的表现,而蚁群往往有“智能”的动作,比如大部分都趋向于食物 这是因为它们在移动的路径上会留下“信息素”,它们会更大概率沿着信息素更浓的路径行走,而路径越短,信息素就会越浓. 在解决TSP问题时,蚁群算法的流程

蚁群算法简介及应用

蚂蚁几乎没有视力,但他们却能够在黑暗的世界中找到食物,而且能够找到一条从洞穴到食物的最短路径.它们是如何做到的呢? 简介 由来 蚁群算法是一种用来寻找优化路径的概率型算法.它由Marco Dorigo于1992年在他的博士论文中提出,其灵感来源于蚂蚁在寻找食物过程中发现路径的行为. 这种算法具有分布计算.信息正反馈和启发式搜索的特征,本质上是进化算法中的一种启发式全局优化算法. 思想 将蚁群算法应用于解决优化问题的基本思路为:用蚂蚁的行走路径表示待优化问题的可行解,整个蚂蚁群体的所有路径构成待优

智能算法:蚁群算法

作为一种现代智能算法,蚁群算法不需要任何先验知识,最初只是随机地选择搜索路径,随着对解空间的了解,搜索更加具有规律性,并逐渐得到全局最优解.目前,蚁群算法已被成功地应用于求解旅行商问题.车辆调度问题以及指派问题等... 求解TSP: %% 第22章 蚁群算法的优化计算——旅行商问题(TSP)优化 %% 清空环境变量 clear all clc %% 导入数据 load citys_data.mat %% 计算城市间相互距离 n = size(citys,1); D = zeros(n,n); f

智能算法---蚁群算法

智能算法---蚁群算法 1 蚁群算法及其基本思想 蚁群算法是一种智能优化算法,通过蚁群优化求解复杂问题,ACO在离散优化问题方面有比较好的优越性. 基本思想(以旅行商问题为例) 设置多只蚂蚁,分头并行搜索. 每只蚂蚁完成一次周游后,在行进的路上释放信息素,信息素量与解的质量成正比. 蚂蚁路径的选择根据信息素强度大小(初始信息素量设为相等),同时考虑两点之间的距离,采用随机的局部搜索策略.这使得距离较       短的边,其上的信息素量较大,后来的蚂蚁选择该边的概率也较大. 每只蚂蚁只能走合法路线