29
货货货货货

货郎担问题

  • Upload
    inez

  • View
    48

  • Download
    0

Embed Size (px)

DESCRIPTION

货郎担问题. 货郎担问题. 小组成员: 卢广桃 谢伟娜 郑理. 货郎担问题. 货郎担问题一般提法为:一个货郎从某城镇出发,经过若干个城镇一次,且仅经过一次,最后仍回到原出发的城镇,问应如何选择行走路线可使总行程最短,这是运筹学的一个著名的问题。 实际中有很多问题可以归结为这类问题。. 哈密尔顿回路 :(环球旅行问题) 即从一个结点出发,经过所有结点回到出发点(结点不能重复经过)。. 设 v1 , v2 , …….. , vn 是已知的 n 个城镇,城镇 vi 到城镇 vj 的距离为 dij ,现求从 v1 出发,经各城镇一次且仅一次返回 v1 的最短路程。. - PowerPoint PPT Presentation

Citation preview

Page 1: 货郎担问题

货郎担问题

Page 2: 货郎担问题

货郎担问题

小组成员:

卢广桃谢伟娜郑理

Page 3: 货郎担问题

货郎担问题

货郎担问题一般提法为:一个货郎从某城镇出发,经过若干个城镇一次,且仅经过一次,最后仍回到原出发的城镇,问应如何选择行走路线可使总行程最短,这是运筹学的一个著名的问题。

实际中有很多问题可以归结为这类问题。

Page 4: 货郎担问题

哈密尔顿回路:(环球旅行问

题)即从一个结点出发,经过所有结点回到出发点(结点不能重复经过)。

Page 5: 货郎担问题

设 v1 , v2 ,…… .. , vn 是已知的 n 个城镇,城镇 vi 到城镇 vj 的距离为 dij ,现求从v1 出发,经各城镇一次且仅一次返回 v1 的最短路程。

问题描述:

解决方案:1. 穷举法?2. 最短路标号法?3. 指派问题?4. 整数规划?5. 动态规划?

Page 6: 货郎担问题

设 S 表示从 v1 到 vi 中间所可能经过的城市集合, S 实际上是包含除 v1 和 vi 两个点之外的其余点的集合,但 S 中的点的个数要随阶段数改变。阶段: S 中的点的个数

建立动态规划模型:

Page 7: 货郎担问题

状态变量( i , S )表示:从 v1 点出发,经过 S 集合中所有点一次最后到达 vi 。最优指标函数 fk ( i , S )为从 v1 出发,经过 S 集合中所有点一次最后到达 vi 。决策变量 Pk ( i , S )表示:从 v1 经 k 个中间城镇的S 集合到 vi 城镇的最短路线上邻接 vi 的前一个城镇,则动态规划的顺序递推关系为:

建立动态规划模型:

Page 8: 货郎担问题

fk ( i , S ) = min{ fk-1 ( j , S 、 { j }+dji}

j 属于 S

f0 ( i ,空集) =d1i ( k=1 , 2 ,… ,n-1, i=2,3,…n)

Page 9: 货郎担问题

例 12 已知 4 个城市间距离如下表,求从 v1出 发,经其余城市一次且仅一次最后返回 v1 的最短路径和距离。

Vj

距离Vi

1 2 3 4

1 0 6 7 9 2 8 0 9 7 3 5 8 0 8 4 6 5 5 0

Page 10: 货郎担问题

解: K=0 由边界条件( 7.21b) 知 :

f0(2, 空集 )=d12=6 f0(3, 空集 )=d13=7 f0(4, 空集 )=d14=9

Page 11: 货郎担问题

当 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

Page 12: 货郎担问题

例 12 已知 4 个城市间距离如下表,求从 v1 出发,经其余城市一次且仅一次最后返回 v1 的最短路径和距离。

Vj

距离Vi

1 2 3 4

1 0 6 7 9

2 8 0 9 7

3 5 8 0 8

4 6 5 5 0

Page 13: 货郎担问题

当 k=2 时 , 从城市 V1 出发 , 中间经过 2 个城镇到达 Vi 的最短距离 .

f2(2,{ 3,4 }) = min[ f1(3,{4})+d 32, f1(4,{3})+ d42 ]

=min[14+8,15+5]=20

P2(2,{3,4})=4

Page 14: 货郎担问题

f2(3,{ 2,4 })= min[14+9,13+5]=18

P2(3,{2,4})=4

f2(4,{ 2,3 })= min[15+7,15+8]=22

P2(4,{2,3})=2

Page 15: 货郎担问题

当 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]=23

