中国数学建模编程交流动态规划算法2.docx

上传人:b****3 文档编号:26573560 上传时间:2023-06-20 格式:DOCX 页数:27 大小:31.83KB
下载 相关 举报
中国数学建模编程交流动态规划算法2.docx_第1页
第1页 / 共27页
中国数学建模编程交流动态规划算法2.docx_第2页
第2页 / 共27页
中国数学建模编程交流动态规划算法2.docx_第3页
第3页 / 共27页
中国数学建模编程交流动态规划算法2.docx_第4页
第4页 / 共27页
中国数学建模编程交流动态规划算法2.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

中国数学建模编程交流动态规划算法2.docx

《中国数学建模编程交流动态规划算法2.docx》由会员分享,可在线阅读,更多相关《中国数学建模编程交流动态规划算法2.docx(27页珍藏版)》请在冰豆网上搜索。

中国数学建模编程交流动态规划算法2.docx

中国数学建模编程交流动态规划算法2

中国数学建模-编程交流-动态规划算法

wh-ee重登录隐身用户控制面板搜索风格论坛状态论坛展区社区服务社区休闲网站首页退出

>>VC++,C,Perl,Asp...编程学习,算法介绍.我的收件箱(0)

中国数学建模→学术区→编程交流→动态规划算法

您是本帖的第641个阅读者

*贴子主题:

动态规划算法

b

等级:

职业侠客

文章:

470

积分:

956

门派:

黑客帝国

注册:

2003-8-28

第11楼

 

动态规划的基本思想

前文主要介绍了动态规划的一些理论依据,我们将前文所说的具有明显的阶段划分和状态转移方程的动态规划称为标准动态规划,这种标准动态规划是在研究多阶段决策问题时推导出来的,具有严格的数学形式,适合用于理论上的分析。

在实际应用中,许多问题的阶段划分并不明显,这时如果刻意地划分阶段法反而麻烦。

一般来说,只要该问题可以划分成规模更小的子问题,并且原问题的最优解中包含了子问题的最优解(即满足最优子化原理),则可以考虑用动态规划解决。

动态规划的实质是分治思想和解决冗余,因此,动态规划是一种将问题实例分解为更小的、相似的子问题,并存储子问题的解而避免计算重复的子问题,以解决最优化问题的算法策略。

由此可知,动态规划法与分治法和贪心法类似,它们都是将问题实例归纳为更小的、相似的子问题,并通过求解子问题产生一个全局最优解。

其中贪心法的当前选择可能要依赖已经作出的所有选择,但不依赖于有待于做出的选择和子问题。

因此贪心法自顶向下,一步一步地作出贪心选择;而分治法中的各个子问题是独立的

(即不包含公共的子子问题),因此一旦递归地求出各子问题的解后,便可自下而上地将子问题的解合并成问题的解。

但不足的是,如果当前选择可能要依赖子问题的解时,则难以通过局部的贪心策略达到全局最优解;如果各子问题是不独立的,则分治法要做许多不必要的工作,重复地解公共的子问题。

解决上述问题的办法是利用动态规划。

该方法主要应用于最优化问题,这类问题会有多种可能的解,每个解都有一个值,而动态规划找出其中最优(最大或最小)值的解。

若存在若干个取最优值的解的话,它只取其中的一个。

在求解过程中,该方法也是通过求解局部子问题的解达到全局最优解,但与分治法和贪心法不同的是,动态规划允许这些子问题不独立,(亦即各子问题可包含公共的子子问题)也允许其通过自身子问题的解作出选择,该方法对每一个子问题只解一次,并将结果保存起来,避免每次碰到时都要重复计算。

因此,动态规划法所针对的问题有一个显著的特征,即它所对应的子问题树中的子问题呈现大量的重复。

动态规划法的关键就在于,对于重复出现的子问题,只在第一次遇到时加以求解,并把答案保存起来,让以后再遇到时直接引用,不必重新求解。

 

----------------------------------------------

