K动态规划教案.docx

上传人:b****5 文档编号:11634317 上传时间:2023-03-29 格式:DOCX 页数:33 大小:117.31KB
下载 相关 举报
K动态规划教案.docx_第1页
第1页 / 共33页
K动态规划教案.docx_第2页
第2页 / 共33页
K动态规划教案.docx_第3页
第3页 / 共33页
K动态规划教案.docx_第4页
第4页 / 共33页
K动态规划教案.docx_第5页
第5页 / 共33页
点击查看更多>>
下载资源
资源描述

K动态规划教案.docx

《K动态规划教案.docx》由会员分享,可在线阅读,更多相关《K动态规划教案.docx(33页珍藏版)》请在冰豆网上搜索。

K动态规划教案.docx

K动态规划教案

动态规划策略

动态规划(dynamicprogramming)是运筹学的一个分支,是求解决策过程(decisionprocess)最优化的数学方法。

20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程(multistepdecisionprocess)的优化问题时,提出了著名的最优化原理(principleofoptimality),把多阶段过程转化为一系列单阶段问题,逐个求解,创立了解决这类过程优化问题的新方法——动态规划。

1957年出版了他的名著DynamicProgramming,这是该领域的第一本著作。

动态规划问世以来,在经济管理、生产调度、工程技术和最优控制等方面得到了广泛的应用。

例如最短路线、库存管理、资源分配、设备更新、排序、装载等问题,用动态规划方法比用其它方法求解更为方便。

虽然动态规划主要用于求解以时间划分阶段的动态过程的优化问题,但是一些与时间无关的静态规划(如线性规划、非线性规划),只要人为地引进时间因素,把它视为多阶段决策过程,也可以用动态规划方法方便地求解。

第一节动态规划的本质

一、多阶段决策过程的最优化问题

   在现实生活中,有一类活动的过程,由于它的特殊性,可将过程分成若干个互相联系的阶段,在它的每一阶段都需要作出决策,从而使整个过程达到最好的活动效果。

因此各个阶段决策的选取不能任意确定,它依赖于当前面临的状态,又影响以后的发展。

当各个阶段决策确定后,就组成一个决策序列,因而也就确定了整个过程的一条活动路线。

这种把一个问题看作是一个前后关联具有链状结构的多阶段过程(如图)就称为多阶段决策过程,这种问题称为多阶段决策问题。

 

   在多阶段决策问题中,各个阶段采取的决策,一般来说是与时间有关的,决策依赖于当前状态,又随即引起状态的转移,一个决策序列就是在变化的状态中产生出来的,故有"动态"的含义,我们称这种解决多阶段决策最优化的过程为动态规划方法。

   应指出,动态规划是考察求解多阶段决策问题的一种途径、一种方法,而不是一种特殊算法。

不像线性规划那样,具有一个标准的数学表达式和明确定义的一组规划。

因此我们在学习时,除了要对基本概念和方法正确理解外,必须具体问题具体分析处理,以丰富的想象力去建立模型,用创造性的技巧去求解。

例如:

图中给出了一个地图,地图中每个顶点代表一个城市,两个城市间的连线代表道路,连线上的数值代表道路的长度。

现在,我们想从城市A到达城市E,怎样走路程最短,最短路程的长度是多少?

解法一:

用搜索法对A->E可能的每一条路线进行枚举,把距离算出来,然后互相比较,找出最短者。

设Dis[X]为城市X到E的最短路线的长度;(X表示任意一个城市)

Map[I,J]表示I,J两个城市间的距离,若Map[I,J]=0,则两个城市不连通。

算法描述

Programli_1;

VarSe:

未访问的城市集合;

FunctionLong(Who:

当前访问城市):

Integer;

{求当前访问城市与城市E的最短距离}

Begin

IfWho=EThenSearch:

=0

ElseBeginMin:

=Maxint;

ForI取遍所有城市Do

If(Map[Who,I]>0)And(IInSe)Then

BeginSe:

=Se-[I];J:

=Map[Who,I]+Long(I);Se:

=Se+[I];

IfJ

=J;

End;

Long:

=Min;

End;

End;

Begin{main}

Se:

=除A外所有城市的集合;Dis[A]:

=Long(A);

End.

