《Planning Algorithm》学习系列第一部分第二章: 离散规划

2.1节和2.2节分别定义并展示了可行规划的搜索方法,他们仅考虑到达目标位置。2.3节描述了最优规划的问题,最优原则和动态规划原则大大减少了计算量,而动态规划中的值迭代方法是本节的重点,Dijkstra算法与值迭代方法的关系也将会被讨论,2.4和2.5节介绍了基于逻辑的辨表示方法,使得问题更容易解决,但后续章节不需要这些内容。

2.1 离散可行规划简介(Discrete Feasible Planning)

2.1.1 问题描述

离散可行规划模型将通过状态空间模型定义,并将贯穿本书始终。每个独特的世界情形被称为状态 x x x (state),其中不相关的信息应该避免,每个可能状态的集合称为状态空间 X X X(state space)。对于离散规划,集合 X X X是可数的,多事情况时有限的, X X X应该包含解决问题所需的足够多的有效信息。世界(world)将通过规划器选择的一些列的动作(actions)发生改变。新状态 x ′ x^{\prime} x通过状态转移函数 f f fstate transition function)得到,状态转移方程如下: x ′ = f ( x , u ) . x^{\prime} = f(x,u). x=f(x,u). U ( x ) U(x) U(x)代表每个状态 x x x的动作空间(action space),所有可行动作的集合为 U U U,定义如下: U = ⋃ x ∈ X   U ( x ) . U=\underset{x\in X}{\mathop{\bigcup}} \,U(x). U=xXU(x). 目标状态(goal states) X G ⊂ X X_G \sub X XGX,规划任务可以描述为寻找有限的一系列动作使得从最初的状态 x I x_I xI转变为 X G X_G XG,模型可以简述为:

