回溯法求解TSP问题

news/2025/1/20 21:46:01/文章来源:https://www.cnblogs.com/tutoubird/p/18238762

1.readme

1>python
2>代码基于具体的实例,如有需要可自行修改问题规模为n,不再赘述

2.code

代价矩阵 999表示无穷

arc = [[999, 3, 6, 7],
[5, 999, 2, 3],
[6, 4, 999, 2],
[3, 7, 5, 999]]

city 存放除出发点0外的城市

city = [3, 2, 1]

访问标志数组 0-未访问 1-已访问

visit = [0, 0, 0]

存放最短路径,首元素与尾元素为出发点0

way = [0, 0, 0, 0, 0]

记录当前距离

CurDistance = 0

记录最短路径距离,初始值999表示无穷大,找到更优解则替换

BestDistance = 999

标志位 判断是否走完全程

flag = 0

判断是否访问完所有城市

def is_empty():
for i in visit:
if i == 0:
return 0
return 1

更新最短路径

def way_add(x):
for i in range(1, 4):
if way[i] == 0:
way[i] = x
break

回溯,恢复路径

def way_out():
for i in range(3, 0, -1):
if way[i] != 0:
way[i] = 0
break

回溯算法函数

def back_track(n):
if is_empty(): # 如果访问完全部城市
global CurDistance
global BestDistance
if CurDistance < BestDistance: # 判断是否是更优解,是则记录下来
BestDistance = CurDistance
print("最短距离:", end='')
print(BestDistance, end=' ')
print("BestWay:", end='')
for i in range(0, len(way)):
print(way[i], end='')
if i != len(way) - 1:
print("-->", end='')
if i == len(way) - 1:
print()
else:
for i in city:
if visit[i - 1] == 0:
visit[i - 1] = 1
way_add(i)
CurDistance += arc[n][i]
if is_empty(): # 如果此时走完所有城市,还需加上回到出发点的距离,同时设置标志位
global flag
flag = 1
CurDistance += arc[i][0]
if CurDistance > BestDistance: # 剪枝函数,CurDistance>BestDistance,回溯
visit[i-1] = 0
CurDistance -= arc[n][i]
if flag == 1: # 如果走完所有城市,还需减去回到出发点的距离
flag = 0
CurDistance -= arc[i][0]
way_out()
return
back_track(i) # 向下递归
visit[i-1] = 0 # 回溯,恢复访问标志位
CurDistance -= arc[n][i]
if flag == 1:
flag = 0
CurDistance -= arc[i][0] # 回溯,恢复CurDistance
way_out() # 回溯,恢复路径

调用回溯算法函数

back_track(0)

3.result
1>将city设置为[1,2,3]


2>将city设置为[3,2,1]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/721874.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenGL:混合

OpenGL中,混合(Blending)通常是实现物体透明度(Transparency)的一种技术。透明就是说一个物体(或者其中的一部分)不是纯色(Solid Color)的,它的颜色是物体本身的颜色和它背后其它物体的颜色的不同强度结合。一个有色玻璃窗是一个透明的物体,玻璃有它自己的颜色,但它最终的…

下水道拾的沟槽的文章

wow天色将晚,在我看着你的眼里色彩斑斓 五月的气候合往年一样闷热,二中的晚自习太静,于是闲下来了,止不住地去向,好像又来一轮毕业的时候。小学时,谈起毕业总是很害怕的,那时觉得毕业时候一定是要大哭一场,不然就算不上毕业结果那天也如同流水一般平淡地过去了,正如过…

P3756 [CQOI2017] 老C的方块 解题报告

P3756 [CQOI2017] 老C的方块 解题报告oj:https://gxyzoj.com/d/gxyznoi/p/P266 又是网格题,考虑染色:显然可以发现,每一个不合法的图形都可以被染成黄->蓝->特殊边->绿->红,且旋转后同样满足条件 推广到整个棋盘就是:所以是否可以将颜色编号,然后按照上述方法…

[stars-one] 星念轻小说下载器

原文地址: [stars-one] 星念轻小说下载器-Stars-One的杂货小窝 一款将在线轻小说保存到本地的下载工具 软件介绍小说单卷下载 小说全卷下载(需VIP) 多线程解析和下载 下载导出为epub文件 自动更新软件使用前需要进行用户登录(邮箱注册) 采用会员订阅制,PC版和Android版共用账号…

裁剪序列Cut the Sequence

首先,我们可以先想一想朴素算法,推出DP,i表示分了几段,则可以推出$$F[i]=min_{1<=j<=i}(f[j]+max_{j+1<=k<=i}(a[k]))$$点击查看代码memset(f,0x3f,sizeof f);f[0]=0;for(int i=1;i<=n;i++){for(int j=0;j<i;j++){int tmp=0;ll sum=0;for(int k=j+1;k<…

vits-simple-api搭建

根据vits-simple-api中文文档指南自行搭建后端 以下步骤均在windows平台cpu推理搭建为例选择你的vits模型(注意是vits!不是So-Vits Bert Vits2 Gpt Vits)建议去抱脸网搜索或者b站搜素以及自己训练.在vits-simple-api的路径的model目录下新建你下载模型的名字的文件夹将模型的js…

bili-emoji自定义表情包设置

使用图床上传图片.推荐使用聚合图床,简单免费 把图片的图床链接复制到一个txt文件中,如abc.txt 将abc.txt放到koishi目录的非node_modules\koishi-plugin-emojihub-bili文件夹中,如koishi\lumia\abc.txt 在插件界面填写要触发的命令以及路径如下图所示5.使用如下图所示

关于LTspice如何导入第三方的.lib文件进行仿真

转载自:https://bbs.eeworld.com.cn/thread-1265324-1-1.html 1.在芯片官网找到对应的PSPICE模型下载后,将.lib文件移入到路径下的sub文件夹中。(例如C:\Users\\username\Documents\LTspiceXVII\lib\sub) 2.将.lib文件拖入LTspice后右键单击.subckt后的芯片名称,选择Creat S…

OOP题目集4~6的总结

目录(一)前言 (二)作业介绍 (三)算法与代码 (四)PowerDesigner类图模型 (五)SourceMonitor代码分析 (六)自学内容 (七)总结一、前言介绍本篇博客的大致内容、写作目的、意义等本篇博客介绍如何使用Java语言基础和算法来解决题目问题,在此基础上进行对最近Java编…

前端使用 Konva 实现可视化设计器(13)- 折线 - 最优路径应用【思路篇】

这一章把直线连接改为折线连接,沿用原来连接点的关系信息。关于折线的计算,使用的是开源的 AStar 算法进行路径规划,启发方式为 曼哈顿距离,且不允许对角线移动。请大家动动小手,给我一个免费的 Star 吧~ 大家如果发现了 Bug,欢迎来提 Issue 哟~ github源码 gitee源码 示…

SpringBoot热部署设置

在使用SpringBoot进行开发过程中,我们往往会对代码进行反复修改并对项目进行部署查看效果,这时反复重启SpringBoot会很麻烦,因此使用热部署是提高开发效率的必备插件——“spring-boot-starter-test” <!--SpringBoot热部署依赖--> <dependency> <gr…

redis zset源码

zset底层是由hash字典和跳表实现的,字典存储member->分数的映射关系,这样根据membe查询score的 时间复杂度O为1 跳表可以理解为多个层级的有序链表,每个节点可能在不同层级上,通过在不同层级的跳跃查找,把查询时间复杂度降低到 Olgn 1.随机层数,只有0.25的概率升级层数…