问题描述

哈密尔顿路径属于旅行商问题,是一个NP完全问题,即没有一个合适的算法来解决它,只能用朴素算法(也就是通常所说的暴力算法)去进行优化。
但这类问题的时间复杂度是极其可怕的O(n!),当n比较小的时候,还可以通过暴力法解决,但当n=15的时候,15!=1307674368000;已经达到了万亿级别;你可以想象下就算以计算机的计算能力,也要跑多久才能解出答案;
所以NP问题最常用的解法是近似解,即无解,寻找大概率出现的近似解;

Hamilton路径的定义:在一张图中,从点0到点n-1不重不漏的恰好经过每一个点一次的路径。

问题分析

但哈密尔顿路径有一个特点:当你计算了其中i条路径的组合之后,计算i+1条的时候,是会重复计算前面已经计算过的值;
如何利用起来已经计算过的值,减少重复计算的步骤,这是一个优化算法的切入点;
因此状态机数据结构出来了;
我们知道有n条路径,那么每条路径都有两种状态:已经走过和没走过;那分别用0|1来表示;
那么当你处于某个路径的终点的时候,并走过了i条路径,你有多少种状态呢,还是一个阶乘i!,但是你可以发现有个规律,这些阶乘有共同重复的点;是不是可以用矩阵来表示呢,所以完整表示这些状态不仅需要2n次方的状态来表示路径是否走过,还需要一个二维深度去存储这些路径的组合状态,索性,我们只需要最短路径,但是怎么去表示呢?
试想下
前提条件:最短,所以我们处于某条路径上,前面走过的路径也肯定是那条路径为终点的最短路径;
目前我们已经走完了i条路径,但我们并不知道处于哪条路径的终点,那有多少情况呢,i种;
因为只有i条路径已经走过了啊;那么对于n条路径
,那么只需要n深度的矩阵就可以了;
所以我们需要一个二维的深度去表示每条路径;
那么状态机就是f[2
次方][n];
那怎么把这个矩阵给计算出来呢?

解法分析

假设我们现在还是处于第i条路径上,并且走过了前i条;所以用顺序表示f的行为00001(i)11…111;
那么有几条路能够走到i呢,肯定只有前面已经状态为1的几条;
而状态机里存储的就是那条路径当时的最短路径,遍历这几条路径就可以得出此时这个状态下的最短路径;
那么
i >> k & 1表示路径已走过,且不是i的路径;

                for(int k = 0; k < n; ++k) {if(i >> k & 1) {dp[i][j] = min(dp[i][j], dp[i ^ 1 << j][k] + weight[k][j]);}}

当处于起点的时候,所有的路径都还没走过,所以第一行只有一个值,就是最开始起点的路径;

代码