公式2.1 离散可行规划

  1. 非空有限集合称为状态空间 X X X(state space)。
  2. ∀ x ∈ X \forall x \in X xX , U ( x ) U(x) U(x)代表有限的动作空间(action space)。
  3. 状态转移函数(state transition function f f f f ( x , u ) ∈ X , x ∈ X , u ∈ U ( x ) f(x,u) \in X, x \in X, u \in U(x) f(x,u)X,xX,uU(x),状态转移方程定义如下: x ′ = f ( x , u ) . x^{\prime} = f(x,u). x=f(x,u).
  4. 最初的状态(initial state) x I x_I xI.
  5. 目标状态集合(goal states) X G ⊂ X X_G \sub X XGX.

通常将公式2.1表述为状态转移图(state transition graph),所有的点代表状态空间 X X X,从 x ∈ X x \in X xX x ′ ∈ X x ^{\prime}\in X xX的有向边存在的条件是,当且仅当存在一个动作 u ∈ U ( x ) u \in U(x) uU(x)使得 x ′ = f ( x , u ) . x^{\prime} = f(x,u). x=f(x,u). 初始点和目标点集合被标记为图上特殊的点。这就完成了公式2.1的图表达。

2.1.2 离散规划的举例

2.2 可行规划搜索(Searching for Feasible Planning)

本节中介绍的方法只是图搜索算法,但要了解状态转换图是通过应用动作逐步显示的,而不是事先完全指定。因此,从规划的角度来看,本节中展示的算法可以被视为访问图搜索算法。 任何搜索算法的一个重要要求是系统化(systematic)。若图是有限的,那么算法将可以访问任何一个可达的状态,并在有限时间内表明是否有解。为了系统化,算法应该跟踪已经访问过的状态; 否则,算法会循环遍历相同的状态而永远运行。 确保不发生冗余探索就足以使搜索系统化。
如果图是无限的,那么我们愿意容忍较弱的系统性。 如果一个解存在,那么搜索算法仍然必须在有限时间内报告它; 但是,如果解决方案不存在,则算法永远搜索是可以接受的。 这一系统要求是通过确保在极限情况下,随着搜索迭代次数趋于无穷大,探索图中的每个可达顶点来实现的。 由于顶点的数量被假定为可数的,所以这必须始终是可能的。

2.2.1 一般前向搜索(General Forward Searching)

图2.4用状态空间来展示了一般的搜索算法模板,在搜索中的任意点,有三种状态:

  1. 未访问(Unvisited):未被访问的点,开始时为除了 x I x_I xI以外的所有点。
  2. 死亡(Dead):已访问过的状态,并且还访问了每个可能的下一个状态。 x x x的下一状态 x ′ = f ( x , u ) . x^{\prime} = f(x,u). x=f(x,u). 这些状态已经dead因为他们对搜索已无贡献。
  3. 存活(Alive):已遇到的状态,但可能尚未访问下一个状态。开始时为 x I x_I xI

存活状态被存贮在一个优先队列 Q Q Q中,并且有一个指定的优先函数。不同搜索算法的最大不同就是用于排列 Q Q Q的特定函数不同。

一些搜索算法需要计算代价(cost)并与每个状态相关联。如果多次达到同一状态,则需要更新代价,这步在第 12 行执行此操作。此类成本可以以某种方式用于对优先级队列进行排序,或者它们可以在算法完成时重新启动算法。与前面提到的存储指针不同,返回到初始状态的最佳代价可以与每个状态一起存储。仅用代价值就足以确定导致任何访问状态的动作序列。从访问过的状态开始,可以通过以尽可能快地降低每一步代价的方式向后遍历状态转换图来获得返回 x I x_I xI 的路径。为此,代价必须具有一定的单调性,这是通过 Dijkstra 算法和 A* 搜索获得的,将在第 2.2.2 节中介绍。更一般地说,代价必须形成导航功能(navigation function),这在第 8.2.2 节中被考虑。
一般搜索

2.2.2 特定前向搜索方法(Particular Forward Search Methods)

本节介绍了一些搜索算法,每种算法都构建了一个搜索树。每种算法都是图2.4的特例,通过定义一个 Q Q Q的不同的排序函数(sorting function)。多数为经典的图搜索理论。

Breadth first (广度优先):假设 Q Q Q是先进先出的队列,这会导致搜索边界均匀增长,因此被称为广度优先搜索。 在搜索具有 k + 1 个步骤的规划之前,所有具有 k 个步骤的规划都已搜索。因此,广度优先保证找到的第一个解决方案将使用最少的步数。如果一个点被再访问了,那么无需进行 图2.4的第12行。搜索时间 O ( ∣ V ∣ + ∣ E ∣ ) O(|V|+|E|) O(V+E)。它是系统性的。

Depth first (深度优先):假设 Q Q Q是先进后出的栈,与广度优先搜索的统一扩展相反,进行了对状态转换图的积极探索。 该算法倾向于尽早调查更长的规划。 尽管这种激进的行为似乎是可取的,但请注意对规划的选择是随机的。由于迭代次数趋于无穷大,搜索很容易专注于一个“方向”并完全错过搜索空间的大部分。搜索时间 O ( ∣ V ∣ + ∣ E ∣ ) O(|V|+|E|) O(V+E)。它在状态有限的情况下是系统性的。

Dijkstra 算法: 用于在图上寻找一条单目标的最短路径,是一种特殊的动态规划。假设在离散规划图中的每条边 e ∈ E e \in E eE都有一个不可忽略的代价 l ( e ) l(e) l(e),它是实施该动作的代价,通过状态空间表示方法 l ( x , u ) l(x,u) l(x,u)。总代价是从最初状态到目标状态的总和。对于优先队列 Q Q Q,优先函数 C : X → [ 0 , ∞ ] , C:X \to [0, \infty], C:X[0,],称为cost-to-come,对于每个状态 x x x的值 C ∗ ( x ) C^*(x) C(x)是距离 x I x_I xI的最优路程代价,被称为optimal cost-to-come,如果代价不是最优的,则为 C ( x ) C(x) C(x). C ∗ ( x I ) = 0 , C ( x ′ ) = C ∗ ( x ) + l ( e ) C^*(x_I) =0, C(x^{\prime}) =C^*(x)+l(e) C(xI)=0,C(x)=C(x)+l(e) C ( x ′ ) = C ∗ ( x ) + l ( x , u ) C(x^{\prime}) =C^*(x)+l(x,u) C(x)=C(x)+l(x,u).若 x ′ x^{\prime} x已经访问过,那么就应该选择 C ( x ′ ) C(x^{\prime}) C(x)更小的那条路径。搜索时间 O ( ∣ V ∣ l g ∣ V ∣ + ∣ E ∣ ) O(|V| lg |V|+|E|) O(VlgV+E)

A-star算法 C ( x ) C(x) C(x)代表cost-to-come,即 x x x x I x_I xI的代价函数, G ( x ) G(x) G(x)代表cost-to-go,即 x x x X G X_G XG的代价函数,真实最优代价函数 G ∗ G^* G难以得到,只有一个估计值 G ^ ∗ \hat{G}^* G^。A*算法与Dj算法类似,他采用的是 C ∗ ( x ′ ) + G ^ ∗ ( x ′ ) C^{*}(x^{\prime})+\hat{G}^*(x^{\prime}) C(x)+G^(x). 当 G ^ ∗ ( x ) = 0 , x ∈ X \hat{G}^*(x) = 0,x \in X G^(x)=0,xX,则退化为Dj算法。

最优优先(best first): 不具备系统性的,基于最优估计cost-to-go,是贪心的当前最优,并不是全局最优。
best first
迭代深化(Iterative deepening):适用于枝杈多的搜索树,即动作多,状态少,状态可能被重复访问的情形。这个想法是使用深度优先搜索并找到与 x I x_I xI 的距离为 i i i 或更小的所有状态,如果没有找到目标,则丢弃之前的工作,并应用深度优先找到与 x I x_I xI 距离 i + 1 i+1 i+1 或更小的所有状态。这通常从 i = 1 i=1 i=1 开始迭代并无限期地进行,直到找到目标。迭代深化可以视为将深度优先搜索转变为具有系统性搜索方法。丢弃之前工作的原因是,预计 i + 1 i+1 i+1 达到的状态数量将远远超过(例如,10 倍)达到 i i i 的数量。 因此,一旦达到第 i + 1 i+1 i+1 级,之前所有迭代的成本就可以忽略不计。
迭代深化方法比广度优先算法有更好的处理最糟糕情况。同时状态的规模也在减小。A* 算法可以与迭代深化结合成为IDA*.

2.2.3 其他一般搜索方案(Other General Search Schemes)

本节介绍另外两个用于搜索算法的通用模板。 第一个只是图 2.4 中树搜索算法的“反向”版本。 第二种是双向方法,它生长两棵搜索树,一棵来自初始状态,另一棵来自目标状态。

反向搜索(backward search):从目标状态(假设只有一个状态 x G x_G xG)搜索初始状态,如图2.6,其中 U − 1 = { ( x , u ) ∈ X × U ∣ x ∈ X , u ∈ U ( x ) } U^{-1} = \left \{ (x,u) \in X \times U | x \in X, u\in U(x) \right \} U1={ (x,u)X×UxX,uU(x)}, u − 1 u^{-1} u1表示一个属于 U − 1 ( x ′ ) U^{-1}(x^{\prime}) U1(x)的状态-动作对 ( x , u ) (x,u) (x,u) f − 1 f^{-1} f1代表方向状态传递函数, x = f − 1 ( x ′ , u − 1 ) x=f^{-1}(x^{\prime},u^{-1}) x=f1(x,u1),他在状态传递图上很好理解,即把每条边反向。每个反向搜索均可以使用图2.6的模板,但是采用不同的 f − 1 f^{-1} f1.
方向搜索
双向搜索(Bidirectional search):图2.7可以视为图2.4和图2.6的结合,假设目标状态只有一个状态 { x G } \left \{ x_G \right \} { xG},当两棵树相交时搜索结束,当其中一个优先队列耗尽时搜索失败。
双向搜索

2.2.4 搜索方法的统一视角(A Unified View of the Search Methods)

搜索方法往往可以归结为简单的几个步骤。复杂的规划算法也都是从这些步骤扩展而来,例如5.4节的基于采样的运动规划问题。离散状态空间扩展为连续空间(C空间),每个方法可以构建搜索图 G = ( V , E ) \mathcal{G}=(V,E) G=(V,E),即状态转移图的子图。

  1. 初始化(Initialization):初始化搜索图 G = ( V , E ) \mathcal{G}=(V,E) G=(V,E), 其中 E = ∅ E=\empty E= V V V包含一些初始状态。对于前向搜索, V = { x I } V = \left \{ x_I \right \} V={ xI},对于后向搜索, V = { x G } V = \left \{ x_G \right \} V={ xG},对于双向搜索, V = { x I , x G } V = \left \{ x_I,x_G \right \} V={ xI,xG}。也可以构建多个搜索树,此时 V V V需要初始化多个状态。搜索图将逐渐增长以显示越来越多的状态转换图。
  2. 选择点(Slect Vertex):选择一个节点 n c u r ∈ V n_{cur} \in V ncurV进行探索,这通常是通过维护一个优先级队列来实现的。 x c u r x_{cur} xcur代表 n c u r n_{cur} ncur的状态。
  3. 实施动作(Apply an Action):获得一个新的状态 x n e w x_{new} xnew x n e w = f ( x , u ) , u ∈ U x_{new}=f(x, u), u \in U xnew=f(x,u),uU(前向)或者 x = f ( x n e w , u ) , u ∈ U ( x n e w ) x=f(x_{new},u), u \in U(x_{new}) x=f(xnew,u),uU(xnew)(后向)。
  4. 在图中插入一条有向边(Insert a Direct Edge into the Graph):如果某些特定算法的测试通过,则产生一条从 x x x x n e w x_{new} xnew的边(前向),或者从 x n e w x_{new} xnew x x x的边(后向)。如果 x n e w x_{new} xnew不在 V V V中,则将其插入其中。
  5. 检查解决方案(Check for Solution): 决定 G \mathcal{G} G是否编码一条从 x I x_I xI x G x_G xG的路径。如果只有一条路径,计算量可以忽略不计。如果有多条路径,那么这一步会有较大的计算量。
  6. 回到第二步(Return to Step 2):不停迭代直到找到一个解决方案或者满足提前终止条件,在这种情况下,算法报告失败。

请注意,在此模板中,一次迭代中可能必须进行多次迭代。 图 2.4 中的前向搜索算法对 Q 的第一个元素尝试所有动作。如果有k个动作,这对应于上面模板中的k次迭代。

2.3 离散最优规划(Discrete Optimal Planning)

这一节将扩展公式2.1使其能解决最优规划问题,三条重要的扩展是:1)将使用阶段索引方便地指示当前规划的步骤;2)将引入代价函数,它的行为类似于计程器,通过指示在计划执行期间累积了多少代价;3)将引入终止操作,直观地指示何时停止规划并确定总代价。

