GOAP 目標導向型行為計畫 AI 演算法

2021-08-14 21:38:53 字數 3767 閱讀 9805

全稱: goal-oriented action planning

參考:goap 是讓 ai 自己去找到解決問題的方法,我們給ai 提供可以執行的行為,對世界的描述,每個行為執行的先決條件,以及執行行為對世界產生的影響效果。

ai 需要有目標(乙個或多個均可),通過世界狀態,根據自身行為,找到一組或多組可以完成某個目標的行為列表,根據優先順序或者綜合排序,決策出乙個最佳行為佇列,並按照順序執行一系列行為。

例子:ai 餓了,要找吃的填飽肚子。

ai 有行為:去飯店、買菜、做飯、翻冰箱找麵包、吃東西

1.去到飯店可以吃飯

2.買菜回來可以做飯然後吃飯

3.翻冰箱找麵包,找到麵包可以吃

4.有吃的就可以去吃東西

以上五中行為可以組合成 4 組 達到吃東的目的。

每個行為都是有先決條件和執行效果的。行為是否能夠執行必須要考慮到先決條件是否滿足。

行為先決條件

執行效果

cost

去飯店有飯店

買到飯(有吃的)

30買 菜

有超市買到菜

15做 飯

有 菜做好飯(有吃的)

10翻冰箱

冰箱有麵包

找到麵包(有吃的)

30吃 飯

有吃的吃東西(完成吃東西目標)

5ai 遍歷所有行為,根據當前世界狀態,獲取滿足執行條件的行為a。將行為a新增到可執行列表中,將a 作為乙個行為鏈的開始,繼續遍歷剩下的行為,直到可以完成目標為止,為乙個可以完成目標的行為鏈。如此下去最終找到 n 組可以完成目標的行為鏈。

第一次遍歷

世界狀態:有超市、沒吃的、沒菜、沒冰箱、有飯店。

遍歷所有行為,行為序列為:去飯店、做飯、翻冰箱、買菜、吃飯

去飯店行為要求有飯店 :條件滿足,加入可執行佇列

做飯行為要求有菜:不滿足跳過

翻冰箱行為要求有冰箱:不滿足跳過

買菜行為要求有超市 :條件滿足,加入可執行佇列

吃飯行為要求有吃的 :不滿足跳過

第一次遍歷完成,可執行行為佇列中有行為:去飯店、買菜

遍歷可執行行為佇列,以佇列中每乙個行為為開端,重新遍歷,這樣就會生成兩個分支,

分支 1:去飯店

分支 2:去超市買菜

以去超市買菜分支為例,買菜行為做為開端開始遍歷

拷貝當前世界狀態為 newworldstate。拷貝行為序列 newactionlist,排除掉買菜行為

注意:以任何行為為開端開始執行遍歷,都要將該行為從行為序列中刪除,否則會出現無限迴圈,且沒有意義

以 newworldstate 為世界狀態,newactionlist 為行為序列,開始新一輪遍歷,將買菜行為執行效果(買到菜/有菜)更新到 newworldstate,判斷 newworldstate 是否包含目標吃飯,如果包含則視為可以完成目標,退出遍歷。

newworldstate沒有包含吃飯,沒有完成目標繼續

此時 newworldstate 世界狀態為:有超市、沒吃的、有菜、沒冰箱、有飯店

newactionlist 為行為序列為: 去飯店、做飯、翻冰箱、吃飯

去飯店行為要求有飯店 :條件滿足,加入到新的行為佇列,以買菜行為為父節點

做飯行為要求有菜 :條件滿足,加入到新的行為佇列,以買菜行為為父節點

翻冰箱行為要求有冰箱 :不滿足跳過

吃飯行為要求有吃的 :不滿足跳過

遍歷結束,以買菜行為為開端,加入乙個去飯店行為,乙個做飯行為

到此去買菜行為又產生兩個分支,這兩個分支都是從 分支 2 上產生的。

分支 2.1 : 去超市買菜 -> 去飯店

分支 2.2 :去超市買菜 -> 做飯

