数模论坛

 找回密码
 注-册-帐-号
搜索
热搜: 活动 交友 discuz
查看: 26753|回复: 28

动态规划算法

  [复制链接]
b
发表于 2004-5-29 03:39:12 | 显示全部楼层 |阅读模式
<>动态规划
<FONT face=Arial>Dynamic Programming</FONT></P>
<>Starfish (<a href="http://www.shumo.org/bbs/mailtstarfish.h@china.com" target="_blank" >starfish.h@china.com</A>)</P>
<><B>摘要</B></P>
<P>本文介绍了动态规划的基本思想和基本步骤,通过实例研究了利用动态规划设计算法的具体途径,讨论了动态规划的一些实现技巧,并将动态规划和其他一些算法作了比较,最后还简单介绍了动态规划的数学理论基础和当前最新的研究成果。</P>
b
 楼主| 发表于 2004-5-29 03:41:31 | 显示全部楼层
<><B>目录</B></P><UL><LI><a href="http://algorithm.myrice.com/algorithm/technique/dynamic_programming/introduction.htm" target="_blank" >引言</A> <LI><a href="http://algorithm.myrice.com/algorithm/technique/dynamic_programming/chapter1.htm" target="_blank" >动态规划的基本概念</A> <LI><a href="http://algorithm.myrice.com/algorithm/technique/dynamic_programming/chapter2.htm" target="_blank" >动态规划的基本定理和基本方程</A> <LI><a href="http://algorithm.myrice.com/algorithm/technique/dynamic_programming/chapter3.htm" target="_blank" >动态规划的适用条件</A> <LI><a href="http://algorithm.myrice.com/algorithm/technique/dynamic_programming/chapter4.htm" target="_blank" >动态规划的基本思想</A> <LI><a href="http://algorithm.myrice.com/algorithm/technique/dynamic_programming/chapter5.htm" target="_blank" >动态规划的基本步骤</A> <LI><a href="http://algorithm.myrice.com/algorithm/technique/dynamic_programming/chapter6.htm" target="_blank" >动态规划的实例分析</A> <LI><a href="http://algorithm.myrice.com/algorithm/technique/dynamic_programming/chapter7.htm" target="_blank" >动态规划的技巧</A> <LI><a href="http://algorithm.myrice.com/algorithm/technique/dynamic_programming/chapter8.htm" target="_blank" >动态规划实现中的问题</A> <LI><a href="http://algorithm.myrice.com/algorithm/technique/dynamic_programming/chapter9.htm" target="_blank" >动态规划与其他算法的比较 </A><LI><a href="http://algorithm.myrice.com/algorithm/technique/dynamic_programming/chapter10.htm" target="_blank" >动态规划的理论基础</A> <LI><a href="http://algorithm.myrice.com/algorithm/technique/dynamic_programming/chapter11.htm" target="_blank" >其他资料</A> </LI></UL>
b
 楼主| 发表于 2004-5-29 03:42:19 | 显示全部楼层
<H2>引言——由一个问题引出的算法</H2><>考虑以下问题</P><><B>[例1] </B>最短路径问题</P><>现有一张地图,各结点代表城市,两结点间连线代表道路,线上数字表示城市间的距离。如图1所示,试找出从结点A到结点E的最短距离。</P><P align=center><img src="http://algorithm.myrice.com/algorithm/technique/dynamic_programming/IMAGES/dynami3.gif"></P><P align=center>图 1</P><P>我们可以用深度优先搜索法来解决此问题,该问题的递归式为</P><P><img src="http://algorithm.myrice.com/algorithm/technique/dynamic_programming/images/exp1.gif"></P><P>其中<img src="http://algorithm.myrice.com/algorithm/technique/dynamic_programming/images/exp11.gif">是与v相邻的节点的集合,w(v,u)表示从v到u的边的长度。</P><P>具体算法如下:</P>
b
 楼主| 发表于 2004-5-29 03:42:36 | 显示全部楼层
