算法设计TSP问题动态规划

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include <iostream>
#include <cmath>
using namespace std;
//集合虚拟化用000 、001 、010 、011 、100 、101 、110 、111分别表示{} 、{1}(V[2^(1-1)]) 、{2}(V[2^(2-1)]) 、{1,2}(V[2^(1-1)+2^(2-1)]) 、{3}(V[2^(3-1)]) 、{1,3}(V[2^(1-1)+2^(3-1)]) 、{2,3}(V[2^(2-1)+2^(3-1)]) 、{1,2,3}(V[2^(1-1)+2^(2-1)+2^(3-1)])注意{1,2} 、{3}顺序
//这是本题的难点,将十进制数转化为二进制
//①直观的看出来包含的元素②可以直接用编码表示这个集合
int distanceTable[100][100];//需要填的表格
int distanceMatrix[10][10];//城市距离的代价矩阵
int N;//城市数量
int path[100][100];//若path[i][j] = k,则说明从i到集合V[j]的最短距离是从i到集合V[j]中的k
int cinDistance(){//输入代价矩阵cout<<"请输入城市个数"<<endl;cin>>N;cout<<"请输入城市距离的代价矩阵"<<endl;for (int i = 0; i < N; ++i) {for (int j = 0; j < N; ++j) {cin>>distanceMatrix[i][j];}}for (int k = 0; k < N; ++k) {//规范distanceMatrix[k][k] = 0;}cout<<"您的代价矩阵已被规范化"<<endl;for (int i = 0; i < N; ++i) {for (int j = 0; j < (int)pow(2,N); ++j) {distanceTable[i][j] = -1;}}return 0;
}int exist(int i,int j){//判断集合V[j]中是否有元素i,有则返回1if((int)pow(2,i - 1)&j)return 1;else return 0;
}int TSP(){for (int i = 1; i < N; ++i) {//初始化第0列,i为行数distanceTable[i][0] = distanceMatrix[i][0];}
//第一步,先不填最后一个空,先填前面的for (int j = 1; j < (int)pow(2,N - 1); ++j) {//从第一列开始填表,j为列数for (int i = 1; i < N; ++i) {//从第一行开始int min = 10000;if(!exist(i,j)){//如果集合V[j]中没有元素i,则求i到V[j]再到0的最短路径for (int k = 1; k < N; ++k) {if(exist(k,j)){//如果k存在集合V[j]中,则求i到k + (k再到0的最短距离)//int d = distanceMatrix[i][k] + distanceTable[k][j - (int)pow(2,k - 1)];//这一行很难理解,为什么V[j]中除掉看,就是//集合V[j - (int)pow(2,k - 1)]呢,因为 例如V[5]={1,3}他的编码是101,如果去掉3,即是101 - 2的3次方 = 101 - 100 = 001,可知集合只剩下1了,所以就是集合001了V[1]/if(d < min){path[i][j] = k;//即从i到V[j]再到0的最短距离是先从i到kmin = d;}}}distanceTable[i][j] = min;}}}
//填最后一个空也就是求最短路径长度,并求最短路径int min = 1000;for (int k = 1; k < N; ++k) {int d = distanceMatrix[0][k] + distanceTable[k][((int)pow(2,N - 1) - 1) - (int)pow(2,k - 1)];if(d < min){min = d;path[0][(int)pow(2,N - 1) - 1] = k;}}distanceTable[0][((int)pow(2,N - 1) - 1)] = min;return 0;
}int coutResult(){for (int i = 0; i < N; ++i) {//输出表格for (int j = 0; j < (int)pow(2,N - 1); ++j) {cout<<distanceTable[i][j]<<'\t';}cout<<endl;}//输出路径cout<<"0->";int i = 0;for (int j = (int)pow(2,N - 1) - 1; j > 0;) {i = path[i][j];cout<<i<<"->";j = j - (int)pow(2,i - 1);}cout<<"0"<<endl;return 0;
}int main()
{cinDistance();TSP();coutResult();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/545530.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

字符串使用与内部实现原理

Redis 发展到现在已经有 9 种数据类型了&#xff0c;其中最基础、最常用的数据类型有 5 种&#xff0c;它们分别是&#xff1a;字符串类型、列表类型、哈希表类型、集合类型、有序集合类型&#xff0c;而在这 5 种数据类型中最常用的是字符串类型&#xff0c;所以本文我们先从字…

Lisp-Stat翻译 —— 第九章 统计绘图窗体

2019独角兽企业重金招聘Python工程师标准>>> 第九章 统计绘图窗体 除了前几章略述的绘图窗体原型提供的基本绘图工具之外&#xff0c;Lisp-Stat里的统计绘图还需要用来管理数据和将那些数据转换成屏幕上的图形的工具集。这些工具由绘图原型graph-proto提供。更多的…

操作系统(王道笔记第三章内存)

第三章内存3.1_1内存的基础知识&#xff08;1&#xff09;什么是内存&#xff1a;略&#xff08;2&#xff09;进程运行的基本原理①从写程序到程序运行②链接③装入3.1_2内存管理的概念&#xff08;1&#xff09;内存管理管哪几个方面&#xff08;2&#xff09;内存保护①上下…

Redis 快速搭建与使用

Redis 是由 C 语言开发的开源内存数据存储器&#xff0c;经常被用作数据库、缓存以及消息队列等。 Redis 因为其强大的功能和简洁的设计&#xff0c;深受广大开发者和公司的喜爱&#xff0c;几乎占领了内存数据库市场的所有份额。 1 Redis 特性 Redis 有很多优秀的特性&#…

hibernate annotation注解方式来处理映射关系

2019独角兽企业重金招聘Python工程师标准>>> 在hibernate中&#xff0c;通常配置对象关系映射关系有两种&#xff0c;一种是基于xml的方式&#xff0c;另一种是基于annotation的注解方式&#xff0c;熟话说&#xff0c;萝卜青菜&#xff0c;可有所爱&#xff0c;每个…

操作系统Ubuntu(实验一二)

摘录&#xff1a;https://www.cnblogs.com/penglang14/p/10632360.html 实验一二1.1_小技巧1.2_ls查看目录命令1.3_cd切换目录命令1.4_查看文件内容命令(1)cat filename(2)more filename(3)head [-n] filename([]表示此内容可有可无)&#xff08;4&#xff09;wc命令确定行数、…

Redis 是如何执行的?

在以往的面试中&#xff0c;当问到一些面试者&#xff1a;Redis 是如何执行的&#xff1f;收到的答案往往是&#xff1a;客户端发命令给服务器端&#xff0c;服务端收到执行之后再返回给客户端。然而对于执行细节却「避而不谈」 &#xff0c;当继续追问服务器端是如何执行的&am…

第五章I/O管理

I/O章节5.1.1I/O分类&#xff08;1&#xff09;按使用特性分&#xff08;2&#xff09;I/O设备按传输速率分类&#xff08;3&#xff09;I/O设备按信息交换的单位分5.1.2I/O控制器5.1.3I/O控制方式&#xff08;1&#xff09;程序直接控制方式&#xff08;轮询&#xff09;&…

列表使用与内部实现原理

列表类型 (List) 是一个使用链表结构存储的有序结构,它的元素插入会按照先后顺序存储到链表结构中,因此它的元素操作 (插入\删除) 时间复杂度为 O(1),所以相对来说速度还是比较快的,但它的查询时间复杂度为 O(n),因此查询可能会比较慢。 1 基础使用 列表类型的使用相对来…

操作系统习题

操作系统习题习题一一、选择习题二一、选择二、综合题习题三一、选择题&#xff1f;二、简答题进程互斥遵循的四个原则&#xff1a;空闲让进、忙则等待、有限等待、让权等待重点习题四一、选择&#xff1f;&#xff1f;二、综合题死锁产生的 4 个必要条件是&#xff1a; &#…

WCF trace、log

1. 打开wcf配置&#xff1a; &#xff12;. enable trace &#xff0c; log 可以改变log路径&#xff1a; &#xff13;. 用 SvcTraceViewer.exe &#xff08;直接在c盘下搜索&#xff09; 查看 &#xff14;. 如果想自定义trace&#xff1a; catch(Exception ex) { Trace.Writ…

字典使用与内部实现原理

字典类型 (Hash) 又被成为散列类型或者是哈希表类型,它是将一个键值 (key) 和一个特殊的“哈希表”关联起来,这个“哈希表”表包含两列数据:字段和值。例如我们使用字典类型来存储一篇文章的详情信息,存储结构如下图所示: 同理我们也可以使用字典类型来存储用户信息,并且…

算法设计与分析复习第一二章(时间复杂度和蛮力法)

算法复习一二章第一章时间复杂度第二章蛮力法&#xff08;1&#xff09;查找问题顺序查找&#xff08;2&#xff09;排序问题选择排序起泡排序&#xff08;3&#xff09;组合问题0-1bag问题概述&#xff08;略&#xff09;&#xff08;4&#xff09;图问题哈密顿回路TSP问题&am…

有序集合使用与内部实现原理

有序集合类型 (Sorted Set) 相比于集合类型多了一个排序属性 score(分值),对于有序集合 ZSet 来说,每个存储元素相当于有两个值组成的,一个是有序结合的元素值,一个是排序值。有序集合的存储元素值也是不能重复的,但分值是可以重复的。 当我们把学生的成绩存储在有序集…

Android 友盟SDK 终极解决报错:SocialSDK_QQZone_2.jar contains native libraries that

转自&#xff1a;http://bbs.umeng.com/thread-6552-1-2.html 报错信息&#xff1a;The library SocialSDK_QQZone_2.jar contains native libraries that will not run on the device.解决方案&#xff1a;此问题和Eclipse环境有关&#xff0c;按照如下步骤操作即可Eclipse-&g…

Redis 持久化——AOF

使用 RDB 持久化有一个风险,它可能会造成最新数据丢失的风险。因为 RDB 的持久化有一定的时间间隔,在这个时间段内如果 Redis 服务意外终止的话,就会造成最新的数据全部丢失。 可能会操作 Redis 服务意外终止的条件: 安装 Redis 的机器停止运行,蓝屏或者系统崩溃;安装 R…

第四章文件管理

第四章文件管理4.1_2初识文件4.1_2文件的逻辑结构无结构文件有结构文件&#xff08;1&#xff09;顺序文件&#xff08;2&#xff09;索引文件索引顺序文件多级索引顺序文件4.1_3文件目录文件控制块FCB&#xff08;2&#xff09;单级目录&#xff08;3&#xff09;两级目录结构…

免费的管理页面模板

2019独角兽企业重金招聘Python工程师标准>>> Free Bootstrap Admin Templates for Designers 1. Admin Lite AdminLTE - 是一个完全响应式管理模板。基于Bootstrap3的框架。高度可定制的&#xff0c;易于使用。支持很多的屏幕分辨率适合从小型移动设备到大型台式机。…

Redis 持久化——RDB

Redis 的读写都是在内存中,所以它的性能较高,但在内存中的数据会随着服务器的重启而丢失,为了保证数据不丢失,我们需要将内存中的数据存储到磁盘,以便 Redis 重启时能够从磁盘中恢复原有的数据,而整个过程就叫做 Redis 持久化。 Redis 持久化也是 Redis 和 Memcached 的主…

MATLAB使用教程

MATLAB使用教程2.1.1 MATLAB系统环境&#xff08;1&#xff09;命令行窗口&#xff08;2&#xff09;工作区窗口2.2.1MATLAB数值数据&#xff08;1&#xff09;强制转换如转换为int整形&#xff08;2&#xff09;判断变量类型&#xff08;3&#xff09;复型&#xff08;4&#…