算法设计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,一经查实,立即删除!

相关文章

Oracle 练习题 20131021 for 循环练习

--Oracle 练习题 20131021 for 循环练习--1、用for循环实现一个倒置的乘法表。beginfor i in reverse 1 .. 9 loopfor j in reverse 1 .. i loopdbms_output.put(i || x || j || || i * j || );end loop;dbms_output.put_line();end loop;end;--2、打印1-100之间所有的素数。…

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

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

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

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

Java ClassLoader getSystemResource()方法与示例

ClassLoader类getSystemResource()方法 (ClassLoader Class getSystemResource() method) getSystemResource() method is available in java.lang package. getSystemResource()方法在java.lang包中可用。 getSystemResource() method is used to find the system resource of…

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

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

按钮button加超链接

突然想做一个普通按钮&#xff0c;然后让按钮超链接到别的页面&#xff0c;不知道怎么搞&#xff0c;不过还是在百度找到了。1.如果让本页转向新的页面则用&#xff1a;<input typebutton οnclick"window.location.href(连接)"> 2.如果需要打开一个新的页面进…

Redis 快速搭建与使用

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

如何计算Python中列表项的出现次数?

The python count() method counts the number of occurrences of an element in the list and returns it. python count()方法对列表中某个元素的出现次数进行计数并返回它。 Syntax: 句法&#xff1a; list.count(x)The count() method takes a single argument, x, whose…

网页自动关闭的代码

<script language"javascript">window.openernull; window.open(, _self, );//模拟自己打开自己window.close();//再关闭就没有对话框了</script>--------------------------以下是过多少秒自动关闭网页,弹窗<html><head><title>JS定时…

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…

java 枚举迭代_Java中的枚举和迭代器之间的区别

java 枚举迭代Java中的枚举与迭代器 (Enumeration vs Iterator in Java) Here, we will see how Enumeration differs from Iterator? 在这里&#xff0c;我们将看到Enumeration与Iterator有何不同&#xff1f; 1)枚举 (1) Enumeration) Enumeration is an interface which i…

ORA-14551: 无法在查询中执行 DML 操作

最近在调试一个带DML操作的函数时&#xff0c;一直不成功&#xff0c;在PL/SQL中测试时没问题&#xff0c;通过SQL语句调用函数时就不行了&#xff0c;刚开始一直没找到原因&#xff0c;后来无意间把 函数中捕获异常的代码注释掉&#xff0c;终于通过SQL调试时&#xff0c;弹出…

第五章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;&…

阿里巴巴分布式服务框架 Dubbo

1.Dubbo是阿里巴巴内部的SOA服务化治理方案的核心框架&#xff0c;每天为2000 个服务提供3,000,000,000 次访问量支持&#xff0c;并被广泛应用于阿里巴巴集团的各成员站点。Dubbo自2011年开源后&#xff0c;已被许多非阿里系公司使用。 2.入门文档 http://alibaba.github.io/d…

列表使用与内部实现原理

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

c ++查找字符串_C ++类和对象| 查找输出程序| 套装1

c 查找字符串Program 1: 程序1&#xff1a; #include <iostream>using namespace std;class Sample {privateint A;privateint B;publicvoid init(){A 10;B 20;}publicvoid print(){cout << A << " " << B;}};int main(){Sample S;S.init…

Oracle 练习P297 131026 PL/SQL块程序

--1、编写一个PL/SQL块&#xff0c;输出所有员工的员工姓名&#xff0c;员工号、工资和部门号。beginfor v_emp in (select * from emp) loopdbms_output.put(员工姓名&#xff1a; || v_emp.ename);dbms_output.put(&#xff0c;员工号&#xff1a; || v_emp.empno);dbms_outp…

操作系统习题

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