旅行商问题的贪心算法解

旅行商问题,简称TSP问题。数学描述为:在一个有权无向图中寻找一条最短的哈密顿回路。意思就是需要在每一条边上都有权值的图(一般情况下边上的权值就是边的几何长度,当然在拓扑图的意义上未必如此)中找一条经过所有节点且每个节点仅经过一次的回路,而且这个回路是所有满足该条件的回路中最短的。

旅行商问题目前没有解析解法,即没有固定的算法,可以稳定地在所有有权无向图中找到最短哈密顿回路(找最短欧拉回路的解析方法是有的)。因为这个原因,旅行商问题成为了组合优化的经典问题,也是很多启发式算法可用的经典示例。

在最后介绍的两种非经典算法,蚁群算法及模拟退火算法中,我们将以旅行商问题为例。在此之前,在这里先给出旅行商问题的贪心算法解。

贪心算法是解决旅行商问题最直接的考虑,即完全地局部寻优。意思就是,在每一个位置,旅行商都找最近能到的点,不重复走,直到完成一个哈密顿回路。贪心算法当然是不能确保找到真正最小的哈密顿回路的(其实智能算法也做不到,但能找到比贪心算法好的)。理论上贪心算法一定会陷入局部最优,即使找到全局最优也是偶然。

在以后将给出的蚁群算法及模拟退火算法中,我们使用的都是同一个图。下面给出的程序列举了从所有点起始的贪心算法找到的最小哈密顿回路,并找到了这些回路中最短的一条。下面智能算法的目标即是超越贪心算法,只要一个智能算法在这个图中能稳定地找到比贪心算法能找到的最短回路还小的回路,这个算法就是成功的。

问题中涉及的图是:坐标数据可以在下面的程序中找到,这里图边的权值即是边的几何长度

下面给出实现贪心算法的程序,C++语言编写,包括两个文件,head.h和main.cpp。在C++空项目中填入这两个文件算法即能运行。

head.h中包括需要的系统头文件和问题描述及算法中的常量:

#include

#include

#include

#include

#include

#include

#definen52//城市规模

//城市横坐标数组

doubleML_x[n]=

{565,25,345,945,845,880,25,525,580,650,1605,1220,1465,1530,845,725,145,415,510,560,

300,520,480,835,975,1215,1320,1250,660,410,420,575,1150,700,685,685,770,795,720,760,

475,95,875,700,555,830,1170,830,605,595,1340,1740};

//城市纵坐标数组

doubleML_y[n]=

{575,185,750,685,655,660,230,1000,1175,1130,620,580,200,5,680,370,665,635,875,365,

465,585,415,625,580,245,315,400,180,250,555,665,1160,580,595,610,610,645,635,650,

960,260,920,500,815,485,65,610,625,360,725,245};

doublemound[n][n];//城市间距离矩阵

voidinit_mound_matrix(double*X,double*Y,double(*M)[n])//城市间距离计算方法