解法分析:

这个程序的时间复杂度为O(N!

),每次除了已经访问过的城市外,其他城市都要访问,所以,这是一个“指数级”的算法。

我们来观察一下这个算法。

在求从B1到E的最短路径的时候,先求出从C2到E的最短路径;而在求从B2到E的最短路径的时候,又求了一遍从C2到E的最短路径。

也就是说,从C2到E的最短路径我们求了两遍。

同样可以发现,在求从C1、C2到E的最短路径的过程中,从D1到E的最短路径也被求了两遍。

而在整个程序中,从D1到E的最短路径被求了四遍。

如果在求解的过程中,同时将求得的最短路径的距离“记录在案”,随时调用,那么算法就会简洁多了!

解法二:

由后往前依次推出每个Dis值,直到推出Dis[A]为止。

所谓“后”、“前”是我们自己为城市编的序号,当两个城市I,J的前后顺序定为I“前”J“后”时,必须满足这个条件:

或者I,J不连通,或者Dis[I]+Map[I,J]≥Dis[J]。

因为如果I,J连通且Dis[I]+Map[I,J]

那么,我们如何划分先后次序呢?

我用不同颜色给城市分阶段,可以用阶段表示每个城市的次序,因为阶段的划分有如下性质:

1:

阶段I的取值只与阶段I+1有关,阶段I的取值只对阶段I-1的取值产生影响;

2:

每个阶段的顺序是确定的,不可以调换任两个阶段顺序;

注:

可以把E看成第4个阶段,A看成第0个阶段。

通过这两个性质,可以推出阶段作为“前”、“后”顺序满足刚才提出的条件,所以我们可以用阶段作为每个城市的次序,然后从阶段3倒推至阶段1,再推出Dis[A]。

推导:

我们按照动态规划的方法将本例从最后一段开始计算,由终点E向前逐步倒推至起点A。

设Uk表示第K阶段的一个决策点,Fk(Uk)表示从第K阶段中的点Uk到达终点的最短路线的长度,Sk(Xk,Uk)表示第K阶段中Xk到Uk的距离。

(当K=4时,F4(E)=0)

当K=3时,F3(D1)=3,F3(D2)=4,F3(D3)=3

当K=2时,

F2(C1)=min[S2(C1,D1)+F3(D1),S2(C1,D2)+F3(D2)]=min[8,10]=8。

F2(C2)=S2(C2,D1)+F3(D1)=8。

F2(C3)=S2(C3,D3)+F3(D3)=11。

F2(C4)=S2(C4,D3)+F3(D3)=6。

当K=1时,

F1(B1)=min[S1(B1,C1)+F2(C1),S1(B1,C2)+F2(C2),

S1(B1,C3)+F2(C3)]=min[9,14,14]=9。

F1(B2)=min[S1(B2,C2)+F2(C2),S1(B2,C4)+F2(C4)]

=min[16,10]=10。

当K=0时,

F0(A)=min[S0(A,B1)+F1(B1),S0(A,B2)+F1(B2)]=min[17,13]=13。

其中X1(A)=B2,X2(B2)=C4,X3(C4)=D3,X4(D3)=E组成一个最优策略。

路A->B2->C4->D3->E为从A到E的最短路线。

最短路线长13。

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

    Fk(Uk)=min[Sk(Uk,Xk)+Fk+1(Xk)]     k=4,3,2,1,0

    F5(U5)=0

这种递推关系,叫做动态规划的状态转移方程。

该动态规划解法的基本思想:

若以Uk表示第K阶段的一个决策点,从终点开始,依逆向求出倒数第一阶段、倒数第二阶段、倒数第三阶段、……、倒数第N-1阶段中各点到达终点的最短路线。

最终求出从起点到终点的最短路线。

这就是动态规划。

动态规划的最优化概念是在一定条件下,我到一种途径,在对各阶段的效益经过按问题具体性质所确定的运算以后,使得全过程的总效益达到最优。

决策过程:

(1)由目标状态E向前推,可以分成3个阶段,即3个子问题。

(2)策略:

每个阶段到E的最省费用为本阶段的决策路径。

(3)D1,D2,D3是第一次输人的结点。

他们到E都只有一种费用,目前无法定下,那一个点将在全程最优策略的路径上。

