【问题描述】

一销售商从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. redis启动异常处理一例
  2. 自己生产签名和数字证书的方法
  3. matplotlib 高阶之Transformations Tutorial
  4. 容器大小_无根容器内部结构浅析
  5. win7创建虚拟无线网络
  6. linux使用root操作文件,以root用户登录Linux系统,当前目录是/root,要求完成如下操作和功...
  7. 企业微信小程序_集成微信小程序插件_地图选点插件
  8. 轧机用弹性阻尼体反力计算_「轴承知识」轧机轴承故障频繁怎么办?必要的检查维护不可少...
  9. ASP.NET WebAPI构建API接口服务实战演练
  10. synchronized偏向锁
  11. python画球面_matplotlib中的球面坐标图
  12. 【翻译工具】如何复活谷歌翻译(网页翻译)
  13. 利用word2007插入参考文献
  14. 练习1:根据老师代码,完成奥运五环的绘图程序
  15. SAP - VL10B 执行采购订单,没有采购订单信息问题
  16. android导出微信朋友圈怎么发文字,微信朋友圈气泡字怎么弄 微信朋友圈气泡文字生成教程...
  17. 在线客服——各第三方的收费标准及服务提供
  18. 单应用下RabbitMQ如何保证线程安全,及多应用下抢数据问题
  19. 曾国藩:利可共而不可独,谋可寡而不可众
  20. 第3章 随机点名器案例

热门文章

  1. 【数据分析】盘点五一期间最受欢迎的几个景区
  2. idea 启动时怎么选择工作空间
  3. 最大连接数与每ip连接数的限制
  4. pwn-进阶-forgot
  5. Caffe Layer 系列(一):Input层、Data层
  6. BZOJ 1085 骑士精神
  7. CRMED知识付费2.0源码 已去授权
  8. AS179-92LF射频开关芯片
  9. 试题 算法训练 车的放置(蓝桥杯c++)
  10. CSS实现强制换行的解决方法