本章将分为三个阶段,首先,2.3.1节寻找固定长度的最优路径,使用的方法是值迭代(value iteration),2.3.2介绍了未指定长度的最优规划,2.3.3介绍了值迭代方法与Dj算法的关系。

本书默认求解的优化问题是最小化问题(最大化问题也可以转化为最小化问题求解)。

首先介绍新的概念:
π K \pi_{K} πK表示一个K步的规划(K-step plan),即K个动作的序列: ( u 1 , u 2 , . . . , u K ) (u_1,u_2,...,u_K) (u1,u2,...,uK)。给定 π K , x I \pi_{K},x_I πK,xI,则通过状态转移函数 f f f得到状态序列 ( x 1 , x 2 , . . . , x K + 1 ) , x 1 = x I , x K + 1 = f ( x k , u k ) (x_1,x_2,...,x_{K+1}), x_1= x_I, x_{K+1}=f(x_k,u_k) (x1,x2,...,xK+1),x1=xI,xK+1=f(xk,uk).

于是我们给出以下模型,该模型的关键是代价函数 L L L:

公式2.2 离散定长度最优规划(Discrete Fixed-Length Optimal Planning)

  1. 公式2.1中的元素均被继承: X , U ( x ) , f , x I , X G X, U(x), f, x_I, X_G X,U(x),f,xI,XG,其中 X X X是有限的.
  2. 正整数K(阶段),代表一个规划的长度, ( u 1 , u 2 , . . . , u K ) (u_1,u_2,...,u_K) (u1,u2,...,uK),状态都会获得一个阶段索引, x k + 1 x_{k+1} xk+1代表实施动作 u k u_k uk后获得的状态。
  3. L L L代表阶段附加代价函数(损失函数)并应用于一个K步规划 π K \pi_{K} πK,于是序列 ( u 1 , u 2 , . . . , u K ) (u_1,u_2,...,u_K) (u1,u2,...,uK) ( x 1 , x 2 , . . . , x K + 1 ) (x_1,x_2,...,x_{K+1}) (x1,x2,...,xK+1)通过 L L L显示表达。令 F F F代表最终阶段, F = K + 1 F=K+1 F=K+1,则代价函数: L ( π K ) = ∑ k = 1 K l ( x k , u k ) + l F ( x F ) L(\pi_K)=\sum \limits_{k=1}^{K} {l(x_k,u_k) +l_F(x_F)} L(πK)=k=1Kl(xk,uk)+lF(xF) 代价项 l ( x k , u k ) l(x_k,u_k) l(xk,uk)代表了每一个 x k ∈ X , u ∈ U ( x k ) x_k \in X, u \in U(x_k) xkX,uU(xk)的代价值,最终项 l F ( x F ) = 0 , x F ∈ X G l_F(x_F) = 0, x_F \in X_G lF(xF)=0,xFXG或者 l F ( x F ) = ∞ , o t h e r w i s e l_F(x_F) = \infty, otherwise lF(xF)=,otherwise.