function MinDistance(v):integer;
begin
if v=E then return 0
  else
   begin
    min:=maxint;
    for 所有没有访问过的节点i do
     if v和i相邻 then
      begin
        标记i访问过了;
        t:=v到i的距离+MinDistance(i);
        标记i未访问过;        
        if t&lt;min then min=t;
      end;  
   end;
end;
b
 楼主| 发表于 2004-5-29 03:43:07 | 显示全部楼层
<>开始时标记所有的顶点未访问过,MinDistance(A)就是从A到E的最短距离。</P><>这个程序的效率如何呢?我们可以看到,每次除了已经访问过的城市外,其他城市都要访问,所以时间复杂度为O(n!),这是一个“指数级”的算法,那么,还有没有更好的算法呢?</P><>首先,我们来观察一下这个算法。在求从B1到E的最短距离的时候,先求出从C2到E的最短距离;而在求从B2到E的最短距离的时候,又求了一遍从C2到E的最短距离。也就是说,从C2到E的最短距离我们求了两遍。同样可以发现,在求从C1、C2到E的最短距离的过程中,从D1到E的最短距离也被求了两遍。而在整个程序中,从D1到E的最短距离被求了四遍。如果在求解的过程中,同时将求得的最短距离"记录在案",随时调用,就可以避免这种情况。于是,可以改进该算法,将每次求出的从v到E的最短距离记录下来,在算法中递归地求MinDistance(v)时先检查以前是否已经求过了MinDistance(v),如果求过了则不用重新求一遍,只要查找以前的记录就可以了。这样,由于所有的点有n个,因此不同的状态数目有n个,该算法的数量级为O(n)。</P><P>更进一步,可以将这种递归改为递推,这样可以减少递归调用的开销。</P><P>请看<a href="http://algorithm.myrice.com/algorithm/technique/dynamic_programming/introduction.htm#img1" target="_blank" >图1</A>,可以发现,A只和B<SUB>i</SUB>相邻,B<SUB>i</SUB>只和C<SUB>i</SUB>相邻,...,依此类推。这样,我们可以将原问题的解决过程划分为4个阶段,设S<SUB>1</SUB>={A},S<SUB>2</SUB>={B<SUB>1</SUB>,B<SUB>2</SUB>},S<SUB>3</SUB>={C<SUB>1</SUB>,C<SUB>2</SUB>,C<SUB>3</SUB>,C<SUB>4</SUB>},S<SUB>4</SUB>={D<SUB>1</SUB>,D<SUB>2</SUB>,D<SUB>3</SUB>},F<SUB>k</SUB>(u)表示从S<SUB>k</SUB>中的点u到E的最短距离,则</P><BLOCKQUOTE><P><img src="http://algorithm.myrice.com/algorithm/technique/dynamic_programming/images/exp12.gif"></P></BLOCKQUOTE><P>并且有边界条件</P><BLOCKQUOTE><P><img src="http://algorithm.myrice.com/algorithm/technique/dynamic_programming/images/exp13.gif"></P></BLOCKQUOTE><P>显然可以递推地求出F<SUB>1</SUB>(A),也就是从A到E的最短距离。这种算法的复杂度为O(n),因为所有的状态总数(节点总数)为n,对每个状态都只要遍历一次,而且程序很简洁。</P><P>具体算法如下:</P>
b
 楼主| 发表于 2004-5-29 03:44:07 | 显示全部楼层
procedure DynamicProgramming;
begin
  F5[E]:=0;
  for i:=4 downto 1 do
     for each u ∈Sk do
      begin
       Fk:=无穷大;
       for each v∈Sk+1∩δ(u) do
         if Fk&gt;w(u,v)+Fk+1[v] then Fk:=w(u,v)+Fk+1[v];
   end;
  输出F1[A];
end;
这种高效算法,就是动态规划算法。
b
 楼主| 发表于 2004-5-29 03:44:39 | 显示全部楼层
