蚁群算法解决TSP问题(C++编写,附全代码)

本文介绍了使用蚁群算法解决旅行商问题(TSP)的方法,详细阐述了算法参数设置,如城市数量、蚂蚁数量、信息素和能见度参数,并解析了算法的主要步骤,包括蚂蚁的路径选择策略和信息素更新规则。在实验中,通过C++代码实现了该算法,结果显示在第96代即找到了最优路径。
摘要由CSDN通过智能技术生成

1.Tsp问题描述

有N个城市,C={0,1,2,3…,N-1},任意两城市距离为dij,求一条经过每个城市的路径,使得距离最小。以30个城市为例分析,另代码中50和75个城市同理。
在这里插入图片描述

2. 参数设置

N:城市个数30
M:蚂蚁个数30
a:表征信息素重要程度的参数,设为2
b:表征能见度重要程度的参数,设为3
p:局部信息素挥发参数,设为0.1
r: 全局信息素挥发参数,设为0.1
NC_MAX: 最大迭代次数,设为500次

3. 算法过程

(1) 蚂蚁均匀分布在各个城市(每个城市放一只)
(2) 随机在30个城市中选一个城市节点,再由这个节点出发由贪心策略到扫描完剩余所有节点得到一条最短路径之和,记为Lnn。
初始化信息素浓度:Info[i][j]=Info[j][i]=1/(N*Lnn)
初始化能见度:visible[i][j]=visible[j][i]=1/dij
(3)对每只蚂蚁从开始出发搜索一条路径:就是从当前城市去往下一城市直到禁忌表中所有节点访问完为止,得到当前路径长度tourlength。最关键就是如何选择下一城市(轮盘赌)。
先生成一个随机数q
P(j)=[(info[start][j])a+(visible[start][j])b]/sum

由概率q按轮盘赌规则选择下一城市为j。
并更新局部信息素浓度:info[i][j]=info[j][i]=(1-p)* info[i][j]+p/(N*Lnn)
(4)进行局部比较:如果当前路径长度<局部最好路径长度,更新局部最好路径为当前路径
(5) 进行全局比较:如果局部路径长度<全局最好路径长度,更新全局最好路径为局部路径
更新全局信息素浓度:info[i][j]=info[j][i]=(1-r)*info[i][j]+r/globalBestLength

4. 实验结果

在这里插入图片描述
在这里插入图片描述
可看到在第96代就得到了最优路径。

5.代码


#include<iostream>   
#include<math.h>   
#include<time.h>   
using namespace std;

//该程序是以蚁群系统为模型写的蚁群算法程序(强调:非蚂蚁周模型),以三个著名的TSP问题为测试对象   
//通过微调参数,都可以获得较好的解   


//----------(1)问题一:Oliver 30 城市 TSP 问题 best_length = 423.7406; ------------------------
//该程序最好的结果是423.741,可运行多次获得
//城市节点数目
#define N 30
//城市坐标
double C[N][2]={
   
{
   2,99},{
   4,50},{
   7,64},{
   13,40},{
   18,54},{
   18,40},{
   22,60},{
   24,42},{
   25,62},{
   25,38},
{
   37,84},{
   41,94},{
   41,26},{
   44,35},{
   45,21},{
   54,67},{
   54,62},{
   58,35},{
   58,69},{
   62,32},
{
   64,60},{
   68,58},{
   71,44},{
   71,71},{
   74,78},{
   82,7},{
   83,46},{
   83,69},{
   87,76},{
   91,38}
};
//----------上面参数是固定的,下面的参数是可变的-----------
//蚂蚁数量
#define M 30
//最大循环次数NcMax
int NcMax = 500;
//信息启发因子,期望启发式因子,全局信息素挥发参数,局部信息素挥发参数, 状态转移公式中的q0
double alpha = 2, beta = 3, rou = 0.1, alpha1 = 0.1,  qzero = 0.01;
//-----------问题一结束------------------------------------------------------------------------