l F l_F lF可以理解成一个惩罚项,他使得 L ( π K ) = ∞ L(\pi_K) = \infty L(πK)=代表无可行解, L ( π K ) < ∞ L(\pi_K) < \infty L(πK)<代表有可行解。

2.3.1 指定长度的最优规划(Optimal Fixed-Length Plans)

最优性原则直接导致迭代算法,称为值迭代,它可以解决大量最优规划问题,包括那些涉及可变长度规划、随机不确定性、不完美状态测量和许多其他复杂问题的问题。 这个想法是在状态空间上迭代计算最优的cost-to-go(或cost-to-come)函数。 在某些情况下,该方法可以简化为 Dijkstra 算法; 然而,这只发生在某些特殊条件下。 接下来将介绍值迭代算法,第 2.3.3 节讨论它与 Dijkstra 算法的联系。

2.3.1.1 后向值迭代(Backward value iteration)

G k ∗ G_{k}^{*} Gk代表从阶段k到F的累加代价值,
G k ∗ ( x k ) = min ⁡ u k , … , u K { ∑ i = k K l ( x i , u i ) + l F ( x F ) } G_{k}^{*}\left(x_{k}\right)=\min _{u_{k}, \ldots, u_{K}}\left\{\sum_{i=k}^{K} l\left(x_{i}, u_{i}\right)+l_{F}\left(x_{F}\right)\right\} Gk(xk)=uk,,uKmin{ i=kKl(xi,ui)+lF(xF)}
k = F k=F k=F G F ∗ ( x F ) = l F ( x F ) G_{F}^{*}\left(x_{F}\right)=l_{F}\left(x_{F}\right) GF(xF)=lF(xF)