<H2>动态规划的基本概念</H2>
<H3>动态规划的发展及研究内容</H3>
<><DFN>动态规划(dynamic programming)</DFN>是运筹学的一个分支,是求解<DFN>决策过程(decision process)</DFN>最优化的数学方法。20世纪50年代初美国数学家R.E.Bellman等人在研究<DFN>多阶段决策过程(multistep decision process)</DFN>的优化问题时,提出了著名的<DFN>最优化原理(principle of optimality)</DFN>,把多阶段过程转化为一系列单阶段问题,逐个求解,创立了解决这类过程优化问题的新方法——动态规划。1957年出版了他的名著<CITE>Dynamic Programming</CITE>,这是该领域的第一本著作。</P>
<>动态规划问世以来,在经济管理、生产调度、工程技术和最优控制等方面得到了广泛的应用。例如最短路线、库存管理、资源分配、设备更新、排序、装载等问题,用动态规划方法比用其它方法求解更为方便。</P>
<>虽然动态规划主要用于求解以时间划分阶段的动态过程的优化问题,但是一些与时间无关的静态规划(如线性规划、非线性规划),只要人为地引进时间因素,把它视为多阶段决策过程,也可以用动态规划方法方便地求解。</P>
<H3>多阶段决策问题</H3>
<P><DFN>多阶段决策过程</DFN>,是指这样的一类特殊的活动过程,问题可以按时间顺序分解成若干相互联系的阶段,在每一个阶段都要做出决策,全部过程的决策是一个决策序列。要使整个活动的总体效果达到最优的问题,称为<DFN>多阶段决策问题</DFN>。</P>
<P><a href="http://algorithm.myrice.com/algorithm/technique/dynamic_programming/introduction.htm#example1" target="_blank" >例1</A>是一个多阶段决策问题的例子,下面是另一个多阶段决策问题的例子:</P>
<P><B>[例2]</B> 生产计划问题</P>
<P>工厂生产某种产品,每单位(千件)的成本为1(千元),每次开工的固定成本为3(千元),工厂每季度的最大生产能力为6(千件)。经调查,市场对该产品的需求量第一、二、三、四季度分别为 2,3,2,4(千件)。如果工厂在第一、二季度将全年的需求都生产出来,自然可以降低成本(少付固定成本费),但是对于第三、四季度才能上市的产品需付存储费,每季每千件的存储费为0.5(千元)。还规定年初和年末这种产品均无库存。试制订一个生产计划,即安排每个季度的产量,使一年的总费用(生产成本和存储费)最少。
</P>
<H3>决策过程的分类</H3>
<P>根据过程的时间变量是离散的还是连续的,分为<DFN>离散时间决策过程(discrete-time decision process)</DFN>,即多阶段决策过程和<DFN>连续时间决策过程(continuous-time decision process)</DFN>;根据过程的演变是确定的还是随机的,分为<DFN>确定性决策过程(deterministic decision process)</DFN>和<DFN>随机性决策过程(stochastic decision process)</DFN>,其中应用最广的是确定性多阶段决策过程。</P>
<H3>动态规划模型的基本要素</H3>
<P>一个多阶段决策过程最优化问题的动态规划模型通常包含以下要素:</P>
<P><DFN>1.阶段</DFN></P>
<P><DFN>阶段(step)</DFN>是对整个过程的自然划分。通常根据时间顺序或空间特征来划分阶段,以便按阶段的次序解优化问题。阶段变量一般用k=1,2,..,n表示。在<a href="http://algorithm.myrice.com/algorithm/technique/dynamic_programming/introduction.htm#example1" target="_blank" >例1</A>中由A出发为k=1,由B<SUB>i</SUB>(i=1,2)出发为k=2,依此下去从D<SUB>i</SUB>(i=1,2,3)出发为k=4,共n=4个阶段。在<a href="http://algorithm.myrice.com/algorithm/technique/dynamic_programming/chapter1.htm#example2" target="_blank" >例2</A>中按照第一、二、三、四季度分为k=1,2,3,4,共4个阶段。</P>
<P><DFN>2.状态</DFN></P>
<P><DFN>状态(state)</DFN>表示每个阶段开始时过程所处的自然状况。它应该能够描述过程的特征并且具有<B>无后向性</B>,即当某阶段的状态给定时,这个阶段以后过程的演变与该阶段以前各阶段的状态无关,即每个状态都是过去历史的一个完整总结。通常还要求状态是直接或间接可以观测的。</P>
<P>描述状态的变量称<DFN>状态变量(state variable)</DFN>。变量允许取值的范围称<DFN>允许状态集合(set of admissible states)</DFN>。用x<SUB>k</SUB>表示第k阶段的状态变量,它可以是一个数或一个向量。用X<SUB>k</SUB>表示第k阶段的允许状态集合。在<a href="http://algorithm.myrice.com/algorithm/technique/dynamic_programming/introduction.htm#example1" target="_blank" >例1</A>中x<SUB>2</SUB>可取B<SUB>1</SUB>,B<SUB>2</SUB>,X<SUB>2</SUB>={B<SUB>1</SUB>,B<SUB>2</SUB>}。</P>
<P>n个阶段的决策过程有n+1个状态变量,x<SUB>n+1</SUB>表示x<SUB>n</SUB>演变的结果,在<a href="http://algorithm.myrice.com/algorithm/technique/dynamic_programming/introduction.htm#example1" target="_blank" >例1</A>中x<SUB>5</SUB>取E。</P>
<P>根据过程演变的具体情况,状态变量可以是离散的或连续的。为了计算的方便有时将连续变量离散化;为了分析的方便有时又将离散变量视为连续的。</P>
<P>状态变量简称为<DFN>状态</DFN>。</P>
<P><DFN>3.决策</DFN></P>
<P>当一个阶段的状态确定后,可以作出各种选择从而演变到下一阶段的某个状态,这种选择手段称为<DFN>决策(decision)</DFN>,在最优控制问题中也称为<DFN>控制(control)</DFN>。</P>
<P>描述决策的变量称<DFN>决策变量(decision variable)</DFN>。变量允许取值的范围称<DFN>允许决策集合(set of admissible decisions)</DFN>。用u<SUB>k</SUB>(x<SUB>k</SUB>)表示第k阶段处于状态x<SUB>k</SUB>时的决策变量,它是x<SUB>k</SUB>的函数,用U<SUB>k</SUB>(x<SUB>k</SUB>)表示了x<SUB>k</SUB>的允许决策集合。在<a href="http://algorithm.myrice.com/algorithm/technique/dynamic_programming/introduction.htm#example1" target="_blank" >例1</A>中u<SUB>2</SUB>(B<SUB>1</SUB>)可取C<SUB>1</SUB>,C<SUB>2</SUB>,C<SUB>3</SUB>。</P>
<P>决策变量简称<DFN>决策</DFN>。</P>
<P><DFN>4.策略</DFN></P>
<P>决策组成的序列称为<DFN>策略(policy)</DFN>。由初始状态x<SUB>1</SUB>开始的全过程的策略记作p<SUB>1n</SUB>(x<SUB>1</SUB>),即p<SUB>1n</SUB>(x<SUB>1</SUB>)={u<SUB>1</SUB>(x<SUB>1</SUB>),u<SUB>2</SUB>(x<SUB>2</SUB>),...,u<SUB>n</SUB>(x<SUB>n</SUB>)}。由第k阶段的状态x<SUB>k</SUB>开始到终止状态的后部子过程的策略记作p<SUB>kn</SUB>(x<SUB>k</SUB>),即p<SUB>kn</SUB>(x<SUB>k</SUB>)={u<SUB>k</SUB>(x<SUB>k</SUB>),u<SUB>k+1</SUB>(x<SUB>k+1</SUB>),...,u<SUB>n</SUB>(x<SUB>n</SUB>)}。类似地,由第k到第j阶段的子过程的策略记作p<SUB>kj</SUB>(x<SUB>k</SUB>)={u<SUB>k</SUB>(x<SUB>k</SUB>),u<SUB>k+1</SUB>(x<SUB>k+1</SUB>),...,u<SUB>j</SUB>(x<SUB>j</SUB>)}。对于每一个阶段k的某一给定的状态x<SUB>k</SUB>,可供选择的策略p<SUB>kj</SUB>(x<SUB>k</SUB>)有一定的范围,称为<DFN>允许策略集合(set of admissible policies)</DFN>,用P<SUB>1n</SUB>(x<SUB>1</SUB>),P<SUB>kn</SUB>(x<SUB>k</SUB>),P<SUB>kj</SUB>(x<SUB>k</SUB>)表示。</P>
<P><DFN>5.状态转移方程</DFN></P>
<P>在确定性过程中,一旦某阶段的状态和决策为已知,下阶段的状态便完全确定。用<DFN>状态转移方程(equation of state)</DFN>表示这种演变规律,写作</P>
<BLOCKQUOTE>
<P><IMG src="http://algorithm.myrice.com/algorithm/technique/dynamic_programming/images/eqn1.gif"></P></BLOCKQUOTE>
<P>在<a href="http://algorithm.myrice.com/algorithm/technique/dynamic_programming/introduction.htm#example1" target="_blank" >例1</A>中状态转移方程为:x<SUB>k+1</SUB>=u<SUB>k</SUB>(x<SUB>k</SUB>)</P>
<P><DFN>6.指标函数和最优值函数</DFN></P>
<P><DFN>指标函数(objective function)</DFN>是衡量过程优劣的数量指标,它是关于策略的数量函数,从阶段k到阶段n的指标函数用V<SUB>kn</SUB>(x<SUB>k</SUB>,p<SUB>kn</SUB>(x<SUB>k</SUB>))表示,k=1,2,...,n。</P>
<P>能够用动态规划解决的问题的指标函数应具有<DFN>可分离性</DFN>,即V<SUB>kn</SUB>可表为x<SUB>k</SUB>,u<SUB>k</SUB>,V<SUB>k+1 n</SUB> 的函数,记为:</P>
<BLOCKQUOTE>
<P><IMG src="http://algorithm.myrice.com/algorithm/technique/dynamic_programming/images/eqn2.gif"></P></BLOCKQUOTE>
<P>其中函数<IMG src="http://algorithm.myrice.com/algorithm/technique/dynamic_programming/images/fi.gif">是一个关于变量V<SUB>k+1 n</SUB><B>单调递增</B>的函数。这一性质保证了<a href="http://algorithm.myrice.com/algorithm/technique/dynamic_programming/chapter3.htm#optimality" target="_blank" ><DFN>最优化原理(principle of optimality)</DFN></A>的成立,是动态规划的适用前提。</P>
<P>过程在第j 阶段的阶段指标取决于状态x<SUB>j</SUB>和决策u<SUB>j</SUB>,用v<SUB>j</SUB>(x<SUB>j</SUB>,u<SUB>j</SUB>)表示。阶段k到阶段n的指标由v<SUB>j</SUB>(j=k,k+1,..n)组成,常见的形式有:</P>
<P>阶段指标之和,即</P>
<BLOCKQUOTE>
<P><IMG src="http://algorithm.myrice.com/algorithm/technique/dynamic_programming/images/eqn3.gif"></P></BLOCKQUOTE>
<P>阶段指标之积,即</P>
<BLOCKQUOTE>
<P><IMG src="http://algorithm.myrice.com/algorithm/technique/dynamic_programming/images/eqn4.gif"></P></BLOCKQUOTE>
<P>阶段指标之极大(或极小),即</P>
<BLOCKQUOTE>
<P><IMG src="http://algorithm.myrice.com/algorithm/technique/dynamic_programming/images/eqn5.gif"></P></BLOCKQUOTE>
<P>这些形式下第k到第j阶段子过程的指标函数为V<SUB>kj</SUB>(x<SUB>k</SUB>,u<SUB>k</SUB>,x<SUB>k+1</SUB>,...,x<SUB>j+1</SUB>)。可以发现,上述(3)-(5)三个指标函数的形式都满足最优性原理。在<a href="http://algorithm.myrice.com/algorithm/technique/dynamic_programming/introduction.htm#example1" target="_blank" >例1</A>中指标函数为(3)的形式,其中v<SUB>j</SUB>(x<SUB>j</SUB>,u<SUB>j</SUB>)是边&lt;x<SUB>j</SUB>,u<SUB>j</SUB>(x<SUB>j</SUB>)&gt;的权(边的长度),u<SUB>j</SUB>(x<SUB>j</SUB>)表示从x<SUB>j</SUB>出发根据决策u<SUB>j</SUB>(x<SUB>j</SUB>)下一步所到达的节点。</P>
<P>根据状态转移方程,指标函数V<SUB>kn</SUB>还可以表示为状态x<SUB>k</SUB>和策略p<SUB>kn</SUB>的函数,即V<SUB>kn</SUB>(x<SUB>k</SUB>,p<SUB>kn</SUB>)。在x<SUB>k</SUB>给定时指标函数V<SUB>kn</SUB>对p<SUB>kn</SUB>的最优值称为<DFN>最优值函数(optimal value function)</DFN>,记作f<SUB>k</SUB>(x<SUB>k</SUB>),即</P>
<BLOCKQUOTE>
<P><IMG src="http://algorithm.myrice.com/algorithm/technique/dynamic_programming/images/eqn6.gif"></P></BLOCKQUOTE>
<P>其中opt可根据具体情况取max或min。上式的意义是,对于某个阶段k的某个状态x<SUB>k</SUB>,从该阶段k到最终目标阶段n的最优指标函数值等于从x<SUB>k</SUB>出发取遍所有能策略p<SUB>kn</SUB>所得到的最优指标值中最优的一个。</P>
<P><DFN>7.最优策略和最优轨线</DFN></P>
<P>使指标函数V<SUB>kn</SUB>达到最优值的策略是从k开始的后部子过程的最优策略,记作p<SUB>kn</SUB><SUP>*</SUP>={u<SUB>k</SUB><SUP>*</SUP>,..u<SUB>n</SUB><SUP>*</SUP>},p<SUB>1n</SUB><SUP>*</SUP>又是全过程的最优策略,简称<DFN>最优策略(optimal policy)</DFN>。从初始状态x<SUB>1</SUB>(=x<SUB>1</SUB><SUP>*</SUP>)出发,过程按照p<SUB>1n</SUB><SUP>*</SUP>和状态转移方程演变所经历的状态序列{x<SUB>1</SUB><SUP>*</SUP>,x<SUB>2</SUB><SUP>*</SUP>,..,x<SUB>n+1</SUB><SUP>*</SUP>}称<DFN>最优轨线(optimal trajectory)</DFN>。</P>
b
 楼主| 发表于 2004-5-29 03:45:48 | 显示全部楼层