{

for(inti=0;i

for(intj=0;j

if(i==j)M[i][j]=0;

elseM[i][j]=sqrt(pow((X[i]-X[j]),2)+pow((Y[i]-Y[j]),2));

}

mian.cpp中是算法主体和程序入口:

/**********************/

/******贪心算法******/

#include"head.h"

introute[n][n+1];//全部贪心路径记录

introute_best[n+1];//最佳贪心路径记录

doublelength[n];//各贪心路径长度

doublelength_best;//最佳贪心路径长度

intmain()

init_mound_matrix(ML_x,ML_y,mound);

for(inti=0;i

for(intk=0;k

intLOC=k;//当前位置变量

intrecord[n+1];//反重走记录

for(inti=0;i

record[LOC]=1;//记录初始位置已走过

intindex;//最佳位置的序号

doubled;//到最近位置的长度

route[k][0]=LOC;//记录初始位置

//依据贪心法则寻找路径

if(i==n-1)record[LOC]=0;//走到最后一步时,允许走回初始位置

d=100000;

if(mound[route[k][i]][j]

index=j;

d=mound[route[k][i]][j];

route[k][i+1]=index;

record[index]=1;

//显示从k点出发找到的贪心路径

for(inti=0;i

std::cout<<"\n";

for(inti=0;i

std::cout<<"length:"<

//从长度记录中找到最短长度,并找到它的序号

length_best=length[0];

inttemp=0;

if(length[i]

length_best=length[i];

temp=i;

//显示最短贪心路径及其长度

std::cout<<"———————————————————————————";

std::cout<<"\n\n";

for(inti=0;i

for(inti=0;i

std::cout<<"length_best:"<

return0;

程序报告的结果:(结果可以秒出,后面两个算法需要10到20秒)

上面看不到的部分是贪心算法从0到51各点起始找到的最短路径,最后报告的是这些回路中最短的一条,从点“39”出发,由贪心算法找到的序列,它的长度是8182.19,在后续的算法中我们将在这张图中找到比这条回路更短的哈密顿回路,以显示智能算法的能力。

THE END
1.python程序示例贪心法mob64ca12d4650e的技术博客贪心算法是一种用于解决优化问题的简单而有效的方法,它通过选择局部最优解来逐步构建全局最优解。这种算法通常适用于求解最小值或最大值的问题,如最小生成树、背包问题等。下面我们将通过一个简单的例子来阐述贪心算法的实现过程,同时提供代码示例和详细的说明。 https://blog.51cto.com/u_16213316/12827303
2.贪心算法在旅行商问题中的应用与优化贪心算法在IT领域的应用 贪心算法是一种在求解问题时,总是选择当前看来最优的解决方案的策略。这种算法广泛应用于计算机科学和IT领域,尤其是在解决优化问题和搜索问题等方面。本文将介绍贪心算法在IT领域的一些应用场景,以及其在实际编程中的实现。 应用场景 https://www.imooc.com/article/338993
3.Unity+c#贪心算法求解旅行商问题旅行资源unity 贪心算法 旅行商问题 需积分: 1 18 浏览量 2024-06-18 上传 评论 收藏 35.06MB ZIP 举报 立即下载 开通VIP(低至0.43/天) 买1年送1年 Unity+c#贪心算法求解旅行商问题,内有demo演示资源推荐 资源评论 c# 动态规划求解旅行商问题 浏览:21 5星 · 资源好评率100% 1.NET下可以直接运行 2.关键https://download.csdn.net/download/qq_42437783/89449418
4.运筹学Python实现图论与最短距离python2 案例1——贪心算法实现 2.1 旅行商问题(TSP) 旅行商问题(TravelingSalesmanProblem,TSP)一个商品推销员要去若干个城市推销商品,该推销员从一个城市出发,需要遍历所有城市一次且只能一次,回到出发地。应如何选择行进路线,以使总的行程最短。 旅行商问题(TSP)即给定一组城市以及每对城市之间的距离,需要找到一条最https://www.jb51.net/article/234785.htm
5.《图解算法》:贪心算法没办法判断问题是不是NP完全问题,但还是有一些蛛丝马迹可循的 不能将问题分成小问题,必须考虑各种可能的情况。这可能是NP完全问题。 如果问题涉及集合(如集合覆盖问题)且难以解决,它可能就是NP完全问题。 如果问题涉及序列(如旅行商问题中的城市序列)且难以解决,它可能就是NP完全问题。 https://www.pianshen.com/article/3361833437/
6.旅行商问题(TSP)学术百科提供全面的“旅行商问题(TSP)”相关文献(论文)下载,论文摘要免费查询,旅行商问题(TSP)论文全文下载提供PDF格式文件。旅行商问题(TSP)中文、英文词汇释义(解释),“旅行商问题(TSP)”各类研究资料、调研报告等。https://wiki.cnki.com.cn/HotWord/12369.htm
7.TSPTSP-旅行商问题,是一个经典问题,如下图所示,描述为“有n个城市,任何两个城市之间的距离都是确定的,现要求一旅行商从某城市出发必须经过每一个城市且只能在每个城市逗留一次,最后回到原出发城市,问如何事先确定好一条最短的路线使其旅行的费用最少”。围绕TSP,回答下列问题。关于TSP的贪心算法的求解思想,下列说法http://www.ppkao.com/wangke/daan/ada5d14898a14b399148dd3228e94dd3
8.宇宙无敌PATA不完全考纲3. 理解并熟练编程实现经典高级算法,包括哈希映射、并查集、最短路径、拓扑排序、关键路径、贪心、深度优先搜索、广度优先搜索、回溯剪枝等; 4. 具备较强的问题抽象和建模能力,能实现对复杂实际问题的模拟求解。 总而言之描述的相当宽泛,你行就你行,你不行就不行 下面https://www.jianshu.com/p/3814d99bed25
9.javascript数据结构与算法:二分查找镜心的小树屋O(n),也叫线性时间,这样的算法包括简单查找。 O(n * log n),这样的算法包括快速排序——一种速度较快的排序算法。 ,这样的算法包括选择排序——一种速度较慢的排序算法 O(n!),这样的算法包括接下来将介绍的旅行商问题的解决方案——一种非常慢的算法 https://segmentfault.com/a/1190000018342920/
10.算法分析与设计期末答案2023秋1.给定二分图G = 中无孤立点,|V|=n,其最大流算法求得最大流f, 则 G的()=f.A:最大匹配数 B:最小顶点覆盖 C:最大独立数 D:最小边覆盖 答案:最大匹配数###最小顶点覆盖 2.贪心算法的基本要素是A:最优子结构性质 B:独立子问题的性质 C:贪心选择的性质 D:无后效性性质 答案:最优子结构 3.https://www.wkebb.com/c/776b56604264529595bfd59c2f472142.html
11.腕关节活动度测量,一般尺偏的角度大于桡偏的角度。在计算机科学中,哪种算法是解决旅行商问题(TSP)的经典算法之一? A. 贪心算法 B. 动态规划 C. 回溯法 D. 遗传算法 查看完整题目与答案 哪个学派强调“无为而治”,主张顺应自然、清静无为? A. 儒家 B. 道家 C. 墨家 D. 法家 查看完整题目与答案 在经济学中,哪个理论提出了“看不见的手”https://www.shuashuati.com/ti/c6bc7ed0dec74447a876d6e4f4c18f16.html
12.算法所有常见知识点总结要注意二分搜索的输入一定是一个升序的数组,实质就是一个二叉搜索树(所以也把二分搜索的执行描述为决策树),对于一个大小为n的排序数组,算法Binarysearch执行比较的最大次数为$()int(log_n)+1$(如果输入数组不是递增排好序的,则可在$nlog_n$内对其进行排序后再进行二分搜索)。 http://www.360doc.com/content/19/1016/18/32762466_867273134.shtml
13.迷茫的旅行商图书简介 假设一名旅行商打算拜访一张城市列表中的所有城市,每座城市只去一次,最后回到出发地。要怎么走才能让路线最短呢?这就是旅行商问题,乍一听很简单,在应展开短评 打开App写短评 巩庆奎2015-03-28 21:40:24 其实我努力试图在算法中读出人生哲理:贪心算法的局部最优解并不能代表全局最优解,就像我们生活https://m.douban.com/book/subject/25713498/
14.贪心算法详解二、贪心算法的应用场景 贪心算法经常被用来解决优化问题,例如: 1、集合覆盖问题:有一些广播台,每个广播台可以覆盖一些地区,求出覆盖所有地区需要选择哪些广播台。 2、背包问题:有一个固定大小的背包,要尽可能装入最有价值的物品,求最大价值量。 3、旅行商问题:有一个旅行商需要访问多个城市,每个城市之间的距离已知https://developer.aliyun.com/article/1356247
15.内含贪心算法详解,老师用ppt码农集市专业分享IT编程学习资源内含贪心算法详解,老师用pptTr**xx 上传1.13 MB 文件格式 ppt 贪心算法 贪心算法详解!若要用贪心算法求解某问题的整体最优解,必须首先证明贪心思想在该问题的应用结果就是最优解!!点赞(0) 踩踩(0) 反馈 所需:1 积分 电信网络下载 yhyyxt 2018-05-02 19:38:56 评论 https://www.coder100.com/index/index/content/id/793630