290 likes | 446 Views
货郎担问题. 货郎担问题. 小组成员: 卢广桃 谢伟娜 郑理. 货郎担问题. 货郎担问题一般提法为:一个货郎从某城镇出发,经过若干个城镇一次,且仅经过一次,最后仍回到原出发的城镇,问应如何选择行走路线可使总行程最短,这是运筹学的一个著名的问题。 实际中有很多问题可以归结为这类问题。. 哈密尔顿回路 :(环球旅行问题) 即从一个结点出发,经过所有结点回到出发点(结点不能重复经过)。. 设 v1 , v2 , …….. , vn 是已知的 n 个城镇,城镇 vi 到城镇 vj 的距离为 dij ,现求从 v1 出发,经各城镇一次且仅一次返回 v1 的最短路程。.
E N D
货郎担问题 小组成员: 卢广桃 谢伟娜 郑理
货郎担问题 货郎担问题一般提法为:一个货郎从某城镇出发,经过若干个城镇一次,且仅经过一次,最后仍回到原出发的城镇,问应如何选择行走路线可使总行程最短,这是运筹学的一个著名的问题。 实际中有很多问题可以归结为这类问题。
哈密尔顿回路:(环球旅行问题)即从一个结点出发,经过所有结点回到出发点(结点不能重复经过)。哈密尔顿回路:(环球旅行问题)即从一个结点出发,经过所有结点回到出发点(结点不能重复经过)。
设v1,v2,……..,vn是已知的n个城镇,城镇vi到城镇vj的距离为dij,现求从v1出发,经各城镇一次且仅一次返回v1的最短路程。设v1,v2,……..,vn是已知的n个城镇,城镇vi到城镇vj的距离为dij,现求从v1出发,经各城镇一次且仅一次返回v1的最短路程。 问题描述: 解决方案:1.穷举法?2.最短路标号法?3.指派问题?4.整数规划?5.动态规划?
设S表示从v1到vi中间所可能经过的城市集合,S实际上是包含除v1和vi两个点之外的其余点的集合,但S中的点的个数要随阶段数改变。阶段: S中的点的个数 建立动态规划模型:
建立动态规划模型: 状态变量(i,S)表示:从v1点出发,经过S集合中所有点一次最后到达vi。最优指标函数fk(i,S)为从v1出发,经过S集合中所有点一次最后到达vi。决策变量Pk(i,S)表示:从v1经k个中间城镇的S集合到vi城镇的最短路线上邻接vi的前一个城镇,则动态规划的顺序递推关系为:
fk(i,S)= min{ fk-1(j,S、{ j }+dji}j属于Sf0(i,空集)=d1i(k=1,2,…,n-1, i=2,3,…n)
例12 已知4个城市间距离如下表,求从v1出 发,经其余城市一次且仅一次最后返回v1的最短路径和距离。
解:K=0由边界条件(7.21b)知: f0(2,空集)=d12=6 f0(3,空集)=d13=7 f0(4,空集)=d14=9
当k=1时:从城市V1出发,经过1个城镇到达Vi的最短距离为:f1(2,{ 3 }) = f0 (3, 空)+d 32 =7+8=15f1(2,{ 4 }) = f0 (4, 空)+d 42 =9+8=14f1(3,{ 2 }) = f0 (2, 空)+d 23 =6+9=15f1(3,{ 4 }) = f0 (4, 空)+d 43 =9+5=14f1(4,{ 2 }) = f0 (2, 空)+d 24 =6+7=13f1(4,{ 3 }) = f0 (3, 空)+d 34 =7+8=15
例12 已知4个城市间距离如下表,求从v1出发,经其余城市一次且仅一次最后返回v1的最短路径和距离。
当k=2时,从城市V1出发,中间经过2个城镇到达Vi的最短距离.f2(2,{ 3,4 }) = min[ f1(3,{4})+d 32, f1(4,{3})+ d42 ] =min[14+8,15+5]=20P2(2,{3,4})=4
f2(3,{ 2,4 })= min[14+9,13+5]=18P2(3,{2,4})=4 f2(4,{ 2,3 })= min[15+7,15+8]=22 P2(4,{2,3})=2
当k=3时:从城市V1出发,中间经过3个城镇最终回到Vi的最短距离.f3(1,{ 2,3, 4 })= min[f2(2,{ 3,4 }) + d 21, f2(3,{ 2,4 })+ d 31,f2(4,{ 2,3 }) + d 41 ] =min[20+8,18+5,22+6]=23P3(1,{2,3,4})=3
逆推回去,货郎的最短路线是12431,最短距离为23.逆推回去,货郎的最短路线是12431,最短距离为23. 货郎担问题当城市数目增加时,用动态规划方法求解,无论是计算量还是存储量都会大大增加,所以本方法只适用于n较小的情况.
这是因为:1,各城市之间可能是复线2,两地之间可能会使用不同的交通工具从而费用不同。这是因为:1,各城市之间可能是复线2,两地之间可能会使用不同的交通工具从而费用不同。 在很多货郎担问题中,经常会看到dij不等于dji的情况。
实际中很多问题都可以归结为货郎担这类问题.如:1,物资运输路线中,汽车应该走怎样的路线使路程最短;2,工厂里在钢板上要挖一些小圆孔,自动焊接机的割咀应走怎样的路线使路程最短;3,城市里有一些地方铺设管道时,管子应走怎样的路线才能使管子耗费最少,等等实际中很多问题都可以归结为货郎担这类问题.如:1,物资运输路线中,汽车应该走怎样的路线使路程最短;2,工厂里在钢板上要挖一些小圆孔,自动焊接机的割咀应走怎样的路线使路程最短;3,城市里有一些地方铺设管道时,管子应走怎样的路线才能使管子耗费最少,等等
比如说,前面曾经遇到的排序问题,以前我们是用0-1整数规划来解决这类问题的。 在这里,我们同样可以使用动态规划的方法。而且相对简单了很多。
排序问题一,问题的提出:设有n个工件要在机床A,B上加工,每个工件都必须经过先A后B的两道加工工序,以ai,bi分别表示工件i(1<=i<=n) 在A,B上的加工时间.问应如何在两机床上安排工件加工的顺序,使在机床A上加工第一个工件开始到在机床B上将最后一个工件加工完为止,所用的加工时间 最少?
二,模型及其解法 min(ai,bj)<=min(aj,bi) 这个条件就是工件i应该排在工件j之前,即对于从头到尾的最优排序而言,它的所有前后相邻的两个工件所组成的对都必须满足以上不等式.根据这个条件,得到最优排序的规则如下: (1)先工作的加工的加工时间的工时矩阵 M= a1 a2 …..an b1 b2 …..bn
(2) 在工时矩阵M中找到最小的元素(若最小的不止一个,可任选其一);若它在上行,则将相应的工件排在最前面的位置;若它在下行,则将相应的工件排在最后面的位置. (3) 将排定位置的工作所对于能够的列从M中划掉,然后对余下的工作重复按(2)进行,但那时的最前位置(或最后位置)是在已排定位置的工件之后(或之前).如此继续下去,直至把所有工件都排完为止.
以一个例题来加以说明 设有5个工件需要在机床A,B上加工,加工的顺序是先A后B,每个工件所需加工时间(单位:小时) 如下表. 问如何安排加工顺序可使机床连续加工完所有的加工总时间最少?
:解:工件的加工工时矩阵为 • 根据最优排序规则,最优加工顺序为: • 13542
这是Johnson在1954年提出的解法.概括起来,这种解法的基本思路是:尽量减少在机床B上等待加工的时间.(A上加工的时间不受限制)因此,把在机床B上加工时间长的工件先加工,在B上加工时间短的工件后加工.这是Johnson在1954年提出的解法.概括起来,这种解法的基本思路是:尽量减少在机床B上等待加工的时间.(A上加工的时间不受限制)因此,把在机床B上加工时间长的工件先加工,在B上加工时间短的工件后加工.
我们上学期学的数据结构里面也有很多内容和货郎担问题的思想是相似!我们上学期学的数据结构里面也有很多内容和货郎担问题的思想是相似!
Dijkstra提出了一个按路径长度递增的顺序逐步产生最短路径的方法,称为Dijkstra算法。Dijkstra提出了一个按路径长度递增的顺序逐步产生最短路径的方法,称为Dijkstra算法。