[AI] 优先级LRTA*搜索算法 Prioritized-LRTA*

一、算法原理

原文点这儿!

优先级扫描(Prioritized Sweeping)是一种用于强化学习问题的算法,它根据优先级排序的状态更新执行异步动态规划(Moore & Atkeson 1993) 1。如果一个状态的值函数有很大的潜在变化,则它具有很高的优先级。为了保持算法的实时保证,每个计划阶段都可以进行最多的β更新,并且只有潜在更新大于的状态才会被添加到队列中。优先级扫描被证明比q-学习和Dyna-PI更有经验效率(Moore & Atkeson 1993)。

上边是原文翻译过来的,主要就是说这个算法是按优先级给节点进行更新的,这个节点的值潜在变化越大优先级就越高,“潜在变化: Δ \Delta Δ” 在下文程序二中给出了具体的计算方式。

下边才到了算法重点哈,下文的结构是先笼统讲一下P-LRTA*算法的流程,流程中用到的具体的三个函数伪代码将在流程下边进行详细介绍:

P-LRTA*(Prioritized简称P-)分为两个阶段,一个是规划阶段(planning phase),一个是动作阶段(action phase),我把具体操作步骤加粗了,未加粗的是各种算法特性之类的。

  • 规划阶段

    • P-LRTA*仅通过考虑邻近节点来更新当前节点(函数2:StateUpdate(s)),然后把已更新状态的节点的近邻节点加入队列,优先级是根据 Δ \Delta Δ 的大小。
    • 如果队列满了,就把队列中优先级低的移走(函数3:AddToQueue(s, Δ \Delta Δ))。
    • P-LRTA* 和 LRTA* 一样不需要地图的初始信息,并且对不可见区域采用自由空间假设。
    • 当队列大小为0时,P-LRTA等同于LRTA
    • 队列有明确的大小,这也严格保证了有限内存的使用。
    • 当更新完当前节点的 h 值后,开始优先级更新
    • 从队列顶部取最多 PS_MAX_UPDATE 个节点并使用函数1:Prioritized-LRTA(s) 进行更新
    • 那些队列中没取完的节点下个规划阶段再用,这也产生了一个不连续的搜索空间,但这是有益的,因为改变单个状态的启发式值可能会影响许多可能是遥远的状态的启发式值
  • 动作阶段

    • Agent 从 s 节点移动到拥有最小 f ( s , s ′ ) f(s, s') f(s,s) 的 s’ 节点, 其中 f ( s , s ′ ) = c ( s , s ′ ) + h ( s ′ ) f(s, s')=c(s, s')+h(s') f(s,s)=c(s,s)+h(s) c ( s , s ′ ) c(s, s') c(s,s)是节点s和s‘ 直接的距离,h(s’)是节点s’的启发式值。

下面介绍下用到的三个函数:

  • 函数 1
    在这里插入图片描述

函数1应该是主体函数了,输入就是 节点s,先判断s是不是目标节点,如果不是,就进入循环,先调用函数2更新当前节点的 h 值,然后它有个最大更新数,前面提到了,主要没超过这个更新次数并且队列里还有节点,就依次取出队列顶部的节点,只要不是目标节点,就更新h值最后向 f 值最小的节点移动。 加粗部分对应上边加粗的步骤

  • 函数 2
    在这里插入图片描述
    函数2用于更新节点h值,先判断s是不是目标节点,然后计算最低 f(s, s’),然后计算 Δ \Delta Δ Δ \Delta Δ就是用来衡量优先级的, Δ \Delta Δ越大优先级越高。如果 Δ \Delta Δ大于0,就把节点s的所有临近节点加入队列,然后更新当前节点 s的启发式值 h

  • 函数 3
    在这里插入图片描述
    函数3 用于把节点加入队列,队列要是没满并且节点s不在里面,就加进入,否则,把优先级低的移走,再把s加入

二、举个栗子!

在这里插入图片描述
如上图a所示,有A, B, C, D和Goal五个节点,从最远的D开始,目标是Goal,其启发式值总是为0,每个相邻节点见的移动代价 c = 1,每条路径都是双向的,圈内的值是当前该节点的启发式值 h,上边的方格表示队列。

以下是对该算法的具体应用例子步骤:

  • 首先执行 函数1 Prioritized-LRTA*(D), 更新D,进入StateUpdate(D),计算最小f,f(D, C)=f(D, B)=1+1=2, Δ = 2 − 1 > 0 \Delta=2-1>0 Δ=21>0 , 把 D 的所有临近节点即B, C加入队列,其优先级都是1写在了下标处,更新 h(D)=2,如图b所示

  • 继续运行函数1,此时队列非空,依次置行取出队列顶部节点,先取B,调用StateUpdate(B),f(B, A)=1+1=2, Δ = 2 − 1 = 1 > 0 \Delta=2-1=1>0 Δ=21=1>0,把B相邻节点A,D加入队列,其优先级也都是1,更新h(B)=2, 对C同理,由于A,D已在队列中了,最终结果如图c所示

  • 从队列取出A,最小 f ( A , G o a l ) = 1 + 0 = 1 , f(A,Goal)=1+0=1, f(A,Goal)=1+0=1, Δ = 1 − 1 = 0 \Delta=1-1=0 Δ=11=0,所以h(A)不更新,也不将临近节点加入队列。

  • 从队列取出D,最小 f ( D , B ) = f ( D , C ) = 1 + 2 = 3 , Δ = 3 − 2 = 1 > 0 f(D, B)=f(D,C)=1+2=3, \Delta=3-2=1>0 f(D,B)=f(D,C)=1+2=3,Δ=32=1>0,将B, C加入队列,优先级都是1,更新 h ( D ) = f ( D , B ) = f ( D , C ) = 3 h(D)=f(D, B)=f(D,C)=3 h(D)=f(D,B)=f(D,C)=3, 如图d所示

  • 从队列中取出B,最小 f ( B , A ) = 2 , Δ = 0 f(B, A)=2, \Delta=0 f(B,A)=2,Δ=0,无事发生,C同理

  • 队列空了,跳出循环,找到最小 f ( D , B ) = f ( D , C ) = 1 + 3 = 4 f(D, B)=f(D, C)=1+3=4 f(D,B)=f(D,C)=1+3=4,节点从D移动到B或者C。

参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是土豆大叔啊!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值