第二阶段计算中,都应分别参加计算。

(4)C1,C2,C3,C4是第二次输入结点,他们到D1,D2,D3各有两种费用。

此时应计算C1,C2,C3,C4分别到E的最少费用。

(5)C1的决策路径是min{(C1D1)+(D1E),(C1D2)+(D2E)}。

同理C2,C3,C4,此时也无法定下第一,二阶段的城市那二个将在整体的最优决策路径上

程序:

将节点A-E顺序编号为1-11,按节点的逆序进行计算的方法

programLi1;

constn=11;

vara:

array[1..n,1..n]ofinteger;p:

text;

b,c:

array[1..n]ofinteger;{b记录到e的最短路径长,c记录路径}

i,j,k,t:

integer;

begin

assign(p,'INPUT1.txt');reset(p);

fori:

=1tondo

beginforj:

=1tondoread(p,a[i,j]);readln(p);end;

b[n]:

=0;c[n]:

=0;

fork:

=n-1downto1do

fort:

=k+1tondo

ifa[k,t]<>0then{有路径}

ifb[k]=0thenbeginc[k]:

=t;b[k]:

=b[t]+a[k,t];end

elseifb[k]>b[t]+a[t,k]then

beginc[k]:

=t;b[k]:

=b[t]+a[k,t];end;

writeln(b[1]);{输出A-E的最短路径}

fori:

=1tondowrite(c[i]:

2,'');writeln;{输出路径各节点}

fori:

=1tondowrite(b[i]:

2,'');writeln;{输出各点到E的最短路径}

end.

输入数据:

input1.txt为11个点的邻接矩阵。

分析:

这个程序的时间复杂为O(N2)。

其核心为:

从A到E共分为3个阶段,除起点A和终点E外,其它各点既是上一阶段的终点又是下一阶段的起点。

各个阶段的决策不同,线路就不同。

当某阶段的起点给定时,它直接影响着后面各阶段的行进路线和整个路线的长短,而后面各阶段的路线的发展不受这点以前各阶段的影响。

故此问题的要求是:

在各个阶段选取一个恰当的决策,使由这些决策组成的一个决策序列所决定的一条路线,其总路程最短。

从求解结果中,我们不仅得到由A点出发到终点E的最短路线及最短距离,而且还得到了从所有各中间点到终点的最短路线及最短距离,这对许多实际问题来讲是很有用的。

二、动态规划中的主要概念和基本模型的构成

1.阶段和阶段变量:

把问题分成几个相互联系的有顺序的几个环节,这些环节即称为阶段。

描述阶段的变量成为阶段变量,一般用k表示。

2.状态和状态变量:

某一阶段的出发位置称为状态。

通常一个阶段包含若干状态。

描述状态的变量成状态变量,一般用Uk表示第K个阶段的状态。

如图1中,阶段3就有三个状态结点U3={d1,d2,d3}。

3.决策、决策变量和决策允许集合:

从某阶段的一个状态演变到下一个阶段某状态的所作出某种选择性的行动就是决策。

一个实际问题可能要有多次决策和多个决策点,在每一个阶段中都需要一次决策,决策可以用变量来描述,称为决策变量。

一般用Xk表示第K阶段的决策变量。

在实际问题中决策变量的取值往往限制在某一范围之内,此范围称为允许决策集合,用Sk表示第K阶段的允许决策集合。

例如,S3={D1,D2,D3},它表示第三阶段可有三种不同的决策。

那么Xk与Sk之间的关系是Uk+1=Xk(Uk)。

当第K阶段的状态确定之后,可能作出的决策范围还要受到这一状态的影响,这就是说,决策变量Xk是状态变量Uk的函数,记为Xk(Uk),简记为Xk。

把Xk的取值范围记为Sk(Uk),显然有Xk(Uk)∈Sk(Uk)。

4.策略和最优策略

所有阶段依次排列构成问题的全过程。

全过程中各阶段决策变量Xk(Uk)所组成的有序总体称为策略。

在实际问题中,可供选择的策略有一定的范围,该范围称为允许策略集合P。

从P中找出最优效果的策略称为最优策略。

5.状态转移方程:

前一阶段的终点就是后一阶段的起点,前一阶段的决策变量就是后一阶段的状态变量,这种关系描述了由K阶段到K十1阶段状态的演变规律,称为状态转移方程。

如上图的状态转移方程为UK+1=Xk(Uk)。

6.目标函数与最优化概念:

目标函数是衡量多阶段决策过程优劣的准则。

最优化概念是在一定条件下找到一个途径,经过按题目具体性质所确定的运算以后,使全过程的总效益达到最优。

动态规划的基本模型如下:

(1)确定问题的决策对象

(2)对决策过程进行划分

(3)对各阶段确定状态变量

(4)根据状态变量确定费用函数和目标函数

(5)建立个阶段状态变量的转移过程,确定状态转移方程。

三、运用动态规划需符合的条件

任何思想方法都有一定的局限性,超出了特定条件,它就失去了作用。

同理,动态规划也并不是万能的。

什么样的问题可以采用动态规划算法?

一般来说,必须满足最优化原理和无后效性。

1.动态规划的最优化原理

作为整个过程的最优策略具有这样的性质:

不论过去状态和决策如何,对前面的决策所形成的状态而言,余下的诸决策必须构成最优策略。

简而言之,一个最优化策略的子策略总是最优的。

利用这个原理,可以把多阶段决策问题的求解过程看成是一个连续的逆推过程。

由后向前逐步推算。

在求解时,各种状态前面的状态和决策,对后面的子问题,只不过相当于其初始条件而己,不影晌后面过程的最优策略。

如图,若路线I和J是A到C的最优路径,则根据最优化原理,路线J必是从B到C的最优路线。

这可用反证法证明:

假设有另一路径J’是B到C的最优路径,则A到C的路线取I和J’比I和J更优,这与原名题矛盾。

从而证明J’必是B到C的最优路径。

最优化原理是动态规划的基础,任何问题,如果失去了最优化原理的支持,就不可能用动态规划方法计算。

2.动态规划的无后效性原则:

某阶段的状态一旦确定,此后的过程演变不会再受此前各状态的影响。

即:

状态I只能由状态I+1通过状态转移方程得来,与其它状态无关。

特别是与其它未发生的状态无关。

四、动态规划中的子问题的重叠性

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

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

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

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

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

其中贪心法的当前选择可能要依赖已经作出的所有选择,但不依赖于有待于做出的选择和子问题,决策策略是阶段最优,但不一定全局最优。

因此贪心法自顶向下,一步一步地作出贪心选择;而分治法中的各个子问题是独立的(即不包含公共的子子问题),因此一旦递归地求出各子问题的解后,便可自下而上地将子问题的解合并成问题的解。

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

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

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

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

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

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

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

在本例中我们看到,动态规划将原来具有指数级复杂度的搜索算法改进成了具有多项式时间的算法。

其中的关键在于解决冗余,这是动态规划算法的根本目的。

动态规划实质上是一种以空间换时间的技术,它在实现的过程中,不得不存储产生过程中的各种状态,所以它的空间复杂度要大于其它的算法。

但从空间复杂度来看,动态规划算法为O(n2),而搜索算法为O(n),搜索算法反而优于动态规划算法。

选择动态规划算法是因为动态规划算法在空间上可以承受,而搜索算法在时间上却无法承受,所以我们舍空间而取时间。

设原问题的规模为n,容易看出,当子问题树中的子问题总数是n的超多项式函数,而不同的子问题数只是n的多项式函数时,动态规划法显得特别有意义。

所以,能够用动态规划解决的问题还有一个显著特征:

子问题的重叠性。

这个性质并不是动态规划适用的必要条件,但是如果该性质无法满足,动态规划算法同其他算法相比就不具备优势了。

第二节动态规划的设计与实现

一、动态规划算法的基本步骤

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

1.

划分阶段:

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

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

 

2.选择状态:

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

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

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

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

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

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

4.寻找边界条件:

给出的状态转移方程只是一个递推式,是一个通用形式化表达式。

需要给出递推的终止条件和边界值。

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

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

步骤1--4是动态规划算法的基本步骤。

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

此时,在步骤1--4中计算最优值时,通常需记录更多的信息,以便在本步骤中使用。

6.程序设计实现:

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

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

