旅行售货员问题即给几个地点,相互之间有路径,有每个路径对应的消耗的费用。我们将起点设为1,其他地点设为2,3,4…n。我们起初将所有路径费用都设置成∞,然后再输入 相通路径的费用,再更新费用值。我们以下图为例。如下图:

注意BackTrack主要是一个求排列组合函数(排列组合函数思路见“递归分治——排列组合”博客),加上了路径和费用回溯。代码如下(适用于旅行售货员问题无向图)主要代码端在BackTraack处:

//回溯法
//旅行售货员问题
class TraveLing
{private:int n;          // 顶点个数vector<vector<int>> a;       // 图的邻接矩阵int* x;         // 记录当前路径int* bestx;  // 最优解路径int   cc;       // 当前费用int   bestc;  // 最优解费用void BackTrack(int i)//排列组合{if (i == n)//递归出口{if (a[x[n - 1]][x[n]] != INT_MAX && a[x[n][x[1]] != INT_MAX && (cc + a[x[n - 1]][x[n]] + a[x[n]][x[1]] < bestc))//当前路径比之前路径费用少{for (int j = 1; j < n+1; ++j){bestx[j] = x[j];//更新目前最优路径 ,注意bestx和x都是从下标1开始用的,下标0我们实际不用}bestc = cc + a[x[n - 1]][x[n]] + a[x[n]][x[1]];}}else{for (int j = i; j <= n; ++j){if (a[x[i - 1]][x[i]] != INT_MAX && cc + a[x[i - 1]][x[i]] < bestc ||bestc == INT_MAX){swap(x[i], x[j]);cc += a[x[i - 1]][x[i]];BackTrack(i + 1);cc -= a[x[i - 1]][x[i]];//递归回退就回溯swap(x[i], x[j]);}}}}
public:TraveLing(int sum) :n(sum), cc(0), bestc(INT_MAX){x = new int[n + 1];//多申请一个空间,我们从下标1开始用,下标0实际不用bestx = new int[n + 1];//多申请一个空间,我们从下标1开始用,下标0实际不用for (int i = 1; i < n+1 ; i++){x[i] = i;//当前路径初始化为1,2,3...n,注意x的0下标我们实际不用bestx[i] = 1;//当前最优解路径初始化为11111...}a.resize(n + 1);//初始化邻接矩阵,并且每个路径都初始化为最大值,为了逻辑清晰一点,下标0没有实际用for (int i = 0; i < n + 1; i++){a[i].resize(n + 1);}for (int i = 0; i < n + 1; i++){for (int j = 0; j < n + 1; j++){a[i][j] = INT_MAX;}}//输入每两个地点和这两个地点消耗的费用cout << "please input 'way1' to 'way1' and 'cost',if way1 < 1 or way2 < 1 or cost < 0 end:\n";int u = 1;int v = 1;int w = 0;while (u >= 1 && v >= 1 && w >= 0){cin >> u >> v >> w;a[u][v] = w;a[v][u] = w;}BackTrack(2);//传入2 是因为我们从起点1出发,只需要对地点2开始到n这些地点进行排列组合}~TraveLing(){delete[] x;delete[] bestx;}void PrintBestx()//打印最优解路径{for (int i = 1; i < n+1; i++){cout << bestx[i] << " ";}cout << "1";//路径结束后肯定回到起点1cout << endl;}int GetBestc()//获取最优解路径下的费用{return bestc;}
};int main()
{TraveLing tra(4);tra.PrintBestx();cout << tra.GetBestc() << endl;return 0;
}

运行截图:

回溯法——旅行售货员问题相关推荐

  1. 【算法导论07】回溯法-旅行售货员问题

    07回溯法-旅行售货员问题 问题描述: 已知有m个城市,城市之间由n条不同长度的道路相连.一个售货员从一座城市出发,途径所有城市,并最终回到原点,设计算法计算售货员所走的最短路径结点. 问题分析: 从 ...

  2. 回溯法----旅行售货员问题

