动态规划习题集详解

动态规划习题集详解
动态规划习题集详解

动态规划

动态规划是运筹学的一个分支,它是解决多阶段决策过程最优化问题的一种方法。该方法是由美国数学家贝尔曼(R.Bellman)等人在本世纪50年代初提出的。他们针对多阶段决策问题的特点,提出了解决这类问题的“最优化原理”,并成功地解决了生产管理、工程技术等方面的许多实际问题,从而建立了运筹学的一个新分支——动态规划。他的名著《动态规划》于1957年出版,该书是动态规划的第一本著作。

动态规划是现代企业管理中的一种重要决策方法,在工程技术、经济管理、工农业生产及军事及其它部们都有广泛的应用,并且获得了显著的效果。动态规划可用于解决最优路径问题、资源分配问题、生产计划与库存问题、投资分配问题、装载问题、设备更新与维修问题、排序问题及生产过程的最优控制等。由于它所具有独特的解题思路,在处理某些优化问题时,常常比线性规划或非线性规划方法更有效。

第一节动态规划的基本方法

多阶段决策的实际问题很多,下面通过具体例子,说明什么是动态规划模型及其求解方法。

例1:最短路线问题

某工厂需要把一批货物从城市A运到城市E,中间可经过B1 、B2、B3、C1、C2、C3、D1、D2等城市,各城市之间的交通线和距离如下图所示,问应该选择一条什么路线,使得从A到E的距离最短?

4

9

6 3

7

下面引进几个动态规划的基本概念和相关符号。

(1)阶段(Stage)

把所给问题的过程,按时间和空间特征划分成若干个相互联系的阶段,以便按次序去求每个阶段的解,阶段总数一般用字母n 表示,用字母k 表示阶段变量。

如例l 中 (最短路线问题)可看作是n=4阶段的动态规划问题,k=2表示处于第二阶段。

(2)状态(State)

状态表示每个阶段开始时系统所处的自然状况或客观条件,它描述了研究问题过程状况。描述各阶段状态的变量称为状态变量,常用字母s k 表示第k 阶段的状态变量,状态变量的取值范围称为状态集,用S k 表示。

如例l 中,第一阶段的状态为A (即出发位置)。第二阶段有三个状态:B 1 、B 2、B 3,状态变量s 2=B 2表示第2阶段系统所处的位置是B 2。第2阶段的状态集S 2={ B 1 、B 2、B 3}。

动态规划中的状态变量应具有如下性质:当某阶段状态给定以后,在这个阶段以后过

程的发展不受这个阶段以前各个阶段状态的影响。也就是说,未来系统所处的状态只与系统当前所处的状态有关,而与系统过去所处的状态无关,即过去历史只能通过当前的状态去影响它未来的发展,这种特点称为无后效性(又称马尔可夫性)。如果所选定的状态变量不具备无后效性,就不能作为状态变量来构造动态规划模型。如例1中,当某阶段的初始状态即所在的城市选定以后,从这个状态以后的运货路线只与这个城市有关,不受以前的运货路线影响,所以是满足状态的无后效性的。

(3)决策(Decision)

当系统在某阶段处于某种状态,可以采取的行动(或决定、选择),从而确定下一阶段系统将到达的状态,称这种行动为决策。描述决策的变量,称为决策变量。常用字母u k(s k)表示第k阶段系统处于状态s k时的决策变量。决策变量的取值范围称为决策集,用D k(s k)表示。

在例l的第二阶段中,若从状态B2出发,可以做出三种不同的决策,其允许的决策集为D2(B2)={ C1、C2、C3},决策u 2(B2)= C2表示第二阶段处于状态B2,选择的确行动下一阶段是走到C2。

(4)策略(Policy)

系统从第k阶段的状态s k开始由每阶段的决策按顺序组成的决策序列{u k(s k) ,u

k+1(s k+1),…,u n(s n)}称为一个策略(k=1,2, …,n),记作

,

()

k n k

p s。

在例l中,p2,4(B2)={ u 2(B2)= C2,u3(C2)= D1,u 4(D1)=E}是一个策略,表示第二

阶段从状态B2出发,沿着B2→C2→D1→E的方向走到终点。注意策略必须是一串实际可行的序列行动。

(5)状态转移方程

系统由这一阶段的—个状态进行决策后转变到下—阶段的另—个状态称为状态转移,

状态转移既与状态有关,又与决策有关,描述状态转移关系的方程称为状态转移方程,记为:

s k+1=T k (s k ,u k )

它的实际意义是当系统第k 阶段处于状态s k 做决策u k 时,第k+1阶段系统转移到状态s k+1。

状态转移方程在不同的问题中有不同的具体表现形式,在例l 中,状态转移方程表示为:s k+1=u k (s k )。

(6)阶段指标

阶段效益是衡量系统阶段决策结果的一种数量指标,记为:

(,)k k k v s u

表示系统在第k 阶段处于状态s k 做出决策u k 时所获得的阶段效益。这里的阶段效益在不同的实际问题中有不同的意义。在例l 中它表示两个中转站的距离,如

2222222(,())(,)7v B u B C d B C ===表示从中转站B 2走到中转站C 2之间的距离为7。更一

般地有(,())(,())k k k k k k k v s u s d s u s =。

(7)指标函数

指标函数是用来街量所实现过程的优劣的一种数量指标,它是一个定义在全过程和所有后部子过程上的确定的数量函数,记为:

,11(,,,,,,)

1,2,,k n k k k k k k V s u s u s u k n ++=L L

它应具有可分离性,并满足递推关系式:

,111,11(,,,,,,)[,,(,,,,)]k n k k k k k k k k k n k k k k V s u s u s u s u V s u s u ?+++++=L L

常见的指标函数的形式是:

1)过程和任一子过程的指标是它所包含的各阶段指标的和。既

,111,111

(,,,,,,)(,)(,)(,,,,)]

n

k n k k k k k k j j j k k k k n k k k k j V s u s u s u v s u v s u V s u s u +++++===+∑L L

2)过程和任一子过程的指标是它所包含的各阶段指标的积。既

,111,111

(,,,,,,)(,)(,)(,,,,)]

n

k n k k k k k k j j j k k k k n k k k k j V s u s u s u v s u v s u V s u s u +++++===?∏L L

(8)最优值函数

指标函数的最优值,称为最优值函数,记为()k k f s 。它表示系统在第k 阶段处于状态s k 时按最优策略行动所获得总的效益。既

,,11()

()(,,,,,,)k n k k k k n k k k k k k p s f s opt V s u s u s u ++=L

其中opt 是最优化(optimization )的缩写,根据实际问题可取max (最大值)和min (最小值),,()

k n k p s opt 表示对所有允许策略,()k n k p s 使后面算式取最优。

下面利用动态规划的逆推归纳法,将例1从最后一个城市E 逐步推算到第一个城市A ,在此()k k f s 表示第k 阶段从城市s k 到城市E 最短路。

1)当k=4时:要求44()f s ,由于第4阶段只有两个城市D 1、D 2(即s 4的取值为D 1、

D 2),从D 1到

E 只有一条路,故*

41141()(,)4,()f D d D E u D E ===,同理

*42242()(,)3,()f D d D E u D E ===。

2)当k=3时:s 3的取值为C 1、C 2、C 3,从C 1出发到E 有两条路,一条是经过D 1到E ,另一条是经过D 2到E ,显然:

1141*31311

1242(,)()34()min min 7,

()(,)()53d C D f D f C u C D d C D f D ++????

====????++????

即从C 1出发到E 的最短路为7,相应决策为*

311()u C D =,最短路线是C 1→D 1→E 。

同理 2141*323222242(,)()64()5,

()(,)()23d C D f D f C u C D d C D f D ++????

====?

???++??

??

3141*333313242(,)()14()5,

()(,)()33d C D f D f C u C D d C D f D ++????

====?

???++??

??

2)当k=2时:s 2的取值为B 1、B 2、B 3,从B 1出发到E 有三条路,分别是经过C 1、C 2、C 3到E ,则有:

1131*2112322121333(,)()67()(,)()459,

()55(,)()d B C f C f B d B C f C u B C d B C f C ++????????

=+=+==????????

++???

?

同理 2131*2222322232333(,)()87()(,)()7511,

()65(,)()d B C f C f B d B C f C u B C d B C f C ++????

????

=+=+==????????

++???

?

3131*233232233333(,)()77()(,)()8512,

()75(3,)()d B C f C f B d B C f C u B C d B C f C ++????

????

=+=+==????????

++???

?

2)当k=1时:s 1的只有一个取值为A. 从A 出发到E 有三条路,分别是经过B 1、B 2、B 3到E ,则有:

121*122211323(,)()89()min (,)()min 91117,

()612(,)()d A B f B f A d A B f B u A B d A B f B ++????

????

=+=+==????????

++???

?

于是得到从A 到E 的最短距离17,为了找出最短路线,按计算的顺序逆推回去,可得到最优策略为:*

