蚁群算法解TSP问题

蚁群算法解决TSP问题 一、论述 1、算法来源 蚁群算法的基本原理来源于自然界蚂蚁觅食的最短路径原理,根据昆虫学家的观察,发现自然界的蚂蚁虽然视觉不发达,但它可以在没有任何提示的情况下找到从食物源到巢穴的最短路径,并且能在环境发生变化(如原有路径上有了障碍物)后,自适应地搜索新的最佳路径。 2、单个蚂蚁寻找路径 正反馈: 单个的蚂蚁为了避免自己迷路,它在爬行时,同时也会释放一种特殊的分泌物——信息素(Phero 阅读详情

代码来源于博客http://blog.sina.com.cn/s/blog_6bb1b4b001016pt0.html

添加了部分注释,几乎没有改动(参数和城市格式略做改动),原博主的代码写的很容易理解,也是我找到的最短的代码了,在此感谢。

算法步骤基本与此网页类似介绍:http://www.nocow.cn/index.php/%E8%9A%81%E7%BE%A4%E4%BC%98%E5%8C%96%E7%AE%97%E6%B3%95


如果没有接触过蚁群算法,请先阅读http://download.youkuaiyun.com/detail/waytoaccept/9493547   这本书介绍的比较全,连参数都告诉你怎么调了。

代码如下:


//蚁群算法关于简单的TSP问题求解//
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<time.h>

#define M 13  //蚂蚁的数量
#define N 52  //城市的数量
#define R 1000 //迭代次数
#define IN 1  //初始化的信息素的量
#define MAX 0x7fffffff //定义最大值

struct coordinate
{
	char city[15];  //城市名
	int x;          //城市相对横坐标
	int y;          //城市相对纵坐标
}coords[N];

double graph[N][N];   //储存城市之间的距离的邻接矩阵,自己到自己记作MAX
double phe[N][N];  //每条路径上的信息素的量
double add[N][N];  //代表相应路径上的信息素的增量
double yita[N][N]; //启发函数,yita[i][j]=1/graph[i][j]

int vis[M][N];  //标记已经走过的城市
int map[M][N];  //map[K][N]记录第K只蚂蚁走的路线
double solution[M]; //记录某次循环中每只蚂蚁走的路线的距离
int bestway[N]; //记录最近的那条路线
double bestsolution=MAX;
int NcMax; //代表迭代次数,理论上迭代次数越多所求的解更接近最优解,最具有说服力
double alpha,betra,rou,Q;

void Initialize(); //信息初始化
void Inputcoords(FILE *fp); //将文件中的坐标信息读入
void GreateGraph(); //根据坐标信息建图
double Distance(int *p); //计算蚂蚁所走的路线的总长度
void Result(); //将结果保存到out.txt中

void Initialize()//初始化参数和迭代次数
{
	alpha=2; betra=4; rou=0.5; Q=50;
    NcMax=R;
	return ;
}
//从文件读入城市坐标
void Inputcoords(FILE *fp)
{
	int i;
	int number;
	if(fp==NULL)
	{
		printf("Sorry,the file is not exist\n");
		exit(1);
	}
	else
	{
		for(i=0; i<N; ++i)
		{
			fscanf(fp,"%d,%d,%d,%s",&number,&coords[i].x,&coords[i].y,coords[i].city);
		}
	}
}
//初始化任意两个城市间的距离
void GreateGraph( )
{
	int i,j;
	double d;
	for(i=0; i<N-1; ++i)
	{
		graph[i][i]=MAX;   //自己到自己标记为无穷大
		for(j=i+1; j<N; ++j)
		{
			d=(double)((coords[i].x-coords[j].x)*(coords[i].x-coords[j].x)+(coords[i].y-coords[j].y)*(coords[i].y-coords[j].y));
			graph[j][i]=graph[i][j]=sqrt(d);
		}
	}
	graph[N-1][N-1]=MAX;
	return ;
}
//计算环路的最小代价
double Distance(int *p)
{
	double d=0;
	int i;
	for(i=0; i<N-1; ++i)
	{
		d+=graph[*(p+i)][*(p+i+1)];
	}
	d+=graph[*(p+i)][*(p)];
	return d;
}
//输出各个结果
void Result()
{
	FILE *fl;
	int i;
	fl = fopen("out.txt","a");  //将结果保存在out.txt这个文件里面
	fprintf(fl,"%s\n","本次算法中的各参数如下:");
	fprintf(fl,"alpha=%.3lf, betra=%.3lf, rou=%.3lf, Q=%.3lf\n",alpha,betra,rou,Q);
	fprintf(fl,"%s %d\n","本次算法迭代次数为:",NcMax);
	fprintf(fl,"%s %.4lf\n","本算法得出的最短路径长度为:",bestsolution);
	fprintf(fl,"%s\n","本算法求得的最短路径为:");
	for(i=0; i<N; ++i)
		fprintf(fl,"%s →  ",coords[bestway[i]].city);
	fprintf(fl,"%s",coords[bestway[0]].city);
	fprintf(fl,"\n\n\n");
	fclose(fl);
	return ;
}

int main()
{
	int NC=0;//迭代次数
	int i,j,k;
	int s;
	double drand,pro,psum;
	FILE *fp;
	Initialize();
	fp = fopen("coords.txt","r+");
	Inputcoords(fp);
	GreateGraph();
	fclose(fp);
	for(i=0; i<N; ++i)//初始化
	{
		for(j=0; j<N; ++j)
		{
			phe[i][j]=IN; //信息素初始化
			if(i!=j)
			yita[i][j]=100.0/graph[i][j];  //期望值,与距离成反比
		}
	}
	memset(map,-1,sizeof(map));  //把蚂蚁走的路线置空
	memset(vis,0,sizeof(vis));  //0表示未访问,1表示已访问
	srand(time(NULL));
	while(NC++<=NcMax)//迭代次数小于等于最大值
	{
		for(k=0; k<M; ++k)
		{
			map[k][0]=(k+NC)%N; //给每只蚂蚁分配一个起点,并且保证起点在N个城市里
			vis[k][map[k][0]]=1; //将起点标记为已经访问,第k个蚂蚁第1个点标记为访问。每个蚂蚁都有一个map
		}
		s=1;//当前每个蚂蚁应该走的第几个城市,下标从0开始,0是每个蚂蚁的起点且已经走过
		while(s<N)
		{
			for(k=0; k<M; ++k)//为第k个蚂蚁选择下一个城市
			{
				psum=0;//Pij(概率)的分母部分,按照公式来计算
				for(j=0; j<N; ++j)
				{
					if(vis[k][j]==0)
					{
						psum+=pow(phe[map[k][s-1]][j],alpha)*pow(yita[map[k][s-1]][j],betra);
					}
				}
				drand=(double)(rand()%5000);
				drand/=5000.0;  //生成一个小于1的随机数(轮盘随机)
				pro=0;//累计的概率之和,当和大于随机数的时候,代表选中当前城市,很形象的模拟
				for(j=0; j<N; ++j)
				{
					if(vis[k][j]==0)
					pro+=pow(phe[map[k][s-1]][j],alpha)*pow(yita[map[k][s-1]][j],betra)/psum;
					if(pro>drand)
					break;
				}
				vis[k][j]=1;  //将走过的城市标记起来(选中j,将j标记)
				map[k][s]=j;  //记录城市的顺序
			}
			s++;
		}//一次迭代完成
		memset(add,0,sizeof(add));
		for(k=0; k<M; ++k)  //计算本次中的最短路径//
		{
			solution[k]=Distance(map[k]);  //蚂蚁k所走的路线的总长度
			if(solution[k]<bestsolution)
			{
				bestsolution=solution[k];
				for(i=0; i<N; ++i)
					bestway[i]=map[k][i];//记录当前最好的路径
			}
		}
		for(k=0; k<M; ++k)
		{
			for(j=0; j<N-1; ++j)//计算路径上信息素的增量
			{
				add[map[k][j]][map[k][j+1]]+=Q/solution[k];
			}
			add[N-1][0]+=Q/solution[k];//首尾相接
		}
		for(i=0; i<N; ++i)
		{
			for(j=0; j<N; ++j)
			{
				phe[i][j]=phe[i][j]*rou+add[i][j];//更新信息素
				if(phe[i][j]<0.0001)  //设立一个下界
					phe[i][j]=0.0001;
				else if(phe[i][j]>20)  //设立一个上界,防止启发因子的作用被淹没
					phe[i][j]=20;
			}
		}
		memset(vis,0,sizeof(vis));
		memset(map,-1,sizeof(map));
	}

	Result();
	printf("Result is saved in out.txt\n");
	return 0;
}


输入文件coords.txt:格式(序号,横坐标,纵坐标,城市代号)

0,1,1,a
1,1,2,b
2,1,3,c
3,1,4,d
4,1,5,e
5,1,6,f
6,1,7,g
7,1,8,h
8,1,9,i
9,1,10,j
10,2,11,k
11,7,11,l
12,12,11,m
13,17,11,n
14,22,11,o
15,27,11,p
16,32,11,q
17,37,11,r
18,42,11,s
19,47,11,t
20,52,11,u
21,57,11,v
22,62,11,w
23,67,11,x
24,72,11,y
25,77,11,z
26,82,11,A
27,87,11,B
28,92,11,C
29,97,11,D
30,101,10,E
31,101,9,F
32,101,8,G
33,101,7,H
34,101,6,I
35,101,5,J
36,101,4,K
37,101,3,L
38,101,2,M
39,100,1,N
40,95,1,O
41,90,1,P
42,85,1,Q
43,80,1,R
44,75,1,S
45,70,1,T
46,65,1,U
47,60,1,V
48,55,1,W
49,50,1,X
50,45,1,Y
51,40,1,Z

输出结果

本次算法中的各参数如下:
alpha=2.000, betra=4.000, rou=0.500, Q=50.000
本次算法迭代次数为: 1000
本算法得出的最短路径长度为: 217.9515
本算法求得的最短路径为:
j →  k →  l →  m →  n →  o →  p →  q →  r →  s →  t →  u →  v →  w →  x →  y →  z →  
A →  B →  C →  D →  E →  F →  G →  H →  I →  J →  K →  L →  M →  N →  O →  P →  Q →  
R →  S →  T →  U →  V →  W →  X →  Y →  Z →  a →  b →  c →  d →  e →  f →  g →  h →  i →  j



Matlab实现蚁群算法求解TSP问题 综合实验结果和经验规则,可以总结出一系列参数调整的指导原则,帮助快速定位到较优的参数配置区间。以下是一些经验规则:初始信息素强度应略高于期望值的一半,以保证有足够的信息素引导蚂蚁搜索。挥发系数应在0.5附近微调,过高或过低都会影响算法的收敛速度和解的质量。蚂蚁数量应根据问题规模适当调整,确保足够的搜索覆盖面和合理的计算成本。以上参数调整策略需要在实际应用中结合问题的具体特点进行微调,以此达到最优的算法性能。 阅读详情

相关推荐

MATLAB实现蚁群算法优化旅行商问题

旅行商问题(Traveling Salesman Problem, TSP)是组合优化领域中一个非常著名的NP-hard问题。其核心是在给定一组城市和每对城市之间的距离后,求出一个最短的可能路径,这个路径需要恰好经过每个城市一次,并最终返回起点城市。在数学模型中,TSP问题可以抽象为寻找一个图中的哈密顿回路,即找到一个包含所有顶点恰好一次的闭合路径,并且路径的总长度尽可能短。

weixin_35414260的博客 1132

蚁群算法(解决TSP问题)

蚂蚁在寻找食物源时,会在其经过的路径上释放一种信息素,并能够感知其它蚂蚁释放的信息素。信息素浓度的大小表征到食物源路径的远近,信息素浓度越高,表示对应的路径距离越短。通常,蚂蚁会以较大的概率优先选择信息素浓度较高的路径,并释放一定量的信息素,以增强该条路径上的信息素浓度,这样会形成一个正反馈。最终,蚂蚁能够找到一条从巢穴到食物源的最佳路径,即最短距离。值得一提的是,生物学家同时发现,路径上的信息素浓度会随着时间的推进而逐渐衰减。

qq_45874683的博客 1万+

蚁群算法 源代码 c++

蚁群算法 C++源代码 有注释说明

C++实现蚁群算法(TSP问题)

注意 代码使用了C++矩阵运算库armadillo,这个库语法和MATLAB相似且功能强大。 头文件 #pragma once #include <armadillo> #include<iostream> using namespace arma; using namespace std; extern const int city_size; extern int m...

ZYunfei的博客 3571

蚁群算法

此类算法适合蚁群算法,希望对大家有所帮助。如有改进请指教

C++的蚁群算法实现

直接实现蚁群算法的C++代码! 蚁群算法是一种模拟进化算法,初步的研究表明该算法具有许多优良的性质.针对PID控制器参数优化设计问题,将蚁群算法设计的结果与遗传算法设计的结果进行了比较,数值仿真结果表明,蚁群算法具有一种新的模拟进化优化方法的有效性和应用价值.

智能优化算法学习笔记(4)–蚁群优化算法(ACO)

蚁群算法的学习笔记

KKAI_C 3030

最新版电子发票样式html+css--普通发票+增值发票

【代码】最新版电子发票样式html+css--普通发票+增值发票。

weixin_44110923的博客 3678

蚁群算法原理及c++实现

一、原理 1. 蚂蚁觅食行为 蚁群在寻找食物时,总能找到一条蚁穴到食物的最短路径,并且能随着环境的变化而更新最优路径。究其原因,是因为蚂蚁在运动过程中,会在所经过路径上留下一种称为信息素(pheromone)的物质,其他蚂蚁在运动中可以感知到这种物质,并以此来指导自己的运动方向。 蚁群的这种行为表现出一种信息正反馈现象:某一路径上走过的蚂蚁越多,则后来者选择该路径的概率越大。 2.蚁群算法 又称蚂蚁算法,是一种基于群体智能的算法,用来在图中寻找优化路径的概率型。它由Marco Dorigo于1992年在他的

柘尾鱼的博客 9270

Sony SLVS-EC接口实战:如何用Xilinx K7 FPGA接收IMX421传感器数据(附电气特性匹配技巧)

本文详细介绍了在Xilinx Kintex-7 FPGA平台上实现Sony IMX421图像传感器SLVS-EC接口数据接收的完整实战方案。内容涵盖从硬件选型、PCB布局的电气特性匹配技巧,到FPGA内部GTX收发器配置、多通道绑定以及SLVS-EC协议数据解析与图像重组的关键步骤,为高速视觉系统开发提供了宝贵的调试经验和系统集成指导。

efc12345678的博客 263

STM32F103+W5500网络通信

STM32F103+W5500网络通信一、W5500模块(一)W5500以太网模块介绍(二)模块排针功能表二、 modbus协议(一)modbus协议原理(二)Modbus 通讯方式1.Modbus三种通讯方式2.在Modbus网络上传输3.以太网(modbus tcp/ip)三、参考资料 一、W5500模块 (一)W5500以太网模块介绍 D-W5500 EVB以太网模块是一款基于WIZnet W5500芯片的以太网模块,且性价比高的以太网模块。W5500是一款全硬件TCP/IP嵌入式以太网控制器,为

”一只特立独行的猪“的博客 1万+

FPGA机器学习之蚁群算法的源代码C++

不知道现在是否还有人在研究蚁群算法?应该有吧。当初为了找C或C++源代码而不可得,在阅读了多份"杂七杂八"的代码的基础,总算写出来了。运行了三个TSP经典用例,基本符合要求。2008年3月份写的,现在贴出来大家共享一下,注释加的应该算齐全。仅仅是一份按照蚁群算法的原理写的代码,没有做任何优化。至于我做优化后的代码,就不发出来了吧,呵呵。环境为:Windows XP SP2 + VC 6.0.  

my_share的专栏 1972

别再自己写组件了!用uni-app的midButton属性5分钟搞定中间凸起TabBar(H5/小程序通用)

本文详细介绍了uni-app官方提供的midButton属性,帮助开发者5分钟内实现中间凸起的TabBar效果,无需编写繁琐的自定义组件代码。该方案兼容H5和微信小程序平台,配置简单且维护成本低,大幅提升开发效率和性能表现。

weixin_30431445的博客 347

蚁群算法MATLAB解TSP问题

Excel表exp12_3_1.xls中数据为: clc clear all [xdata,textdata]=xlsread('exp12_3_1.xls'); %加载20个城市的数据,数据按照表格中的位置保存在Excel文件exp12_3_1.xls中 x_label=xdata(:,2); %第二列为横坐标 y_label=xdata(:,3); %第三列为纵坐标 ...

weixin_34166847的博客 1177

Autosar MCAL-S32k324 Crypto配置-基于EB

NXP官网提供了免费的HSE固件,同时也提供了对应的协议栈。本文以算法为例,介绍MCAL相关的配置及在代码中的集成与使用。使用HSE计算,比软件算法确实方便许多。后面会完善更多的算法测试。

赞的博客 2434

华为OD机试双机位C卷-分披萨 (Py/Java/C/C++/Js/Go)

华为OD机试(机考)双机位C卷 【分披萨】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为od机试 - 分披萨。

qq_45776114的博客 1396

蚂蚁算法求解tsp问题matlab,蚁群算法MATLAB解TSP问题

Excel表exp12_3_1.xls中数据为: clcclear all[xdata,textdata]=xlsread('exp12_3_1.xls'); %加载20个城市的数据,数据按照表格中的位置保存在Excel文件exp12_3_1.xls中x_label=xdata(:,2); %第二列为横坐标y_label=xdata(:,3); %第三列为纵坐标C=[x_label y_label...

weixin_28719385的博客 504

使用xlwings在Python中对Excel表格进行操作是非常方便的,可以实现自动化处理、批量数据处理等功能

使用xlwings在Python中对Excel表格进行操作是非常方便的,可以实现自动化处理、批量数据处理等功能。本篇文章主要介绍如何使用xlwings对Excel表格进行多行多列数据设置和操作,并给出相应的源代码。接着,我们可以对这个范围内的所有单元格进行操作,如设置字体颜色、填充颜色、对齐方式等。以上就是使用xlwings对Excel表格进行多行多列数据操作和设置字体颜色、填充色和对齐方式的全部内容。最后,我们可以将数据写入到单元格中,也可以从单元格中读取数据。在Excel中,可以通过。

BUG?不存在的! 712

蚁群算法(ACO)解决旅行商(TSP)问题的python实现

蚁群算法在组合优化问题中表现出色,尤其是在动态变化的问题环境中。它已被应用于各种实际问题,如物流配送、网络路由优化、图像处理等领域。优势与局限性优势:蚁群算法具有强大的全局搜索能力,能够在大规模搜索空间中有效找到解决方案;同时具备良好的并行性和适应性。局限性:蚁群算法可能需要较多的迭代次数才能收敛,且有可能陷入局部最优解。此外,算法参数的设置对结果影响较大,需要根据具体问题仔细调整。

qq_49370210的博客 2638

YOLOv11改进策略【损失函数篇】| 将激活函数替换为带有注意力机制的激活函数 ARelu

将ELSA中的函数Φ\PhiΦ用具有可学习参数α\alphaα和β\betaβ的网络层表示为LxiαβCαxixi0σβxixi≥0Lxi​αβCαxi​σβxi​​xi​0xi​≥0​,结合标准的Rectified Linear UnitsRxi0xi0xixi≥0Rxi​0xi​​xi​0xi​≥0​,得到可学习激活函数Fxiα。

Limiiiing的博客 2117

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【路径规划】蚁群算法的优化计算——旅行商问题(TSP)优化

旅行商问题(TSP)是一种经典的组合优化问题,其目标是找到一条遍历所有城市且总路程最短的环路。由于其计算复杂度高,求解大规模TSP问题往往依赖于启发式算法。本文研究了基于蚁群算法(Ant Colony Optimization, ACO)的TSP优化问题,通过实验验证了蚁群算法在求解TSP问题中的有效性。结果表明,经过若干次迭代后,蚁群算法能够找到一个较优的解决方案。

2401_84610415的博客 1378

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

详解蚁群算法(以MATLAB编写)

详解蚁群算法(以MATLAB编写)

corn1949的博客 3012

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

使用蚁群算法加邻域搜索算法解决带有起点和终点的TSP问题(python)

经典的TSP问题,是通过随机初始化蚂蚁的起始地点,然后设置每个城市都可以访问,访问完所有的城市那么结束循环,来形成回路的。 带有起始点的TSP问题就是,初始化时蚂蚁的初始点只能是起点,并且如果没访问的城市还有两个或者以上那么就设置终点不可访问(当访问的城市只剩最后一个时候打开即可,我的程序中是设置open_table的布尔值)。 所以带有起点和终点的TSP问题相对于经典的TSP问题使用蚁群算法进行求解的时候只用改两行代码即可,非常的简单。 这个蚁群算法是使用op2优化(邻域搜索优化)的蚁群,基本上100个城

SUMPLUSS的博客 2859

蚁群算法的源代码

不知道现在是否还有人在研究蚁群算法?应该有吧。当初为了找C或C++源代码而不可得,在阅读了多份"杂七杂八"的代码的基础,总算写出来了。运行了三个TSP经典用例,基本符合要求。2008年3月份写的,现在贴出来大家共享一下,注释加的应该算齐全。仅仅是一份按照蚁群算法的原理写的代码,没有做任何优化。至于我做优化后的代码,就不发出来了吧,呵呵。环境为:Windows XP SP2 + VC 6.0. 

逍遥剑客的专栏 3万+
上一篇: vim的c语言环境简单配置
下一篇: 约瑟夫问题递归求解
WayToAccept
博客等级 码龄14年 21粉丝 56原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值