【回溯算法】旅行商问题--TSP问题
【问题描述】
一销售商从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问题相关推荐
- 回溯法解决tsp问题 matlab,回溯法求解tsp问题
回溯法以这种工作方式递归地在解空间中搜索, 直至找到所 要求的解或解 空间中已无活结点时为止. 回溯法求解 TSP 问题,首先把所有的顶点的访问标志初始化为 0,...... 回溯法求解 TSP 问题 ...
- 贪心算法求解 TSP 旅行商问题及其实现
文章目录 一.TSP 概述 1. TSP 2. 数学模型 3. TSP分类 二.贪心算法 1. 算法思路 2. 算法框架 3. 问题 三.贪心算法求解 TSP 一.TSP 概述 1. TSP 旅行商问 ...
- 人工蜂群算法求解TSP旅行商问题C++(2020.11.13)
ABC算法求解TSP问题的C++实现 1.输入数据文件:bayg29.tsp 2.头文件 3.所需的类 3.1 城市类City 3.2 包含城市的地图类Graph 3.3 蜜蜂类Bee 3.4 人工蜂 ...
- 《MATLAB智能算法30个案例》:第22章 蚁群算法的优化计算——旅行商问题(TSP)优化
@[TOC](<MATLAB智能算法30个案例>:第22章 蚁群算法的优化计算--旅行商问题(TSP)优化) 1. 前言 <MATLAB智能算法30个案例分析>是2011年7月 ...
- 粒子群算法求解旅行商问题TSP (JAVA实现)
粒子群算法求解旅行商问题TSP 写在开头: 最近师妹的结课作业问我,关于使用粒子群求解TSP问题的思路.我想了想,自己去年的作业用的是遗传算法,貌似有些关联,索性给看了看代码.重新学习了一遍粒子群算法 ...
- java 蚁群算法_Java蚁群算法(Ant Colony)求解旅行商问题(TSP)(二)
算法准备 旅行商问题(TSP)是一个经典的图论问题.在给定一系列城市和他们之间的距离以后,一个旅行商人希望能够找到一条能够走遍所有城市,并返回起点城市的最短路径.既然路径能串起来所有的城市,那么问题中 ...
- branch and bound(分支定界)算法求解TSP旅行商问题
转载自:分枝定界算法求解TSP 整个程序如下所示: 其中各个模块说明如下: - Timer:计时用. - TSPInstanceReader:TSPLIB标准算例读取用. - PriorityQueu ...
- (Python)模拟退火算法解决旅行商问题(TSP)
两种写法思路,最全备注,第二种个人感觉上理解起来稍容易一点: 第一种: import numpy as np import matplotlib.pyplot as plt import pdb# 解 ...
- java 双调旅行商 hamiltonian,双调欧几里得旅行商问题(TSP)
最小环+欧拉回路=最短哈密顿图 介绍 TSP(Traveling Salesman Problem)即旅行商问题,是数学领域中著名问题之一.这个问题是这样的:假设有一个旅行商人要拜访n个城市,他必须选 ...
最新文章
- MapReduce基础开发之十一DistributedCache使用
- 近期在看的一段JS(谁能看出我想实现什么功能)
- FTPClient.listFiles() 放到linux上,返回值为null或数组长度为0
- TCP/IP原理 (四) IP编址
- Bootstrap 调用插件
- 代码中大量的if/else,你有什么优化方案?
- 免费的用户界面设计工具、工具包和资源备忘
- php循环产生复选框,史上最详细的vue动态生成checkbox的选项并实现多选框的保存回显...
- 外卖侠小程序源码v4.24.0微擎插件外卖cps同城生活团购
- 未来编程语言展望——G语言的神奇新要素
- BScroll切换才能滚动,刷新一下就不能滚动
- RFID(射频识别)详解(带图)
- android 通知写法_Android消息通知-Notification
- anisotropy texture filtering
- 启动记事本后在任务栏可以看到它,但是却没有在桌面窗口显示的问题
- 软件测试管理--第二章 2.2节
- noip模拟赛 终末
- 分布式框架-设置jenkins自动化构建重启项目
- 教你如何在软文中设置关键词
- SIMetrix导入MOS管SPICE参数进行仿真的快速方法