最短路径问题,一个经典算法问题。本文粗略总结了一种常见的最短路径算法,以及几个最短路径变种问题的解法,其中包括哈密顿路。对于有向图或者无向图,假设有V个节点,E条边,G[Vi,Vj]表示图中点Vi到Vj边的权值。dist[i]表示:点s到点i的最短路径。

一、单源最短路径

给定图G,求点对s->t之间的最短路径,该问题使用经典的dijkstra算法即可解决,时间复杂度O(V^2)。基本思想:两个集合S,T,S表示已经访问的点集合,T表示未访问的点集合,S初始为空,T包括所有点;每次从T集合中选取从s到该点距离最小的点cur,然后将点cur加入到S中(保证从s到S集合中的点之间的路径长度最小),并且基于cur点为跳板,做松弛操作,更新s到T集合中其他点的距离,松弛操作即,如果dist[j] > dist[cur] + G[cur,j],更新dist[j] = dist[cur]+G[cur,j],其中j属于T集合;当cur==t时算法结束。

二、有负权边的图的单源最短路径

对于(一)中的dijkstra算法,是否可以用于求解带负权边的单源最短路径问题呢?用三元组(x,y,w)表示一条边权为w的从点x到点y的有向边。先举例看看,假设图中包含3个节点,包含3条边:(1,2,-3)、(2,3,1)、(3,1,1),从图可以看出为一个环1->2->3->1,且环的边权总权值为-3+1+1=-1,那么通过一直循环,那么图中任意两点之间的最短路径都为-oo大,因此不能通过dijkstra来求解最短路径,因为出现负环之后破坏了“从s到集合S中点之间路径长度最小”这点,通过负环的循环,s到S中点之间的路径长度还可以变小。

对付有负权边的单源最短路径问题,可以采用bellman-ford算法、SPFA算法。

Bellman-ford算法思想:dist[s] = 0,其他点i ,dist[i]=oo。进行V-1次循环,每一次循环:对图每一条边E(i,j)两边的点做松弛操作,如果dist[j] > dist[i] + G[i,j],更新dist[j] = dist[i]+G[i,j]。完成V-1次循环后,进行判断:如果存在一条边E(i,j),如果dist[i]+G[i,j] < dist[j],那么图中存在负权环。如果不存在负权环,则dist[t]为从s到t的最短路径。算法复杂度O(VE)。

SPFA算法思想:维护一个队列Q,队列初始只有s点,一个标记数组flag,flag[i]=1表示节点i在队列中,否则表示不在队列中,一个cnt数组,cnt[i]标记点i进入队列的次数。求队首元素cur,对于边E(cur,j),进行松弛操作:如果dist[j] > dist[cur] + G[cur,j],更新dist[j] = dist[cur]+G[cur,j],如果j不在队列中,则将j加入队尾,同时判断j进入队列次数是否大于V-1,如果大于V-1,说明存在负权环,算法结束,否则一直进行,直到队列为空为止。算法复杂度O(2E)。

三、大规模的图,顶点多的稀疏图

Dijkstra算法复杂度为O(V^2),如果图的规模太大,那么无疑难以胜任。其实,对与规模大的图,可以使用min-heap优化,复杂度O((V+E)logV)。思想:维护一个最小堆,用于优化Dijkstrak中从T选取从s到T中路径最短的点,该点即堆顶元素。这个方法即A*搜索。

四、全源最短路径问题

全源最短路径即求出图中任意点对之间的最短路径。方法(1):枚举任意点对,采用dijkstra算法求解即可,复杂度O(V^4)。方法(2):以每一个点为松弛操作的中间点,枚举其他两点,进行松弛操作,即可得到全源最短路径,这便是鼎鼎大名的floyd算法,其状态转移方程如下: G[i,j]=min{G[i,k]+G[k,j],G[i,j]},时间复杂度O(V^3)。

五、最短哈密顿路径

从s出发到达t,且经过图中每个点至少一次的最短路径长度。这个问题是一个NPC问题,没有高效的解法。假设有N个点,那么N位bit来标记那些点已经访问过,哪些没有访问过。设f[I][J]表示,从s出发达到J,且经过了I中对应位标记为1的所有点的最短路径。有方程如下:

f[I1][J1] = min{F[I][J] + G[J][j],  枚举I,J,j,其中(I&(1<

初始只f[(1<

六、第K短路径问题

求s到t的第k短路径,如果k=1,直接采用dijkstra算法即可求解。如果k=2的话,首先采用dijkstra算法求解最短路径,然后枚举删除最短路径上边,再次进行dijkstra算法,求解最短路径即为第k短路径。

理论一:A*算法求解到的路径是最短的。

根据理论一就可以用A*路径求得最短路径,比dijkstra盲目式算法效率高。

假设用A*算法求得最短路径时,即第一次搜索到目标节点后不停止。继续启发式搜索下去,那么根据理论一可以得到第二次搜索到目标节点的路径是第二短路径。依次类推得到第k短路径。

那么A*算法的h’(x)怎么设计呢?

已知h’(x)与h(x)越接近,时间效率越好,h(x)为x到目标节点的实际最短路长。既然这样那么直接取最好值,先用dijkstra算法算出各点到目标节点的最短路径作为估价值h’(x),使效率到达极大。

posted on 2011-12-27 18:24 哲学与程序 阅读(2590) 评论(0)  编辑 收藏 引用

最短哈密顿路matlab,最短路径系列【最短路径、哈密顿路等】相关推荐

  1. MATLAB实战系列(二十九)-头脑风暴优化(BSO)算法求解旅行商问题(TSP)-交叉算子

    前言 代码明细可参见 MATLAB实战系列(八)-头脑风暴优化(BSO)算法求解旅行商问题(TSP)(附MATLAB代码) 交叉算子的实现机制 我们还是以求解TSP问题为例,8个城市的坐标如下所示. ...

  2. MATLAB实战系列(十九)-遗传算法解决TSP(旅行商)问题-应用及解析(文末附MATLAB源码)

    接上篇MATLAB实战系列(十八)-遗传算法解决TSP(旅行商)问题-算法原理 https://wenyusuran.blog.csdn.net/article/details/114060030 感 ...

  3. [js高手之路] html5 canvas系列教程 - 线条样式(lineWidth,lineCap,lineJoin,setLineDash)

    上文,写完弧度与贝塞尔曲线[js高手之路] html5 canvas系列教程 - arcTo(弧度与二次,三次贝塞尔曲线以及在线工具),本文主要是关于线条的样式设置 lineWidth: 设置线条的宽 ...

  4. [js高手之路] html5 canvas系列教程 - 掌握画直线图形的常用API

    我们接着上文[js高手之路] html5 canvas系列教程 - 认识canvas以及基本使用方法继续. 一.直线的绘制 cxt.moveTo( x1, y1 ): 将画笔移动到x1, y1这个点 ...

  5. 【转载】【收藏】汽车电子expert成长之路公众号系列文章列表

    汽车电子expert成长之路公众号系列文章列表 2017-07-19 胡恩伟 汽车电子expert成长之路 本文列出本人担任Freescale/NXP汽车电子FAE期间工作中想跟大家分享的一些汽车电子 ...

  6. matlab从无到有系列(四):符号数学基础

    matlab从无到有系列文章汇总: matlab从无到有系列(一):认识matlab matlab从无到有系列(二):矩阵运算基础 matlab从无到有系列(三):数值计算基础 全文共17248个字, ...

  7. .NET Core微服务之路:文章系列和内容索引汇总 (v0.52)

    原文:.NET Core微服务之路:文章系列和内容索引汇总 (v0.52) 微服务架构,对于从事JAVA架构的童鞋来说,早已不是什么新鲜的事儿,他们有鼎鼎大名的Spring Cloud这样的全家桶框架 ...

  8. matlab 积分进阶教程,最适合小白的matlab教程系列_进阶系列二之微积分

    微积分篇 更多文章参考 符号变量 极限问题 求导数 求导数----偏导数 积分--符号解 积分数值解 多重积分 级数求和 泰勒级数展开 常微分方程 更多文章参考 最适合小白的matlab教程系列_基础 ...

  9. HTML弧度文本,[js高手之路] html5 canvas系列教程 - 文本样式(strokeText,fillText,measureText,textAlign,textBaseline)...

    canvas提供两种输出文本的方式: strokeText:描边文本 fillText:填充文本 fillStyle配合fillText使用,strokeStyle配合strokeText使用 str ...

  10. 最适合小白的matlab教程系列_进阶系列二之微积分

    微积分篇 更多文章参考 符号变量 极限问题 求导数 求导数----偏导数 积分--符号解 积分数值解 多重积分 级数求和 泰勒级数展开 常微分方程 更多文章参考 最适合小白的matlab教程系列_基础 ...

最新文章

  1. iOS ALAsset的选取和存储
  2. [译]Javascript数列的push和pop方法
  3. jquery.validation.js 使用
  4. Spring Boot Spring MVC 异常处理的N种方法 1
  5. ubuntu环境下搭建Ethereum测试私链及JSON-RPC合约交互
  6. super go_Go 简单性的价值:来自对 Go 倍加青睐的谷歌软件工程师的自述
  7. 《软件测试技术》课程第二周随笔
  8. ASP.NET中定制自己的委托和事件参数类
  9. python中文视频教程-python中文视频教程(全38集)
  10. 最大子数组累加和(2种方法)
  11. 容量耦合系数模型_使用Fluent电芯仿真模型进行结构设计优缺点分析
  12. 蓝牙精确定位技术下的化工厂安全管理系统,蓝牙定位标签-新导智能
  13. 作词家下岗系列:教你用 AI 做一个写歌词的软件!
  14. 2021年JRebel最新激活方式
  15. 睿智的目标检测26——Pytorch搭建yolo3目标检测平台
  16. 计算机磁盘管理打不开,教你怎样轻松解决磁盘打不开的问题
  17. 观《当幸福来敲门》有感
  18. 由浅入深:自己动手开发模板引擎——解释型模板引擎(一)
  19. SKETCH 切出背景透明的图标
  20. 7-1 婚宴座次排定

热门文章

  1. 怎么修改html的空格大小,css设置空格宽度间距样式
  2. iOS设备指纹的前世今生
  3. Android Studio使用AIDL技术进行SDK开发
  4. Google推出移动搜索 80亿网页、8亿图片尽在掌中
  5. java实现轮播图片_Banner框架实现图片轮播
  6. 复旦大学python教程_复旦大学大数据学院本科生课程学习手册.PDF
  7. Greenplum在HTAP场景下的优化和应用
  8. 情报研判分析系统开发,可视化大数据研判平台建设
  9. LaTex关于数学公式的使用(7)--- 函数单边大括号
  10. ODT(old driver tree)详解(带例题)