for(let i = 1; i < i<<n; i++) {for(let j = 0; j < n; j++) {// 每一轮只求jif(i & (1 << j)) {for(let k = 0; k < n; k++) {// j 不等于k, k已被开启、j未被开启的情况存在, k、j之间if((i >> k & 1)) {let value = dp[i - (1 << j)][k] + raod[k][j]// 谁小我就从谁过来if((dp[i][j] === -1) || (value < dp[i][j])) dp[i][j] = value}}}}}

哈密尔顿路径问题解析相关推荐

  1. 从哈密尔顿路径谈NP问题

    1859年,爱尔兰数学家哈密尔顿(Hamilton)提出下列周游世界的游戏:在正十二面体的二十个顶点上依次标记伦敦.巴黎.莫斯科等世界著名大城市,正十二面体的棱表示连接这些城市的路线.试问能否在图中做 ...

  2. 哈密尔顿回路和哈密尔顿路径

    哈密尔顿回路:从一个点出发,沿着边行走,经过每个顶点恰好一次,之后再回到出发点 旅行推销员问题(Travelling Salesman Problem ,TSP) 带权图,完全图 NP难问题,指数级问 ...

  3. 什么是哈密尔顿回路/路径?

    一:哈密尔顿回路与哈密尔顿路径 1859 年,爱尔兰数学家哈密尔顿(Hamilton)提出了一个"周游世界"的游戏: 在一个正十二面体的二十个顶点上,标注了伦敦,巴黎,莫斯科等世界 ...

  4. 欧拉回路和哈密尔顿回路

    "哈密尔顿回路问题"与"欧拉回路问题"看上去十分相似,然而却是完全不同的两个问题."哈密尔顿回路问题"是访问除原出发结点以外的每个结点一次且 ...

  5. 如果图G=V,E是哈密尔顿图,则它必然具备下述性质

    哥尼斯堡七桥问题是在寻找一条遍历图中所有边的简单路径,而哈密尔顿的周游世界问题则是在寻找一条遍历图中所有点的基本路径.在无向图G=<V,E>中,遍历G中每个顶点一次且仅一次的路径称为哈密尔 ...

  6. 哈密尔顿问题与哈密尔顿环

    哈密尔顿问题与哈密尔顿环 1859年,爱尔兰数学家哈密尔顿(Hamilton)提出下列周游世界的游戏:在正十二面体的二十个顶点上依次标记伦敦.巴黎.莫斯科等世界著名大城市,正十二面体的棱表示连接这些城 ...

  7. 蓝桥杯 哈密尔顿回路 Java

    问题描述 给出一个有向图,输出这个图的一个哈密尔顿回路. 输入格式 输入的第一行包含两个整数n, m,分别表示图的点数和边数. 接下来m行,每行包含两个整数,表示一条边的起点和终点. 输出格式 输出一 ...

  8. 回溯法-哈密尔顿回路

    一.哈密顿回路 哈密顿回路的定义: G=(V,E)是一个图,若G中一条路径通过且仅通过每一个顶点一次,称这条路径为哈密顿路径.若G中一个回路通过且仅通过每一个顶点一次,称这个环为哈密顿回路.若一个图存 ...

  9. 最优控制理论 二+、哈密尔顿函数法的补充

    前面我在第二章最优控制理论 二.哈密尔顿函数法给出了Hamilton函数法一些重要推导过程和一些常用公式.最近翻看,觉得写得太多了,于是把一部分不重要的贴到下面,另成一篇. 2. 其他等式约束的转化 ...

最新文章

  1. 进程间数据传递:Queue,Pipe 进程间数据共享:Manager
  2. CommonJs和AMD是什么(20170214)
  3. 在SpringBoot的Web项目中使用于Thymeleaf(二)
  4. 新时代网管的十二大主要职责(一)
  5. ubuntu中安装ffmpeg+mencoder转换flv -
  6. 线程和进程之间的联系----基本概念
  7. 多媒体基础:动画和视频知识笔记
  8. python中mysql更新字段中传参问题
  9. django-查询-F对象-Q对象
  10. python库声纹_针对亿级大规模声纹库检索,有哪些简洁、高效的算法?
  11. python解释器把python代码一次性翻译成目标代码_Python语言程序设计----【第1周 Python基本语法元素】之1.1 程序设计基本方法...
  12. 基于auto.js的网课自动签到软件以及facerig控制摄像头内容及auto.js新手教学
  13. 导航系统中里程计研究综述
  14. 利用函数wavread对语音信号进行采样_信号时间采样
  15. surface go 安装纯AndroidX86系统
  16. 去除硬盘安全删除硬件图标
  17. 金庸《倚天屠龙记》中的一个瑕疵
  18. 浅析影响银行小微信贷业务精细化发展的六大要素
  19. 增量学习方法分类及近两年论文汇总
  20. HTML5开发系列(4) 之 样式表的三种类型

热门文章

  1. opengl之triangel
  2. 史上最全!统计学常用的数据分析方法大总结
  3. 告别 NPE,全网最全 Optional 实战理解
  4. matlab构造核函数,matlab常用核函数
  5. java ssl连接(no cipher suites in common)
  6. RuntimeError: Already borrowed
  7. 关于Go语言..\main.go:4:2: cannot refer to unexported name fmt.println .\main.go:4:2: undefined: fmt.prin
  8. CListCtrl控件使用技巧
  9. mysql1067 aborting_mysql启动报错误1067怎么办
  10. Android 周历