<H2>动态规划的基本定理和基本方程</H2><>动态规划发展的早期阶段,从简单逻辑出发给出了所谓最优性原理,然后在最优策略存在的前提下导出基本方程,再由这个方程求解最优策略。后来在动态规划的应用过程中发现,<b>最优性原理不是对任何决策过程普遍成立,它与基本方程不是无条件等价,二者之间也不存在任何确定的蕴含关系</b>。基本方程在动态规划中起着更为本质的作用。</P><><B>[基本定理]</B></P><>对于初始状态x<SUB>1</SUB>∈X<SUB>1</SUB>,策略p<SUB>1n</SUB><SUP>*</SUP>={u<SUB>1</SUB><SUP>*</SUP>,..u<SUB>n</SUB><SUP>*</SUP>}是最优策略的充要条件是对于任意的k,1&lt;k&lt;=n,有</P><P><img src="http://algorithm.myrice.com/algorithm/technique/dynamic_programming/images/eqn8.gif"></P><P><B>[推论] </B></P><P>若p<SUB>1n</SUB><SUP>*</SUP>∈P<SUB>1n</SUB>(x<SUB>1</SUB>)是最优策略,则对于任意的k,1&lt;k&lt;n,它的子策略p<SUB>kn</SUB><SUP>*</SUP>对于由x<SUB>1</SUB>和p<SUB>1,k-1</SUB><SUP>*</SUP>确定的以x<SUB>k</SUB><SUP>*</SUP>为起点的第k到n后部子过程而言,也是最优策略。</P><P>上述推论称为<DFN>最优化原理</DFN>,它给出了最优策略的必要条件,通常略述为:不论过去的状态和决策如何,对于前面的决策形成的当前的状态而言,余下的各个决策必定构成最优策略。</P><P>根据基本定理的推论可以得到<DFN>动态规划的基本方程</DFN>:</P><P><img src="http://algorithm.myrice.com/algorithm/technique/dynamic_programming/images/eqn9.gif"></P><P>其中<img src="http://algorithm.myrice.com/algorithm/technique/dynamic_programming/images/eqn9_2.gif">是决策过程的终端条件,<img src="http://algorithm.myrice.com/algorithm/technique/dynamic_programming/images/xt.gif">为一个已知函数。当x<SUB>n+1</SUB>只取固定的状态时称<DFN>固定终端</DFN>;当x<SUB>n+1</SUB>可在终端集合X<SUB>n+1</SUB>中变动时称<DFN>自由终端</DFN>。最终要求的最优指标函数满足(10)式:</P><BLOCKQUOTE><P><img src="http://algorithm.myrice.com/algorithm/technique/dynamic_programming/images/d4.gif"></P></BLOCKQUOTE><P>(9)式是一个递归公式,如果目标状态确定,当然可以直接利用该公式递归求出最优值(这种递归方法将在后文介绍,称作<DFN>备忘录法</DFN>),但是一般在实际应用中我们通常将该递归公式改为递推公式求解,这样一般效率会更高一些。</P><!-- #EndEditable -->
b
 楼主| 发表于 2004-5-29 03:46:20 | 显示全部楼层
