简单规划
用PDDL将规划问题定义搜索问题
我们考虑一个航空货物运输问题
下面将该问题进行形式化
对于上图的问题,如何表示
我们就可以利用数据库语义,即未提及的语句都默认为false
其中效果只用来描述发生变化的部分,在这个问题中,直升机从一个地点飞行到另一地点,则会导致At(p,from)会发生变化,以及会增加一个效果也就是At(p,to)
因此我们在效果中只提及这两个部分
基元动作:就是将变量进行赋值从而得到基元动作
即只有当前状态满足动作a的前提条件时,才会执行该动作
其中上图给的第一个状态s,其不蕴涵precond因此不能执行该动作
然而第二个状态蕴涵precond,因此可以执行该动作
即当给定动作模式时,如何获得状态的转移模型?
即从当前状态s出发,去掉在效果里不能出现的流(动作效果里以负文字出现的流),并增加在效果里以正文字出现的流
目标测试:即给定状态s,判断其是否到达目标,即判断当前状态是否蕴涵目标
前向搜索,后向搜索及搜索的启发式
相关动作:指能够到达目标的最后一个动作,可能有多条路径能够到达目标,因此可能会有多个相关动作
对于前向搜索和后向搜索而言,它们的转移模型是不一样的
我们可以发现若将后向搜索的转移模型替换为前向搜索的转移模型,此时不满足动作的前提
此时还有一个问题,Result(Backto(g,a),a) = g 这个等式是否正确
即前向和后向这个过程是否是可逆的? 答案是:不可逆
我们以上图的假设为例,g为D,经过反向搜索后,得Backto(g,a)为A,B,C的合取,若此时再利用一次前向搜索,得Result(Backto(g,a),a)为A,B,D的合取,不为D。因此两个过程是不可逆的。
下面来讨论一下,如何判断动作是否相关
即需满足两个条件
- 动作效果不能否定目标的任何元素
- 动作效果至少与目标的一个元素一致
因此上述两个动作都是不相关的,第一个动作否定了C,第二个动作A,B,C三者都没实现。
下面讨论后向搜索的目标测试
区分前向搜索和后向搜索,两者的目标测试不同
前向搜索:当前状态s是否蕴涵目标Goal
后向搜索:初始状态s0是否蕴涵当前目标g
即使用目标和效果合一的最一般合一元对动作模式中的动作进行代换,从而减小分支因子
如上图,目标为At(C2,SFO),此时效果为At(c,a),因此可以将c代换为c2,将a代换为SFO
搜索的启发式
忽略动作中的前提,可以减少对动作的限制,使得难解的问题变得容易
考虑到一些动作可能抵消另外一些动作的效果,因此会导致松弛解的步数可能大于未被满足的目标数。因此可以去掉前提和目标以外的效果
如上图,只要去掉前提Blank(s2)合取Adjacent(s1,s2)即可移动到任意方格
即通过去除负效果达到松弛的效果,由于去除负效果之后,没有动作会抵消另一个动作的效果,从而使得解短于原始空间的解。
但需要注意:如果前提或者目标包含负文字,那么去除负效果,可能不一定会产生一个松弛问题
由于对动作进行松弛不会减少状态的数量,因此可以去掉一些流
假设有A,B,C三个文字,此时空间有8个状态,但如果去掉文字B,此时空间就只有4个状态,故可以将某些状态进行合并。去掉文字B指的是将前提和效果里含B的都去掉,去掉B之后会导致有些状态相同,因此可以合并
这就是松弛目标,即将大目标分解成多个小目标,分别找到对应的解规划,再利用一些方法对这些解规划进行组合