plot(100+t+15*cos(3.05*t),t=0..200,coords=polar,axes=none,scaling=constrained);

 

2004-5-2819:

46:

48

b

等级:

职业侠客

文章:

470

积分:

956

门派:

黑客帝国

注册:

2003-8-28

第12楼

 

动态规划算法的基本步骤

设计一个标准的动态规划算法,通常可按以下几个步骤进行:

划分阶段:

按照问题的时间或空间特征,把问题分为若干个阶段。

注意这若干个阶段一定要是有序的或者是可排序的(即无后向性),否则问题就无法用动态规划求解。

 

选择状态:

将问题发展到各个阶段时所处于的各种客观情况用不同的状态表示出来。

当然,状态的选择要满足无后效性。

确定决策并写出状态转移方程:

之所以把这两步放在一起,是因为决策和状态转移有着天然的联系,状态转移就是根据上一阶段的状态和决策来导出本阶段的状态。

所以,如果我们确定了决策,状态转移方程也就写出来了。

但事实上,我们常常是反过来做,根据相邻两段的各状态之间的关系来确定决策。

 

写出规划方程(包括边界条件):

动态规划的基本方程是规划方程的通用形式化表达式。

一般说来,只要阶段、状态、决策和状态转移确定了,这一步还是比较简单的。

动态规划的主要难点在于理论上的设计,一旦设计完成,实现部分就会非常简单。

根据动态规划的基本方程可以直接递归计算最优值,但是一般将其改为递推计算,实现的大体上的框架如下:

标准动态规划的基本框架

1.对fn+1(xn+1)初始化;{边界条件}2.fork:

=ndownto1do3.for每一个xk∈Xkdo4.for每一个uk∈Uk(xk)dobegin5.fk(xk):

=一个极值;{∞或-∞}6.xk+1:

=Tk(xk,uk);{状态转移方程}7.t:

=φ(fk+1(xk+1),vk(xk,uk));{基本方程(9)式}8.ift比fk(xk)更优thenfk(xk):

=t;{计算fk(xk)的最优值}end;9.t:

=一个极值;{∞或-∞}10.for每一个x1∈X1do11.iff1(x1)比t更优thent:

=f1(x1);{按照10式求出最优指标}12.输出t;但是,实际应用当中经常不显式地按照上面步骤设计动态规划,而是按以下几个步骤进行:

分析最优解的性质,并刻划其结构特征。

递归地定义最优值。

以自底向上的方式或自顶向下的记忆化方法(备忘录法)计算出最优值。

根据计算最优值时得到的信息,构造一个最优解。

步骤

(1)--(3)是动态规划算法的基本步骤。

在只需要求出最优值的情形,步骤(4)可以省略,若需要求出问题的一个最优解,则必须执行步骤(4)。

此时,在步骤(3)中计算最优值时,通常需记录更多的信息,以便在步骤(4)中,根据所记录的信息,快速地构造出一个最优解。

--#EndEditable-->

----------------------------------------------

plot(100+t+15*cos(3.05*t),t=0..200,coords=polar,axes=none,scaling=constrained);

 

2004-5-2819:

47:

05

b

等级:

职业侠客

文章:

470

积分:

956

门派:

黑客帝国

注册:

2003-8-28

第13楼

 

动态规划的实例分析

下面我们将通过实例来分析动态规划的设计步骤和具体应用。

例1已经在前文介绍过了。

例1和例2是标准的动态规划,有明显的阶段和状态转移方程;例3、例4、例5、例6是没有明显阶段划分的动态规划,也是一般常见的形式,其中对例4、例5、例6作了比较详细的分析;例7是比较特殊的动态规划,例8是两重动态规划(即为了解决问题要进行两次动态规划)的例子。

例1最短路径问题

例2生产计划问题

例3Bitonic旅行路线问题

例4计算矩阵连乘积

例5最长公共子序列

例6凸多边形的最优三角剖分问题

例7多边形计算

例8字符识别

 