<H2>动态规划的适用条件</H2><>任何思想方法都有一定的局限性,超出了特定条件,它就失去了作用。同样,动态规划也并不是万能的。适用动态规划的问题必须满足最优化原理和无后效性。</P><H3>1.最优化原理(最优子结构性质)</H3><>最优化原理可这样阐述:一个最优化策略具有这样的性质,不论过去状态和决策如何,对前面的决策所形成的状态而言,余下的诸决策必须构成最优策略。简而言之,一个最优化策略的子策略总是最优的。一个问题满足最优化原理又称其具有<DFN>最优子结构性质</DFN>。</P>< align=center><img src="http://algorithm.myrice.com/algorithm/technique/dynamic_programming/images/ch5.gif"></P><P align=center>图2</P><P>例如图2中,若路线I和J是A到C的最优路径,则根据最优化原理,路线J必是从B到C的最优路线。这可用反证法证明:假设有另一路径J'是B到C的最优路径,则A到C的路线取I和J'比I和J更优,矛盾。从而证明J'必是B到C的最优路径。</P><P>最优化原理是动态规划的基础,任何问题,如果失去了最优化原理的支持,就不可能用动态规划方法计算。动态规划的最优化理在其<a href="http://algorithm.myrice.com/algorithm/technique/dynamic_programming/chapter1.htm#indexfunc" target="_blank" >指标函数的可分离性和单调性中得到体现</A>。根据最优化原理导出的<a href="http://algorithm.myrice.com/algorithm/technique/dynamic_programming/chapter2.htm#BasicEqn" target="_blank" >动态规划基本方程</A>是解决一切动态规划问题的基本方法。</P><P>可以看出,例1是满足最优化原理的。</P><H3>2.无后向性</H3><P>将各阶段按照一定的次序排列好之后,对于某个给定的阶段状态,它以前各阶段的状态无法直接影响它未来的决策,而只能通过当前的这个状态。换句话说,每个状态都是过去历史的一个完整总结。这就是<DFN>无后向性</DFN>,又称为<DFN>无后效性</DFN>。</P><P>如果用前面的记号来描述无后向性,就是:对于确定的x<SUB>k</SUB>,无论p<SUB>1,k-1</SUB>如何,最优子策略p<SUB>kn</SUB><SUP>*</SUP>是唯一确定的,这种性质称为无后向性。</P>
b
 楼主| 发表于 2004-5-29 03:46:32 | 显示全部楼层