现在考虑从 K K K X X X,每一步计算通过 G K + 1 ∗ G^{*}_{K+1} GK+1计算 G K ∗ G^{*}_{K} GK,第一步, G F ∗ = l F G^{*}_{F}=l_F GF=lF,第二步, G K ∗ ( x K ) = min ⁡ u K { l ( x K , u K ) + l F ( x F ) } G_{K}^{*}\left(x_{K}\right)=\min _{u_{K}}\left\{l\left(x_{K}, u_{K}\right)+l_{F}\left(x_{F}\right)\right\} GK(xK)=uKmin{ l(xK,uK)+lF(xF)}
因为 l F = G F ∗ l_F=G^{*}_{F} lF=GF以及 x F = f ( x K , u K ) x_{F}=f\left(x_{K}, u_{K}\right) xF=f(xK,uK)
G K ∗ ( x K ) = min ⁡ u K { l ( x K , u K ) + G F ∗ ( f ( x K , u K ) ) } G_{K}^{*}\left(x_{K}\right)=\min _{u_{K}}\left\{l\left(x_{K}, u_{K}\right)+G_{F}^{*}\left(f\left(x_{K}, u_{K}\right)\right)\right\} GK(xK)=uKmin{ l(xK,uK)+GF(f(xK,uK))}
于是, G k ∗ G^*_k Gk可以由 G k + 1 ∗ G^*_{k+1} Gk+1得到
G k ∗ ( x k ) = min ⁡ u k { min ⁡ u k + 1 , … , u K { l ( x k , u k ) + ∑ i = k + 1 K l ( x i , u i ) + l F ( x F ) } } G_{k}^{*}\left(x_{k}\right)=\min _{u_{k}}\left\{\min _{u_{k+1}, \ldots, u_{K}}\left\{l\left(x_{k}, u_{k}\right)+\sum_{i=k+1}^{K} l\left(x_{i}, u_{i}\right)+l_{F}\left(x_{F}\right)\right\}\right\} Gk(xk)=ukmin{ uk+1,,uKmin{ l(xk,uk)+i=k+1Kl(xi,ui)+lF(xF)}}

