小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

行為樹(Behavior Tree)實踐(1)– 基本概念 | AI分享站

 文檔集成 2015-01-07

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

2011年7月27日 | 分類: AI分享 | 標簽: , , , , , ,
19
(5 票,評分 5.00)

自從開博以來,每天都會關心一下博客的訪問情況,看到一些朋友的訂閱或者訪問,不勝欣喜,也促使我去寫一些更好的博文,來和大家分享和交流,從訪問統(tǒng)計來看,有相當一部分是來自于搜索引擎的流量,關鍵字以“行為樹”,或者“Behavior Tree”居首位,我想大家對此可能有些興趣,加上,這幾年反反復復一直在AI中研究和運用行為樹,所以這次就來談談關于行為樹(Behavior Tree)的一些東西,以前也寫過一些文章(12,3)來討論行為樹,不過已經(jīng)是一兩年前的事情了,較之以前,這次會更為系統(tǒng),也會添加一些我新的思考和感悟。所謂行為樹實踐,其實在我腦海里就是Practice in Behavior Tree,沒法子,受英文教材影響太多了:)

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

bv-tree-1

這是我們?yōu)橐粋€士兵定義的一顆行為樹(可以先不管這些綠圈和紅圈是干嗎的),首先,可以看到這是一個樹形結構的圖,有根節(jié)點,有分支,而且子節(jié)點個數(shù)可以任意,然后有三個分支,分別是巡邏(Patrol),攻擊(Attack),逃跑(Retreat),這個三個分支可以看成是我們?yōu)檫@個士兵定義的三個大的行為(Behavior),當然,如果有更多的行為,我們可以繼續(xù)在根節(jié)點中添加新的分支。當我們要決策當前這個士兵要做什么樣的行為的時候,我們就會自頂向下的,通過一些條件來搜索這顆樹,最終確定需要做的行為(葉節(jié)點),并且執(zhí)行它,這就是行為樹的基本原理。

值得注意的是,我們標識的三大行為其實并不是真正的決策的結果,它只是一個類型,來幫助我們了解這個分支的一些行為是屬于這類的,真正的行為樹的行為都是在葉節(jié)點上,一般稱之為行為節(jié)點(Action Node),如下圖紅圈表示的

bv-tree-action-node

這些葉節(jié)點才是我們真正通過行為樹決策出來的結果,如果用我以前提到的那個層次化的AI結構來描述的話,這些行為結果,相當于就是一個個定義好的“請求”(Request),比如移動(Move),無所事事(Idle),射擊(Shoot)等等。所以行為樹是一種決策樹,來幫助我們搜尋到我們想要的某個行為。

行為節(jié)點是游戲相關的,因不同的游戲,我們需要定義不同的行為節(jié)點,但對于某個游戲來說,在行為樹上行為節(jié)點是可以復用的,比如移動,在巡邏的分支上,需要用到,在逃跑分支上,也會用到,這種情況下,我們就可以復用這個節(jié)點。行為節(jié)點一般分為兩種運行狀態(tài):

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

除了行為節(jié)點,其余一般稱之為控制節(jié)點(Control Node),用樹的“學名”的話,就是那些父節(jié)點,如下圖綠圈表示

bv-tree-control-node

控制節(jié)點其實是行為樹的精髓所在,我們要搜索一個行為,如何搜索?其實就是通過這些控制節(jié)點來定義的,從控制節(jié)點上,我們就可以看出整個行為樹的邏輯走向,所以,行為樹的特點之一就是其邏輯的可見性。

我們可以為行為樹定義各種各樣的控制節(jié)點(這也是行為樹有意思的地方之一),一般來說,常用的控制節(jié)點有以下三種

  1. 選擇(Selector):選擇其子節(jié)點的某一個執(zhí)行
  2. 序列(Sequence):將其所有子節(jié)點依次執(zhí)行,也就是說當前一個返回“完成”狀態(tài)后,再運行先一個子節(jié)點
  3. 并行(Parallel):將其所有子節(jié)點都運行一遍

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

bv-tree-sel

bv-tree-seq

bv-tree-pal

