FSM(狀態機)、HFSM(分層狀態機)、BT(行為樹)的區別
遊戲人工智能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(行為樹)的區別