将上式进行整理,可得
G k ∗ ( x k ) = min ⁡ u k { l ( x k , u k ) + min ⁡ u k + 1 , … , u K { ∑ i = k + 1 K l ( x i , u i ) + l F ( x F ) } } G_{k}^{*}\left(x_{k}\right)=\min _{u_{k}}\left\{l\left(x_{k}, u_{k}\right)+\min _{u_{k+1}, \ldots, u_{K}}\left\{\sum_{i=k+1}^{K} l\left(x_{i}, u_{i}\right)+l_{F}\left(x_{F}\right)\right\}\right\} Gk(xk)=ukmin{ l(xk,uk)+uk+1,,uKmin{ i=k+1Kl(xi,ui)+lF(xF)}}也就是
G k ∗ ( x k ) = min ⁡ u k { l ( x k , u k ) + G k + 1 ∗ ( x k + 1 ) } G_{k}^{*}\left(x_{k}\right)=\min _{u_{k}}\left\{l\left(x_{k}, u_{k}\right)+G_{k+1}^{*}\left(x_{k+1}\right)\right\} Gk(xk)=ukmin{ l(xk,uk)+Gk+1(xk+1)}其中 x k + 1 = f ( x k , u k ) x_{k+1}=f\left(x_{k}, u_{k}\right) xk+1=f(xk,uk),此时等式右边仅与 x k , u k , G k + 1 ∗ x_k,u_k,G^*_{k+1} xk,uk,Gk+1有关, G k + 1 ∗ G^*_{k+1} Gk+1计算时间复杂度为 O ( ∣ X ∣ ∣ U ∣ ) O(|X||U|) O(XU),这样的计算便是值迭代。

为了简化,值迭代步骤如下:
G F ∗ → G K ∗ → G K − 1 ∗ ⋯ G k ∗ → G k − 1 ∗ ⋯ G 2 ∗ → G 1 ∗ G_{F}^{*} \rightarrow G_{K}^{*} \quad \rightarrow \quad G_{K-1}^{*} \quad \cdots \quad G_{k}^{*} \rightarrow G_{k-1}^{*} \quad \cdots \quad G_{2}^{*} \rightarrow G_{1}^{*} GFGKGK1GkGk1G2G1最终决定 G 1 ∗ G_1^* G1需要 O ( K ∣ X ∣ ∣ U ∣ ) O(K|X||U|) O(KXU)时间。

在这里插入图片描述
值迭代举例
在这里插入图片描述
在这里插入图片描述

2.3.1.2 前向值迭代(Forward value iteration)

C k ∗ C^*_k Ck 表示从第 1 阶段到第 k 阶段的最优成本,在所有 (k − 1) 步规划上进行了优化。 为了排除不在 x I x_I xI开始的计划, C 1 ∗ C^*_1 C1的定义由下式给出 C 1 ∗ ( x 1 ) = l I ( x 1 ) C_{1}^{*}\left(x_{1}\right)=l_{I}\left(x_{1}\right) C1(x1)=lI(x1) l I ( x I ) = 0 ,  and  l I ( x ) = ∞  for all  x ≠ x I . l_{I}\left(x_{I}\right)=0,\text { and } l_{I}(x)=\infty \text { for all } x \neq x_{I}. lI(xI)=0 and lI(x)= for all x=xI.

对于中间阶段, k ∈ { 2 , . . . , K } k \in \left \{ 2,...,K\right \} k{ 2,...,K}
C k ∗ ( x k ) = min ⁡ u 1 , … , u k − 1 { l I ( x 1 ) + ∑ i = 1 k − 1 l ( x i , u i ) } C_{k}^{*}\left(x_{k}\right)=\min _{u_{1}, \ldots, u_{k-1}}\left\{l_{I}\left(x_{1}\right)+\sum_{i=1}^{k-1} l\left(x_{i}, u_{i}\right)\right\} Ck(xk)=u1,,uk1min{ lI(x1)+i=1k1l(xi,ui)}注意这个加和序列为 x 1 , . . . , x k − 1 x_1,...,x_{k-1} x1,...,xk1以及 u 1 , . . . , u k − 2 u_1,...,u_{k-2} u1,...,uk2
C F ∗ ( x F ) = min ⁡ u 1 , … , u K { l I ( x 1 ) + ∑ i = 1 K l ( x i , u i ) } C_{F}^{*}\left(x_{F}\right)=\min _{u_{1}, \ldots, u_{K}}\left\{l_{I}\left(x_{1}\right)+\sum_{i=1}^{K} l\left(x_{i}, u_{i}\right)\right\} CF(xF)=u1,,uKmin{ lI(x1)+i=1Kl(xi,ui)}
为了展示动态规划,假设 C k − 1 ∗ C^{*}_{k-1} Ck1已知,并通过 x k x_k xk计算 C k ∗ C^{*}_{k} Ck,这就需要实施动作, x k − 1 = f − 1 ( x k , u k − 1 ) x_{k-1}=f^{-1}\left(x_{k}, u_{k}^{-1}\right) xk1=f1(xk,uk1)
C k ∗ ( x k ) = min ⁡ u k − 1 ∈ U − 1 ( x k ) { C k − 1 ∗ ( x k − 1 ) + l ( x k − 1 , u k − 1 ) } C_{k}^{*}\left(x_{k}\right)=\min _{u_{k}^{-1} \in U ^{-1}\left(x_{k}\right)}\left\{C_{k-1}^{*}\left(x_{k-1}\right)+l\left(x_{k-1}, u_{k-1}\right)\right\} Ck(xk)=uk1U1(xk)min{ Ck1(xk1)+l(xk1,uk1)}最终决定需要 O ( K ∣ X ∣ ∣ U ∣ ) O(K|X||U|) O(KXU)时间。