<><B>[例3]</B> <a href="http://algorithm.myrice.com/problems/problem_set/bitonic/problem.htm" target="_blank" >Bitonic旅行路线问题</A></P><>欧几里德货郎担问题是对平面给定的n个点确定一条连结各点的、闭合的最短游历路线问题。图3(a)给出了七个点问题的解。Bitonic旅行路线问题是欧几里德货郎担问题的简化,这种旅行路线先从最左边开始,<B>严格地</B>由左至右到最右边的点,然后再<B>严格地</B>由右至左到出发点,求路程最短的路径长度。图3(b)给出了七个点问题的解。</P>< align=center><img src="http://algorithm.myrice.com/algorithm/technique/dynamic_programming/images/ch1.gif"> <P align=center>图3</P><P>这两个问题看起来很相似。但实质上是不同的。为了方便讨论,我将每个顶点标记了号码。由于必然经过最右边的顶点7,所以一条路(P1-P2)可以看成两条路(P1-7)与(P2-7)的结合。所以,这个问题的状态可以用两条道路结合的形式表示。我们可以把这些状态中,两条路中起始顶点相同的状态归于一个阶段,设为阶段[P1,P2]。</P><P>那么,对于Bitonic旅行路线问题来说,阶段[P1,P2]如果可以由阶段[Q1,Q2]推出,则必须满足的条件就是1&lt;Q1或P2&lt;Q2。例如,阶段[3,4]中的道路可以由阶段[3,5]中的道路加一条边4-5得出,而阶段[3,5]的状态却无法由阶段[3,4]中的状态得出,因为Bitonic旅行路线要求必须严格地由左到右来旅行。所以如果我们已经知道了阶段[3,4]中的状态,则阶段[3,5]中的状态必然已知。因此我们可以说,Bitonic问题满足<DFN>无后向性</DFN>,可以用动态规划来解决。</P><P>有些问题乍一看好像有后向性,但如果按照某种合理的方式重新划分阶段,就可以发现其本质上是无后向性的,所以关键是阶段的合理划分,这一点将在<a href="http://algorithm.myrice.com/algorithm/technique/dynamic_programming/chapter7.htm" target="_blank" >动态规划的技巧</A>中详细阐述。</P><H3>3.子问题的重叠性</H3><P>在例1中我们看到,动态规划将原来具有指数级复杂度的搜索算法改进成了具有多项式时间的算法。其中的关键在于<b>解决冗余</b>,这是动态规划算法的根本目的。动态规划实质上是一种以空间换时间的技术,它在实现的过程中,不得不存储产生过程中的各种状态,所以它的空间复杂度要大于其它的算法。以<a href="http://algorithm.myrice.com/algorithm/technique/dynamic_programming/chapter3.htm#example3" target="_blank" >Bitonic旅行路线问题</A>为例,这个问题也可以用搜索算法来解决。动态规划的时间复杂度为O(n<SUP>2</SUP>),搜索算法的时间复杂度为O(n!) ,但从空间复杂度来看,动态规划算法为O(n<SUP>2</SUP>),而搜索算法为O(n),搜索算法反而优于动态规划算法。选择动态规划算法是因为动态规划算法在空间上可以承受,而搜索算法在时间上却无法承受,所以我们舍空间而取时间。</P><P>设原问题的规模为n,容易看出,当子问题树中的子问题总数是n的超多项式函数,而不同的子问题数只是n的多项式函数时,动态规划法显得特别有意义,此时动态规划法具有线性时间复杂性。所以,能够用动态规划解决的问题还有一个显著特征:<DFN>子问题的重叠性</DFN>。这个性质并不是动态规划适用的必要条件,但是如果该性质无法满足,动态规划算法同其他算法相比就不具备优势。</P><!-- #EndEditable -->
您需要登录后才可以回帖 登录 | 注-册-帐-号

本版积分规则

小黑屋|手机版|Archiver|数学建模网 ( 湘ICP备11011602号 )

GMT+8, 2024-11-27 11:34 , Processed in 0.066784 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表