【问题描述】

一销售商从n个城市中的某一城市出发,不重复地走完其余n—1个城市并回到原出发点,在所有可能的路径中求出路径长度最短的一条。本题假定该旅行商从第1个城市出发。

输入

对每个测试例,第1行有两个整数:n(4≤n≤10)和m(4≤m≤20 ) ,n是结点数,m是边数。

接下来m行,描述边的关系,每行3个整数:(i,j),length,表示结点i到结点j的长度是length。

当n=0时,表示输入结束。

输出

对每个测试例,输出最短路径长度所经历的结点,最短的长度。

输入样例

4 6

1 2 20

1 4 4

1 3 6

2 3 5

2 4 10

3 4 15

0

输出样例

1 3 2 4

25

【算法分析】

旅行商问题的解空间是一棵排列树。 开始时,x={1,2,…,n},相应的排列树由x的全排列构成。

TSP问题(Traveling Salesman Problem)通常称为旅行商问题,也称为旅行售货员问题、货担郎问题等,是组合优化中的著名难题,也是计算复杂性理论、图论、运筹学、最优化理论等领域中的一个经典问题,具有广泛的应用背景。

问题的一般描述为:旅行商从n个城市中的某一城市出发,经过每个城市仅有一次,最后回到原出发点,在所有可能的路径中求出路径长度最短的一条。

设G=(V, E)是一个带权图,其每一条边(u, v)∈E的费用(权)为正数w(u, v)。目的是要找出G的一条经过每个顶点一次且仅经过一次的回路,即汉密尔顿(Hamilton)回路v1,v2 ,…,vn ,使回路的总权值最小:

【代码部分】

//旅行商问题回溯算法的数据结构#define NUM 100
int n;              //图G的顶点数量
int m;              //图G的边数
int a[NUM][NUM];        //图G的邻接矩阵
int x[NUM];         //当前解
int bestx[NUM];     //当前最优解向量
int cc;             //当前费用
int bestc;          //当前最优值
int NoEdge = -1;       //无边标记
//在构造邻接矩阵a时,其初始值应为NoEdge:
for (i=0; i<NUM; i++)for (j=1; j<NUM; j++)a[i][j] = NoEdge;//最优值和向量x的初始化数值如下:
bestc = NoEdge;
for(i=1; i<=n; i++)x[i] = i;
//旅行商问题回溯算法的实现
//形参t是回溯的深度,从2开始
void Backtrack(int t)
{//到达叶子结点的父结点if(t==n){if(a[x[n-1]][x[n]]!= NoEdge && a[x[n]][1]!= NoEdge && (cc + a[x[n-1]][x[n]]+a[x[n]][1]<bestc||bestc== NoEdge)){for(int i=1; i<=n; i++)bestx[i] = x[i];bestc = cc + a[x[n-1]][x[n]] + a[x[n]][1];}return;}
else {for(int i=t; i<=n; i++){if(a[x[t-1]][x[i]]!= NoEdge &&(cc + a[x[t-1]][x[i]]< bestc||bestc == NoEdge)){swap(x[t],x[i]);cc += a[x[t-1]][x[t]];Backtrack(t+1);cc -= a[x[t-1]][x[t]];swap(x[t],x[i]);}}}
}
//完整实现
#include <iostream>
using namespace std;#define NUM 100
int n;
int m;
int a[NUM][NUM];
int x[NUM];
int bestx[NUM];
int cc;
int bestc;
int NoEdge = -1;void Backtrack(int t)
{if(t==n){if(a[x[n-1]][x[n]]!= NoEdge && a[x[n]][1]!= NoEdge && (cc + a[x[n-1]][x[n]]+a[x[n]][1]<bestc||bestc== NoEdge)){for(int i=1; i<=n; i++)bestx[i] = x[i];bestc = cc + a[x[n-1]][x[n]] + a[x[n]][1];}return;}else {for(int i=t; i<=n; i++){if(a[x[t-1]][x[i]]!= NoEdge &&(cc + a[x[t-1]][x[i]]< bestc||bestc == NoEdge)) {swap(x[t],x[i]);cc += a[x[t-1]][x[t]];Backtrack(t+1);cc -= a[x[t-1]][x[t]];swap(x[t],x[i]);}}}
}int main()
{int i, j;int from, to, length;while (scanf("%d%d", &n, &m) && n) {for (i=0; i<NUM; i++)for (j=1; j<NUM; j++)a[i][j] = NoEdge;for (i=0; i<m; i++){scanf("%d%d%d", &from, &to, &length);a[from][to] = length;a[to][from] = length;}bestc = NoEdge;for(i=1; i<=n; i++)x[i] = i;Backtrack(2);for(j=1; j<=n; j++)printf("%d ", bestx[j]);printf("\n%d\n", bestc);} return 0;
}

