城市交通【信息技术】.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
城市交通 某城市有n(1≤n≤50)个街区,某些街区由公共汽车线路相连,如在下图中,街区1,2有一条公共汽车线路相连,且由街区1至街区2的时间为34分钟。由于街区与街区之间的距离较近,与等车时间相比可忽略不记,所以这个时间为两趟公共汽车的间隔时间,即平均的等车时间。 由街区1至街区5的最快走法为1-3-5,总时间为44分钟。 现在市政府为了提高城市交通质量,决定加开m(1≤m≤10)条公共汽车线路。若在某两个街区a,ba、b之间必须已有线路),则从a到b的旅行时间缩小为原来的一半(距离未变,只是等车的时间缩短了一半)。例如,若在1,2之间加开一条线路,则时间变为17分钟,加开两条线路,时间变为8.5分钟,以此类推。所有的线路都是环路{即无向},即如果由1至2的时间变为17分钟,则由2至1的时间也变为17分钟。 求加开某些线路,能使由城市1至城市n的时间最少。例如,在上图中,如果m=2,则改变1-3,3-5 第一行为城市数n与加开线路数m。 第二行至第n+1行,每行为n个实数,第i+1行第j列表示由城市i到城市j的时间。 如果时间为0,则城市i不可能到城市j。 注意:输入数据中,从城市1到城市n至少有一条路线。 输出: 第一行为由城市1到城市n的最小时间X(保留小数点后两位)。 第二行至第m+1行为更改的线路。每行由两个整数(x,yx与城市y之间增加一条线路。 分析:《城市交通》问题的图论模型很简单。如果只考虑从城市1到城市n的最少时间,那么,这个问题就是一道经典的最短路径问题。因此,这个问题乍看上去,就给人一种熟悉的感觉。而实质呢?问题的“变数”在于市政府的改革措施很奇特(每加一条公共汽车路线,两个街区之间的旅行时间就缩短为原来的一半),这就弄得人不知所措。{是否是关键路径的问题??}显然,这个改革不能分步执行,即它不具有“贪心法”的要求,而如果采用搜索的方法,时间效率会很低。那么该如何解决呢? 还是采用Floyd-Warshall的算法思想。在计算增加m条边的最优解(使最短路下降最快)的过程中,我们同样可以发现: 1、将道路a-b上增加的m条边可以分为如下两个问题(如果k是最短路上的一点) ⑴求a-k增加t条边; ⑵求k-b增加m-t条边。 t可以取从0至m的任意值。问题a-b增加m条边的最优解取决与这两个子问题的最优解。 2、在求m条边的过程中,始终只与增加t条边与增加m-t条边的子问题发生联系。 以上两个特点即为“无后效性”与“最优子问题”。所以,“城市交通”问题可采用动态程序设计方法。设 val[a,b,m]m条线路后城市a到城市b的最短路长。其中val[a,b,]的值为原交通图中边城市a至城市b的最短路,可以直接使用floyd算法计算; val[a,b,m]=min{val[a,k,t]+val[k,b,m-t]}(t为从0到m中的一个数,k为a到b中间的一点) 在两条道路增加的边数确定的条件下,采用Floyd算法计算最优解。所以这个问题实质上是一个双重动态程序设计问题。具体算法如下: 直接使用floyd算法计算val[a,b,](1≤a≤n,1b≤n); for g←1 to m do {按照新增加的边数g划分阶段} begin 对任一对城市(i,j(i,jval[i,j,g]= (i,j   for k←1 to n do {枚举中间城市} for i←1 to n do {枚举经由城市k的所有城市对(i—k—j)} for j←1 to n do begin val[i,j,g]= val[i,j,g]=min{val[i,j,g]val[i,k,0]+val[k,j,g]val[k,j,g]0val[k,j,0]+val[i,k,g]val[i,k,g]0 }End;for} end;for} 说明:这个问题的val数组的初始值与上一个Floyd算法不一样,初始值均为maxint。 这个算法的时间复杂度为W(n3*m2),约为W(n5),还是一个多项式级的算法。值得注意的是, 程序还要求可打印出增加的边,由于问题规模大,存储也需要一些技巧,这些小问题的解决请参看程序样例 Const big=1000000; {极大值}

文档评论(0)

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

1亿VIP精品文档

相关文档