行爲樹(Behavior Tree)實踐(1)– 基本概念

自從開博以來,天天都會關心一下博客的訪問狀況,看到一些朋友的訂閱或者訪問,不勝欣喜,也促使我去寫一些更好的博文,來和你們分享和交流,從訪問統計來看,有至關一部分是來自於搜索引擎的流量,關鍵字以「行爲樹」,或者「Behavior Tree」居首位,我想你們對此可能有些興趣,加上,這幾年反反覆覆一直在AI中研究和運用行爲樹,因此此次就來談談關於行爲樹(Behavior Tree)的一些東西,之前也寫過一些文章(123)來討論行爲樹,不過已是一兩年前的事情了,較之之前,此次會更爲系統,也會添加一些我新的思考和感悟。所謂行爲樹實踐,其實在我腦海裏就是Practice in Behavior Tree,無法子,受英文教材影響太多了:) node

我想經過一個例子來介紹一下行爲樹的基本概念,會比較容易理解,看下圖: 程序員

bv-tree-1

這是咱們爲一個士兵定義的一顆行爲樹(能夠先無論這些綠圈和紅圈是幹嘛的),首先,能夠看到這是一個樹形結構的圖,有根節點,有分支,並且子節點個數能夠任意,而後有三個分支,分別是巡邏(Patrol),攻擊(Attack),逃跑(Retreat),這個三個分支能夠當作是咱們爲這個士兵定義的三個大的行爲(Behavior),固然,若是有更多的行爲,咱們能夠繼續在根節點中添加新的分支。當咱們要決策當前這個士兵要作什麼樣的行爲的時候,咱們就會自頂向下的,經過一些條件來搜索這顆樹,最終肯定須要作的行爲(葉節點),而且執行它,這就是行爲樹的基本原理。 oop

值得注意的是,咱們標識的三大行爲其實並非真正的決策的結果,它只是一個類型,來幫助咱們瞭解這個分支的一些行爲是屬於這類的,真正的行爲樹的行爲都是在葉節點上,通常稱之爲行爲節點(Action Node),以下圖紅圈表示的 測試

bv-tree-action-node

這些葉節點纔是咱們真正經過行爲樹決策出來的結果,若是用我之前提到的那個層次化的AI結構來描述的話,這些行爲結果,至關於就是一個個定義好的「請求」(Request),好比移動(Move),無所事事(Idle),射擊(Shoot)等等。因此行爲樹是一種決策樹,來幫助咱們搜尋到咱們想要的某個行爲。 搜索引擎

行爲節點是遊戲相關的,因不一樣的遊戲,咱們須要定義不一樣的行爲節點,但對於某個遊戲來講,在行爲樹上行爲節點是能夠複用的,好比移動,在巡邏的分支上,須要用到,在逃跑分支上,也會用到,這種狀況下,咱們就能夠複用這個節點。行爲節點通常分爲兩種運行狀態: spa

  1. 運行中(Executing):該行爲還在處理中
  2. 完成(Completed):該行爲處理完成,成功或者失敗

除了行爲節點,其他通常稱之爲控制節點(Control Node),用樹的「學名」的話,就是那些父節點,以下圖綠圈表示 索引

bv-tree-control-node

控制節點實際上是行爲樹的精髓所在,咱們要搜索一個行爲,如何搜索?其實就是經過這些控制節點來定義的,從控制節點上,咱們就能夠看出整個行爲樹的邏輯走向,因此,行爲樹的特色之一就是其邏輯的可見性。 遊戲

咱們能夠爲行爲樹定義各類各樣的控制節點(這也是行爲樹有意思的地方之一),通常來講,經常使用的控制節點有如下三種 get

  1. 選擇(Selector):選擇其子節點的某一個執行
  2. 序列(Sequence):將其全部子節點依次執行,也就是說當前一個返回「完成」狀態後,再運行先一個子節點
  3. 並行(Parallel):將其全部子節點都運行一遍

用圖來表示的話,就是這樣,依次爲選擇,序列和並行 input

bv-tree-sel

bv-tree-seq

bv-tree-pal

能夠看到,控制節點其實就是「控制」其子節點(子節點能夠是葉節點,也能夠是控制節點,所謂「執行控制節點」,就是執行其定義的控制邏輯)如何被執行,因此,咱們能夠擴展出不少其餘的控制節點,好比循環(Loop)等,與行爲節點不一樣的是,控制節點是與遊戲無關的,由於他只負責行爲樹邏輯的控制,而不牽涉到任何的遊戲代碼。若是是做爲一個行爲樹的庫的話,其中就必定會包含定義好的控制節點庫。

若是咱們繼續考察選擇節點,會產生一個問題,如何從子節點中選擇呢?選擇的依據是什麼呢?這裏就要引入另外一個概念,通常稱之爲前提(Precondition),每個節點,不論是行爲節點仍是控制節點,都會包含一個前提的部分,以下圖

bv-tree-precondition

前提就提供了「選擇」的依據,它包含了進入,或者說選擇這個節點的條件,當咱們用到選擇節點的時候,它就是去依次測試每個子節點的前提,若是知足,則選擇此節點。因爲咱們最終返回的是某個行爲節點(葉節點),因此,當前行爲的「總」前提就能夠當作是:

當前行爲節點的前提 And 父節點的前提 And 父節點的父節點的前提 And….And 根節點的前提(通常是不設,直接返回True)

行爲樹就是經過行爲節點,控制節點,以及每一個節點上的前提,把整個AI的決策邏輯描述了出來,對於每次的Tick,能夠用以下的流程來描述:

action = root.FindNextAction(input);
if action is not empty then
action.Execute(request,  input)  //request是輸出的請求
else
print 「no action is available」

從概念上來講,行爲樹仍是比較簡單的,但對AI程序員來講,倒是充滿了吸引力,它的一些特性,好比可視化的決策邏輯,可複用的控制節點,邏輯和實現的低耦合等,較之傳統的狀態機,都是能夠大大幫助咱們迅速而便捷的組織咱們的行爲決策。但願此次簡單的介紹,對你們有所幫助,能力有限,不必定能表述的很清楚,有問題,或者有指教的,都請和我多多交流,最後,我對這個士兵的巡邏分支畫了一個示意圖,供你們參考:

S — 選擇節點   Se — 序列節點

bv-tree-patrol-example

相關文章
相關標籤/搜索