1

我目前正试图从目标状态进行回归搜索,以找出将实现我的GOAP计划者的目标状态的动作列表。到目前为止,对我有什么下来伪代码是这样的:回归目标导向行动计划

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]); 
        } 
       } 
      } 
     } 
    } 
} 

我听说GOAP酷似只有该节点是国家和边缘是动作的A *算法。但是由于在一个A *中,没有任何节点必须满足的条件,它让我很困惑如何适应一个A *算法来处理前提条件。 我正在努力理解的是如何存储操作并比较操作的成本以找到最有效的路径。如果我们假设集体行动有一个函数getCost(),它返回行动的成本,那么在考虑先决条件的情况下,我该如何处理这个问题?

回答

1

节点确实是WorldStates。 和边缘是行动。但请注意,它们是有针对性的边缘!

前提条件: 它们确定哪些边(动作)流出节点。 只有满足其前提条件的操作才是退出该状态节点的有效边。

因此,为了找到节点的邻居,如果满足所有前提条件,就要检查每个动作。如果是这样,则应用后置条件以查看该操作将导致的节点。然后这个动作是这些状态(节点)之间的有效边界。

请参阅开放源代码GPGOAP(面向通用目标的行动计划),以实现具有A *的GOAP。 C语言中的直接代码解释了所有步骤。我是GPGOAP的作者。

思考回归

现在到了回归的一部分:我从来没有从实现的目标,目前的世界状态的向后搜索。所以我可以在这方面得到有限的帮助。

两个相邻节点仍将基于单个动作连接。现在,您可以启用/禁用不基于动作前提条件的边,而是根据动作的后置条件。如果发布条件与当前节点不匹配,则该操作将无效。如果是这样,我希望你通过强制行动的先决条件来增加邻居。

您希望在向后搜索时使用向后搜索的理由是什么?

+0

谢谢,我没有这么想。现在完成了。 – Sammi3

+0

向后搜索更高效。 Jeff Orkin在以下网址简单地介绍了它:http://alumni.media.mit.edu/~jorkin/GOAP_draft_AIWisdom2_2003.pdf 我设法做了回归搜索。现在我正在寻找改变行动前提的正确方法。 – Sammi3