最短路径 数学建模

上传人:油条 文档编号:19120589 上传时间:2017-11-18 格式:DOC 页数:3 大小:34.50KB
返回 下载 相关 举报
最短路径 数学建模_第1页
第1页 / 共3页
最短路径 数学建模_第2页
第2页 / 共3页
最短路径 数学建模_第3页
第3页 / 共3页
亲,该文档总共3页,全部预览完了,如果喜欢就下载吧!
资源描述

《最短路径 数学建模》由会员分享,可在线阅读,更多相关《最短路径 数学建模(3页珍藏版)》请在金锄头文库上搜索。

1、最短路径问题是一个非常能联系实际的问题,下面我们以具体例题来看看这类问题的解法例 1、假设 A、B、C、D、E 各个城市之间旅费如下图所示。某人想从城市 A 出发游览各 城市一遍,而所用费用最少。试编程序输出结果。 解这类题时同学们往往不得要领,不少同学采用穷举法把所有可能的情况全部列出,再找出其中最短的那条路径;或是采用递归或深度搜索,找出所有路径,再找出最短的那条。这两种方法可见都是费时非常多的解法,如果城市数目多的话则很可能要超时了。 _4 M5 G: M# , 7 实际上我们知道,递归、深度搜索等算法一般用于求所有解问题(例如求 A 出发每个城市走一遍一共有哪几种走法) ,而这几种算法

2、对于求最短路径这类最优解问题显然是不合适的,以下介绍的几种算法就要优越很多。 首先,对于这类图我们都应该先建立一个邻接矩阵来存放任意两点间的距离数据,以便在程序中方便调用,如下: / m# K! x& s* jconst dis:array1.5,1.5 of integer =( ( 0, 7, 3,10,15), 1 _1 w( , j$ , a e, x& U) L( 7, 0, 5,13,12), ( 3, 5, 0, 5,10), w, t7 R. M7 Y i(10,13, 5, 0,11), / d. P, Y a- d% O j(15,12,10,11, 0); ; 1 & k

3、0 H6 Y以下是几种解法: + 1 I0 D5 a( r: L# m5 A4 L( n一、 宽度优先搜索 S2 y0 v6 E 宽度优先搜索并不是一种很优秀的算法,只里只是简单介绍一下它的算法。 具体方法是: ; J o- J$ _: o8 I1、 从 A 点开始依次展开得到 AB、AC、AD、AE 四个新结点(第二层结点) ,当然每个新结点要记录下其距离; 2、 再次以 AB 展开得到 ABC、ABD、ABE 三个新结点(第三层结点) ,而由 AC 结点可展开得到 ACB、ACD 、ACE 三个新结点,自然 AD 可以展开得到ADB、ADC 、ADE,AE 可以展开得到 AEB、AEC、A

4、ED 等新结点,对于每个结点也须记录下其距离; 3、 再把第三层结点全部展开,得到所有的第四层结点:ABCD、ABCE、ABDC、ABDE、BEC、ABEDAEDB、AEDC,每个结点也需记录下其距离; y& p) $ Z) k2 ?4、 再把第四层结点全部展开,得到所有的第五层结点:ABCDE、ABCED、AE ! n+ n8 # F; 5 Q1 G! T/ dDBC、AEDCB ,每个结点也需记录下其距离; 5、 到此,所有可能的结点均已展开,而第五层结点中最小的那个就是题目的解了。 由上可见,这种算法也是把所有的可能路径都列出来再找最短的那条,显而易见这也是一种很费时的算法。 ( h/

5、e$ 3 D8 7 V9 B- b: G二、 A算法 . D0 e# _9 G CA算法是在宽度优先搜索算法的基础上,每次并不是把所有可展的结点展开,而是对所有没有展开的结点,利用一个自己确定的估价函数对所有没展开的结点进行估价,从而找出最应该被展开的结点(也就是说我们要找的答案最有可能是从该结点展开) ,而把该结点展开,直到找到目标结点为止。 z2 8 e5 A4 4 g这种算法最关键的问题就是如何确定估价函数,估价函数越准则越快找到答案。A算法实现起来并不难,只不过难在找准估价函数,大家可以自已找资料看看。 * z: s P m% ?三、等代价搜索法 6 G* V * D f! M; L(

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

7、的一个展开,即展开 AC(3)结点,得到 ACB(8) 、ACD(16) 、ACE(13)三个结点,并把结点 AC 标记为已展开;! l- k3 Z/ F, Q1 A6 U. C! g3、 再从未展开的所有结点中找出距离最小的一个展开,即展开 AB(7)结点,得到ABC(12) 、ABD(20) 、ABE(19)三个结点,并把结点 AB 标记为已展开; 4、 再次从未展开的所有结点中找出距离最小的一个展开,即展开 ACB(8)结点; 5、 每次展开所有未展开的结点中距离最小的那个结点,直到展开的新结点中出现目标情况(结点含有 5 个字母)时,即得到了结果。 : Q( u) 7 z7 O由上可见