2.3.2 未指定长度的最优规划(Optimal Plans of Unspecified Lengths)

公式2.3 离散最优规划

  1. 公式2.1中的元素均被继承: X , U ( x ) , f , x I , X G X, U(x), f, x_I, X_G X,U(x),f,xI,XG,公式2.2中的“阶段”概念也被使用
  2. L L L代表阶段附加代价函数(损失函数)并应用于任意一个K步规划 π K \pi_{K} πK,于是序列 ( u 1 , u 2 , . . . , u K ) (u_1,u_2,...,u_K) (u1,u2,...,uK) ( x 1 , x 2 , . . . , x K + 1 ) (x_1,x_2,...,x_{K+1}) (x1,x2,...,xK+1)通过 L L L显示表达。令 F F F代表最终阶段, F = K + 1 F=K+1 F=K+1,则代价函数: L ( π K ) = ∑ k = 1 K l ( x k , u k ) + l F ( x F ) L(\pi_K)=\sum \limits_{k=1}^{K} {l(x_k,u_k) +l_F(x_F)} L(πK)=k=1Kl(xk,uk)+lF(xF) 与公式2.2不同的是, K K K不是预先已知的常数,而是一个可变的数。
  3. 每个 U ( x ) U(x) U(x)包含一个特殊的滞止动作(termination action) u T u_T uT,当 u T u_T uT重复作用于 x k x_k xk,该状态将不会发生改变,代价值也不会增长。因此, ∀ i ≥ k , u i = u T , x i = x k , l ( x i , u T ) = 0 \forall i \geq k, u_{i}=u_{T}, x_{i}=x_{k}, l\left(x_{i}, u_{T}\right)=0 ik,ui=uT,xi=xk,l(xi,uT)=0.

滞止动作是使规划不同长度的关键。当达到滞止状态时,值迭代将陷入循环但代价值不变,此时便于索引无关了。(迭代循环增长但是值不变,故索引已经失去了意义),丢弃索引后:
G ∗ ( x ) = min ⁡ u { l ( x , u ) + G ∗ ( f ( x , u ) ) } G^{*}(x)=\min _{u}\left\{l(x, u)+G^{*}(f(x, u))\right\} G(x)=umin{ l(x,u)+G(f(x,u))}对于一个存在最优解的规划,则存在一个上限阶段总数,任何多于该上限的值迭代都会是不变或是更差的。如果 l ( x , u ) l(x,u) l(x,u)包含负数项,循环多次后就会趋近负无穷,这将是一个麻烦。由于特定阶段索引不重要,因此让 k=0 为最后阶段的索引,这是后向值迭代开始的阶段。 G 0 ∗ G^*_0 G0是最终阶段的代价,可由 l F l_F lF直接得到。令 − K -K K表示代价函数滞止的阶段,此时 G ∗ : X → R ∪ { ∞ } , G ∗ = G − K ∗ G^{*}: X \rightarrow \mathbb{R} \cup\{\infty\}, G^{*}=G^{*}_{-K} G:XR{ },G=GK。换句话说,特定阶段索引不再重要。 值 G ∗ ( x ) G^{*}(x) G(x) 给出了从状态 x ∈ X x ∈ X xX 到特定目标状态 x G x_G xG 的最佳成本。

