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