【回溯算法】旅行商问题--TSP问题相关推荐

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

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

  2. 贪心算法求解 TSP 旅行商问题及其实现

    文章目录 一.TSP 概述 1. TSP 2. 数学模型 3. TSP分类 二.贪心算法 1. 算法思路 2. 算法框架 3. 问题 三.贪心算法求解 TSP 一.TSP 概述 1. TSP 旅行商问 ...

  3. 人工蜂群算法求解TSP旅行商问题C++(2020.11.13)

    ABC算法求解TSP问题的C++实现 1.输入数据文件:bayg29.tsp 2.头文件 3.所需的类 3.1 城市类City 3.2 包含城市的地图类Graph 3.3 蜜蜂类Bee 3.4 人工蜂 ...

  4. 《MATLAB智能算法30个案例》:第22章 蚁群算法的优化计算——旅行商问题(TSP)优化

    @[TOC](<MATLAB智能算法30个案例>:第22章 蚁群算法的优化计算--旅行商问题(TSP)优化) 1. 前言 <MATLAB智能算法30个案例分析>是2011年7月 ...

  5. 粒子群算法求解旅行商问题TSP (JAVA实现)

    粒子群算法求解旅行商问题TSP 写在开头: 最近师妹的结课作业问我,关于使用粒子群求解TSP问题的思路.我想了想,自己去年的作业用的是遗传算法,貌似有些关联,索性给看了看代码.重新学习了一遍粒子群算法 ...

  6. java 蚁群算法_Java蚁群算法(Ant Colony)求解旅行商问题(TSP)(二)

    算法准备 旅行商问题(TSP)是一个经典的图论问题.在给定一系列城市和他们之间的距离以后,一个旅行商人希望能够找到一条能够走遍所有城市,并返回起点城市的最短路径.既然路径能串起来所有的城市,那么问题中 ...

  7. branch and bound(分支定界)算法求解TSP旅行商问题

    转载自:分枝定界算法求解TSP 整个程序如下所示: 其中各个模块说明如下: - Timer:计时用. - TSPInstanceReader:TSPLIB标准算例读取用. - PriorityQueu ...

  8. (Python)模拟退火算法解决旅行商问题(TSP)

    两种写法思路,最全备注,第二种个人感觉上理解起来稍容易一点: 第一种: import numpy as np import matplotlib.pyplot as plt import pdb# 解 ...

  9. java 双调旅行商 hamiltonian,双调欧几里得旅行商问题(TSP)

    最小环+欧拉回路=最短哈密顿图 介绍 TSP(Traveling Salesman Problem)即旅行商问题,是数学领域中著名问题之一.这个问题是这样的:假设有一个旅行商人要拜访n个城市,他必须选 ...

最新文章

  1. MapReduce基础开发之十一DistributedCache使用
  2. 近期在看的一段JS(谁能看出我想实现什么功能)
  3. FTPClient.listFiles() 放到linux上,返回值为null或数组长度为0
  4. TCP/IP原理 (四) IP编址
  5. Bootstrap 调用插件
  6. 代码中大量的if/else,你有什么优化方案?
  7. 免费的用户界面设计工具、工具包和资源备忘
  8. php循环产生复选框,史上最详细的vue动态生成checkbox的选项并实现多选框的保存回显...
  9. 外卖侠小程序源码v4.24.0微擎插件外卖cps同城生活团购
  10. 未来编程语言展望——G语言的神奇新要素
  11. BScroll切换才能滚动,刷新一下就不能滚动
  12. RFID(射频识别)详解(带图)
  13. android 通知写法_Android消息通知-Notification
  14. anisotropy texture filtering
  15. 启动记事本后在任务栏可以看到它,但是却没有在桌面窗口显示的问题
  16. 软件测试管理--第二章 2.2节
  17. noip模拟赛 终末
  18. 分布式框架-设置jenkins自动化构建重启项目
  19. 教你如何在软文中设置关键词
  20. SIMetrix导入MOS管SPICE参数进行仿真的快速方法

热门文章

  1. vue 实现一个滑块拖动验证功能
  2. 模仿学习(GMM-GMR应用)
  3. Java实现 幸运数字
  4. 差分方程模型(一):模型介绍与Z变换
  5. Matlab的D算法
  6. 语雀全新模板中心,你的创作锦囊
  7. 热门软件看点:QQ和它的对手们 收藏 转载
  8. 风火之旅 需要的信息保存
  9. springboot入门笔记
  10. 寂寞是因为思念谁(校园民谣)铃声 寂寞是因为思念谁(校园民谣)...