标准动态规划的基本框架

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

2.fork:

=ndownto1do{逆推求解}

3.for每一个xk∈Xkdo

4.for每一个uk∈Uk(xk)do

begin

5.fk(xk):

=一个极值;{∞或-∞}

6.xk+1:

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

7.t:

=φ(fk+1(xk+1),vk(xk,uk));

8.ift比fk(xk)更优thenfk(xk):

=t;{计算fk(xk)的最优值}

end;

9.t:

=一个极值;{∞或-∞}

10.for每一个x1∈X1do

11.iff1(x1)比t更优thent:

=f1(x1);{求出一个最优解}

12.输出t;

但是,实际应用当中经常不显式地按照上面步骤设计动态规划,而是按以下几个步骤进行:

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

2.递归地定义最优值。

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

4.

7

38

810

2744

45265

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

二、动态规划的经典例题

1、数字三角形问题

如图所示的一个数字三角形宝塔中,数字三角形中的数字为不超过100的整数。

现规定从最顶层走到最底层,每一步可沿左斜线向下或右斜线向下走。

任务一:

假设三角形行数≤10,键盘输入一个确定的整数值M,编程确定是否存在一条路径,使得沿着该路径所经过的数字的总和恰为M,若存在则给出所有路径,若不存在,则输出“Nonswer!

”字样。

任务二:

假设三角形行数≤100,编程确定一条路径,使得沿着该路径所经过的数字的总和最大,输出最大总和及经过的路径。

任务一分析:

由于数字三角形的行数不大(n<=10),很容易想到用枚举的方法去解决,即列举出所有路径并记录每一条路径所经过的数字总和,然后判断数字总和是否等于给定的整数值M。

而合理地选择枚举的方法,可以优化问题的解法,由于从塔顶到底层每次都只有两种走法,即左或右。

为此,不妨用“0”表示左下,用“1”表示右下,对于层数为n的数字塔,从顶到底的一种走法可用一个n—1位的二进制数表示。

这样就可以用一个n—l位的二进制数来模拟走法和确定解的范围。

穷举出从0到2n一1个十进制数所对应的n—1位二进制串对应的路径中的数字总和,判定其是否等于M而求得问题的解。

任务二分析:

由于三角形行数≤100,枚举量过大不适宜采用枚举方法。

但通过分析可以得出这样一个结论:

如果得到一条由顶至底的最佳路径,那么对于该路径上的每一个中间点来说,由顶至该中间点的路径所经过的数据之和也为最大。

因此该问题是一个典型的多阶段决策的最优化问题。

按三角形的行划分阶段,若行为n则问题可划分为n-1个阶段。

可以采用顺推法:

从顶点出发,依顺向求出第一阶段、第二阶段……第n-1阶段中个决策点的最佳路径,最终求出始点到终点的最佳路径。

设:

Fk(Uk)为k阶段Uk点到三角形顶点的最佳路径的最大数字和。

Uk1和Uk2为k-1阶段中Uk点的左边和右边路径上的点。

D(Uk)为k阶段中Uk点上的数字。

因此可以得出顺推的状态转移方程:

Fk(Uk)=max{Fk-1(Uk1),Fk-1(Uk2)}+D(Uk)k=1……n

Fo(Uo)=0

经过一次顺推后,可以得出n条路径,求出其中的最大值即可。

为了程序处理的方便,我们也可以采用逆推法。

设:

Fk(Uk)为k阶段Uk点到三角形底边的最佳路径的最大数字和。

Uk1和Uk2为k+1阶段中Uk点的左边和右边路径上的点。

D(Uk1)和D(Uk2)为k+1阶段中Uk点的左边和右边路径上点的数字。

因此可以得出顺推的状态转移方程:

Fk(Uk)=max{Fk+1(Uk1),Fk+1(Uk2)}+D(Uk)k=1……n-1

Fn(Ux)=D(Ux)x=1……n

求得的F1(U1)即为所求。

程序:

顺推法

programli2_shun;

constnmax=10;

vard,f:

array[1..nmax,0..nmax]ofinteger;

n,m1,m2,i,j:

integer;p:

text;

t:

array[1..nmax,1.

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

当前位置:首页 > 求职职场 > 自我管理与提升

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

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