noip动态规划1
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
➢
j:=map[who,i]+search(i); {计算城市E至城市Who的路径长度}
➢
s:=s+[i]; {恢复城市i未访问状态}
➢
if j<min then min:=j; {若城市E至城市Who的路径长度为目前最短,则记下}
➢
end;
➢
search:=min; {返回城市E至城市的最短路径长度}
noip动态规划1
第一章 回归分析的性质
➢动态规划
➢ 与递归程序相类,将对问题求解分解为对子问 题求解;不同之处在于把子问题的解存起来, 用空间换时间。
➢ 例:Fibonacci数
F(0)=0; F(1)=1; F(n)=F(n-1)+F(n-2); 递归: F(n-1)和F(n-2)分别求到底一次 动态规划:用数组将前n-1个数存起来,每次只用
化”称为状态转移。 ➢ 应用动态程序设计方法的一个重要条件。那就是将各阶段按照一定的次序排
列好之后,对于阶段i的状态只能由阶段i+1的状态通过状态转移方程得来, 与其它状态没有关系,尤其是与未发生的状态没有关系。换句话说,每个状 态都是“过去历史的一个完整总结”。这就是无后效性。
二、决策和策略
➢ 1、决策uk(sk):当阶段的状态取定以后,就可以做出不同的决定,从而
➢ 首先,我们来观察上述算法。在求B1到E的最短路径的时候,先求出从C2 到E的最短路径;而在求B2到E的最短路径的时候,又求了一遍从C2到E 的最短路径。也就是说,从C2到E的最短路径求了两遍。两样可以发现, 在求从C1、C2到E的最短路径的过程中,从D1到E的最短路径也被求了两 遍。而在整个过程中,从D1到E的最短路径被求了四遍,这是多么大的一 个浪费啊!如果在求解的过程中,同时将求得的最短路径的距离“记录在 案”,以便将来随时调用,则可以避免这种重复计算。至此,一个新的思
运用动态程序设计方法的一个前提。即这个过程的最优策 略应具有这样的性质:无论初始状态及初始决策如何,对于先前 决策所形成的状态而言,其以后的所有决策应构成最优策略。这 就是最优化原理。简言之,就是最优策略的子策略也是最优策略。
➢最优化原理与无后效性
⑴该问题的解必须符合最优化原理是前提。 这是因为是否符合最优化原理是一个问题的本质特征。对于不满足最优化
由于动态程序设计方法的模式性比较强,因此应该把主要精力 放在状态定义、阶段划分和状态转移方程的设计上。一旦这些 问题解决了,事情成功了一大半。
动态程序设计方法之所以效率高,是因 为它把已经做过的工作结果存储起来,每 次需要的时候,直接读入即可,不做已经 做过的工作。当然,对于同一个问题,由 于各人看问题的角度不同,对阶段、状态 和状态转移方式的理解可能不一样,因此 有些状态转移方程仍存在冗余运算。是否 充分利用信息是提高时间效率的关键。此 外,充分利用信息并不一定要以牺牲空间 为代价,只要方法得当,同样可以优化算 法的空间复杂度。
➢ 2、状态Sk: ➢ 各阶段开始时的客观条件叫做状态。 ➢ 描述各阶段状态的变量称为状态变量,常用Sk表示第k阶段的状态变量,状
态变量Sk的取值集合称为状态集合。用Sk表示。例如S2={C1,C2,C3,C4}。 ➢ 状态是阶段的属性。每个条件通常包含若干个状态,用以描述问题发展到这
个阶段时所处在的一种客观情况。S1={B1,B2}。 ➢ 每个阶段的状态都是由以前阶段的状态以某种方式“变化”而来,这种“变
一个加法 F[n] = F[n-1]+F[n-2] 即可。
➢ 例1 最短路径问题。下图中给出一个地图,地图中每个顶点代表 一个城市,两个城市之间的连线表示道路,连线上的数值代表道路 的长度。现在,想从城市A到城市E,怎样走路程最短,最短路程 的长度是多少?
➢ 现在,我们想从城市A到达城市E。怎样走才能使得路径最短,最 短路径的长度是多少?
由常识知,最短路有一个重要特性:最短路上的任一(后部)子
路也是最短的。即
若 A---B3---C1---D1---E 是 A---E 最短,
则
B3---C1---D1---E 是 B3---E 最短路,
C1---D1---E 也是C1---E 最短路.
利用最短路的这一特性,构造寻找 A---E 最短路的方法,即为:
设:Dis[x]为城市x到城市E的最短路径长度(x表示任意一个城市);Map[i,j]表示i,j 两个城市间的距离,若map[i,j]=0,则两个城市不通。 我们可以使用回溯来计算Dis[x]:
➢ var s:未访问的城市聚合;
➢ function search(who):integer; {求城市Who与城市E的最短距离}
确定下一阶段的状态,这种决定称为决策。表示决策的变量称为决策变量, 常用Uk(Sk)表示第k阶段当状态为Sk时的决策变量。在实际问题中,决策 变量的取值往往限制在一定范围内,我们称此范围为允许决策集合。常用
Dk(Sk)表示第k阶段从状态Sk出发的允许决策集合。显然有uk(sk) Dk(sk)
➢ 决策是问题解的属性。决策的目的就是“确定下一阶段的状态”。从阶段 1的B1状态出发有三条路,也就是三个决策,分别导向阶段2的C1,C2,C3 三个状态,即D1(B1)={C1,C2,C3}。
➢ 最优指标函数和状态转移方程 ➢ 用于衡量所选定策略优劣的数量指标称为指标函数,指标
函数记Fk(Sk),它表示从第k段状态Sk采用策略P*k,n到过程 终止时的最佳效益值。 ➢ 最优指标函数其实就是我们真正关心的问题的解。在上例 中,F1(B1)就表示从B1点到终点E的最短路径长度。我们 求解的最终目标就是F0(A)。 ➢ 最优指标函数的求法一般是一个从目标状态出发的递推公 式,称为状态转移议程:
dis[k][x]=
min{ d[iy]s m[x a ,y]p (x,y) G }
y k 1 阶段的城市集
dis[4][E]=0
k=4,3…,0,其中dis[k][x]指k阶段的城市x。
7
5
B1
6 3
10
A
4
7
B2
4
6
2 85
B3 6
3
C1
1 2
42
C2 2
63
C3
3
2
D1 2
3
0
D2 3
E
44
从最后一段开始,即 D---E 段开始,用由后向前逐步逆推的方法,
求出各点到 E 的最短路线,最后求出从 A 点到 E 点的最短路—
—逆序法。
(动态规划的方法是从终点逐段向始点方向寻找最短路线的一种方法。)
➢基本概念
一、阶段和状态 1、阶段k:将所给问题的过程,按时间或空间特征分解成若
干相互联系的阶段,以便按次序去求每阶段的解。设阶段变量 为k。阶段是问题的属性。多阶段决策问题中通常存在着若干 个阶段。在一般情况下,阶段是和时间有关的,但是在很多问 题中,阶段和时间并无直接关系。从阶段的定义中,可以看出Hale Waihona Puke Baidu阶段的两个特点,一是“相互联系”,二是“次序”。阶段之 间相互联系的方式是通过状态和状态转移体现的。
程序设计的一般格式
fn(sn) 某个初始值 ; for k←n-1 downto 1 do {枚举阶段}
for s取遍所有状态 do
for u取遍所有决策 do f k ( s k ) o g p f k 1 T k ( t s k , u k ) , u ;k
这里是一种从目标状态往回推的逆序求法,适用于目标状态确 定的问题。而很多试题是确定了初始状态的。当然,对于初始 状态确定的问题,我们也可以采用从初始状态出发往前推的顺 序求法。事实上,这种方法对我们来说要更为直观、更易设计 一些,从而更多地出现在我们的解题过程中。
原理的一个多阶段决策问题,整体上的最优策略p1,n同任何一个阶段k上的决 策Uk或任何一组阶段k1,…,k2上的子策略pk1,k2都不存在任何关系。如果要 对这样的问题进行动态程序设计的话,我们从一开始所作的划分阶段等如努 力进都将是徒劳的。 ⑵问题的求解过程必须具备无后效性的特点是条件。
因为动态程序设计方法是按次序去求每阶段的解,如果一个问题有后效性, 那么这样的次序便是不合理的。但是,我们可以通过重新划分阶段或选定状 态以及增加状态变量个数等手段,来使得问题满足无后效性这个条件。说到 底,还是要确定一个“序”。
➢
end;
➢ begin
➢ s:=所有城市;
➢ dis[a]:=search(a); {计算城市A城市E的最短路径长度}
➢ writeln(dist[a]);
➢ end.
➢ 这个程序的效率如何呢?我们可以看到,每次除了已经访问过的城市外, 其他城市都要,所以时间复杂度为W(n!),这是一个“指数级”的算法。 那么还有没有效率更高的解题方法呢?
问题的状态转移方程就是
➢使用动态程序设计方法解题的步骤
1、确定问题的研究对象,即状态。选定的状态必须满足如下两点: ⑴状态必须完全描述出事物的性质,两个不同事物的状态是不同的; ⑵必须存在状态与状态之间的“转移方程”,以便我们可以由初始状态逐 渐转化为目标状态。 由于状态是描述事物性质的量,所以我们应该以上述要求为标准,具体情 况具体分析。 2、划分阶段,确定阶段之间的状态转移方程; 3、考察此问题可否用动态程序设计方法解决,即问题是否具备最优子结构 和无后效性的特征 4、如果发现问题目前不能用动态程序设计方法解决,则调整阶段的划分和 状态的定义,使其具备最优子结构和无后效性的特征。
➢ 动态规划的实质是分治思想和解决冗余,因此它与分 治和贪心类似,它们都是将问题的实例分解为更小的、 相似的子问题,但是动态规划又有自己的特点。
➢ 贪心法的当前选择可能要依赖于已经作出的选择,但 不依赖于还未做出的选择和子问题,因此它的特征是 由顶向下,一步一步地做出贪心的选择,但不足的是, 如果当前选择可能要依赖子问题的解时,则难以通过 局部的贪心策略达到全局最优解。相比而言,动态规 划则可以处理不具有贪心实质的问题。
路产生了,即由后往前依次推出每个Dis值,直到推出Dis[A]为止。
7
5
B1
6 3
10
A
4
7
B2
4
6
2 85
B3 6
A
B
阶段0
阶段1
3
C1
1 2
42
C2 2
63 C3 3
C
阶段2
2
D1 2
3
D2 3 44 D3 D
阶段3
0
E
E
阶段4
我们从阶段4的城市E出发,按照阶段的顺序倒推至阶段0的城市a。 在求解的各个阶段,利用了k阶段与k+1阶段之间的如下关系
➢ 在用分治法解决问题时,由于子问题的数目往往是问题 规模的指数函数,因此对时间的消耗太大。动态规划的 思想在于,如果各个子问题不是独立的,不同的子问题 的个数只是多项式数数量级,如果我们能够保存已经解 决的子问题的答案,而在需要的时候再找出已求得的答 案,这样就可以避免大量的重复计算。由此而来的基本 思路是:用一个表记录所有已解决的子问题的答案,不 管该问题以后是否被用到,只要它被计算过,就将其结 果填入表中。
fk ( s k )op g fk t 1 T k ( s k ,u k ) ,u k
u k D k ( s k )
fn(sn) 某个初始值 (边界条件)
➢ 其中Sk是第k段的某个状态,Uk是从Sk出发的允许决 策集合Dk(Sk)中的一个决策,Tk(Sk,Uk)是定义在数值 x和决策Uk上的一个函数,而函数opt表示最优化, 根据具体问题分别表示为max或min。例中最短路径
➢ Var i,j,min:integer;
➢ begin
➢ if who=E then search:=0
➢ else begin
➢
min:=maxint;
➢
for i取遍所有城市 do
➢
if (map[who,i]>0) and (i in s)
➢
then begin
➢
s:=s-[i]; {城市i已访问}
➢ 动态程序设计方法中本阶段的状态往往是对上一阶段某状态进行相应决策 的结果,由第k段的状态Sk和决策Uk确定第k+1段的状态Sk+1的过程叫状态 转移。
➢ 状态转移规律的形式化表示sk+1=Tk(sk,uk)称为状态转移方程。决策的
目的是转移状态,状态转移的途径是决策。
2、策略pl,n:各段决策确定后,整个问题的决策序列就构成一个策 略,用p1,n={u1(s1),u2(s2),…, un(sn)}表示。对每个实际问 题,可供选择的策略有一定范围,称为允许策略集合,记作P1,n, 使整个问题达到最有效果的策略就是最优策略。
D3
由此得出程序 : dis[E]←0; for k←3 downto 0 do
for x取遍k阶段的所有城市do
begin dis[x]←∞; for y取遍k+1阶段的所有城市do
if dis[y]+map[x,y]<dis[x] then dis[x]←dis[y]+map[x,y]; end;{for} 输出dis[a];