后向搜索选择最优的下一步动作方程如下:
u ∗ = argmin ⁡ u ∈ U ( x ) { l ( x , u ) + G ∗ ( f ( x , u ) ) } u^{*}=\underset{u \in U(x)}{\operatorname{argmin}}\left\{l(x, u)+G^{*}(f(x, u))\right\} u=uU(x)argmin{ l(x,u)+G(f(x,u))}选择完最优动作 u ∗ u^* u后,下一个状态 x ′ = f ( x , u ∗ ) x^{\prime} = f(x,u^*) x=f(x,u)。如此往复,直到达到最终的状态 X G X_G XG。这个过程基于动态规划。

前向最优动作获取方法
argmin ⁡ u − 1 ∈ U − 1 { C ∗ ( f − 1 ( x , u − 1 ) ) + l ( f − 1 ( x , u − 1 ) , u ′ ) } \underset{u^{-1} \in U^{-1}}{\operatorname{argmin}}\left\{C^{*}\left(f^{-1}\left(x, u^{-1}\right)\right)+l\left(f^{-1}\left(x, u^{-1}\right), u^{\prime}\right)\right\} u1U1argmin{ C(f1(x,u1))+l(f1(x,u1),u)} u ′ u^{\prime} u U ( f − 1 ( x , u − 1 ) ) U(f^{−1}(x, u^{−1})) U(f1(x,u1)) 中的动作,当应用状态转换函数 f f f 时,它产生 x x x。 迭代从 x G x_G xG 向后进行,并在达到 x I x_I xI 时终止。

继续以例子2.3分析,在这之上叠加代价值为0的新的边

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.3.3 Dj算法(Dijkstra Revisited)

Dijkstra 算法属于更广泛的标签校正算法(label-correcting algorithm)系列,它们都通过对图 2.4 中的通用前向搜索算法进行小的修改来产生最佳计划。下图展示了算法结果。主要区别在于,如果找到更好的成本,则允许状态再次活跃。 这使得其他代价值能够相应地得到改善。 这对于 Dijkstra 算法和 A* 搜索并不重要,因为它们只需要访问每个状态一次。 因此,图 2.4 和 2.16 中的算法在这种情况下基本相同。 然而,只要 X 是有限的,标签校正算法就会为 Q 的任何排序产生最优解,包括 FIFO(广度优先)和 LIFO(深度优先)。 如果 X 不是有限的,那么系统搜索的问题就占主导地位,因为必须保证状态被重新访问足够多次以保证最终会找到最佳解决方案。

标签校正算法和标准前向搜索模型之间的另一个重要区别是标签校正方法使用目标状态的成本来修剪许多候选路径; 这在第 7 行中显示。因此,它仅适用于单一目标状态; 它可以适用于多个目标状态,但性能会下降。 将 C ( x G ) C(x_G) C(xG) 包含在第 7 行中的动机是,如果某个状态 x ′ x^{\prime} x 的新成本高于 C ( x G ) C(x_G) C(xG) ,则无需担心改进成本。 类似地,第 10 行没有插入 x G x_G xG ,因为不需要考虑将 x G x_G xG 作为中间状态的规划。 为了恢复计划,每次在第 7 行进行更新时都可以将指针从 x 存储到 x’,或者最终的最优成本 C* 可以用于恢复使用下式的动作。

argmin ⁡ u − 1 ∈ U − 1 { C ∗ ( f − 1 ( x , u − 1 ) ) + l ( f − 1 ( x , u − 1 ) , u ′ ) } \underset{u^{-1} \in U^{-1}}{\operatorname{argmin}}\left\{C^{*}\left(f^{-1}\left(x, u^{-1}\right)\right)+l\left(f^{-1}\left(x, u^{-1}\right), u^{\prime}\right)\right\} u1U1argmin{ C(f1(x,u1))+l(f1(x,u1),u)}在这里插入图片描述

(以下内容暂不介绍)

2.4 使用逻辑制定离散规划(Using Logic to Formulate Discrete Planning)

2.4.1 类STRIPS 描述(A STRIPS-Like Representation)

2.4.2 状态空间描述 (Converting to the State-Space Representation)

2.5 基于逻辑规划的方法(Logic-Based Planning Methods)

2.5.1 在局部平面空间中搜索(Searching in a Space of Partial Plans)

2.5.2 构造规划图(Building a Planning Graph)

2.5.3 可满足性的规划(Planning as Satisfiability)

延伸阅读

猜你喜欢

转载自blog.csdn.net/hujiawei_SJTU/article/details/120220074
今日推荐