----------------------------------------------

plot(100+t+15*cos(3.05*t),t=0..200,coords=polar,axes=none,scaling=constrained);

 

2004-5-2819:

47:

32

b

等级:

职业侠客

文章:

470

积分:

956

门派:

黑客帝国

注册:

2003-8-28

第14楼

 

动态规划的技巧——阶段的划分和状态的表示

在动态规划的设计过程中,阶段的划分和状态的表示是非常重要的两步,这两步会直接影响该问题的计算复杂性,有时候阶段划分或状态表示的不合理还会使得动态规划法不适用。

[例9]街道问题

在下图中找出从左下角到右上角的最短路径,每步只能向右方或上方走。

这是一道简单而又典型的动态规划题,许多介绍动态规划的书与文章中都拿它来做例子。

通常,书上的解答是这样的:

按照图中的虚线来划分阶段,即阶段变量k表示走过的步数,而状态变量xk表示当前处于这一阶段上的哪一点。

这时的模型实际上已经转化成了一个特殊的多段图。

用决策变量uk=0表示向右走,uk=1表示向上走,则状态转移方程如下:

(这里的row是地图竖直方向的行数)

我们看到,这个状态转移方程需要根据k的取值分两种情况讨论,显得非常麻烦。

相应的,把它代入规划方程而付诸实现时,算法也很繁。

因而我们在实现时,一般是不会这么做的,而代之以下面方法:

(这里Distance表示相邻两点间的边长)

这样做确实要比上面的方法简单多了,但是它已经破坏了动态规划的本来面目,而不存在明确的阶段特征了。

如果说这种方法是以地图中的行(A、B、C、D)来划分阶段的话,那么它的"状态转移"就不全是在两个阶段之间进行的了。

也许这没什么大不了的,因为实践比理论更有说服力。

但是,如果我们把题目扩展一下:

在地图中找出从左下角到右上角的两条路径,两条路径中的任何一条边都不能重叠,并且要求两条路径的总长度最短。

这时,再用这种"简单"的方法就不太好办了。

如果非得套用这种方法的话,则最优指标函数就需要有四维的下标,并且难以处理两条路径"不能重叠"的问题。

而我们回到原先"标准"的动态规划法,就会发现这个问题很好解决,只需要加一维状态变量就成了。

即用xk=(ak,bk)分别表示两条路径走到阶段k时所处的位置,相应的,决策变量也增加一维,用uk=(xk,yk)分别表示两条路径的行走方向。

状态转移时将两条路径分别考虑

在写规划方程时,只要对两条路径走到同一个点的情况稍微处理一下,减少可选的决策个数:

从这个例子可以看出,合理地划分阶段和选择状态可以给解题带来方便。

 

----------------------------------------------

plot(100+t+15*cos(3.05*t),t=0..200,coords=polar,axes=none,scaling=constrained);

 

2004-5-2819:

48:

30

b

等级:

职业侠客

文章:

470

积分:

956

门派:

黑客帝国

注册:

2003-8-28

第15楼

 

[例10]LITTLESHOPOFFLOWERS(IOI’99)

PROBLEM

Youwanttoarrangethewindowofyourflowershopinamost

pleasantway.YouhaveFbunchesofflowers,eachbeingofa

differentkind,andatleastasmanyvasesorderedinarow.The

vasesaregluedontotheshelfandarenumberedconsecutively1

throughV,whereVisthenumberofvases,fromlefttorightso

thatthevase1istheleftmost,andthevaseVistherightmost

vase.Thebunchesaremoveableandareuniquelyidentifiedby

integersbetween1andF.Theseid-numbershaveasignificance:

Theydeterminetherequiredorderofappearanceoftheflower

bunchesintherowofvasessothatthebunchimustbeinavase

totheleftofthevasecontainingbunchjwheneveri

Suppose,forexample,youhaveabunchofazaleas(id-number=1),a

bunchofbegonias(id-number=2)andabunchofcarnations

