首页 > 其他分享 >回溯法求解TSP问题

回溯法求解TSP问题

时间:2024-06-08 17:13:33浏览次数:12  
标签:求解 BestDistance 999 arc way 回溯 CurDistance TSP

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 = [1, 2, 3]
# 访问标志数组 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]

标签:求解,BestDistance,999,arc,way,回溯,CurDistance,TSP
From: https://www.cnblogs.com/tutoubird/p/18238762

相关文章

  • 关于LTspice如何导入第三方的.lib文件进行仿真
    转载自:https://bbs.eeworld.com.cn/thread-1265324-1-1.html1.在芯片官网找到对应的PSPICE模型下载后,将.lib文件移入到路径下的sub文件夹中。(例如C:\Users\\'username'\Documents\LTspiceXVII\lib\sub)2.将.lib文件拖入LTspice后右键单击.subckt后的芯片名称,选择CreatSymbol,即......
  • 基于GA-PSO遗传粒子群混合优化算法的DVRP问题求解matlab仿真
    1.程序功能描述       车辆路径问题(VehicleRoutingProblem,VRP)是运筹学领域的一个经典问题,旨在寻找满足一系列送货或取货需求的最优车辆行驶路径。DVRP是一个经典的组合优化问题,在物流配送、运输调度等领域有广泛应用。它要求确定一组最优路径,使得一定数量的车辆从起......
  • 代码随想录算法训练营第30天|回溯复习篇
    回溯基础理论1.回溯的本质是利用递归进行暴力搜索,将符和条件的结果集搜索出来2.回溯法常见的问题:组合问题:N个数里面按一定规则找出k个数的集合排列问题:N个数按一定规则全排列,有几种排列方式切割问题:一个字符串按一定规则有几种切割方式子集问题:一个N个数的集合里有多少符合......
  • 基于GA-PSO遗传粒子群混合优化算法的CDVRP问题求解matlab仿真
    1.程序功能描述       车辆路径问题(VehicleRoutingProblem,VRP)是运筹学领域的一个经典问题,旨在寻找满足一系列送货或取货需求的最优车辆行驶路径。其中,CDVRP是一个经典的组合优化问题,它要求确定一组最优路径,使得一定数量的车辆从起点出发,服务一系列客户点,并最终返回起......
  • 多目标应用:NSGA2求解无人机三维路径规划(MATLAB代码)
    详细介绍多目标应用:基于非支配排序的鱼鹰优化算法NSOOA求解无人机三维路径规划(MATLAB代码)-CSDN博客一次运行结果完整MATLAB代码多目标应用:NSGA2求解无人机三维路径规划(MATLAB代码)......
  • 最大似然估计的求解步骤(详细解释,通俗易懂)
          关于最大似然估计的定义我已经分享过啦,小伙伴们可以通过下面的链接看看 什么是最大似然估计?1.求解步骤        今天我们来说一下它的求解步骤(这里的求解过程是以离散型随机变量为例,连续型随机变量同理)。在上文中我们知道,离散型随机变量的似然函数为......
  • 无人机航迹规划:人工原生动物优化算法APO求解无人机路径规划MATLAB
    一、无人机模型介绍单个无人机三维路径规划问题及其建模_无人机路径规划场景建模-CSDN博客参考文献:[1]胡观凯,钟建华,李永正,黎万洪.基于IPSO-GA算法的无人机三维路径规划[J].现代电子技术,2023,46(07):115-120二、人工原生动物优化算法APO求解无人机路径规划人工原生动物......
  • 代码随想录算法训练营第二十四天 | 回溯算法 77.组合
    回溯算法理论基础文章讲解视频讲解回溯是递归的副产品,只要有回溯就会有递归回溯的本质是琼剧,所以效率不高回溯法可以解决的问题组合问题切割问题子集问题排列问题棋盘问题如何理解回溯回溯算法的问题都可以抽象为树形结构集合的大小就构成了书的快读,递归的深度......
  • Arkime(前身为Moloch)-开源网络回溯系统
    Arkime(前身为Moloch)是一个专为安全分析师、网络工程师和研究人员设计的工具,它专注于提供高效、直观的方式来捕获、索引和搜索网络流量,以便于进行深入分析。Github官网:GitHub-arkime/arkime:Arkimeisanopensource,largescale,fullpacketcapturing,indexing,anddat......
  • 求解一个行列式的值
    求一个行列式的值问题描述:输入一个行列式的阶数,再按行输入这个行列式,再计算出它的值。解法:存储一个行列式可以使用一个n行n列的数组。使用双重for循环按行输入行列式的值即可。cout<<"请输入行列式的阶数:"<<endl;cin>>n;cout<<"请按行输入一个行列式:"<<endl;for......