GOAP:Goal-Oriented Action Planning
資料來源在一般的AI邏輯中,會使用FSM(finite state machine)來作處理
FSM
以下圖顯示
有數個state相互聯結,這些聯結稱為transition。
在執行此AI時,會將transition設定條件,滿足條件就經過transition到另一個state。
這個架構的缺點是,當state變多,整個結構會變複雜,而transition的條件要整體檢視也十分麻煩。
這次介紹的是Goal-Oriented Action Planning
目標導向動作規劃(我是這樣翻)
分成三個部分來說明。
goal:目標
action:動作
planner:規劃器
action:動作
有三個屬性cost:這個action造成的花費
precondition:這個action執行的前提,類似fsm的state
effects:這個action執行後的效果,類似fsm的state
action定義這個ai所有可以執行的動作。
goal:目標
這個AI要達成的目標。目標會是某個動作的effects
planner:規劃器
有一個屬性world state:世界狀態
基本上這個狀態會是action的一個前提
規劃器會從目前所有的動作,一個一個拉出來檢視。
目前的世界狀態是否符合這個動作的前提。
如果不符合,找下一個。
如果符合,檢視effect達到目標?
確認這個達到目標的action組合是最低cost。
範例
現在我試著依照GOAP架構砍柴AI。
這邊已經簡化,不是上方的例子。
目標:
將柴放回倉庫
動作:
(花費) [前提] 效果
(花費) [前提] 效果
取得斧頭
(2) [身上沒斧頭] 身上有斧頭
砍樹
(4) [身上有斧頭] 取得柴
身上滿了
(3) [取得柴] 將柴放回倉庫
撿柴
(8) [天氣晴朗] 取得柴
規劃器
世界狀態[身上沒有斧頭]
[身上有斧頭]
[取得柴]
[天氣晴朗]
執行的歷程如下
目標:將柴放回倉庫
起始的世界狀態:[身上沒有斧頭]
將所有動作抓出來跑,直到符合。
砍樹:世界狀態不符合此動作的前提。跳過。
身上滿了:世界狀態不符合此動作的前提。跳過。
取得斧頭:符合,世界狀態改為[身上有斧頭]
再跑一次全部的動作,直到符合。
身上滿了:世界狀態不符合此動作的前提。跳過。
砍樹:符合,世界狀態改為[取得柴]
再跑一次全部的動作,直到符合。
將柴放回倉庫:符合,達到目標。