旅行商问题,又称旅行者,推销员问题,货郎担问题。该问题十分经典,几十年前用于计算机国际竞赛,现在被用来作为算法的入门练习。

假设有一个商人要拜访n个城市,他必须走完所有路径,且路径不能重复,并且走到最后能回到原来路径。

事实上我们可以将这个问题转换成一张图(丑了点)

注:这篇文章是对无向路径进行求解,并非双向,又称为修路问题以及最短路径问题。

该题只为TSP问题的一个特例,核心是——最小生成树问题

例如这样:

可以画出它的邻接矩阵:

类似这样:

邻接矩阵中对应位置写出与自己相连的点距离值

0代表当前旅行商的位置,那么问题就转换成了,我要如何走这张图,才能让我走完每个点,并且不能重复过点,而且使得最终路径最短。

以上三个要求其实就是解决问题的入题点,无论使用动态规划还是蛮力法都只是对上面三个条件的求解。

这样的题目我们通常采用的方法是将其转换成可以用数学方式解答的问题。

那么我们常用的手段就是图和树:

这道题是一个点——线问题,那么用图可以将问题抽象出来

我们将图一转换成一个邻接矩阵    邻接矩阵可以将点和边的关系很好的展现出来

我们将点装进集合,走过一个点,就把它从集合中剔除,这样可以保证不走重复路径

将走过的路径装进一个数组中,每次走了一条路,就把路径与之前走过的路径相加。

那么这个问题就可以分为三个步骤:

  1. 初始化点的集合和走过的路径长度
  2. 寻找最近的没走过的点
  3. 将这个点从集合中剔除,并将路径与原来路径相加,表示走过了这条路。

下面是C++的源代码

#include<iostream>
using namespace std;
const int INF = 0x3ffffffff;
const int N = 100;
bool s[N];
int closest[N];
int lowcost[N];
void Prim(int n, int u0, int c[N][N])
{//顶点个数,开始顶点,带权矩阵//如果s[i]=true,说明顶点i属于句话V-U//将最后的相关的最小权值传递到数组lowcosts[u0] = true;//最初时,集合中U只有一个元素,即顶点u0int i;int j;for (i = 1; i <= n; i++) {if (i != u0) {lowcost[i] = c[u0][i];closest[i] = u0;s[i] = false;}else {lowcost[i] = 0;}for (i = 1; i <= n; i++) {int temp = INF;int t = u0;for (j = 1; j <= n; j++) {if ((!s[j]) && (lowcost[j] < temp)){t = j;temp = lowcost[j];}}if (t == u0) {break;}s[t] = true;for (j = 1; j <= n; j++) {if ((!s[j]) && (c[t][j] < lowcost[j])){lowcost[j] = c[t][j];closest[j] = t;}}}}}
int main() {int n, c[N][N], m, u, v, w;int u0;cout << "输入结点数n和边数m:" << endl;cin >> n >> m;int sumcost = 0;for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {c[i][j] = INF;}}cout << "输入结点数u,v和边值w: " << endl;for (int i = 1; i <= m; i++) {cin >> u >> v >> w;c[u][v] = c[v][u] = w;}cout << "输入任一结点u0: " << endl;cin >> u0;Prim(n, u0, c);cout << "数组lowcost的内容为: " << endl;for (int i = 1; i <= n; i++) {cout << lowcost[i] << " ";}cout << endl;for (int i = 1; i <= n; i++) {sumcost += lowcost[i];}cout << "最小的花费是:" << sumcost << endl << endl;return 0;
}

