1. 程式人生 > >FSM(狀態機)、HFSM(分層狀態機)、BT(行為樹)的區別

FSM(狀態機)、HFSM(分層狀態機)、BT(行為樹)的區別

分類 log 巡邏 其中 感到 人工智能 執行者 跳轉 藍色

遊戲人工智能AI中最常聽見的就是這三個詞:

FSM

這個不用說拉,百度一大堆解釋,

簡單將就是將遊戲AI行為分為一個一個的狀態,狀態與狀態之間的過渡通過事件的觸發來形成。

比如士兵的行為有“巡邏”,“追擊敵人”,“攻擊敵人”,“逃跑”等行為,

響應的事件就有“發現敵人”,“追到敵人”,“敵人逃跑”,“敵人死亡”,“自己血量不足”等。

那麽可以寫成這樣一個狀態機:

1.士兵 “巡邏”,如果 “發現敵人”,那麽,“追擊敵人”

2.士兵 “追擊敵人”, 如果 “追到敵人”, 那麽,“攻擊敵人”

3.士兵 “追擊敵人”, 如果 “敵人死亡”, 那麽,繼續 “巡邏”

4.士兵 “攻擊敵人”, 如果 “敵人死亡”, 那麽,繼續 “巡邏”

5.士兵 “攻擊敵人”, 如果 “血量不足”, 那麽,“逃跑”

其中,士兵就是這個FSM的執行者,紅色的就是狀態,藍色的就是事件,

整個狀態機的行為可以總結為:

當前狀態=>是否滿足條件1,如果是,則跳轉到對應狀態

  否則=>是否滿足條件2,如果是,則跳轉到對應狀態

由此可看出,狀態機是一種“事件觸發型”AI,就是只有事件的觸發才會發生引起狀態的變化。

HFSM

簡單來說,就是FSM當狀態太多的時候,不好維護,於是將狀態分類,抽離出來,將同類型的

狀態做為一個狀態機,然後再做一個大的狀態機,來維護這些子狀態機。

舉個決策小狗行為的例子:

我們對小狗定義了有很多行為,比如跑,吃飯,睡覺,咆哮,撒嬌,搖尾巴等等,如果每個行為都是一個狀態,

用常規狀態機的話,我們就需要在這些狀態間定義跳轉,比如在“跑”的狀態下,如果累了,那就跳轉到“睡覺”狀態,

再如,在“撒嬌”的狀態下,如果感到有威脅,那就跳轉到“咆哮”的狀態等等,我們會考量每一個狀態間的關系,定

義所有的跳轉鏈接,建立這樣一個狀態機。如果用層次化的狀態機的話,我們就先會把這些行為“分類”,把幾個小狀

態歸並到一個狀態裏,然後再定義高層狀態和高層狀態中內部小狀態的跳轉鏈接。

其實層次化狀態機從某種程度上,就是限制了狀態機的跳轉,而且狀態內的狀態是不需要關心外部狀態的跳轉的,

這樣也做到了無關狀態間的隔離,比如對於小狗來說,我們可以把小狗的狀態先定義為疲勞,開心,憤怒,然後這些

狀態裏再定義小狀態,比如在開心的狀態中,有撒橋,搖尾巴等小狀態,這樣我們在外部只需要關心三個狀態的跳

轉(疲勞,開心,憤怒),在每個狀態的內部只需要關心自己的小狀態的跳轉就可以了。這樣就大大的降低了狀態機的復雜度,

另外,如果覺得兩層的狀態機還是狀態太多的話,可以定義更多的狀態層次以降低跳轉鏈接數。

(摘自此文章)http://www.aisharing.com/archives/393

技術分享

Behavir Tree

有空再更新,先看之前的文章:http://www.cnblogs.com/jeason1997/p/4803243.html

參考:http://www.aisharing.com/archives/439

行為樹與FSM不同,它是一種“輪詢式機制”,即每次更新都會遍歷樹,判定邏輯是否成立,是否該繼續往下執行。

FSM(狀態機)、HFSM(分層狀態機)、BT(行為樹)的區別