*

*

*

1,41121232242(){(),(),(),()}p A u A B u B C u C D u D E =====,最短路线是A →B 1→C 2→D 2→E 。

第 二 节 动态规划的基本原理

从上面的计算过程中可以看出,在求解的各个阶段,利用了k 阶段与k+1阶段之间的递推关系:

{}11()

55444()min (,())()4,3,2,1

()0(()(,))

k k k k k k k k k k u D s f s d s u s f s k f s f s d s E ++∈?=+=??==??或

这种递推关系称为动态规划的基本方程,其中55444()0(()(,))f s f s d s E ==或称为边

界条件。这个递推方程,是根据下述动态规划的贝尔曼(R .Bellman)最优化原理推导得来的。

动态规划最优化原理:“作为整个过程的最优策略具有这样的性质:即无论过去的状态和决策如何,对前面的决策所形成的状态而言,余下的诸决策必须构成最优策略。”简单地说就是一个最优策略的子策略也是最优的。

一般情况下,作为一个动态规划模型的最优值函数在k 阶段与k+1阶段之间必须满足下列递推关系:

1) 加法型:若

,111,111

(,,,,,,)(,)(,)(,,,,)]

n

k n k k k k k k j j j k k k k n k k k k j V s u s u s u v s u v s u V s u s u +++++===+∑L L 则:

{}

,1,1,11()

1,11()

()

11()

(,,,,,,)

{(,)(,,,,()(,)}

)()k n k k k k k k k k n k k n k k k k k k p s k k k k n k k k k u D s p s k k k k k k k u D s opt V s u s u s u opt v s u op f s opt

v s u t V s s f u s u ++++∈+∈++++=+==+L L

即:{}

11()

,()(,)()1,,2,1k k k k k k k k k k u D s k f s opt

n v s u f s n ++∈+=-=

L (1)

边界条件为 11()0n n f s ++= 2)乘法型:{}

11()

,()(,)()1,,2,1k k k k k k k k k k x D s k f s opt

n v s u f s n ++∈?=-=

L (2)

边界条件为 11()1n n f s ++=

这种递推关系式(1)、(2) 称为动态规划的基本方程。这样的求解方法称为逆推解法(或逆序解法)。

同理也可给出顺推解法(或顺序解法),动态规划的顺序解法的基本方程为: 1)加法型:{}

11()

()(,)(1,2,,1,)k k k k k k k k k k u D s f s opt

v s u f s k n n +-∈=

+=-L (1)

边界条件为 01()0f s =

2)乘法型:{}

11()

()max (,1,2,,1)(),k k k k k k k k k k x D s f s v s u f k n s n +-∈=?=-L (2)

边界条件为 01()1f s =

注意:此时状态转移方程变为:s k =T k (s k +1,u k )

通过对最短路线问题的求解,我们可以把动态规划方法的基本思想归纳如下: 动态规划方法的关键,在于利用最优化原理给出最优值函数的递推关系式和边界条件,为此,必须先将问题的过程划分为几个相互联系的阶段,适当选取状态变量、决策变量, 状态转移方程及定义最优值函数。从而把一个大问题化成一系列同类型的子问题,然后逐个求解。

例3:逆推解法求解下面问题:2123

1

23123max ,,0

z x x x x x x c x x x =++=??

≥?

解: 按问题的变量个数划分阶段,把它看作一个三阶段决策问题。设状态变量为s 1,s 2,s 3,s 4。并记s 1=c ;令变量x 1,x 2,x 3为决策变量;各阶段指标按乘积方式结合。

即令:2

111122223333(,),(,),(,)v s x x v s x x v s x x ===

令最优值函数f k (s k )表示为第k 阶段的初始状态为s k 时,从第k 阶段到第3阶段所得到的最大值。

设: s 3= x 3, s 3+ x 2=s 2, s 2+ x 1=s 1=c 则有:x 3=s 3, 0≤x 2≤s 2, 0≤x 1≤s 1=c 即状态转移方程为: s 3=s 2-x 2, s 2 =s 1-x 1 由逆推解法,33

3333()

max(),x s f s x s ===即最优解x 3*=s 3,

23

22

22

22

222223233,022*******()max[]max [()]

max [()]max (,)

x x x s x s x s f s x x x f s x s x h s x ≤≤≤≤≤≤=?=?=?-=

222222230dh x s x dx =-=,得222

3

x s =和20x =(舍去) 又22222226d h s x dx =-,而22

2222223|20x s

d h s dx ==-<,故2223x s =为极大值点。 所以22224()27f s s =

即最优解*222

3

x s =。 123

11

1111211123122,,03

11111100()max[]max[()]

4max[()]max (,)27

x x x x s x s x s f s x x x x f s x s x h s x ≤≤≤≤≤≤=??=?=?-= 求导并令导数等于0可得:*

1114x s =

,故4

1111()64

f s s = 由于s 1=c ,∴*

114x c =,411()64

f c c =

由s 2 =s 1-x 1*,∴*

222132x s c ==,3221()16

f s c =

由s 3 =s 2-x 2*,∴*

3314x s c ==,331()4

f s c =

因此最优解为:*114x c =,*212x c =,*

314

x c =,

最大值为:4

11max ()64

z f c c ==

例3:用顺推解法求解下面问题:2123

123123max ,,0

z x x x x x x c x x x =++=??

≥?

解:设s 4=c ,决策变量仍为x 1,x 2,x 3;最优值函数f k (s k+1)表示为第k 阶段末的结束状态为s k+1,从第1阶段到第k 阶段所得到的最大值。

设: s 2= x 1, s 2+ x 2=s 3, s 3+ x 3=s 4=c 则有:x 1=s 2, 0≤x 2≤s 3, 0≤x 3≤s 4=c 即状态转移方程为: s 2=s 3-x 2, s 3=s 4-x 3

由顺推解法,12

1212()max(),x s f s x s ===即最优解x 1*=s 2,

12

23

23222312212,02

3

23230()max[]max [()]

4max [()]27

x x x s x s f s x x x f s x s x s ≤≤≤≤=?=?=?-=

最优解*

232

3

x s =

。 123

34

34234123323,,03

434340()max[]max [()]

41max [()]2764

x x x x s x s f s x x x x f s x s x s ≤≤≤≤=??=?=?-=

最优解*

3414

x s =

由于s 4=c ,∴*

314x c =,431()64

f c c =

由s 3=s 4-x 3*,∴*

232132x s c ==,221()16

f s c =

由s 2=s 3-x 2*,∴*

1214x s c ==,331()4f s c =

因此最优解为:*114x c =,*212x c =,*

214x c =,

最大值为:4

1max 64z c =

例4:用顺推解法求解下面问题:222123123123max 4212

329

,,0

z x x x x x x x x x =-++++≤??≥?

解: 按问题的变量个数划分阶段,把它看作一个三阶段决策问题。 设状态变量为s 0,s 1,s 2,s 3。并记s 3≤9; 令变量x 1,x 2,x 3为决策变量;

最优值函数f k (s k )表示为第k 阶段末的结束状态为s k ,从第1阶段到第k 阶段所得到的最大值。

设: 3x 1=s 1, s 1+2x 2=s 2, s 2+ x 3=s 3≤9 则有:x 1=s 1/3,0≤x 2≤s 2/2 , 0≤x 3≤s 3≤9 即状态转移方程为: s 1=s 2-2x 2, s 2=s 3-x 3 由顺推解法,112

2

11113

4()max(4),9

s x f s x s ===

即最优解x 1*=s 1/3,

2

12

222222222212211,02

2

2

2222220022

()max[4]max [()]

4max [(2)]max (,)

9s x x x s s x x f s x x x f s x s x h s x ≤≤

≤≤≤≤=-=-+=-+-=

22221416099dh x s dx =-=,得228

7

x s =(它不在决策集内) 则最大值在端点上,∵222222241

(0),()924

s h s h s =

=- ∴最大值点为x 2=0。故得到22224()9

f s s =及最优解*

20x =。

123

33

3333222233123322,,02

233333300()max[4212]max [212()]

4

max [212()]max (,)9

x x x x s x s x s f s x x x x f s x s x h s x ≤≤≤≤≤≤=-++=++=++-=

3333448099dh x s dx =-=,得33211

x s = 又23234409

dh dx =>,故该点为极小值点。 而2

2332334(0)12,()2129

h s h s s =

+=+ ∴最大值点为x 3=s 3。故得到2333()212f s s =+及最优解*

33x s =。

由于s 3不知道,故须在对s 3求一次极值,即

33233309

09

max ()max[212]174s s f s s ≤≤≤≤=+=

反推回去即可得最优解为:*10x =,*20x =,*

39x =,

最大值为:1max (9)174z f ==

作业 P 214 1,5(1逆推,2顺推)

第 二 节 动态规划应用举例

一、资源分配问题

