最短路算法--王晟.ppt

  1. 1、本文档共55页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
最短路算法--王晟

* 1)描述这个问题。 2)启发学生:怎么变化Dijkstra算法来求解这个问题。 3)给出这个代码。 4)讨论:复杂度变了么? * 需要讲清楚这个问题与加性权重下的Dijkstra算法的关系。 记得提醒学生,做这个题一定要将权重设为float,要改代码。 * 1)问题描述 2)基本想法:先求一条最短路,然后删除所有该路径经过的边(保证链路分离);然后再求一条最短路。 3)问题是:这样做可能不完备(存在解却得不到);而且就算得到的了,也不一定是最短的。用图来说明。 4)Suurballe算法:先算最短路,然后路径上的边反向(不是删除),然后再求一条最短路;最后合并这两条路径,去掉重复的边。 5)两个难点:对边反向(原本就存在反向边怎么办?);以及路径的组合。 关于路径的组合:可以这样来解决。A)用边表示路径;B)遍历p1和p2,找到“共同”的边(其实2条反向的边);C)从p1和p2种去掉这些共同边,就得到了一些分段。D)这些分段分别编号,例如s(x,y)代表第x条路径(x只能取1或2)的第y个分段。E)按照顺序交替取两条路径上的分段来构造路径。例如s(x,1)+s(y,2)+s(x,3)+s(y,4)……,另一条路径为s(y,1)+s(x,2)+s(y,3)+s(x,4)。注意两条路径上的分段数目肯定是一样的。 * * 每次FindMin都从上一次找到最小的那个桶开始查找,碰到第一个非空的桶为止。 * 最好能做成这样:只有需要的时候才创建新的桶。 * * SF:正向的永久标记集合。SB:反向的永久标记集合。 最坏复杂度一样,但现实用例中双向Dijkstra算法往往更快。 * 难点1:Dijkstra算法代码的框架不变,但循环终止条件和循环体都要变化。 难点2:要增加一些数据结构。 难点3:循环终止后,要从所有找到的路径中拼凑出最短路。 * * * 为什么叫A*?原文中叫Algorithm A,由于它针对给定的heuristic能得到最佳解,所以称为A*。 --参见wikipedia 关于为什么等效: 更改权重后算得的距离标记(也就是排序的依据)为d’(b),对所有的节点来说,这样得到的距离标记与A*所要求的只差一个常数。所以是等效的。 在“尽量将宿点d的距离标记排在前面”这件事上,A*算法是最优的(在给定的启发式下界下)。实际中这个算法出奇地快。虽然其最坏复杂度有可能很差,甚至比Dijkstra还差(有人说是指数的)。参见wikipedia。 在其他应用中,还可以有其他的下界估计方法(比如B*和D*)。而且一般意义上的A*算法实际上允许在运行时以任意的启发式方法来得到下界。参见wikipedia。 * 路由器拿到一个IP包的目的地址,如何转发??转发表。地址与下一跳端口的映射。 如何决定转发表??看到目的地址的最短路。 怎样计算最短路??连路状态的扩散。 注意:每个路由器自己决定最短路,那么这种决定是否具有全网的一致性??只要连路状态不变化,就是的。因为加性原则。 什么时候会不一致??连路状态发生变化,但扩散还没有完成。 * 逐包转发;目的地址;转发表; 注意:决定出端口是看本路由器到目的地址的最短路是经过哪个端口;并非看源地址到目的地址的最短路怎么走。。。 * 先讲每个路由器如何生成其发布的信息; 然后是:洪泛; 最后,某个路由器拿到所有这些链路状态信息后,如何重构一个图。 * 问题1:换句话说,A把目的地址为F的包扔给了D,原因是A认为ADEF是最短路;但E做判决时认为ECF最短,结果走出的路径变成了ADECF? 答:不会。因为最短路上的路径也一定是最短路。 问题2:如果存在多条最短路,不就会产生不一致么? 答:这不是不一致,因为两条路径的权重是一样的。 问题3:如果两个路由器对拓扑的理解不同呢? 答:是的,这样会出现不一致。例如,D知道DE和DC权重为100,而A还以为该值为1。路径就会出错。因为如果A知道,它本可以走ABCF的。 但是,链路状态协议就是为了保证这种理解是一致的。 问题4:链路状态协议在任何情况下都能保证这种一致性么? 除非出现链路失效。 * * 1)负权重下,Dijkstra无法工作。 2)负权重有用么? 通信网中一般不会出现负权重,但是很多其他实际问题建模为最短路问题时,就会出现负权重。Robert Sedgewick在《Algorithms in Java》3rd Ed中(21.7节),就给出了一个例子。他将Hamilton路径问题转化为一个最短路问题,图中出现的权重就可能为负。 3)更糟的是,如果图中存在负圈,则最短路问题无法求解。 ?如果不强制要求解为简单路径(注意,Dijkstra算法求出的必然是简单路径),则不存在最短路,因为路径权重可以为负无穷。 ?如果要求解必须是简单路径,那么

文档评论(0)

mv2323 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档