    一.问题 同文章 <分支限界法----旅行售货员问题> 二.代码实现 程序实现了 递归回溯 解决该问题 迭代回溯算法仍在考虑中... /************************** ...

  3. 算法设计与分析——回溯法——旅行售货员问题

    #include<iostream> #include<bits/stdc++.h> using namespace std; const int noEdge=65535; ...

  4. 旅行售货员问题及其近似算法(NPC问题)

    旅行售货员问题 一.基本介绍 二.问题解法 2.1 枚举法(穷举法) 2.2 回溯法 2.3 分支限界法 2.4 旅行售货员问题近似算法 三.总结 一.基本介绍 设有n个城镇,已知每两个城镇之间的距离 ...

  5. [回溯算法] 五大常用算法之回溯法

    算法入门6:回溯法 一. 回溯法 – 深度优先搜素 1. 简单概述 回溯法思路的简单描述是:把问题的解空间转化成了图或者树的结构表示,然后使用深度优先搜索策略进行遍历,遍历的过程中记录和寻找所有可行解 ...

  6. 五大常用算法之回溯法详解及经典例题

    一. 回溯法 – 深度优先搜素 1. 简单概述 回溯法思路的简单描述是:把问题的解空间转化成了图或者树的结构表示,然后使用深度优先搜索策略进行遍历,遍历的过程中记录和寻找所有可行解或者最优解. 基本思 ...

  7. 旅行售货员问题-回溯法

    问题描述  某售货员要到若干城市去推销商品,已知各城市之间的路程,他要选定一条从驻地出发,经过每个城市一遍,最后回到住地的路线,使总的路程最短.       结果为: 1 3 2 4 1 算法描述   ...

  8. 回溯法、分支限界法两种思想帮你轻松搞定旅行售货员问题(TSP)

    问题描述 某售货员要到若干城市去推销商品,已知各城市之间的路线(或旅费).要选定一条从驻地出发,经过每个城市一遍,最后回到驻地的路线,使总的路程(或总旅费)最小.本文只考虑4个城市的情况,下面这个带权 ...

  9. java 着色问题 回溯算法,C语言使用回溯法解旅行售货员问题与图的m着色问题

    旅行售货员问题 1.问题描述: 旅行售货员问题又称TSP问题,问题如下:某售货员要到若干个城市推销商品,已知各城市之间的路程(或旅费),他要选定一条从驻地出发,经过每个城市一遍最后回到驻地的路线,使总 ...

最新文章

  1. CSS透明度设置支持IE,Chrome,Firefox浏览器
  2. 关联规则算法php,科学网—加权关联规则权值的计算 - 叶文菁的博文
  3. 在panel中显示一个新的form
  4. git branch 为什么会进入编辑状态_最好的Git分支管理教程
  5. 第五十八期:AI艺术日渐繁荣,未来何去何从?
  6. SICP~计算机程序的构造和解释~ 1.12 c++实现
  7. 部署腾讯云(CentOS6.6版本,jdk1.7+tomcat8+mysql)
  8. dede后台登陆提示 验证码不正确 解决办法
  9. 论文中的i.e.等简写
  10. PHP 梯形图,PLC梯形图程序设计
  11. Destroy销毁物体失败,Can't remove RectTransform because Image (Script) depends on it
  12. bilibili老版本_bilibili网页版下载
  13. 这-96到底是个什么东西?
  14. 2022 计网复习计算题【太原理工大学】
  15. 基于药效团的药物设计(Pharmacophore Construction)
  16. 传输指令——MOV、FMOV、BMOV、SMOV、SWAP
  17. linux看磁带内容命令,Linux下磁带管理命令
  18. keep跑步数据修改器_一只手环就能指导运动?Keep 想做你手腕上的魔鬼教练
  19. 基于Vue实现的网页音乐播放器
  20. Tomcat的配置与优化

热门文章

  1. 使用三目运算嵌套方法 或 临时变量方法: 获取三个整数中最大值的数
  2. [python爬虫] 爬取图片无法打开或已损坏的简单探讨
  3. 【数据结构与算法】之深入解析“验证二叉搜索树”的求解思路与算法示例
  4. iOS开发两个距离较近的按钮同时触发事件的解决方法
  5. linux wlan进程名称,linux无线网络配置无线网卡驱动安装与wlan802.11配置
  6. c++五子棋_Java五子棋实现
  7. gitlens突然不显示了_损失百万!预防LED显示屏火灾隐患,从三方面入手
  8. kotlin sealed 中_Kotlin sealed class
  9. seq2seq模型_Pytorch学习记录-Seq2Seq模型对比
  10. 8个适合新手入门的python项目2020_8个适合新手入门的Python项目(2020.6)