假设有某种资源的总数量为a (例如原材料、能源、机器设备、劳力、食品等),可用于生产n 个产品,若生产j 种产品的所用资源数为x j 时,可获得利润为g j (x j ),问如何分配该种资源,使所获得的总利润达到最大。

该问题的数学模型可表示为:

11221212max ()()(),,0

n n n n z g x g x g x x x x a x x x =++++++≤??

≥?L L L

当g j (x j )都是线性函数时,它是一个线性规划问题;当g j (x j )是非线性函数时,它是—个非线性规划问题。但当n 比较大时,求解起来是非常麻烦的。由于该问题的特殊性,可以将它看成一个多阶段决策问题,并利用动态规划的方法来求解。

我们将n 个产品看作是n 个阶段,设状态变量s k 表示生产第k 个产品至第n 个产品的资源数量,0k s a ≤≤。

决策变量x j 表示生产第k 个产品的所用资源数量,0k k x s ≤≤。

显然状态转移方方程为:

1k k k s s x +=-

第k 阶段的阶段指标为:(,)()k k k k k v s x g x =。

最优值函数()k k f s 表示生产第k 个产品至第n 个产品的

资源数量为s k 时所获得的最大总利润。

则由动态规划最优化原理,可得动态规划的基本方程为:

{}1111()max ()()()0

k

k k k k k k x n n f s g x f s f s ++++=+=????? 下面我们来考虑一种资源可回收利用的资源分配问题,这类分配问题的一般描述如下:

设有某种资源,初始的拥有量是s 1。计划在A 、B 两个生产车间连续使用n 个阶段。巳知在A 车间投入资源x 时的阶段收益是g(x ),在B 车间投入资源y 时的阶段收益是h(y )。投入的资源在生产过程中有部分消耗,已知,每生产一个阶段后,车间A 、B 的资源回收率分别为a 和b ,0 <a ,b <1。回收的资源下一阶段可继续使用,求n 阶段间总收益最大的资源分配计划。

设s j 为第j 阶段投入A 、B 两个车间使用的资源数,j=1、2、…、n 。

x j 为第j 阶段投入A 车间使用的资源数,投入B 车间使

用的资源数为y j =s j -x j ,j=1、2、…、n 。此问题的静态规划模型为:

11122221113

222111

max ()()()()()()()()

()

0,1,2,,n n n n n n n j j z g x h s x g x h s x g x h s x s ax b s x s ax b s x s ax b s x x s j n

---=+-++-+++-=+-??=+-????=+-?≤≤=??L L L

L

该模型可用动态规划的方法来处理。

令s k 为状态变量,表示在第k 阶段投入A 、B 两个车间使用的资源数,k=1、2、…、n 。

x k 为决策变量,它表示在第k 阶段投入A 车间使用的

资源数,则y k =s k -x k 表示在第k 阶段投入B 车间使用的资源数,k=1、2、…、n 。

状态转移方程为:s k+1=ax k +b(s k -x k )

最优值函数()k k f s 表示拥有资源数为s k 时,从第k 阶段至第n 阶段采取最优分配方案进行生产时所获得的最大总收益。

则动态规划的递推公式

{}1111()max ()()()()0

k

k k k k k k k x n n f s g x h s x f s f s ++++=+-+=?????

下面我们对一个具体问题,用此方法求解。 例1:机器负荷分配问题

某公司新购进1000台机床,每台机床都可在高、低两

种不同的负荷下进行生产,设在高负荷下生产的产量函数为g(x)=10x(单位:百件),其中x为投入生产的机床数量,年完好率为a=0.7;在低负荷下生产的产量函数为h(y)=6y (单位:百件),其中y为投人生产的机床数量,年完好率为b=0.9。计划连续使用5年,试问每年如何安排机床在高、低负荷下的生产计划,使在五年内生产的产品总产量达到最高。

解:该问题可看作一个5阶段决策问题,一个年度就是一个阶段。

状态变量s k取为第k年度度初具有的完好机床台数。

决策变量x k为第k年度中分配在高负荷下生产的机器台数,则y k=s k-x k为第k年度中分配在低负荷下生产的机器台数(假定x k、s k皆为连续变量)。

状态转移方方程为:s k+1=a x k+b(s k-x k)=0.7x k+0.9(s k-x k)

第k年度的产量为:v k(s k,x k)=10x k+6(s k-x k)

最优值函数()

f s表示拥有机床数为s k时,从第k年度至

k k

第五年度采取最优分配方案进行生产时所获得的最大总产量。

则动态规划的基本方程为:

{}1111()max ()()()()0

k k k k k k k k x n n f s g x h s x f s f s ++++=+-+=????? 下面第5年度开始,用逆推归纳法进行计算。

1)k=5时,有

{}

{}

{}

55

5555

555556605550550()max ()()()max 106()0max 46x s x s x s f s g x h s x f s x s x x s ≤≤≤≤≤≤=+-+=+-+=+

因为55()f s 是x 5的单调增加函数,故的最大解为55*x s =,相应有55()f s =10s 5。

2) k=4

时,有

{}

{}

{}{}

44

444444

44444550444544404444440440()max ()()()max 106()(0.70.9())max 106()10(0.70.9())max 215x s x s x s x s f s g x h s x f s x s x f x s x x s x x s x x s ≤≤≤≤≤≤≤≤=+-+=+-++-=+-++-=+ 因为44()f s 是x 4的单调增加函数,故的最大解为44*x s =,相应有44()f s =17s 4。

3) k=3时,有

{}

{}

{}{}

33

333333

33333440333433303333330330()max ()()()max 106()(0.70.9())max 106()17(0.70.9())max 0.621.3x s x s x s x s f s g x h s x f s x s x f x s x x s x x s x x s ≤≤≤≤≤≤≤≤=+-+=+-++-=+-++-=+

因为33()f s 是x 3的单调增加函数,故的最大解为33*x s =,相应有33()f s =21.9s 3。 4) 当k=2时,有

{}

{}

{}{}

22

222222

22222330222322202222220220()max ()()()max 106()(0.70.9())max 106()21.9(0.70.9())max 0.3825.71x s x s x s x s f s g x h s x f s x s x f x s x x s x x s x x s ≤≤≤≤≤≤≤≤=+-+=+-++-=+-++-=-+

因为22()f s 是x 2的单调减少函数,故的最大解为2*0x =,相应有22()f s =25.71s 2。 5) 当k=1时,有

{}

{}

{}{}

11

111111

11111220111211101111110110()max ()()()max 106()(0.70.9())max 106()25.71(0.70.9())max 1.14229.139x s x s x s x s f s g x h s x f s x s x f x s x x s x x s x x s ≤≤≤≤≤≤≤≤=+-+=+-++-=+-++-=-+ 因为11()f s 是x 1的单调减少函数,故的最大解为1*0x =,相应有11()f s =29.139s 1。

由于第l 阶段的初始状态s 1是给定的,即s 1=1000,因此最优目标函数值为111()(1000)f s f =

=29139(百件)。

计算结果表明:最优策略为1*0x =,2*0x =,33*x s =,44*x s =,

55*x s =。即前两年应把年初全部完好机床投入低负荷生产,后

三年应把年初全部完好机床投入高负荷生产。这样所得的产

量最高,其最高产量为29139百件产品。同时,从求解过程还可反过来确定每年年初的状态,即每年年初所拥有的完好机器台数。已知s 1=1000,于是可得:

21111322224333354444655550.70.9()0.9900(0.70.9()0.9810(0.70.9()0.7567(0.70.9()0.7397(0.70.9()0.7278(s x s x s s x s x s s x s x s s x s x s s x s x s =+-===+-===+-===+-===+-==台)台)台)台)台)

由此可知最优的决策过程是:第一年将全部1000台机器全部投入到低负荷下进行生产,第一年末机床完好数是900台,第二年将900台机器继续投入到低负荷下进行生产,第二年末机床完好数成为810台,第三年改变策略将这810台机床全部投入到高负荷下进行生产,第三年末机床完好数为567台,第四年将这567台机床全部投入到高负荷下进行生产,第四年末机床完好数成为397台,第五年将这397台机床投入到高负荷下进行生产,这样第五年末剩下的完好机床数为278台,五年共生产产品29139(百件)。

二、生产与存储问题

假设为有一个企业,要制定某种产品n 个阶段(例如年、月、周)的生产(或购买)计划,已知初始的存储量为零,

第k 个阶段市场需求量为d k ,每个阶段企业的最大产量为M ,单位产品的生产成本为a ,每次生产的生产准备成本为K 。问该企业如何安排生产和存储,才能即满足市场需求,又使总的费用最少?

设x k 为第k 个阶段该产品的生产量。

s k 为第k 个阶段末该产品的库存量,则有s k =s k-1+x k -d k 。

()k k c x 表示第

k 个阶段该产品x k 时的成本费用,它包括

生产准备成本K 和产品成本ax k 两项费用,即 0,

0(),1,2,,,k k k k k k x c x K ax x M

x M =??

