云题海 - 专业文章范例文档资料分享平台

当前位置:首页 > 最短路径问题的几个算法

最短路径问题的几个算法

  • 62 次阅读
  • 3 次下载
  • 2025/6/23 2:57:34

最短路径问题) r+ g v% [5 p) W) J

最短路径问题是一个非常能联系实际的问题,某人想从城市A出发游览各 城

市一遍,而所用费用最少。试编程序输出结果。

解这类题时同学们往往不得要领,不少同学采用穷举法把所有可能的情况全部列出,再找出其中最短的那条路径;或是采用递归或深度搜索,找出所有路径,再找出最短的那条。这两种方法可见都是费时非常多的解法,如果城市数目多的话则很可能要超时了。

实际上我们知道,递归、深度搜索等算法一般用于求所有解问题(例如求A出发每个城市走一遍一共有哪几种走法),而这几种算法对于求最短路径这类最优解问题显然是不合适的,以下介绍的几种算法就要优越很多。 : V7 @) v\ 首先,对于这类图我们都应该先建立一个邻接矩阵来存放任意两点间的距离数据,以便在程序中方便调用,如下:

const dis:array[1..5,1..5] of integer =( ( 0, 7, 3,10,15), 0 u; Y0 O i2 L/ i\ ( 7, 0, 5,13,12),

( 3, 5, 0, 5,10), 8 I- f\ (10,13, 5, 0,11), (15,12,10,11, 0)); 以下是几种解法: 3 G3 c# u' e- I7 y

一、 宽度优先搜索 % O9 O4 G3 W, L9 l3 Q9 O

宽度优先搜索并不是一种很优秀的算法,只里只是简单介绍一下它的算法。 具体方法是: 2 c d6 Y) \\/ t9 h3 c/ i

1、 从A点开始依次展开得到AB、AC、AD、AE四个新结点(第二层结

点),当然每个新结点要记录下其距离;

2、 再次以AB展开得到ABC、ABD、ABE三个新结点(第三层结点),而由AC结点可展开得到ACB、ACD、ACE三个新结点,自然AD可以展开得到ADB、ADC、ADE,AE可以展开得到AEB、AEC、AED等新结点,对于每个结点也须记录下其距离; 5 n. d+ ^\