关于单向TSP旅行商问题/修路问题/最小生成树问题的求解讨论相关推荐

  1. TSP旅行商问题之分支界限法法求解(C语言)

    #include <stdio.h> #include <malloc.h>#define NoEdge 1000struct MinHeapNode {int lcost; ...

  2. Python小白的数学建模课-18.最小生成树问题

    Python小白的数学建模课-18.最小生成树问题 最小生成树(MST)是图论中的基本问题,具有广泛的实际应用,在数学建模中也经常出现. 路线设计.道路规划.官网布局.公交路线.网络设计,都可以转化为 ...

  3. 数据结构与算法-Prim算法解析与解决修路最小生成树问题

    文章目录 简介 Prim算法 最小生成树 应用场景 问题描述 思路分析 代码实现 简介 Prim算法 ​ 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索 ...

  4. java寻优算法_模拟退火算法SA原理及python、java、php、c++语言代码实现TSP旅行商问题,智能优化算法,随机寻优算法,全局最短路径...

    模拟退火算法SA原理及python.java.php.c++语言代码实现TSP旅行商问题,智能优化算法,随机寻优算法,全局最短路径 模拟退火算法(Simulated Annealing,SA)最早的思 ...

  5. 最小生成树问题的算法笔记

    最小生成树问题 前提 在一给定的无向图G = (V, E) 中,(u, v) 代表连接顶点 u 与顶点 v 的边(即),而 w(u, v) 代表此边的权重,若存在 T 为 E 的子集且为无循环图,使得 ...

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

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

  7. 遗传算法(GA)分析总结(Matlab+C#模拟解决TSP旅行商问题)

    遗传算法 1.1.简介 1.2.遗传算法的基本要素 1.3.染色体的编码方式 1.3.1.二进制编码 1.3.2.实数编码 1.4.适应度函数 1.5.遗传算子 1.5.1.选择算子策略 1.5.2. ...

  8. 使用贪心算法解决最小生成树问题。

    使用贪心算法解决最小生成树问题. #include<iostream> #include<algorithm> using namespace std; const int M ...

  9. 实验1 最小生成树问题【Kruskal+Prim】

    1.贪心算法思想 贪心算法的基本思想是找出整体当中每个小的局部的最优解,并且将所有的这些局部最优解合起来形成整体上的一个最优解.因此能够使用贪心算法的问题必须满足下面的两个性质: 1.整体的最优解可以 ...

最新文章

  1. Nginx 配置清单(一篇够用)
  2. 求多个四元数的平均数
  3. 数据挖掘:分享两个Pandas使用小陷阱
  4. Arduino--DS3231实时时钟模块
  5. Java的,与类的初始化顺序
  6. 计算机相关专业试题,计算机基础类 模拟试题 计算机相关专业 模拟题 10套 附答案.doc...
  7. Codeforces 1009E Intercity Travelling 【期望】【概率】
  8. 强大的Git客户端:Tower for Mac
  9. 信息技术专项习题汇总
  10. 用DrRacket写scheme语言的hello world
  11. 微信支付被盗刷?微信:我们全赔!支付宝:我们秒赔!
  12. bilibili 实时平台的架构与实践
  13. 怎么把图片弄成logo_怎么把logo变成矢量图
  14. 为Visual studio 2008 添加汇编工程模板(原创)
  15. 此iphone尚未备份显示未连接服务器,iPhone出现尚未备份的提示是怎么回事 提示取消方法...
  16. 三分钟轻松实现连接西门子PLC
  17. 导出CSV后,时间字段无法自动识别-0xEF,0xBB,0xBF
  18. ArcEngine IPageLayout 添加经纬网和公里网
  19. JavaWeb——BootStrap_7/14
  20. 4-6 Aruba Central 升级维护配置

热门文章

  1. 白木彰:具有普遍性的设计力
  2. android 保持socket连接,android – 如何保持websocket连接活着?
  3. linux虚拟光驱挂载教程,Linux操作系统下虚拟光驱(iso)的挂载
  4. RTK固定解什么意思
  5. arm搭建云手机教程_云手机解决方案对比:arm服务器与安卓板机
  6. 一分钟解决“仅限中国大陆地区播放” (转)
  7. 不同的量化交易软件速度差距大吗?
  8. 2019腾讯游戏客户端面试
  9. MobaXterm如何修改字体
  10. 如何使用CorelDRAW 2019快速制作幻影图像效果