TSP问题是指旅行家要旅行n个城市,要求各个城市经历且仅经历一次然后回到出发城市,并要求所走的路程最短。各个城市间的距离可以用代价矩阵来表示。

假设从顶点i出发,令d(i, V')表示从顶点i出发经过V'中各个顶点一次且仅一次,最后回到出发点i的最短路径长度,开始时,V'=V-{i},于是,TSP问题的动态规划函数为:

d(i,V')=min{cik+d(k,V-{k})}(k∈V')

d(k,{})=cki(k≠i)

伪代码:

for (i=1; i<n; i++)     //初始化第0列d[i][0]=c[i][0]; for (j=1; j<2n-1-1; j++)  for (i=1; i<n; i++)   //依次进行第i次迭代if (子集V[j]中不包含i) 对V[j]中的每个元素k,计算[i][j]=min(c[i][k]+d[k][j-1]);
对V[2n-1-1]中的每一个元素k,计算d[0][2n-1-1]=min(c[0][k]+d[k][2n-1-2]);
输出最短路径长度d[0][2n-1-1];

笔者在写此程序时卡在了如何判断:子集V[j]中不包含i。解决方法是对n个顶点分别用0~n-1的数字编号,按个数为1,2,……,n-1的顺序生成1~n-1个元素的子集存放在数组V[2^n-1]中。这样,在判断时就可以将当前点与数组编号按位与运算(如下图所示),为0则为需要进行计算(这时才能品味按位与运算的美)。

完整代码:

#include<iostream.h>
#include<math.h>
int main()
{int i,j,k,min,brief,n;int D[20][20];cout<<"顶点个数:";cin>>n;int b=(int)pow(2,n-1);for(i=0;i<n;i++)for(j=0;j<n;j++)cin>>D[i][j];int ** Route = (int **)calloc(n, sizeof(int *));int ** Mat = (int **)calloc(n, sizeof(int *));for(i=0;i<n;i++){Route[i] = (int *)calloc(b*b, sizeof(int))+i*b;Mat[i] = (int *)calloc(b*b, sizeof(int))+i*b;}for(i=0;i<b;i++)for(j=0;j<n;j++){Route[j][i] = -1;Mat[j][i] = -1;}for(i=0;i<n;i++)//初始化第0列 Route[i][0] = D[i][0];    for(i=1;i<b-1;i++)for(j=1;j<n;j++)//依次进行第i次迭代 if( ((int)pow(2,j-1) & i) == 0)//子集V[j不包含i {min=999;for(k=1;k<n;k++)if( (int)pow(2,k-1) & i ){brief = D[j][k] + Route[k][i-(int)pow(2,k-1)]; if(brief < min){min = brief;Route[j][i] = min;Mat[j][i] = k;//局部最优决策}}    }min=999;for(k=1;k<n;k++){brief = D[0][k] + Route[k][b-1 - (int)pow(2,k-1)];if(brief < min){min = brief;Route[0][b-1] = min;//最优解Mat[0][b-1] = k;}}cout<<"最短路径长度:"<<Route[0][b-1]<<endl;//最短路径长度cout<<"最短路径:"<<"1";for(i=b-1,j=0; i>0; ){j = Mat[j][i];i = i - (int)pow(2,j-1);cout<<"->"<<j+1;}cout<<"->1"<<endl;for(i=0;i<n;i++){for(j=0;j<b;j++)cout<<Route[i][j]<<" ";cout<<endl;}free(Route);free(Mat);return 0;
}

TSP问题,动态规划法相关推荐

  1. 开源项目推荐:我个人中意的Python/C++/.Net数学库(★精品收藏★)

    Numpy和SciPy 大名鼎鼎的 NumPy python版本 https://github.com/numpy/numpy https://github.com/dpilger26/NumCpp  ...

  2. 算法设计与分析-TSP六种方法-贪心算法(最近邻点、最短链接)、蛮力法、动态规划法、回溯法、分支限界法、模拟退火

    旅行商问题,即TSP问题(Travelling Salesman Problem)又译为旅行推销员问题.货郎担问题,是数学领域中著名问题之一.假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径, ...

  3. 用动态规划法求解TSP问题

    一.求解TSP问题 1.问题描述 TSP问题(担货郎问题,旅行商问题)是指旅行家要旅行n个城市,要求各个城市经历且仅经历一次然后回到出发城市,并要求所走的路程最短 各个城市间的距离可以用代价矩阵来表示 ...

  4. 【动态规划法】求解TSP问题

    问题详情 求解下图所示的TSP问题,计算出所经过的城市编号以及最短路径值,城市代价矩阵如图所示: 求解思路 假设从顶点i出发,令d(i, V' )表示从顶点i出发经过V' 中各个顶点一次且仅一次,最后 ...

  5. 算法设计与分析实验二:动态规划法实现TSP问题和0/1背包问题

    [实验目的] 1.熟练掌握动态规划思想及教材中相关经典算法. 2.使用动态规划法编程,求解0/1背包问题和TSP问题. TSP问题 一.实验内容: TSP问题是指旅行家要旅行n个城市,要求每个城市经历 ...

  6. c语言旅行规划问题,利用动态规划法求解旅行商问题(TSP)的C语言实现(一)...

    算法改进:通过改进集合操作降低比较次数,利用二进制表示集合.确定元素k是否在集合S中的比较次数为1,从而降低了时间复杂度到O(n2^n) #include #include #include #inc ...

  7. 动态规划法求解TSP问题 C++

    此文章借鉴于博文https://blog.csdn.net/shujian_tianya/article/details/80873892,在此基础上重新进行了分析总结. 一.问题 二.想法 三.讲解 ...

  8. TSP问题-多种算法求解

    目录 前言 问题及思路 1.问题概述 2.设计思路 源码及测试 1.输入 2.代码 前言 算法大作业,综合应用8种算法解决TSP问题,分别是: 蛮力法(顺序查找) 分治法(快速排序) 贪心法(求上界) ...

  9. 旅行商问题(TSP)简介

    什么是旅行商问题 旅行商问题(TravelingSalesmanProblem,TSP)是一个经典的组合优化问题.经典的TSP可以描述为:一个商品推销员要去若干个城市推销商品,该推销员从一个城市出发, ...

最新文章

  1. python模块之imghdr检测图片类型
  2. Java序列化bean保存到本地文件中
  3. 【并发编程】并发编程的三大特性
  4. Geomagic Freeform Plus 2019中文版
  5. (补充)爬取大西洋月刊并调用彩云小译翻译 API 脚本
  6. 5.修改hadoop配置文件
  7. Qt 判断一个点是否落在三角形内(算法)
  8. linux 在不同终端之下的切换方式
  9. 在非主线程中创建窗口
  10. findfirst_当心findFirst()和findAny()
  11. 一位老师,一位领导,一个让全体学生考上目标学校的故事
  12. @计算机专业大学生,毕业后如何明确自己的职业方向,该走那条路?
  13. autoresizingMask的用法
  14. 重写Java中equals和hashcode方法的一般规则
  15. php使用自定义ip,PHP跨平台获取服务器IP地址自定义函数分享
  16. 解决PowerDesigner 错误:Invalid repository user or password!
  17. 2020的另一面:5G的斯普特尼克之年
  18. 去除新安装火狐浏览器黑色背景
  19. Oracle数据库锁表查询与解锁处理详解
  20. SSL/TLS(3): CA证书解释

热门文章

  1. 【电赛备考】基于STM32控制的可调PWM输出+LCD显示
  2. 【精辟】为人处事的学问
  3. 如何向GitHub上传删除项目
  4. 阿里巴巴集团2016校园招聘内部推荐
  5. ROS中topic重映射理解及验证(remap标签)
  6. esp8266/32~资源帖[持续更新]
  7. python中的语句是什么意思_python语句意思
  8. 用扫把理解面向对象编程
  9. RYU+Mininet的SDN架构-设计校园网络(一)
  10. Maya 2022 安装numpy