可以看到,控制節(jié)點其實就是“控制”其子節(jié)點(子節(jié)點可以是葉節(jié)點,也可以是控制節(jié)點,所謂“執(zhí)行控制節(jié)點”,就是執(zhí)行其定義的控制邏輯)如何被執(zhí)行,所以,我們可以擴展出很多其他的控制節(jié)點,比如循環(huán)(Loop)等,與行為節(jié)點不同的是,控制節(jié)點是與游戲無關的,因為他只負責行為樹邏輯的控制,而不牽涉到任何的游戲代碼。如果是作為一個行為樹的庫的話,其中就一定會包含定義好的控制節(jié)點庫。

如果我們繼續(xù)考察選擇節(jié)點,會產(chǎn)生一個問題,如何從子節(jié)點中選擇呢?選擇的依據(jù)是什么呢?這里就要引入另一個概念,一般稱之為前提(Precondition),每一個節(jié)點,不管是行為節(jié)點還是控制節(jié)點,都會包含一個前提的部分,如下圖

bv-tree-precondition

前提就提供了“選擇”的依據(jù),它包含了進入,或者說選擇這個節(jié)點的條件,當我們用到選擇節(jié)點的時候,它就是去依次測試每一個子節(jié)點的前提,如果滿足,則選擇此節(jié)點。由于我們最終返回的是某個行為節(jié)點(葉節(jié)點),所以,當前行為的“總”前提就可以看成是:

當前行為節(jié)點的前提 And 父節(jié)點的前提 And 父節(jié)點的父節(jié)點的前提 And….And 根節(jié)點的前提(一般是不設,直接返回True)

行為樹就是通過行為節(jié)點,控制節(jié)點,以及每個節(jié)點上的前提,把整個AI的決策邏輯描述了出來,對于每次的Tick,可以用如下的流程來描述:

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

從概念上來說,行為樹還是比較簡單的,但對AI程序員來說,卻是充滿了吸引力,它的一些特性,比如可視化的決策邏輯,可復用的控制節(jié)點,邏輯和實現(xiàn)的低耦合等,較之傳統(tǒng)的狀態(tài)機,都是可以大大幫助我們迅速而便捷的組織我們的行為決策。希望這次簡單的介紹,對大家有所幫助,能力有限,不一定能表述的很清楚,有問題,或者有指教的,都請和我多多交流,最后,我對這個士兵的巡邏分支畫了一個示意圖,供大家參考:

S — 選擇節(jié)點   Se — 序列節(jié)點

bv-tree-patrol-example