3、 再把第三层结点全部展开,得到所有的第四层结点:ABCD、ABCE、ABDC、ABDE、BEC、ABED……AEDB、AEDC,每个结点也需记录下其距离; 4、 再把第四层结点全部展开,得到所有的第五层结点:ABCDE、ABCED、……、AE 1 \\5 {2 `0 r: I V* h DBC、AEDCB,每个结点也需记录下其距离;

5、 到此,所有可能的结点均已展开,而第五层结点中最小的那个就是题目的解了。

由上可见,这种算法也是把所有的可能路径都列出来再找最短的那条,显而易见这也是一种很费时的算法。 ) p. ?+ X5 c: B* `5 u4 j7 O 二、 A*算法

A*算法是在宽度优先搜索算法的基础上,每次并不是把所有可展的结点展开,而是对所有没有展开的结点,利用一个自己确定的估价函数对所有没展开的结点进行估价,从而找出最应该被展开的结点(也就是说我们要找的答案最有可能是从该结点展开),而把该结点展开,直到找到目标结点为止。 2 _0 Z. d; G* A( E+ [& W9 V* [

这种算法最关键的问题就是如何确定估价函数,估价函数越准则越快找到答案。A*算法实现起来并不难,只不过难在找准估价函数,大家可以自已找资料

看看。

三、等代价搜索法 0 J3 J$ W( z% c/ m5 ?: l k) ?' K

等代价搜索法也是基于宽度优先搜索上进行了部分优化的一种算法,它与A*算法的相似之处都是每次只展开某一个结点(不是展开所有结点),不同之处在于:它不需要去另找专门的估价函数,而是以该结点到A点的距离作为估价值,也就是说,等代价搜索法是A*算法的一种简化版本。它的大体思路是: 1、 从A点开始依次展开得到AB(7)、AC(3)、AD(10)、AE(15)四个新结点,把第一层结点A标记为已展开,并且每个新结点要记录下其距离(括号中的数字); 0 z G0 p3 V( K\

2、 把未展开过的AB、AC、AD、AE四个结点中距离最小的一个展开,即展开AC(3)结点,得到ACB(8)、ACD(16)、ACE(13)三个结点,并把结点AC标记为已展开;

3、 再从未展开的所有结点中找出距离最小的一个展开,即展开AB(7)结点,得到ABC(12)、ABD(20)、ABE(19)三个结点,并把结点AB标记为已展开;

4、 再次从未展开的所有结点中找出距离最小的一个展开,即展开ACB(8)结点……;

5、 每次展开所有未展开的结点中距离最小的那个结点,直到展开的新结点中出现目标情况(结点含有5个字母)时,即得到了结果。

由上可见,A*算法和等代价搜索法并没有象宽度优先搜索一样展开所有结点,只是根据某一原则(或某一估价函数值)每次展开距离A点最近的那个结点(或是估价函数计算出的最可能的那个结点),反复下去即可最终得到答案。

虽然中途有时也展开了一些并不是答案的结点,但这种展开并不是大规模的,不是全部展开,因而耗时要比宽度优先搜索小得多。 \ 例2、题目基本同例1、但只要求求A到E点的最短路径(并不要求每个城市都要走一遍)。 3 ^8 u6 \\7 ^0 _# _

题目一改,问题的关键变了,所要求的结果并不是要求每个点都要走一遍,而是不管走哪几个点,只要距离最短即可。再用宽度优先搜索已经没有什么意义了,那么等代价搜索能不能再用在这题上呢?

答案是肯定的,但到底搜索到什么时候才能得到答案呢?这可是个很荆手的问题。 ! i3 {+ n, w, m. _0 I+ d3 y, [8 b/ z

是不是搜索到一个结点是以E结束时就停止呢?显然不对。

那么是不是要把所有以E为结束的结点全部搜索出来呢?这简直就是宽度优先搜索了,显然不对。 ( q2 w3 L0 ~# d4 }2 @6 s2 M

实际上,应该是搜索到:当我们确定将要展开的某个结点(即所有未展开的结点中距离最小的那个点)的最后一个字母是E时,这个结点就是我们所要求的答案! 9 [; x: j% |) V8 ~

那么,除了等代价搜索外,有没有其它办法了呢?下面就介绍求最短路径问题的第四种算法: ( Y0 H- h# {5 G 四、Warshall算法

该算法的中心思想是:任意两点i,j间的最短距离(记为Dij)会等于从i点出发到达j点的以任一点为中转点的所有可能的方案中,距离最短的一个。即: Dij=min(Dij,Dik+Dkj,……),1<=k<=5。

这样,我所就找到了一个类似动态规划的表达式,只不过这里我们不把它当

搜索更多关于: 最短路径问题的几个算法 的文档
  • 收藏
  • 违规举报
  • 版权认领
下载文档10.00 元 加入VIP免费下载
推荐下载
本文作者:...

共分享92篇相关文档

文档简介:

最短路径问题) r+ g v% [5 p) W) J 最短路径问题是一个非常能联系实际的问题,某人想从城市A出发游览各 城市一遍,而所用费用最少。试编程序输出结果。 解这类题时同学们往往不得要领,不少同学采用穷举法把所有可能的情况全部列出,再找出其中最短的那条路径;或是采用递归或深度搜索,找出所有路径,再找出最短的那条。这两种方法可见都是费时非常多的解法,如果城市数目多的话则很可能要超时了。 实际上我们知道,递归、深度搜索等算法一般用于求所有解问题(例如求A出发每个城市走一遍一共有哪几种走法),而这几种算法对于求最短路径这类最优解问题显然是不合适的,以下介绍的几种算法就要优越很多。 : V7 @) v\ 首先,对于这类图我们都应该先建立一个邻接矩阵来存放任意两点间的距

× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:10 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:fanwen365 QQ:370150219
Copyright © 云题海 All Rights Reserved. 苏ICP备16052595号-3 网站地图 客服QQ:370150219 邮箱:370150219@qq.com