8、,A算法和等代价搜索法并没有象宽度优先搜索一样展开所有结点,只是根据某一原则(或某一估价函数值)每次展开距离 A 点最近的那个结点(或是估价函数计算出的最可能的那个结点) ,反复下去即可最终得到答案。虽然中途有时也展开了一些并不是答案的结点,但这种展开并不是大规模的,不是全部展开,因而耗时要比宽度优先搜索小得多。 7 v8 i+ C. T) l. Y* g; n% . s例 2、题目基本同例 1、但只要求求 A 到 E 点的最短路径(并不要求每个城市都要走一遍) 。 : A& : i+ V3 Q+ w6 w+ X% I j5 L: w* b# p题目一改,问题的关键变了,所要求的结果并不是要求

9、每个点都要走一遍,而是不管走哪几个点,只要距离最短即可。再用宽度优先搜索已经没有什么意义了,那么等代价搜索能不能再用在这题上呢? 答案是肯定的,但到底搜索到什么时候才能得到答案呢?这可是个很荆手的问题。 6 |& V: ? 1 n + p% i! T7 D是不是搜索到一个结点是以 E 结束时就停止呢?显然不对。 那么是不是要把所有以 E 为结束的结点全部搜索出来呢?这简直就是宽度优先搜索了,显然不对。 实际上,应该是搜索到:当我们确定将要展开的某个结点(即所有未展开的结点中距离最小的那个点)的最后一个字母是 E 时,这个结点就是我们所要求的答案! : R+ B - % |8 q0 n: U那么

10、,除了等代价搜索外,有没有其它办法了呢?下面就介绍求最短路径问题的第四种算法: 四、Warshall 算法 % o A( B! , i: A/ c4 m; q0 _ _0 C该算法的中心思想是:任意两点 i,j 间的最短距离(记为 Dij)会等于从 i 点出发到达 j点的以任一点为中转点的所有可能的方案中,距离最短的一个。即: 1 H8 a- - M5 K+ Dij=min(Dij,Dik+Dkj,),1=k=5。 这样,我所就找到了一个类似动态规划的表达式,只不过这里我们不把它当作动态规划去处理,而是做一个二维数组用以存放任意两点间的最短距离,利用上述公式不断地对数组中的数据进行处理,直到各

11、数据不再变化为止,这时即可得到 A 到 E 的最短路径。 7 k& t% I- O3 S% l9 z- B# 算法如下: 4 o0 b; * U. a% N- M, q2 1、 把上述邻接矩阵直接赋值给最短距离矩阵 D; 2、 i=1; 3、 j=1; 4、 repeat 5、 c=false; 用以判断第 6 步是否有某个 Dij 值被修改过 : P5 b3 I. Q ( S6、 Dij=min(Dij,Dik+Dkj,), k=1 to 5 如果 Dij 被修改则 c=true 7、 I=I+1 8、 J=j+1 ! j+ o) h1 T5 m M/ i2 k9 G5 R9、 Until

12、not c 10、 打印 D15 # L6 O* A* t/ f这种算法是产生这样一个过程:不断地求一个数字最短距离矩阵中的数据的值,而当所有数据都已经不能再变化时,就已经达到了目标的平衡状态,这时最短距离矩阵中的值就是对应的两点间的最短距离。 9 o + / K5 ( * j e五、动态规划 动态规划算法已经成为了许多难题的首选算法,只不过在很多的题目中动态规划的算法表达式比较难找准,而恰恰最短距离问题如果用动态规划算法考虑则可以非常容易地找准那个算法表达式。 * x( _* h! M9 F$ e c我们知道,动态规划算法与递归算法的不同之处在于它们的算法表达式: 6 o T2 i9 c/

13、I5 O8 U: h4 R递归:类似 f(n)=x1*f(n-1)+x2*f(n-2),即可以找到一个确定的关系的表达式; 动态规划:类似 f(n)=min(f(n-1)+x1,f(n-2)+x2),即我们无法找到确定关系的表达式,只能找到这样一个不确定关系的表达式,f(n)的值是动态的,随着 f(n-1),f(n-2)等值的改变而确定跟谁相关。 7 Z9 E / s1 - b就本题来说,我们记 f(5)为 A 到 E 点的最短距离,则 f(4)为 A 到 D 点的最短距离,f(1)为A 到 A 点的最短距离(为 0) 。 于是,f(5)的值应该是所有与 E 点相邻的点的最短距离值再加上该点到 E 点的直接距离(dis 矩阵中的值)所得到的值中最小的一个。 我们可以得到这样一个关系式: 3 y! _( ?1 X. Y5 Df(5)=min(f(1)+dis(1,5), f(2)+dis(2,5), f(3)+dis(3,5), f(4)+dis(4,5) 以此关系式作一个递归函数即可求得 A 到 E 点的最短距离。不过,为了节省时间,我们可以把 f(1)-f(4)已经算得的结果保存起来给后面的递归直接调用,这样就能节约大量的递归空间和时间,这对于数据量大时尤为重要。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 电子/通信 > 综合/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号