=+=??∞>?

L

()k k h s 表示在第k 个阶段结束时有库存量s k 所需的存储费

用。故第k 个阶段的总成本费用为()()k k k k c x h s +。

上述问题的数学模型为:

1

01min [()()]

0,0

()0

1,2,,101,2,,1,2,,n

k

k k k k n k k j j j k k z c

x h s s s s x d k n x M k n x k n ===

+==???=-≥=-??

?≤≤=??=?∑∑L L L 为整数

现在我们用动态规划的顺推归纳法来求解,把它看作一个n 阶段决策问题。令

x k 为决策变量,它表示在第k 阶段的生产量。 s k 为状态变量,它表示在第k 个阶段末该产品的库存量。 则状态转移方程为:s k =s k-1+x k -d k 。

最优值函数()k k f s 表示从第1阶段初始库存量为0到第k 阶段末库存量为s k 时的最小总费用。

则其顺序递推关系式:

1

101,()min [()(,(]

2)),k k

k k k k k k k k x f s c x k h s f

s n

σ--≤≤==++L 其中min(,)k k k s d M σ=+,这是因为一方面在每个阶段企业的

最大产量为M ,另一方面由于满足每个阶段市场的需求量,因为第k-1阶段末库存量为s k-1必须非负,即:

s k-1= d k +s k -x k ≥0 , ∴ x k ≤d k +s k 。 边界条件为00()f s (或111111()min[()()]f s c x h s =+)。 从边界条件出发,利用上面顺序递推关系式,最后求出的(0)n f 即为所要求的最小总费用。

下面通过一个实际例子计算之。

例2:某企业通过市场调查,估计今后四个时期市场对某种产品的需要量如下表:

假定不论在任何时期,生产每批产品的固定成本费为3(千元),若不生产,则为零;生产单位产品成本费为1(千

动态规划例题

例1:机器负荷分配问题 某公司新购进1000台机床,每台机床都可在高、低两种不同的负荷下进行生产,设在高负荷下生产的产量函数为g(x )=10x (单位:百件),其中x 为投入生产的机床数量,年完好率为a =0.7;在低负荷下生产的产量函数为h(y)=6y (单位:百件),其中y 为投人生产的机床数量,年完好率为b=0.9。计划连续使用5年,试问每年如何安排机床在高、低负荷下的生产计划,使在五年内生产的产品总产量达到最高。 例2:某企业通过市场调查,估计今后四个时期市场对某种产品的需要量如下表: 时期(k) 1 2 3 4 需要量(d k ) 2(单位) 3 2 4 假定不论在任何时期,生产每批产品的固定成本费为3(千元),若不生产,则为零;生产单位产品成本费为1(千元);每个时期生产能力所允许的最大生产批量为不超过6个单位,则任何时期生产x 个单位产品的成本费用为: 若 0<x ≤6 , 则生产总成本=3十1·x 若 x =0 , 则生产总成本=0 又设每个时期末未销售出去的产品,在一个时期内单位产品的库存费用为0.5(千元),同时还假定第1时期开始之初和在第4个时期之末,均无产品库存。现在我们的问题是;在满足上述给定的条件下,该厂如何安排各个时期的生产与库存,使所花的总成本费用最低? 例3:设某企业在第一年初购买一台新设备,该设备在五年内的年运行收益、年运行费用及更换新设备的净费用如下表:(单位:万元) 年份(k) 役龄(t) 运行收益()k g t 运行费用()k r t 更新费用()k c t 第一年 0 22 6 18 第二年 0 1 23 21 6 8 19 22

动态规划讲解大全(含例题及答案)

动态规划讲解大全 动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程(multistep decision process)的优化问题时,提出了著名的最优化原理(principle of optimality),把多阶段过程转化为一系列单阶段问题,逐个求解,创立了解决这类过程优化问题的新方法——动态规划。1957年出版了他的名著Dynamic Programming,这是该领域的第一本著作。 动态规划问世以来,在经济管理、生产调度、工程技术和最优控制等方面得到了广泛的应用。例如最短路线、库存管理、资源分配、设备更新、排序、装载等问题,用动态规划方法比用其它方法求解更为方便。 虽然动态规划主要用于求解以时间划分阶段的动态过程的优化问题,但是一些与时间无关的静态规划(如线性规划、非线性规划),只要人为地引进时间因素,把它视为多阶段决策过程,也可以用动态规划方法方便地求解。 动态规划程序设计是对解最优化问题的一种途径、一种方法,而不是一种特殊算法。不象前面所述的那些搜索或数值计算那样,具有一个标准的数学表达式和明确清晰的解题方法。动态规划程序设计往往是针对一种最优化问题,由于各种问题的性质不同,确定最优解的条件也互不相同,因而动态规划的设计方法对不同的问题,有各具特色的解题方法,而不存在一种万能的动态规划算法,可以解决各类最优化问题。因此读者在学习时,除了要对基本概念和方法正确理解外,必须具体问题具体分析处理,以丰富的想象力去建立模型,用创造性的技巧去求解。我们也可以通过对若干有代表性的问题的动态规划算法进行分析、讨论,逐渐学会并掌握这一设计方法。 基本模型 多阶段决策过程的最优化问题。 在现实生活中,有一类活动的过程,由于它的特殊性,可将过程分成若干个互相联系的阶段,在它的每一阶段都需要作出决策,从而使整个过程达到最好的活动效果。当然,各个阶段决策的选取不是任意确定的,它依赖于当前面临的状态,又影响以后的发展,当各个阶段决策确定后,就组成一个决策序列,因而也就确定了整个过程的一条活动路线,如图所示:(看词条图) 这种把一个问题看作是一个前后关联具有链状结构的多阶段过程就称为多阶段决策过程,这种问题就称为多阶段决策问题。 记忆化搜索 给你一个数字三角形, 形式如下: 1 2 3 4 5 6 7 8 9 10 找出从第一层到最后一层的一条路,使得所经过的权值之和最小或者最大. 无论对与新手还是老手,这都是再熟悉不过的题了,很容易地,我们写出状态转移方程:f(i, j)=a[i, j] + min{f(i+1, j),f(i+1, j + 1)} 对于动态规划算法解决这个问题,我们根据状态转移方程和状态转移方向,比较容易地写出动态规划的循环表示方法。但是,当状态和转移非常复杂的时候,也许写出循环式的动态规划就不是那么

经典算法——动态规划教程

动态规划是对最优化问题的一种新的算法设计方法。由于各种问题的性质不同,确定最优解的条件也互不相同,因而动态规划的没计法对不同的问题,有各具特色的表示方式。不存在一种万能的动态规划算法。但是可以通过对若干有代表性的问题的动态规划算法进行讨论,学会这一设计方法。 多阶段决策过程最优化问题 ——动态规划的基本模型 在现实生活中,有一类活动的过程,由于它的特殊性,可将过程分成若干个互相联系的阶段,在它的每一阶段都需要作出决策,从而使整个过程达到最好的活动效果。因此各个阶段决策的选取不能任意确定,它依赖于当前面临的状态,又影响以后的发展。当各个阶段决策确定后,就组成一个决策序列,因而也就确定了整个过程的一条活动路线。这种把一个问题看做是一个前后关联具有链状结构的多阶段过程就称为多阶段决策过程,这种问题称为多阶段决策最优化问题。 【例题1】最短路径问题。图中给出了一个地图,地图中每个顶点代表一个城市,两个城市间的连线代表道路,连线上的数值代表道路的长度。现在,想从城市A到达城市E,怎样走路程最短,最短路程的长度是多少? 【分析】把从A到E的全过程分成四个阶段,用k表示阶段变量,第1阶段有一个初始状态A,两条可供选择的支路ABl、AB2;第2阶段有两个初始状态B1、 B2,B1有三条可供选择的支路,B2有两条可供选择的支路……。用dk(x k,x k+1)表示在第k阶段由初始状态x k到下阶段的初始状态x k+1的路径距离,Fk(x k)表示从第k阶段的x k到终点E的最短距离,利用倒推方法求解A到E的最短距离。具体计算过程如下: S1:K=4,有:F4(D1)=3,F4(D2)=4,F4(D3)=3 S2: K=3,有: F3(C1)=min{d3(C1,D1)+F4(D1),d3(C1,D2)+F4(d2)}=min{8,10}=8 F3(C2)=d3(C2,D1)+f4(D1)=5+3=8 F3(C3)=d3(C3,D3)+f4(D3)=8+3=11 F3(C4)=d3(C4,D3)+f4(D3)=3+3=6

动态规划习题

第七章动态规划 规划问题的最终目的就是确定各决策变量的取值,以使目标函数达到极大或极小。在线性规划和非线性规划中,决策变量都是以集合的形式被一次性处理的;然而,有时我们也会面对决策变量需分期、分批处理的多阶段决策问题。所谓多阶段决策问题是指这样一类活动过程:它可以分解为若干个互相联系的阶段,在每一阶段分别对应着一组可供选取的决策集合;即构成过程的每个阶段都需要进行一次决策的决策问题。将各个阶段的决策综合起来构成一个决策序列,称为一个策略。显然,由于各个阶段选取的决策不同,对应整个过程可以有一系列不同的策略。当过程采取某个具体策略时,相应可以得到一个确定的效果,采取不同的策略,就会得到不同的效果。多阶段的决策问题,就是要在所有可能采取的策略中选取一个最优的策略,以便得到最佳的效果。动态规划(dynamic programming)同前面介绍过的各种优化方法不同,它不是一种算法,而是考察问题的一种途径。动态规划是一种求解多阶段决策问题的系统技术,可以说它横跨整个规划领域(线性规划和非线性规划)。当然,由于动态规划不是一种特定的算法,因而它不象线性规划那样有一个标准的数学表达式和明确定义的一组规则,动态规划必须对具体问题进行具体的分析处理。在多阶段决策问题中,有些问题对阶段的划分具有明显的时序性,动态规划的“动态”二字也由此而得名。动态规划的主要创始人是美国数学家贝尔曼(Bellman)。20世纪40年代末50年代初,当时在兰德公司(Rand Corporation)从事研究工作的贝尔曼首先提出了动态规划的概念。1957年贝尔曼发表了数篇研究论文,并出版了他的第一部著作《动态规划》。该著作成为了当时唯一的进一步研究和应用动态规划的理论源泉。1961年贝尔曼出版了他的第二部著作,并于1962年同杜瑞佛思(Dreyfus)合作出版了第三部著作。在贝尔曼及其助手们致力于发展和推广这一技术的同时,其他一些学者也对动态规划的发展做出了重大的贡献,其中最值得一提的是爱尔思(Aris)和梅特顿(Mitten)。爱尔思先后于1961年和1964年出版了两部关于动态规划的著作,并于1964年同尼母霍思尔(Nemhauser)、威尔德(Wild)一道创建了处理分枝、循环性多阶段决策系统的一般性理论。梅特顿提出了许多对动态规划后来发展有着重要意义的基础性观点,并且对明晰动态规划路径的数学性质做出了巨大的贡献。 动态规划在工程技术、经济管理等社会各个领域都有着广泛的应用,并且获得了显著的效果。在经济管理方面,动态规划可以用来解决最优路径问题、资源分配问题、生产调度问题、库存管理问题、排序问题、设备更新问题以及生产过程最优控制问题等,是经济管理中一种重要的决策技术。许多规划问题用动态规划的方法来处理,常比线性规划或非线性规划更有效。特别是对于离散的问题,由于解析数学无法发挥作用,动态规划便成为了一种非常有用的工具。 动态规划可以按照决策过程的演变是否确定分为确定性动态规划和随机性动态规划;也可以按照决策变量的取值是否连续分为连续性动态规划和离散性动态规划。本教材主要介绍动态规划的基本概念、理论和方法,并通过典型的案例说明这些理论和方法的应用。 §7.1 动态规划的基本理论 1.1多阶段决策过程的数学描述 有这样一类活动过程,其整个过程可分为若干相互联系的阶段,每一阶段都要作出相应的决策,以使整个过程达到最佳的活动效果。任何一个阶段(stage,即决策点)都是由输入(input)、决策(decision)、状态转移律(transformation function)和输出(output)构成的,如图7-1(a)所示。其中输入和输出也称为状态(state),输入称为输入状态,输出称为输出状态。

动态规划练习试题和解答

动态规划练习题 [题1] 多米诺骨牌(DOMINO) 问题描述:有一种多米诺骨牌是平面的,其正面被分成上下两部分,每一部分的表面或者为空,或者被标上1至6个点。现有一行排列在桌面上:顶行骨牌的点数之和为6+1+1+1=9;底行骨牌点数之和为1+5+3+2=11。顶行和底行的差值是2。这个差值是两行点数之和的差的绝对值。每个多米诺骨牌都可以上下倒置转换,即上部变为下部,下部变为上部。 现在的任务是,以最少的翻转次数,使得顶行和底行之间的差值最小。对于上面这个例子,我们只需翻转最后一个骨牌,就可以使得顶行和底行的差值为0,所以例子的答案为1。 输入格式: 文件的第一行是一个整数n(1〈=n〈=1000〉,表示有n个多米诺骨牌在桌面上排成一行。接下来共有n行,每行包含两个整数a、b(0〈=a、b〈=6,中间用空格分开〉。第I+1行的a、b分别表示第I个多米诺骨牌的上部与下部的点数(0表示空)。 输出格式: 只有一个整数在文件的第一行。这个整数表示翻动骨牌的最少次数,从而使得顶行和底行的差值最小。 [题2] Perform巡回演出 题目描述: Flute市的Phlharmoniker乐团2000年准备到Harp市做一次大型演出,本着普及古典音乐的目的,乐团指挥L.Y.M准备在到达Harp市之前先在周围一些小城市作一段时间的巡回演出,此后的几天里,音乐家们将每天搭乘一个航班从一个城市飞到另一个城市,最后才到达目的地Harp市(乐团可多次在同一城市演出). 由于航线的费用和班次每天都在变,城市和城市之间都有一份循环的航班表,每一时间,每一方向,航班表循环的周期都可能不同.现要求寻找一张花费费用最小的演出表. 输入: 输入文件包括若干个场景.每个场景的描述由一对整数n(2<=n<=10)和k(1<=k<=1000)开始,音乐家们要在这n个城市作巡回演出,城市用1..n标号,其中1是起点Flute市,n是终点Harp市,接下来有n*(n-1)份航班表,一份航班表一行,描述每对城市之间的航线和价格,第一组n-1份航班表对应从城市1到其他城市(2,3,...n)的航班,接下的n-1行是从城市2到其他城市(1,3,4...n)的航班,如此下去. 每份航班又一个整数d(1<=d<=30)开始,表示航班表循环的周期,接下来的d个非负整数表示1,2...d天对应的两个城市的航班的价格,价格为零表示那天两个城市之间没有航班.例如"3 75 0 80"表示第一天机票价格是75KOI,第二天没有航班,第三天的机票是80KOI,然后循环:第四天又是75KOI,第五天没有航班,如此循环.输入文件由n=k=0的场景结束. 输出: 对每个场景如果乐团可能从城市1出发,每天都要飞往另一个城市,最后(经过k天)抵达城市n,则输出这k个航班价格之和的最小值.如果不可能存在这样的巡回演出路线,输出0. 样例输入: 样例输出:

动态规划经典教程

动态规划经典教程 引言:本人在做过一些题目后对DP有些感想,就写了这个总结: 第一节动态规划基本概念 一,动态规划三要素:阶段,状态,决策。 他们的概念到处都是,我就不多说了,我只说说我对他们的理解: 如果把动态规划的求解过程看成一个工厂的生产线,阶段就是生产某个商品的不同的环节,状态就是工件当前的形态,决策就是对工件的操作。显然不同阶段是对产品的一个前面各个状态的小结,有一个个的小结构成了最终的整个生产线。每个状态间又有关联(下一个状态是由上一个状态做了某个决策后产生的)。 下面举个例子: 要生产一批雪糕,在这个过程中要分好多环节:购买牛奶,对牛奶提纯处理,放入工厂加工,加工后的商品要包装,包装后就去销售……,这样没个环节就可以看做是一个阶段;产品在不同的时候有不同的状态,刚开始时只是白白的牛奶,进入生产后做成了各种造型,从冷冻库拿出来后就变成雪糕(由液态变成固态=_=||)。每个形态就是一个状态,那从液态变成固态经过了冰冻这一操作,这个操作就是一个决策。 一个状态经过一个决策变成了另外一个状态,这个过程就是状态转移,用来描述状态转移的方程就是状态转移方程。 经过这个例子相信大家对动态规划有所了解了吧。 下面在说说我对动态规划的另外一个理解: 用图论知识理解动态规划:把动态规划中的状态抽象成一个点,在有直接关联的状态间连一条有向边,状态转移的代价就是边上的权。这样就形成了一个有向无环图AOE网(为什么无环呢?往下看)。对这个图进行拓扑排序,删除一个边后同时出现入度为0的状态在同一阶段。这样对图求最优路径就是动态规划问题的求解。 二,动态规划的适用范围 动态规划用于解决多阶段决策最优化问题,但是不是所有的最优化问题都可以用动态规划解答呢? 一般在题目中出现求最优解的问题就要考虑动态规划了,但是否可以用还要满足两个条件: 最优子结构(最优化原理) 无后效性 最优化原理在下面的最短路径问题中有详细的解答; 什么是无后效性呢? 就是说在状态i求解时用到状态j而状态j就解有用到状态k…..状态N。 而求状态N时有用到了状态i这样求解状态的过程形成了环就没法用动态规划解答了,这也是上面用图论理解动态规划中形成的图无环的原因。 也就是说当前状态是前面状态的完美总结,现在与过去无关。。。 当然,有是换一个划分状态或阶段的方法就满足无后效性了,这样的问题仍然可以用动态规划解。 三,动态规划解决问题的一般思路。 拿到多阶段决策最优化问题后,第一步要判断这个问题是否可以用动态规划解决,如果不能就要考虑搜索或贪心了。当却定问题可以用动态规划后,就要用下面介绍的方法解决问题了:(1)模型匹配法: 最先考虑的就是这个方法了。挖掘问题的本质,如果发现问题是自己熟悉的某个基本的模型,就直接套用,但要小心其中的一些小的变动,现在考题办都是基本模型的变形套用时要小心条件,三思而后行。这些基本模型在先面的分类中将一一介绍。 (2)三要素法 仔细分析问题尝试着确定动态规划的三要素,不同问题的却定方向不同: 先确定阶段的问题:数塔问题,和走路问题(详见解题报告) 先确定状态的问题:大多数都是先确定状态的。 先确定决策的问题:背包问题。(详见解题报告) 一般都是先从比较明显的地方入手,至于怎么知道哪个明显就是经验问题了,多做题就会发现。 (3)寻找规律法: 这个方法很简单,耐心推几组数据后,看他们的规律,总结规律间的共性,有点贪心的意思。 (4)边界条件法 找到问题的边界条件,然后考虑边界条件与它的领接状态之间的关系。这个方法也很起效。 (5)放宽约束和增加约束 这个思想是在陈启锋的论文里看到的,具体内容就是给问题增加一些条件或删除一些条件使问题变的清晰。 第二节动态规划分类讨论

动态规划习题精讲

信息学竞赛中的动态规划专题 哈尔滨工业大学周谷越 【关键字】 动态规划动机状态典型题目辅助方法优化方法 【摘要】 本文针对信息学竞赛(面向中学生的Noi以及面向大学生的ACM/ICPC)中的动态规划算法,从动机入手,讨论了动态规划的基本思想和常见应用方法。通过一些常见的经典题目来归纳动态规划的一般作法并从理论上加以分析和说明。并介绍了一些解决动态规划问题时的一些辅助技巧和优化方法。纵观全文可知,动态规划的关键在于把握本质思想的基础上灵活运用。 【目录】 1.动态规划的动机和基本思想 1.1.解决重复子问题 1.2.解决复杂贪心问题 2.动态规划状态的划分方法 2.1.一维状态划分 2.2.二维状态划分 2.3.树型状态划分 3.动态规划的辅助与优化方法 3.1.常见辅助方法 3.2.常见优化方法 4.近年来Noi动态规划题目分析 4.1 Noi2005瑰丽华尔兹 4.2 Noi2005聪聪与可可 4.3 Noi2006网络收费 4.4 Noi2006千年虫 附录参考书籍与相关材料

1.动态规划的动机和基本思想 首先声明,这里所说的动态规划的动机是从竞赛角度出发的动机。 1.1 解决重复子问题 对于很多问题,我们利用分治的思想,可以把大问题分解成若干小问题,然后再把各个小问题的答案组合起来,得到大问题的解答。这类问题的共同点是小问题和大问题的本质相同。很多分治法可以解决的问题(如quick_sort,hanoi_tower等)都是把大问题化成2个以内的不相重复的小问题,解决的问题数量即为∑(log2n / k)。而考虑下面这个问题: USACO 1.4.3 Number Triangles http://122.139.62.222/problem.php?id=1417 【题目描述】 考虑在下面被显示的数字金字塔。 写一个程序来计算从最高点开始在底部任意处结束的路径经过数字的和的最大。每一步可以走到左下方的点也可以到达右下方的点。 7 3 8 8 1 0 2 7 4 4 4 5 2 6 1 在上面的样例中,从7到3到8到7到5的路径产生了最大和:30。 【输入格式】 第一个行包含R(1<= R<=1000) ,表示行的数目。后面每行为这个数字金字塔特定行包含的整数。所有的被供应的整数是非负的且不大于100。 【输出格式】 单独的一行包含那个可能得到的最大的和。 【样例输入】 5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 1 【样例输出】 30 显然,我们同样可以把大问题化成小问题来解决。如样例中最底层的6就可以从次底层

动态规划典型例题

1、单调递增最长子序列 描述 求一个字符串的最长递增子序列的长度 如:dabdbf最长递增子序列就是abdf,长度为4 输入 第一行一个整数0

2、最长公共子序列 描述 如题,需要写一个程序,得出最长公共子序列。 tip:最长公共子序列也称作最长公共子串(不要求连续),英文缩写为LCS(Longest Common Subsequence)。其定义是,一个序列S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则S 称为已知序列的最长公共子序列。 输入 第一行给出一个整数N(0

3、括号匹配 时间限制:1000 ms | 内存限制:65535 KB 描述 给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来。 如: []是匹配的 ([])[]是匹配的 ((]是不匹配的 ([)]是不匹配的 输入 第一行输入一个正整数N,表示测试数据组数(N<=10) 每组测试数据都只有一行,是一个字符串S,S中只包含以上所说的四种字符, S的长度不超过100 输出 对于每组测试数据都输出一个正整数,表示最少需要添加的括号的数量。每组 测试输出占一行 样例输入 4 [] ([])[] ((] ([)] 样例输出 3 2

动态规划经典案例详解(背包问题)

动态规划经典案例详解之背包问题 【摘要】本文主要从动态规划经典案例——背包问题的动态规划设计思路出发,结合具体实例,对动态规划在程序设计中的典型应用以及衍生拓展进行详细分析。 【关键字】动态规划信息学奥赛0/1背包问题 动态规划并非一个算法,而是一种解题的思路,其核心思想是通过使用大量的存储空间把中间结果记录下来,大大减少重复计算的时间,从而提高的程序的执行效率,因为信息学奥林匹克复赛题目的解决程序一般是有时间限制的,对于某些用搜索必然耗费大量时间的题目,动态规划几乎是唯一的选择。但是动态规划并没有一个简单的模型可以套用,对于每个不同的题目都有对应的不同规划思路,我们只能通过对一些动态规划经典案例的学习来训练自己的动态规划思维能力,从而以不变应万变,应付各种复杂的程序设计,本文通过对动态规划经典案例之一的背包问题进行详细阐述,旨在让学生了解动态规划和搜索的不同设计思路以及动态规划的优越性。 【原型例题】 从n个物品中选取装入背包的物品,每件物品i的重量为wi,价值为pi。求使物品价值最高的选取方法。 【输入文件】 第一行一个数c,为背包容量。 第二行一个数n,为物品数量 第三行n个数,以空格间隔,为n个物品的重量 第四行n个数,以空格间隔,为n个物品的价值 【输出文件】 能取得的最大价值。 【分析】 初看这类问题,第一个想到的会是贪心,但是贪心法却无法保证一定能得到最优解,看以下实例: 贪心准则1:从剩余的物品中,选出可以装入背包的价值最大的物品,利用这种规则,价值最大的物品首先被装入(假设有足够容量),然后是下一个价值最大的物品,如此继续下去。这种策略不能保证得到最优解。例如,考虑n=2,w=[100,10,10],p=[20,15,15],c=105。当利用价值贪婪准则时,获得的解为x=[1,0,0],这种方案的总价值为20。而最优解为[0,1,1],其总价值为30。 贪心准则2:从剩下的物品中选择可装入背包的重量最小的物品。虽然这种规则对于前面的例子能产生最优解,但在一般情况下则不一定能得到最优解。考虑n=2,w=[10,20], p=[5,100],c=25。当利用重量贪婪策略时,获得的解为x=[1,0],比最优解[0,1]要差。

动态规划习题完整版

动态规划习题 Document serial number【NL89WT-NY98YT-NC8CB-NNUUT-NUT108】

动态规划专题分类视图数轴动规题: 题1.2001年普及组第4题--装箱问题 【问题描述】有一个箱子容量为V(正整数,0≤V≤20000),同时有n个物品(0

对于100%的数据,砝码的种类n满足:1≤n≤100; 对于30%的数据,砝码的总数量C满足:1≤C≤20; 对于100%的数据,砝码的总数量C满足:1≤C≤100; 对于所有的数据,砝码的总重量W满足:1≤W≤400000; 题3.石子归并-szgb.pas 【问题描述】有一堆石头质量分别为W1,W2,…,Wn.(Wi≤10000),将石头合并为两堆,使两堆质量的差最小。 【输入】输入文件szgb.in的第一行只有一个整数n(1≤n≤50),表示有n堆石子。接下去的n行,为每堆石子质量。 【输出】输出文件szgb.out的只有一行,该行只有一个整数,表示最小的质量差. 【样例输入】 5 5 8 13 27 14 【样例输出】 3 题4.补圣衣 【问题描述】有四个人,每人身上的衣服分别有s1,s2,s3和s4处破损,而且每处破损程度不同,破损程度用需修好它用的时间表示 (A1...As1,B1...Bs2,C1...Cs3,D1...Ds4)。不过你可以同时修补2处破损。但是这2处破损,只能是同一件衣服上的。就是说你只能同时修补一件衣服,修好了,才能修补下一件。 【输入】本题包含5行数据:第1行,为s1,s2,s3,s4(1≤s1,s2,s3,s4≤20) 第2行,为A1...As1共s1个数,表示第一件衣服上每个破损修好它所需的时间 第3行,为B1...Bs2共s2个数,表示第二件衣服上每个破损修好它所需的时间 第4行,为C1...Cs3共s3个数,表示第三件衣服上每个破损修好它所需的时间 第5行,为D1...Ds4共s4个数,表示第四件衣服上每个破损修好它所需的时间 (1≤A1...As1,B1...Bs2,C1...Cs3,D1...Ds4≤60) 【输出】输出一行,为修好四件衣服所要的最短时间。 【样例输入】 1213 5 43 6 243 【样例输出】 20 题5.光光的作业homework.pas/homework.exe 【问题描述】光光上了高中,科目增多了。在长假里,光光的老师们都非常严厉,都给他布置了一定量的作业。假期里,光光一共有的时间是k小时。在长假前,老师们一共给光光布置了n份作业,第i份作业需要的时间是ti小时。但是由于老师们互相不

动态规划法求解生产与存储问题

动态规划 一·动态规划法的发展及其研究内容 动态规划是运筹学的一个分支,是求解决策过程最优化的数学方法。20世纪50年代初美国数学家等人在研究多阶段决策过程的优化问题时,提出了著名的最优化原理,把多阶段问题转化为一系列的单阶段问题,逐个求解 创立了解决这类过程优化问题的新方法——动态规划。1957年出版的他的名著《Dynamic Proggramming》,这是该领域的第一本著作。 动态规划问世以来,在经济管理·生产调度·工程技术和最优控制等方面得到了广泛的应用。例如最短路线·库存管理·资源分配·设备更新·组合·排序·装载等问题,采用动态规划法求解比用其他方法更为简便。 二·动态规划法基本概念 一个多阶段决策过程最优化问题的动态规划模型通常包括以下几个要素: 1.阶段 阶段(stage)是对整个过程的自然划分。通常根据时间顺序或是空间特征来划分阶段,对于与时间,空间无关的“静态”优化问题,可以根据其自然特征,人为的赋予“时段”概念,将静态问题动态化,以便按阶段的顺序解优化问题。阶段变量一般用k=….n.表示。

1.状态 状态(state)是我们所研究的问题(也叫系统)在过个阶段的初始状态或客观条件。它应能描述过程的特征并且具有无后效性,即当某阶段的状态给定时,这个阶段以后的过程的演变与该阶段以前各阶段的状态无关。通常还要求状态是可以直接或者是间接可以观测的。描述状态的变量称为状态变量(State Virable)用s 表示,状态变量的取值集合称为状态集合,用S表示。变量允许取值的范围称为允许状态集合(set of admissble states).用x(k)表示第k阶段的状态变量,它可以是一个数或者是一个向量。用X(k)表示第k阶段的允许状态集合。 n 个阶段的决策过程有n+1个状态变量,x(n+1)是x(n)的演变的结果。 根据演变过程的具体情况,状态变量可以是离散的或是连续的。为了计算方便有时将连续变量离散化,为了分析的方便有时又将离散的变量视为连续的。 2.决策 当一个阶段的状态确定后,可以做出各种选择从而演变 到下一阶段的某个状态,这种选择手段称为决策 (decision),在最优控制问题中也称为控制(control)描述决策的变量称为决策变量(decision virable)。 变量允许取值的范围称为允许决策集合(set of

动态规划试题

动态规划 1.最佳队形(bestqueue; 时限:1s; 128MB) 【题目描述】 要参加复赛了,大家都在体育馆门口集合完毕,由于这次参赛的人数较多,上车前需要排一下队,所有人自愿排成两队(分别定义为A和B队列,人数大于1且两队人数随意),Ms. Zhou给每位同学一张纸,每人默默写下一个字母代表自己,比如:郑逸宁写Z,吴天舒写W等等。 A队: 字母:c m c B队: 字母:s n m n 最佳队形为: 1、每个人前后可以有任意个空位,也可以没有空位; 2、两队在添加空位后长度必须一样,上图可以有多种方案使得A、B两队长度一致, 例如: 3、根据每个人所写的字母,我们定义A队与B队的距离为相应位置上的字母的距离总 和; 4、两队相应位置的距离定义为:

(1)两个非空位的距离定义为它们的所写字母ASCII码的差的绝对值; (2)空位与其他任意非空位之间的距离为已知的定值K; (3)空位与空位的距离为0。 5、最佳队形为:在A、B的所有可能队形中,必定存在两个等长的队A’、B’,使得A’ 与B’之间的距离达到最小,这个队形就是最佳队形。 请你写一个程序,求出最佳队形时,A队与B队的距离。 【输入数据】 输入文件第一行为队列A每个人所写字母组成的字符串A; 第二行为队列B每个人所写字母组成的字符串B。(约定:A、B均由小写字母组成且长度均不超过2000)。 第三行为一个整数K(1≤K≤100),表示空位与非空位的距离。 【输出数据】 输出文件仅一行包含一个整数,表示所求得最佳队形A、B之间的距离。 【样例】 bestqueue.in bestqueue.in cmc 10 snmn 2 2. 数学作业(homework; 时限:1s; 128MB) 【问题描述】 数学竞赛刚刚结束,据说题目很难,不过信息学里面的数学题也不容易哦,题目描述很简单:求:方程x1+2x2+…+nx n=m的所有非负整数解(x1,x2,…,x n)的个数。例如,方程:x1+2x2+3x3+4x4+5x5=5有7组解:(5,0,0,0,0)、(3,1,0 ,0,0)、…、(0,0,0,0,1)。 运用你的数学思维加上强大的信息学能力,试试解决它吧! 【输入数据】 2个整数n,m 【输出数据】 方程非负整数解的个数ans,如果解超过10^9,只需输出ans mod 10^9。

经典的动态规划入门练习题

动态规划入门练习题 1.石子合并 在一个圆形操场的四周摆放着N堆石子(N<= 100),现要将石子有次序地合并成一堆.规定每次只能选取相邻的两堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分.编一程序,由文件读入堆栈数N及每堆栈的石子数(<=20). (1)选择一种合并石子的方案,使用权得做N-1次合并,得分的总和最小; (2)选择一种合并石子的方案,使用权得做N-1次合并,得分的总和最大; 输入数据: 第一行为石子堆数N; 第二行为每堆的石子数,每两个数之间用一个空格分隔. 输出数据: 从第一至第N行为得分最小的合并方案.第N+1行是空行.从第N+2行到第2N+1行是得分最大合并方案.每种合并方案用N行表示,其中第i行(1<=i<=N)表示第i次合并前各堆的石子数(依顺时针次序输出,哪一堆先输出均可).要求将待合并的两堆石子数以相应的负数表示. 输入输出范例: 输入: 4 4 5 9 4 输出: -459-4 -8-59 -13-9 224-5-94 4-14-4 -4-18 22 最小代价子母树设有一排数,共n个,例如:22 14 7 13 26 15 11.任意2个相邻的数可以进行归并,归并的代价为该两个数的和,经过不断的归并,最后归为一堆,而全部归并代价的和称为总代价,给出一种归并算法,使总代价为最小. 输入、输出数据格式与“石子合并”相同。 输入样例: 4 12 5 16 4 输出样例: -12-5164 17-16-4 -17-20 37

2.背包问题 设有n种物品,每种物品有一个重量及一个价值。但每种物品的数量是无限的,同时有一个背包,最大载重量为XK,今从n种物品中选取若干件(同一种物品可以多次选取),使其重量的和小于等于XK,而价值的和为最大。 输入数据: 第一行两个数:物品总数N,背包载重量XK;两个数用空格分隔; 第二行N个数,为N种物品重量;两个数用空格分隔; 第三行N个数,为N种物品价值; 两个数用空格分隔; 输出数据: 第一行总价值; 以下N行,每行两个数,分别为选取物品的编号及数量; 输入样例: 4 10 2 3 4 7 1 3 5 9 输出样例: 12 2 1 4 1 3.商店购物 某商店中每种商品都有一个价格。例如,一朵花的价格是2 ICU(ICU 是信息学竞赛的货币的单位);一个花瓶的价格是5 ICU。为了吸引更多的顾客,商店提供了特殊优惠价。特殊优惠商品是把一种或几种商品分成一组。并降价销售。例如:3朵花的价格不是6而是5 ICU ;2个花瓶加1朵花是10 ICU不是12 ICU。 编一个程序,计算某个顾客所购商品应付的费用。要充分利用优惠价以使顾客付款最小。请注意,你不能变更顾客所购商品的种类及数量,即使增加某些商品会使付款总数减小也不允许你作出任何变更。假定各种商品价格用优惠价如上所述,并且某顾客购买物品为:3朵花和2个花瓶。那么顾客应付款为14 ICU 因为: 1朵花加2个花瓶: 优惠价:10 ICU 2朵花正常价: 4 ICU 输入数据 用两个文件表示输入数据。第一个文件INPUT.TXT描述顾客所购物品(放在购物筐中);第二个文件描述商店提供的优惠商品及价格(文件名为OFF ER.TXT)。两个文件中都只用整数。 第一个文件INPUT.TXT的格式为:第一行是一个数字B(0≤B≤5),表示所购商品种类数。下面共B行,每行中含3个数C,K,P。 C 代表商品的编码(每种商品有一个唯一的编码),1≤C≤999。K代表该种商品购买总数,1≤K≤5。P 是该种商品的正常单价(每件商品的价格),1≤P≤999。请注意,购物筐中最多可放5*5=25件商品。 第二个文件OFFER.TXT的格式为:第一行是一个数字S(0≤S≤9 9),表示共有S 种优惠。下面共S行,每一行描述一种优惠商品的组合中商品的种类。下面接着是几个数字对(C,K),其中C代表商品编码,1≤C≤9 99。K代表该种商品在此组合中的数量,1≤K≤5。本行最后一个数字P(1≤ P≤9999)代表此商品组合的优惠价。当然,优惠价要低于该组合中商品正常价之总和。 输出数据 在输出文件OUTPUT.TXT中写一个数字(占一行),该数字表示顾客所购商品(输入文件指明所购商品)

动态规划理论(精华)

动态规划理论 一.动态规划的逆向思维法 动态规划是一种思维方法,没有统一的、具体的模式。动态规划可以从多方面去考察,不同的方面对动 态规划有不同的表述。我们不打算强加一种统一的表述,而是从多个角度对动态规划的思维方法进行讨 论,希望大家在思维具体问题时,也能够从多个角度展开,这样收获会更大。 逆向思维法是指从问题目标状态出发倒推回初始状态或边界状态的思维方法。如果原问题可以分解成 几个本质相同、规模较小的问题,很自然就会联想到从逆向思维的角度寻求问题的解决。 你也许会想,这种将大问题分解成小问题的思维不就是分治法吗?动态规划是不是分而治之呢?其实, 虽然我们在运用动态规划的逆向思维法和分治法分析问题时,都使用了这种将问题实例归纳为更小的、 相似的子问题,并通过求解子问题产生一个全局最优值的思路,但动态规划不是分治法:关键在于分解 出来的各个子问题的性质不同。 分治法要求各个子问题是独立的(即不包含公共的子问题),因此一旦递归地求出各个子问题的解后, 便可自下而上地将子问题的解合并成原问题的解。如果各子问题是不独立的,那么分治法就要做许多不 必要的工作,重复地解公共的子问题。 动态规划与分治法的不同之处在于动态规划允许这些子问题不独立(即各子问题可包含公共的子问题) ,它对每个子问题只解一次,并将结果保存起来,避免每次碰到时都要重复计算。这就是动态规划高效

的一个原因。 动态规划的逆向思维法的要点可归纳为以下三个步骤: (1)分析最优值的结构,刻画其结构特征; (2)递归地定义最优值;0 (3)按自底向上或自顶向下记忆化的方式计算最优值。 【例题1】背包问题描述: 有一个负重能力为m的背包和n种物品,第i种物品的价值为v,重量为w。在不超过背包负重能力的前 提下选择若干个物品装入背包,使这些的物品的价值之和最大。每种物品可以不选,也可以选择多个。 假设每种物品都有足够的数量。 分析: 从算法的角度看,解决背包问题一种最简单的方法是枚举所有可能的物品的组合方案并计算这个组合 方案的价值之和,从中找出价值之和最大的方案。显然,这种靠穷举所有可能方案的方法不是一种有效 的算法。 但是这个问题可以使用动态规划加以解决。下面我们用动态规划的逆向思维法来分析这个问题。 (1)背包问题最优值的结构 动态规划的逆向思维法的第一步是刻画一个最优值的结构,如果我们能分析出一个问题的最优值包含 其子问题的最优值,问题的这种性质称为最优子结构。一个问题的最优子结构性质是该问题可以使用动 态规划的显著特征。 对一个负重能力为m的背包,如果我们选择装入一个第 i 种物品,那么原背包问题就转化为负重能力 为 m-w 的子背包问题。原背包问题的最优值包含这个子背包问题的最优值。若我们用背包的负重能力来 划分状态,令状态变量s[k]表示负重能力为k的背包,那么s[m]的值只取决于s[k](k≤m)的值。因此背包

动态规划习题

动态规划专题分类视图 数轴动规题: (1) 较复杂的数轴动规 (4) 线性动规 (7) 区域动规: (14) 未知的动规: (20) 数轴动规题: 题1.2001年普及组第4题--装箱问题 【问题描述】有一个箱子容量为V(正整数,0≤V≤20000),同时有n个物品(0

的个数,但不包括一个砝码也不用的情况。 【输入格式】输入文件weight.in的第一行只有一个数n,表示不同的砝码的种类数. 第2行至第n+1行,每行有两个整数.第k+1行的两个数分别表示第k种砝码的个数和重量. 【输出格式】输出文件weight.out中只有一行数据:Total=N。表示用这些砝码能秤出的不同重量数。【输入样例】 2 2 2 2 3 【输出样例】 Total=8 【样例说明】 重量2,3,4,5,6,7,8,10都能秤得 【数据限制】 对于100%的数据,砝码的种类n满足:1≤n≤100; 对于30%的数据,砝码的总数量C满足:1≤C≤20; 对于100%的数据,砝码的总数量C满足:1≤C≤100; 对于所有的数据,砝码的总重量W满足:1≤W≤400000; 题3.石子归并-szgb.pas 【问题描述】有一堆石头质量分别为W1,W2,…,Wn.(Wi≤10000),将石头合并为两堆,使两堆质量的差最小。 【输入】输入文件szgb.in的第一行只有一个整数n(1≤n≤50),表示有n堆石子。接下去的n行,为每堆石子质量。 【输出】输出文件szgb.out的只有一行,该行只有一个整数,表示最小的质量差. 【样例输入】 5 5 8 13 27 14 【样例输出】 3 题4.补圣衣 【问题描述】有四个人,每人身上的衣服分别有s1,s2,s3和s4处破损,而且每处破损程度不同,破损程度用需修好它用的时间表示(A1...As1,B1...Bs2,C1...Cs3,D1...Ds4)。不过你可以同时修补2处破损。但是这2处破损,只能是同一件衣服上的。就是说你只能同时修补一件衣服,修好了,才能修补下一件。【输入】本题包含5行数据:第1行,为s1,s2,s3,s4(1≤s1,s2,s3,s4≤20) 第2行,为A1...As1 共s1个数,表示第一件衣服上每个破损修好它所需的时间 第3行,为B1...Bs2 共s2个数,表示第二件衣服上每个破损修好它所需的时间 第4行,为C1...Cs3 共s3个数,表示第三件衣服上每个破损修好它所需的时间 第5行,为D1...Ds4 共s4个数,表示第四件衣服上每个破损修好它所需的时间 (1≤A1...As1,B1...Bs2,C1...Cs3,D1...Ds4≤60)

5 动态规划算法习题答案

1.最大子段和问题:给定整数序列 n a a a ,,,21 ,求该序列形如∑=j i k k a 的子段和 的最大值: ? ?? ???∑=≤≤≤j i k k n j i a 1max ,0max 1) 已知一个简单算法如下: int Maxsum(int n,int a,int& best i,int& bestj){ int sum = 0; for (int i=1;i<=n;i++){ int suma = 0; for (int j=i;j<=n;j++){ suma + = a[j]; if (suma > sum){ sum = suma; besti = i; bestj = j; } } } return sum; }试分析该算法的时间复杂性。 2) 试用分治算法解最大子段和问题,并分析算法的时间复杂性。 3) 试说明最大子段和问题具有最优子结构性质,并设计一个动态规划算法解最大子段和问题。分析算法的时间复杂度。 (提示:令1()m ax ,1,2,,j k i j n k i b j a j n ≤≤≤===∑ ) 解:1)分析按照第一章,列出步数统计表,计算可得)(2 n O 2)分治算法:将所给的序列a[1:n]分为两段a [1:n/2]、a[n/2+1:n],分别求出 这两段的最大子段和,则a[1:n]的最大子段和有三种可能: ①a[1:n]的最大子段和与a[1:n/2]的最大子段和相同; ②a[1:n]的最大子段和与a[n/2+1:n]的最大子段和相同; ③a[1:n]的最大子段和为两部分的字段和组成,即 j n j i l n i j a a a a a +++++=+?? ? ???=?? ????∑ 122;

相关文档
最新文档