/*
//----------(2)问题二:Elion50 城市 TSP 问题 best_length = 427.96; ----------------------------
//该程序最好的结果是428.468,可运行多次获得
//城市节点数目
#define N 50
//城市坐标
double C[N][2]={
{5,64}, {5,25}, {5,6}, {7,38}, {8,52}, {10,17},
{12,42}, {13,13}, {16,57}, {17,33}, {17,63},
{20,26}, {21,47}, {21,10}, {25,32}, {25,55},
{27,68}, {27,23}, {30,48}, {30,15}, {31,62},
{31,32}, {32,22}, {32,39}, {36,16}, {37,69},
{37,52}, {38,46}, {39,10}, {40,30}, {42,57},
{42,41}, {43,67}, {45,35}, {46,10}, {48,28},
{49,49}, {51,21}, {52,33}, {52,41}, {52,64},
{56,37}, {57,58}, {58,27}, {58,48}, {59,15},
{61,33}, {62,42}, {62,63}, {63,69}
};
//----------上面参数是固定的,下面的参数是可变的-----------
//蚂蚁数量
#define M 50
//最大循环次数NcMax
int NcMax = 1000;
//信息启发因子,期望启发式因子,全局信息素挥发参数,局部信息素挥发参数, 状态转移公式中的q0
double alpha = 2, beta = 4, rou = 0.1, alpha1 = 0.1,  qzero = 0.01;
//-----------问题二结束------------------------------------------------------------------------
*/

//----------(3)问题三:Elion75 城市 TSP 问题 best_length = 542.31;   
//该程序最好的结果是542.309,可运行多次获得    
//城市节点数目   
/*#define N 75   
//城市坐标   
double C[N][2] = {
	{ 6, 25 }, { 7, 43 }, { 9, 56 }, { 10, 70 }, { 11, 28 },
	{ 12, 17 }, { 12, 38 }, { 15, 5 }, { 15, 14 }, { 15, 56 },
	{ 16, 19 }, { 17, 64 }, { 20, 30 }, { 21, 48 }, { 21, 45 },
	{ 21, 36 }, { 22, 53 }, { 22, 22 }, { 26, 29 }, { 26, 13 },
	{ 26, 59 }, { 27, 24 }, { 29, 39 }, { 30, 50 }, { 30, 20 },
	{ 30, 60 }, { 31, 76 }, { 33, 34 }, { 33, 44 }, { 35, 51 },
	{ 35, 16 }, { 35, 60 }, { 36, 6 }, { 36, 26 }, { 38, 33 },
	{ 40, 37 }, { 40, 66 }, { 40, 60 }, { 40, 20 }, { 41, 46 },
	{ 43, 26 }, { 44, 13 }, { 45, 42 }, { 45, 35 }, { 47, 66 },
	{ 48, 21 }, { 50, 30 }, { 50, 40 }, { 50, 50 }, { 50, 70 },
	{ 50, 4 }, { 50, 15 }, { 51, 42 }, { 52, 26 }, { 54, 38 },
	{ 54, 10 }, { 55, 34 }, { 55, 45 }, { 55, 50 }, { 55, 65 },
	{ 55, 57 }, { 55, 20 }, { 57, 72 }, { 59, 5 }, { 60, 15 },
	{ 62, 57 }, { 62, 48 }, { 62, 35 }, { 62, 24 }, { 64, 4 },
	{ 65, 27 }, { 66, 14 }, { 66, 8 }, { 67, 41 }, { 70, 64 }
};
//----------上面参数是固定的,下面的参数是可变的-----------   
//蚂蚁数量   
#define M 75   
//最大循环次数NcMax   
int NcMax = 1000;
//信息启发因子,期望启发式因子,全局信息素挥发参数,局部信息素挥发参数, 状态转移公式中的q0   
double alpha = 2, beta = 5, rou = 0.1, alpha1 = 0.1, qzero = 0.1;
//-----------问题三结束------------------------------------------------------------------------   
*/

//===========================================================================================================   
//局部更新时候使用的的常量,它是由最近邻方法得到的一个长度   
//什么是
  • 12
    点赞
  • 109
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值