定义:旅行商问题,即TSP问题(Traveling Salesman Problem)又译为旅行推销员问题、货郎担问题,是数学领域中著名问题之一。假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求得的路径路程为所有路径之中的最小值。


本提中对TSP问题,可以看作全排列问题,只不过在排列过程中,只对符合条件的数进行,那怎末判断要去的下一个城市(下一个数是否满足要求,这里就采用了限界(代价)函数,用来减少不必要的循环,也就是所谓的剪枝函数的作用)

这里的限界函数用的是屈婉玲老师的算法与设计分析中提到的方法,

代码如下:

#include <stdio.h>
#define max 100
int num ;
int g[max][max], x[max], bestx[max]; //best[]是用来存储最终的最短路径
int cl=0;
int best = max;//交换函数
void swap(int &a, int &b)
{int tem = a;a= b;b =tem;
}//界定函数,按照屈婉玲老师的算法公开课视频讲解的给出的实现,
//下界公式为 min{cl + min1 + temmin}解释一下就是当前走过的路径+下一个要找的最短路径+剩下点的到其他点的最短路径(最后这个temmin是用贪心的思想求剩下没走过城市的最路径)
//当然,贪心毕竟不是从整体最优考虑,而是从局部最优考虑,所以,在后来的寻找中,如果找到比 cl + min1 + temmin求解出来的最短路径,则可以考虑往下找,否则剪枝。
int  bound( int t)
{int min1=max ,min2=max, temmin=0;  //这里min与min2初始化一下 for(int i=t; i<=num; i++){//这里求min1 if( g[x[t-1]][x[i]] != -1 && g[x[t-1]][x[i]]  < min1){min1 =g[x[t-1]][x[i]]; //这里求要去的第t城市。选择当前到t路径最短的 }//这里求min2 for(int j =1; j<=num; j++) //贪心的思想,求剩下的路径的下界 {if( g[x[i]][x[j]]!=-1 &&  g[x[i]][x[j]]!=0  && g[x[i]][x[j]] < min2){min2 = g[x[i]][x[j]];}}temmin += min2; //这里是剩下点的最短出出路径的和的累加 }return cl+ min1 + temmin;
}//这里选择城市的方式类似于全排列问题,只不过这里加了 一个判断条件就是t与之前的城市t-1有路径,这里是有选择性的选择点(这里也叫剪枝)。
void prim(int t)
{//如果到叶节点,则表示所有城市都走过了,这个时候就保存一下最短路径以及相应的城市顺序 ,当然是满足条件就是比之前的bext还要小的路径的长度,每次取最优 if(t>num ){if(g[x[num]][1]!=-1 &&  cl + g[x[num]][1] <best) //记得还有最后回到原点 ,这里必须是有到原点的一条路径 {for(int i =1; i<=num; i++){bestx[i] =x[i];   //将走过的顺序放入best数组中 }best = cl + g[x[num]][1]; //保存加上回到原点的的路径 }}else{for(int j =t; j<=num; j++){if( g[x[t-1]][x[j]] !=-1 && (bound(t)<best)) //满足条件的选择要选的城市的编号 {swap(x[j],x[t]);cl += g[x[t-1]][x[t]]; //注意,这里不是g[x[t-1]x[j]],j改成t,因为上面的j与t的位置的数换了。 prim(t+1);//回溯,恢复走过的。 cl -= g[x[t-1]][x[t]];swap(x[j],x[t]);}}}
}int main()
{printf("输入城市数: ");scanf("%d",&num);for(int i =1; i<=num; i++){x[i] =i; //将城市编号放入一个数组中,初始化 bestx[i] = 0;}for(int i =1; i<=num; i++){for(int j =1; j<=num; j++){scanf("%d",&g[i][j]);}} prim(2); //这里是从第一个城市出发,开始要寻找第二个要走的城市 printf("从1号城市出发,经过所有城市回到起点顺序为: "); for(int i =1; i<=num ;i++){printf("%d --> ", bestx[i]);}if(g[x[num]][1]!=-1);{printf("%d",bestx[1]); }printf("\n"); printf("\n最短路径为:  %d", best); return 0;}

程序运行如下:


回溯法求解TSP问题(旅行商问题)相关推荐

  1. 回溯法解决tsp问题 matlab,回溯法求解tsp问题

    回溯法以这种工作方式递归地在解空间中搜索, 直至找到所 要求的解或解 空间中已无活结点时为止. 回溯法求解 TSP 问题,首先把所有的顶点的访问标志初始化为 0,...... 回溯法求解 TSP 问题 ...

  2. 回溯法求解旅行商问题

    回溯法求解旅行商问题 #include <iostream> #include <cstdlib> using namespace std; #define n 5 #defi ...

  3. 【算法分析】实验 4. 回溯法求解0-1背包等问题

    目录 实验内容 实验目的 实验结果 步骤1:描述与分析 步骤2:策略以及数据结构 步骤3 步骤4 步骤5 步骤6 实验总结 实验内容 本实验要求基于算法设计与分析的一般过程(即待求解问题的描述.算法设 ...

  4. java背包算法回溯法_【算法分析】实验 4. 回溯法求解0-1背包等问题

    [TOC] 实验内容 本实验要求基于算法设计与分析的一般过程(即待求解问题的描述.算法设计.算法描述.算法正确性证明.算法分析.算法实现与测试),通过回溯法的在实际问题求解实践中,加深理解其基本原理和 ...

  5. 回溯法求解N皇后问题(Java实现)

    回溯法:也称为试探法,它并不考虑问题规模的大小,而是从问题的最明显的最小规模开始逐步求解出可能的答案,并以此慢慢地扩大问题规模,迭代地逼近最终问题的解.这种迭代类似于穷举并且是试探性的,因为当目前的可 ...

  6. php生成迷宫图片,PHP实现基于回溯法求解迷宫问题的方法详解

    本文实例讲述了PHP实现基于回溯法求解迷宫问题的方法.分享给大家供大家参考,具体如下: 引言 最近在leetcode上看了些算法题,有些看着很简单的很常用的东西,竟然一下子想不出来怎么求解,比如说:实 ...

  7. 回溯法求解图着色问题

    回溯法求解图着色问题 #include <iostream> #include <cstdlib> using namespace std; #define n 5 #defi ...

  8. 回溯法求解N皇后问题及其时间复杂度分析

    回溯法求解N皇后问题及其时间复杂度分析 一.回溯法简介 1. 什么是回溯法? 2. 回溯法的时间复杂度分析 蒙特卡罗方法 蒙特卡罗方法在回溯法求解时间复杂度中的应用 二.回溯法求解N皇后问题 1. 回 ...

  9. 算法设计与分析 实验三 回溯法求解地图填色问题

    回溯法求解地图填色问题 一.实验目的与要求 1.实验基本要求: 2.实验亮点: 二.实验内容与方法 三.实验步骤与过程 1.未优化的回溯: (1)算法描述: (2)编程实现 (3)运行并测试: 2.对 ...

  10. 回溯法求解0-1背包问题

    回溯法求解0-1背包问题时比较随机序列和按 v/w 降序排列的算法 问题描述: 针对0-1背包问题,尝试用回溯法. 物品总数N=10,背包容量 C=26, 物品的重量数组为w={7,3,10,12,1 ...

最新文章

  1. tensorflow中的BN层实现
  2. 数论分块 ---- 2020牛客多校第7场H-Dividing[思维+数论分块]
  3. 如何使得自己的Python程序每行长度小于80个字符?
  4. easyui js解析字符串_EasyUI Dialog弹出框+JS执行字符串
  5. 23种设计模式C++源码与UML实现--外观模式
  6. 【经验】刚读硕士怎么感觉学机器学习和深度学习越学越不懂?
  7. Stegsolve(Data Extract):lsb隐写
  8. POJ 1719 Shooting Contest
  9. 2_数据分析—认识pandas
  10. 【Android游戏开发二十一】Android os设备谎言分辨率的解决方案!
  11. STC学习:电子音乐
  12. linux+镜像命令在哪里,怎么查看 linux 镜像文件
  13. Java常见gis开源框架,开源gis大全java
  14. 2.遥感传感器和遥感数据
  15. 加减法叫做什么运算_加减法是什么意思
  16. UE4学习笔记:学习UE4中的UMG(图形UI设计器)工具(一): Widget Blueprint控件蓝图
  17. 小型元器件介绍:排阻
  18. 投资转型:实体店铺,投资经营复盘
  19. Android 通用流行框架梳理
  20. 一文了解 Julia(lang)

热门文章

  1. Google翻译插件不能用解决方案
  2. Python爬取——国家统计局省份加城市 并写入数据库
  3. 推荐的PDF阅读器(可对pdf文章进行编辑操作的)
  4. 离散数学常见面试问题总结,含答案
  5. 比较全面的OA系统需求分析
  6. ppt视频音画不同步怎么解决?ppt音画同步设置方法
  7. windows无法完成格式化U盘的几种终极解决办法
  8. winform 固定splitContainer某一部分大小
  9. vulnhub--odin
  10. ZYNQ+FPGA读取SD卡BMP图片并通过HDMI显示