————————————————————————
作者:Finney
Blog:AI分享站(http://www./)
Email:finneytang@gmail.com
本文歡迎轉載和引用,請保留本說明并注明出處
————————————————————————

發(fā)表評論 | Trackback | 已被閱讀11,814次
  1. ShionRyuu
    2014年9月19日17:24

    并行(Parallel)是多線程同時運行?

    • 2014年9月22日09:39

      不是,是一幀里所有的子節(jié)點都會被更新

  2. 游戲初級程序員
    2014年7月24日18:33

    我想問下,行為節(jié)點會重復不?假設我有個開槍的行為節(jié)點,然后有 跑,走,蹲,跳,這四個選擇節(jié)點,然后我可以在上訴四個狀態(tài)下開槍,大改是怎么協(xié)調?把 開槍提到和上訴四個狀態(tài)的選擇節(jié)點同級別,共同歸于一個loop下面么?

    • 2014年8月22日10:20

      可以啊,同一個行為節(jié)點可以掛在不同的節(jié)點下面,這就是行為樹一個很大的好處之一

  3. keng
    2014年7月14日16:58

    您好,想問下 如果某個動作 比如施法吟唱 吟唱過程中需要進行對目標判定 比如目標距離太遠之類的 這類是術語動作內包含的 還是行為樹中的 再比如一個需要持續(xù)施法的法術 過程中也要對目標判定之類的 這個用行為樹怎么表示 再就是當外部改變時 比如某人打斷了我的施法 這個 過程中 行為樹 還是從頭遍歷嘛? 發(fā)現(xiàn)改變才做調整?

    • 2014年7月16日10:20

      實現(xiàn)方法不唯一,要看具體需求,吟唱的合法性判定,可以做在precondition里,因為行為樹每幀都會檢查precondition,不合法的自然就跳出了,目標判定可以做在節(jié)點里,也可以外部算好傳給行為樹,外部改變屬于我提到的被動請求或者外部事件,可以考慮用黑板接收后,傳給行為樹處理

  4. coderchen
    2014年5月4日13:51

    樓主您好,我是新入行的游戲程序員,在公司做AI方面,自己業(yè)務時間做了一個簡單的AI編輯器,可配置節(jié)點。
    但是現(xiàn)在有一個問題沒想清楚,就是事件節(jié)點在行為樹中怎么實現(xiàn)?例如定時器事件或者周圍觸發(fā)的事件之類的。
    我想只用行為樹去控制AI,這樣只有一個控制源了,但是沒想清楚在行為樹中怎么實現(xiàn)事件?

    • 2014年5月16日09:57

      事件我都是用外部黑板來實現(xiàn)的,由外部黑板接受事件,更新黑板狀態(tài),而不是行為樹直接接受事件,行為樹只是根據(jù)黑板狀態(tài)來執(zhí)行

  5. 會飛的魚
    2014年3月5日18:18

    樓主的行為樹內容寫的很全,持續(xù)關注中。

  6. aceyan
    2014年2月8日16:38

    博主有個問題,對于游戲中不同的怪物都要建立一棵行為樹嗎?這樣會不會很浪費內存?

    • 2014年2月17日13:25

      如果按照種類來建行為樹,內存幾乎可以忽略不計,如果你說的是每個實例的話,可以用共享節(jié)點型的行為樹,看這里http://www./archives/563和這里http://www./archives/572

      • aceyan
        2014年2月25日09:36

        感謝博主解答,繼續(xù)關注:)

  7. 程序猿
    2014年2月8日15:33

    這里講的行為樹好像與您講的有一些不同
    http://www./2011/02/24/introduction-to-behavior-trees/

    • 2014年2月17日13:28

      差不多吧,只是他把條件檢測作為一個節(jié)點了,實現(xiàn)上有點區(qū)別

  8. 一個誠實的人
    2013年8月16日20:05

    文章不錯,如果能將reference寫一下就更好了。

  9. Raven
    2012年2月16日16:41

    站長您好~~有沒有什么好的書籍來學習行為樹的知識(外文也行)或者網(wǎng)站~~? 求推薦!~

    • 2012年2月16日17:11

      有個網(wǎng)站很不錯,英文的aigamedev.com,里面有一些behavior tree的資料

  10. 小N_大進行曲
    2011年11月26日00:11

    請問代碼中的input指什么呢。

  11. 小N_大進行曲
    2011年11月26日00:06

    又看了一遍,略微懂了,但是請問Tick是什么意思,還有實例代碼中的input指什么?
    實例代碼是每幀都執(zhí)行,還是事件驅動執(zhí)行?

    • 2011年11月26日12:16

      Tick就是游戲每一次循環(huán),input可能名字不是很好,我這里指的是傳入行為樹的參數(shù)

  12. 小N_大進行曲
    2011年11月25日16:29

    請問 行為樹 和 層次狀態(tài)機 有什么區(qū)別啊。
    我了解過層次狀態(tài)機,看這個文章覺得跟行為樹沒什么區(qū)別呀?

    • 2011年11月26日12:15

      這個要說起來就多了,簡單的說吧,行為樹是樹狀結構,絕對沒有“回路”,而狀態(tài)機是圖狀的結構,就是有時會形成一個“回路”,而且,行為樹的決策方式是自頂向下的,狀態(tài)機是在每一個狀態(tài)內部做決策的

      • 小N_大進行曲
        2011年11月26日12:38

        對于每一幀的Update()函數(shù)來說:
        狀態(tài)機,只需currentState.Update(),在其中遍歷當前狀態(tài)的所有Transition(轉換條件)即可。
        而行為樹,卻需要從根部節(jié)點按照遍歷規(guī)則,從頭開始遍歷。(比如說從最左邊的節(jié)點開始)
        這樣以來,是不是每一次Update,BT都要“統(tǒng)攬全樹”,而FSM只需要“關心自己”,BT所做的事情就要比FSM多?效率會降低嗎?

        另外,今天看了一片英文文章,文章說,BT和FSM的區(qū)別在于,相對于FSM,BT把“轉換條件”從“狀態(tài)”中剝離出來,也就是說,F(xiàn)SM中的“狀態(tài)”,在BT中演化成了“轉換條件”+“行為”?

        • 2011年11月26日12:49

          由于只是對轉換條件的判斷,所以效率并不低,而且從本質上來說,你在狀態(tài)機中也是需要判斷所有可能的轉換條件的,順便說一句,這篇文章對于區(qū)別說的比我好,呵呵

        • 坑王
          2012年2月4日11:40

          能請問一下這篇文章的名字嗎?也想看一下

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多