然後遍歷 分支 2.1 和 2.2,繼續查詢可執行序列

以 分支 2.2 為例,做飯行為作為開端開始遍歷

拷貝newworldstate狀態為 newworldstate_2_2。拷貝newactionlist行為序列 newactionlist_2_2,排除掉做飯行為

以 newworldstate_2_2為世界狀態,newactionlist_2_2 為行為序列,開始新一輪遍歷,將做飯行為執行效果(有飯/有吃的)更新到 newworldstate_2_2,判斷 newworldstate_2_2 是否包含目標吃飯,如果包含則視為可以完成目標,退出遍歷。

newworldstate_2_2 沒有包含吃飯,沒有完成目標繼續

此時 newworldstate_2_2 世界狀態為:有超市、有吃的、有菜、沒冰箱、有飯店

newactionlist 為行為序列為: 去飯店、翻冰箱、吃飯

去飯店行為要求有飯店 :條件滿足,加入到新的行為佇列,以買菜行為為父節點

翻冰箱行為要求有冰箱 :不滿足跳過

吃飯行為要求有吃的 :條件滿足,加入到新的行為佇列,以買菜行為為父節點

遍歷結束,以分支 2.2 做飯行為為開端,加入乙個去飯店行為,乙個吃飯行為

到此去做飯行為又產生兩個分支,這三個分支都是從 分支 2.2 上產生的。

分支 2.2.1 : 去超市買菜 -> 做飯 -> 去飯店

分支 2.2.2 : 去超市買菜 -> 做飯 -> 吃飯

到此 分支 2.2.2 分支已可以完成 吃飯目標了,為乙個完整的達到目標的可執行序列。儲存起來。

上面所有分支都要遍歷完成,這裡只是講述原理,不能做到將所有分

引用塊內容

支都走一遍。

最終結果大概有如下幾種

a :去飯店 -> 吃飯

b :去飯店 -> 買 菜 -> 做飯 -> 吃飯

c :買 菜-> 做飯 -> 去飯店 -> 吃飯

d: 買 菜 -> 做飯 -> 吃飯

e: 買 菜-> 去飯店-> 做飯 -> 吃飯

如何找到最有解,設定每種行為的 消耗 cost,每中方案 總消耗為 所有行為的 cost 相加,找到 總 cost 最小的乙個。

那麼如上 a - e 幾種方案的消耗如下

方案行為序列

cost

a去飯店 -> 吃飯

30+5 = 35

b去飯店 -> 買 菜 -> 做飯 -> 吃飯

30 + 15 + 10 + 5 = 60

c買 菜-> 做飯 -> 去飯店 -> 吃飯

15 + 10 + 30 + 5 = 60

d買 菜 -> 做飯 -> 吃飯

15 + 10 + 5 = 30

e買 菜-> 去飯店-> 做飯 -> 吃飯

15 + 30 + 10 + 5 = 60

最終確定執行 d 方案為最優解

任務導向型對話系統

任務導向型對話系統 對話管理模型研究最新進展 building task oriented dialogue systems for online shopping 我分享了 dm sequicity simplifying task oriented dialogue systems with s...

About Face 一 目標導向設計

1.目標導向設計 設計是 為賦予有意義的秩序,做出有意識或直覺的努力 以人為導向的設計活動 當今數字產品的一些問題 原因 2.實現模型和心理模型 使用者介面應該按照使用者心理模型來實現,但當今大多數軟體是按照實現模型來設計的。3.新手 專家和中間使用者 大多數是中間使用者,沒有人願意停留在新手級別。...

職業生涯點評(一) 體驗式還是目標導向式

程式設計師跨越鴻溝之二 彷徨與微笑 編者按 同樣有許多人,覺得定位人生目標,不是個問題。在家吃飯,父母會諄諄教導 你要學會賺錢,而出去在餐廳點菜,服務員臉色隨著價位高低陰晴變化,也在暗示 你最好是有錢人。人為財死,鳥為食亡,在如今的商品社會裡,不會有人質疑把 生命的顛峰 一步到位直接等同成 金山 有...