Algorithm 回归目标导向行动计划
我目前正在尝试从目标状态进行回归搜索,为我的GOAP planner找出将实现目标状态的行动列表。到目前为止,我写下的伪代码是这样的:Algorithm 回归目标导向行动计划,algorithm,artificial-intelligence,regression,depth-first-search,planning,Algorithm,Artificial Intelligence,Regression,Depth First Search,Planning,我目前正在尝试从目标状态进行回归搜索,为我的GOAP planner找出将实现目标状态的行动列表。到目前为止,我写下的伪代码是这样的: closedList = list; s = stack; s.push(goal); while(s.size() > 0) { state = s.pop; if(!state exists in closedList) { closedList.add(state); for(action =
closedList = list;
s = stack;
s.push(goal);
while(s.size() > 0)
{
state = s.pop;
if(!state exists in closedList)
{
closedList.add(state);
for(action = firstAction; action != lastAction; action = nextAction)
{
if(action.getEffect() == state)
{
if(!action.ConditionsFulfilled())
{
conditionList = action.getConditions;
for(i = 0; i < conditionList.size(); i++)
{
s.push(conditionList[i]);
}
}
}
}
}
}
closedList=列表;
s=堆栈;
s、 推动(目标);
而(s.size()>0)
{
state=s.pop;
如果(!状态存在于closedList中)
{
closedList.add(状态);
for(action=firstAction;action!=lastAction;action=nextAction)
{
if(action.getEffect()=状态)
{
如果(!action.ConditionsFulfilled())
{
conditionList=action.getConditions;
对于(i=0;i
我听说GOAP完全像A*算法,只是节点是状态,边是动作。但由于在A*中,节点没有任何必须满足的条件,因此我对如何使A*算法适应先决条件感到困惑。
我很难理解的是如何存储操作并比较操作的成本,以便找到最有效的路径。如果我们假设类操作有一个函数getCost(),它返回操作的成本,那么在考虑前提条件时,我该如何处理这个问题呢?节点确实是世界状态。 边缘就是行动。但请注意,它们是定向边 如果有先决条件: 它们确定哪些边(动作)流出节点。 只有满足其先决条件的操作才是退出该状态节点的有效边 因此,要查找节点的邻居,您需要检查每个操作是否满足所有先决条件。如果是,请应用后置条件以查看操作将导致的节点。然后,该操作是这些状态(节点)之间的有效边 请参阅开源(面向目标的通用行动规划)以了解GOAP的实施情况。用C语言编写的代码解释了所有步骤。我是GPGOAP的作者 回归思考 现在是回归部分:我从未实现过从目标到当前世界状态的反向搜索。所以我在这方面的帮助有限 两个相邻节点仍将基于一个动作进行连接。现在,启用/禁用边不是基于操作的前提条件,而是基于操作的后条件。如果post条件与当前节点不匹配,则该操作将无效。如果是这样,我希望您通过强制操作的前提条件来添加邻居
你为什么喜欢向后搜索而不是向前搜索?谢谢,我没有这么想。现在完全有意义了。向后搜索更有效。杰夫·奥金(Jeff Orkin)在一篇文章中简要地谈到了这一点:我成功地进行了回归搜索。现在我正在寻找正确的方法来改变动作的前提条件。你好,过了一会儿我又回到了这个项目。我以前没能解决这个问题。我现在的问题是在检查前提条件的同时进行广度优先搜索。如果我在目标上,并且我有实现该目标的优势(我所说的目标是指我们正在检查的当前状态),我如何确保一项行动能够进一步满足其先决条件?广度优先搜索如何确保树下的边缘有效?更新:我在做堆栈而不是优先级队列,我只是在脑子里把事情搞糊涂了。使用优先级队列后,一切都很简单,就像您描述的那样。非常感谢。