P3(1,{2,3,4})=3

Page 16: 货郎担问题

逆推回去 , 货郎的最短路线是 12431,

最短距离为 23.

货郎担问题当城市数目增加时 , 用动态规划方法求解 , 无论是计算量还是存储量都会大大增加 , 所以本方法只适用于 n 较小的情况 .

Page 17: 货郎担问题

在很多货郎担问题中,经常会看到 dij 不等于 dji 的情况。

Vj

距离Vi

1 2 3 4

1 0 6 7 9

2 8 0 9 7

3 5 8 0 8

4 6 5 5 0

• 这是因为: 1 ,各城市之间可能是复线 2 ,两地之间可能会使用不同的交通工具从而费用不同。

Page 18: 货郎担问题

实际中很多问题都可以归结为货郎担这类问题 .

如 :1, 物资运输路线中 , 汽车应该走怎样的路线使路程最短 ;

2, 工厂里在钢板上要挖一些小圆孔 , 自动焊接机的割咀应走怎样的路线使路程最短 ;

3, 城市里有一些地方铺设管道时 , 管子应走怎样的路线才能使管子耗费最少 , 等等

Page 19: 货郎担问题

比如说,前面曾经遇到的排序问题,以前我们是用 0-1 整数规划来解决这类问题的。 在这里,我们同样可以使用动态规划的方法。而且相对简单了很多。

Page 20: 货郎担问题

排序问题一,问题的提出 : 设有 n 个工件要在机床 A,B

上加

工 ,每个工件都必须经过先 A 后 B 的两道加工工序 ,

以 ai,bi分别表示工件 i(1<=i<=n) 在 A,B 上的加工

时间 . 问应如何在两机床上安排工件加工的顺序 ,

使在机床 A 上加工第一个工件开始到在机床 B上

将最后一个工件加工完为止 , 所用的加工时间 最

少 ?

Page 21: 货郎担问题

二 , 模型及其解法 min(ai,bj)<=min(aj,bi)

这个条件就是工件 i 应该排在工件 j 之前 , 即对于从头到尾的最优排序而言 ,它的所有前后相邻的两个工件所组成的对都必须满足以上不等式 .根据这个条件 ,得到最优排序的规则如下 : (1)先工作的加工的加工时间的工时矩阵

M= a1 a2 …..an

b1 b2 …..bn

Page 22: 货郎担问题

(2) 在工时矩阵M 中找到最小的元素 ( 若最小的不止一个,可任选其一 ); 若它在上行 , 则将相应的工件排在最前面的位置 ; 若它在下行 , 则将相应的工件排在最后面的位置 .

(3) 将排定位置的工作所对于能够的列从 M 中划掉 ,然后对余下的工作重复按 (2)进行 , 但那时的最前位置 (或最后位置 ) 是在已排定位置的工件之后 (或之前 ). 如此继续下去 ,直至把所有工件都排完为止 .

Page 23: 货郎担问题

以一个例题来加以说明

设有 5 个工件需要在机床 A,B 上加工 , 加工的顺序是先 A 后B,每个工件所需加工时间 ( 单位 : 小时 ) 如下表 . 问如何安排加工顺序可使机床连续加工完所有的加工总时间最少 ?

机床加工时间工件号码

A B

1 3 6

2 7 2

3 4 7

4 5 3

5 7 4

Page 24: 货郎担问题

:

解 : 工件的加工工时矩阵为

• 根据最优排序规则 , 最优加工顺序为 :

• 13542

Page 25: 货郎担问题

这是 Johnson 在 1954年提出

的解法 .概括起来 , 这种解法

的基本思路是 :尽量减少在机

床 B 上等待加工的时间 .(A 上

加工的时间不受限制 ) 因此 ,

把在机床 B 上加工时间长的

工件先加工 , 在 B 上加工时间短的

工件后加工 .

Page 26: 货郎担问题

我们上学期学的数据结构里面也有很多内容和货郎担问题的思想

是相似 !

Page 27: 货郎担问题

最小生成树的普里姆算法

Page 28: 货郎担问题

最短路径问题

Page 29: 货郎担问题

DijkstraDijkstra 提出了一个按路径长度递增的顺序逐步产提出了一个按路径长度递增的顺序逐步产生最短路径的方法,称为生最短路径的方法,称为 DijkstraDijkstra 算法。算法。