(id-number=3).Now,allthebunchesmustbeputintothevases

keepingtheirid-numbersinorder.Thebunchofazaleasmustbein

avasetotheleftofbegonias,andthebunchofbegoniasmustbe

inavasetotheleftofcarnations.Iftherearemorevasesthan

bunchesofflowersthentheexcesswillbeleftempty.Avasecan

holdonlyonebunchofflowers.

Eachvasehasadistinctcharacteristic(justlikeflowersdo).

Hence,puttingabunchofflowersinavaseresultsinacertain

aestheticvalue,expressedbyaninteger.Theaestheticvaluesare

presentedinatableasshownbelow.Leavingavaseemptyhasan

aestheticvalueof0.

 VASES

12345

Bunches1(azaleas)723-5-2416

2(begonias)521-41023

3(carnations)-215-4-2020

Accordingtothetable,azaleas,forexample,wouldlookgreatin

vase2,buttheywouldlookawfulinvase4.

Toachievethemostpleasanteffectyouhavetomaximizethesum

ofaestheticvaluesforthearrangementwhilekeepingtherequired

orderingoftheflowers.Ifmorethanonearrangementhasthe

maximalsumvalue,anyoneofthemwillbeacceptable.Youhaveto

produceexactlyonearrangement.

ASSUMPTIONS

1<=F<=100whereFisthenumberofthebunchesofflowers.

Thebunchesarenumbered1throughF.

F<=V<=100whereVisthenumberofvases.

-50<=Aij<=50whereAijistheaestheticvalueobtainedby

puttingtheflowerbunchiintothevasej.

INPUT

Theinputisatextfilenamedflower.inp.

Thefirstlinecontainstwonumbers:

F,V.

ThefollowingFlines:

EachoftheselinescontainsVintegers,

sothatAijisgivenasthejthnumberonthe(i+1)stlineof

theinputfile.

OUTPUT

Theoutputmustbeatextfilenamedflower.outconsistingoftwo

lines:

Thefirstlinewillcontainthesumofaestheticvaluesforyour

arrangement.

ThesecondlinemustpresentthearrangementasalistofF

numbers,sothatthek’thnumberonthislineidentifiesthe

vaseinwhichthebunchkisput.

EXAMPLE

flower.inp:

35723-5-2416521-41023-215-4-2020

flower.out:

53245

EVALUATION

Yourprogramwillbeallowedtorun2seconds.

Nopartialcreditcanbeobtainedforatestcase.

本题虽然是IOI’99中较为简单的一题,但其中大有文章可作。

说它简单,是因为它有序,因此我们一眼便可看出这题应该用动态规划来解决。

但是,如何动态规划呢?

如何划分阶段,又如何选择状态呢?

<方法1>

以花束的编号来划分阶段。

在这里,第k阶段布置第k束花,共有F束花,有F+1个阶段,增加第F+1阶段是为了计算的方便;状态变量xk表示第k束花所在的花瓶。

而对于每一个状态xk,决策uk就是第k+1束花放置的花瓶号;最优指标函数fk(xk)表示从第k束花到第n束花所得到的最大美学值;A(i,j)是花束i插在花瓶j中的美学值,V是花瓶总数,F是花的总数。

状态转移方程为

规划方程为

边界条件为:

事实上这是一个虚拟的边界。

最后要求的最大美学价值是

<方法2>

方法1的规划方程中的允许决策空间:

xk+1≤uk≤V-(F-k)+1

比较麻烦,因此有待改进。

还是以花束的编号来划分阶段,第k阶段布置第k束花;状态变量xk表示第k束花所在的花瓶;注意,这里我们考虑倒过来布置花瓶,即从第F束花开始布置到第1束花。

于是状态变量uk表示第k-1束花所在的花瓶;最优指标fk(xk)表示从第一束花到第k束花所获得的美学价值;A(i,j)是花束i插在花瓶j中的美学值,V是花瓶总数,F是花的总数。

则状态转移方程为:

规划方程为:

增加的虚拟边界条件为:

最后要求的最大美学价值是:

可以看出,这种方法实质上和方法1没有区别,但是允许决策空间的表示变得简单了。

<方法3>

以花瓶的数目来划分阶段,第k个阶段决定花瓶k中是否放花;状态变量xk表示前k个花瓶中放了多少花;而对于任意一个状态xk,决策就是第xk束花是否放在第k个花瓶中,用变量uk=1或0来表示。

最优指标函数fk(xk)表示前k个花瓶中插了xk束花,所能取得的最大美学值。

注意,这里仍然是倒过来考虑。

状态转移方程为

规划方程为

边界条件为

三种不同的方法都成功地解决了问题,只不过因为阶段的划分不同,状态的表示不同,决策的选择有多有少,所以算法的时间复杂度也就不同。

这个例子具有很大的普遍性。

有很多的多阶段决策问题都有着不止一种的阶段划分方法,因而往往就有不止一种的规划方法。

有时各种方法所产生的效果是差不多的,但更多的时候,就像我们的例子一样,两种方法会在某个方面有些区别。

所以,在用动态规划解题的时候,可以多想一想是否有其它的解法。

对于不同的解法,要注意比较,好的算法好在哪里,差一点的算法差在哪里。

从各种不同算法的比较中,我们可以更深刻地领会动态规划的构思技巧。

--#EndEditable-->

----------------------------------------------

plot(100+t+15*cos(3.05*t),t=0..200,coords=polar,axes=none,scaling=constrained);

 

2004-5-2819:

48:

44

b

等级:

职业侠客

文章:

470

积分:

956

门派:

黑客帝国

注册:

2003-8-28

第16楼

 

动态规划实现中的问题

应用动态规划解决问题,在有了基本的思路之后,一般来说,算法实现是比较好考虑的。

但有时也会遇到一些问题,而使算法难以实现。

动态规划思想设计的算法从整体上来看基本都是按照得出的递推关系式进行递推,这种递推相对于计算机来说,只要设计得当,效率往往是比较高的,这样在时间上溢出的可能性不大,而相反地,动态规划需要很大的空间以存储中间产生的结果,这样可以使包含同一个子问题的所有问题共用一个子问题解,从而体现动态规划的优越性,但这是以牺牲空间为代价的,为了有效地访问已有结果,数据也不易压缩存储,因而空间矛盾是比较突出的。

另一方面,动态规划的高时效性往往要通过大的测试数据体现出来(以与搜索作比较),因而,对于大规模的问题如何在基本不影响运行速度的条件下,解决空间溢出的问题,是动态规划解决问题时一个普遍会遇到的问题。

对于这个问题,可以考虑从以下一些方面去尝试:

一个思考方向是尽可能少占用空间。

如从结点的数据结构上考虑,仅仅存储必不可少的内容,以及数据存储范围上精打细算(按位存储、压缩存储等)。

当然这要因问题而异,进行分析。

另外,在实现动态规划时,一个我们经常采用的方法是用一个与结点数一样多的数组来存储每一步的决策,这对于倒推求得一种实现最优解的方法是十分方便的,而且处理速度也有一些提高。

但是在内存空间紧张的情况下,我们就应该抓住问题的主要矛盾。

省去这个存储决策的数组,而改成在从最优解逐级倒推时,再计算一次,选择某个可能达到这个值的上一阶段的状态,直到推出结果为止。

这样做,在程序编写上比上一种做法稍微多花一点时间,运行的时效也可能会有一些(但往往很小)的下降,但却换来了很多的空间。

因而这种思想在处理某些问题时,是很有意义的。

但有时,即使采用这样的方法也会发现空间溢出的问题。

这时就要分析,这些保留下来的数据是否有必要同时存在于内存之中。

因为有很多问题,动态规划递推在处理后面的内容时,前面比较远处的内容实际上是用不着的。

对于这类问题,在已经确信不

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 冶金矿山地质

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1