行為樹,打破濫用迴圈(一)

2021-10-02 03:52:23 字數 3176 閱讀 1555

行為樹(bt)[millington 09]是現代遊戲開發中最受歡迎的工具之一。 行為樹是對簡單決策樹方法的擴充套件,類似於大型的「 if-then-else」**語句。 這使得bt似乎是一種相對簡單明瞭的技術,正是這種感知到的簡單性以及它們最初的易用性,從而導致bt在大多數主要遊戲引擎中得到廣泛採用並得以實施[epic 18,johansen  18]。 因此,關於該技術的介紹,實施和優化,有很多資訊,但是關於最佳實踐和使用的適用性卻很少。

由於缺乏此類資訊,加上「銀彈」思維,導致在所有經驗水平上的廣泛濫用。 這種濫用導致整體樹的大小和複雜性使得幾乎沒有功能退化的風險就幾乎不可能進行擴充套件或重構。 將感知到的簡單性與缺乏有關內在問題的資訊以及缺乏有關如何最好地利用該技術的資訊相結合,結果是無論是對於新手還是有經驗的開發人員而言,這些都是刻板的定時炸彈。 本章旨在討論該技術的弱點以及常見的濫用方式。 最後,我們將討論用於**致動的適應性行為樹。

在深入討論bt之前,我們需要簡要介紹一些ai基礎知識。 在標準的ai**模型(圖1)中,我們具有三個不同的層/階段:感測,決策和促動(作用).

感覺層負責將遊戲世界的當前狀態反映/重新解釋為ai可以理解的格式。 然後,決策層負責決定**在給定遊戲世界的當前狀態下需要採取哪些動作(如果有)。 最後,致動層負責執行所決定的動作過程。

讓我們以需要喝杯咖啡的示例來說明各個階段。 感覺可能檢測到我們感到有點疲倦,也許我們也有點冷。 然後,決策層將處理該資訊,並得出結論,我們應該獲取一種含咖啡因的溫暖品種的飲料,並且咖啡會是完美的。 然後,執行動作將執行一系列動作,首先進行然後喝下那杯咖啡,資訊圖層之間的ai**模型流應該是單向的,並且任何層都不應干擾其上的任何層.

現在,傳統上將bt視為決策層的一部分,不幸的是,在我們已經看到的大多數實現中(包括作者自己過去的實現[anguelov 14]),bt中的節點通常負責這兩個方面。 決策以及執行。 例如,在fps遊戲中,bt可能具有確定我們是否應該處於掩護狀態的節點,然後選擇掩護,然後執行移動和射擊命令作為葉子任務。 在乙個系統中將兩個不同層的職責混合在一起,違反了「關注點分離」的軟體工程原理[greer 08],並且通常具有一定的體系結構味道。 我們將在第3節和第4節中詳細討論為什麼這是乙個問題,但是目前重要的是,我們首先對決策主題進行簡單說明:決策本質上是週期性的

我們的意思是,**將在其生命週期內不斷在各種決策之間進行切換。 這些決策通常會根據一組確定性規則重複進行。

如果我們考慮上面使用的fps遊戲示例,我們可以想象在最高端別上的戰鬥迴圈看起來類似於圖2a所示。 **將在一組戰鬥行為之間不斷切換。 圖2b顯示了爭鬥遊戲中老闆打架的遊戲迴圈,這裡的ai具有固定的動作/行為模式,需要在戰鬥期間進行動作和迴圈。 再次強調的重點是,無論是遊戲還是問題:決策本質上都是週期性的。

行為樹:它們如何工作

如前所述,bt是決策樹的擴充套件,因為從其根開始評估一棵靜態樹,以根據當前的環境狀態決定課程。 每次需要做出決策時,決策樹總是從根開始進行評估,並且樹本身傳統上不是有狀態的。 對樹的重新評估使我們能夠切換**行為,而不管我們當前處於什麼狀態,只要滿足相關分支條件即可。

bt採納了這個概念,並通過新增顯式樹狀狀態和長期執行的任務對其進行擴充套件。 這意味著,當我們在後續更新中重新評估樹時,可能會最終到達包含先前評估的狀態的同一葉節點。 這使我們現在可以在樹中擁有順序流構造(即序列/並行節點),這在無狀態決策樹中是不可能的.

隨著bt的普及和樹中內容的**式增長,每次ai更新時從樹的根部重新評估該樹在計算上都變得昂貴,因此導致了事件驅動的bt的發展[epic 18,champandard 12]。 儘管這極大地提高了效能,但由於對環境事件的反應性也產生了問題,因為我們不再評估以前發生故障的分支,並且直到當前選擇的分支完成或發生故障,行為切換才會發生。 這極大地複雜化了bt的概念以及一般的樹創作,需要開發其他技術和工具,例如 監視/服務節點[epic 18,anguelov 14],以恢復丟失的功能。

對各種bt正規化及其發展歷史的深入討論超出了本章的範圍。 有興趣的讀者可以參考以下資源以獲取更多資訊[millington 08,champandard 08,champandard 12]。 在本章的其餘部分討論bt時,我們將參考事件驅動的bt模型,因為它是bt實現中最受歡迎的事實標準。

樹流和視覺化

bt的主要吸引力之一是它們易於視覺化,因此視覺化/編寫/除錯bt的工具非常普遍。 由於起源於決策樹,大多數工具會將bt視覺化為基於深度優先遍歷順序的簡單的自上而下,從左到右的樹。

這種視覺化清晰地向使用者傳達了兩組資訊:樹的深度和操作順序。 這種視覺化使節點從左到右的順序過載,從而傳達了決策的優先順序和操作順序。 就bt的功能而言,樹的深度是無關緊要的資訊,但是我們經常將整個軸專用於此。 給定樹的最重要的可視資料點是:決策的優先順序和操作順序。 因此,我們建議使用一種視覺化方法,其中從上到下的順序代表決策的優先順序,從左到右的順序代表動作的順序。 我們還強烈建議從視覺化中省略諸如順序和並行節點之類的標準流量控制節點,因為它們只會增加混亂,對使用者幾乎沒有價值。 可以使用不同的顏色,容器和線條樣式來視覺化節點連線,從而實現各種控制流節點之間的視覺區別。

為說明起見,圖4以下面兩種格式顯示了相同bt的表示。 重要的是要注意,有很多生活質量視覺化無法在圖中顯示,例如 突出顯示給定序列的所有節點,等等。本章的其餘部分將針對所有bt示例使用此視覺化方案

為了討論反應性(即高階行為轉換)主題,我們將使用fps遊戲的行為樹示例(如圖4a所示)。 假設在對樹的第一次評估中,座席將進入「空閒」狀態。 由於樹評估將在下一次評估時從空閒分支恢復,因此我們只能通過以下兩種方式之一觸發完全重新評估:當前活動行為完成(或失敗),或者我們明確重置樹。

因此,我們需要某種機制來在發生環境變化時需要通知樹,該環境變化需要重新設定樹(行為轉換)。 這通常是通過註冊監視/服務節點來實現的,該監視/服務節點將連續輪詢樹執行之外的環境,並在滿足其重置條件後觸發樹重置(即行為更改)。 圖4b顯示了處於空閒狀態時已註冊的監視節點(深灰色)。 還需要注意的是,樹越深,我們註冊的監視器越多,因此每次更新的樹的評估成本也就越高。 當這些註冊的監視器之一觸發時,我們將重置整個樹狀態並從根節點重新評估樹,這將選擇適合於當前環境狀態的新行為。

迴圈反思 for迴圈的濫用

本博剛剛從學校畢業,剛進去公司工作也已經接近兩個月了。最近我的pl分配了乙個功能給我,主要涉及到了兩個bean,然後兩個bean都有乙個projectid,然後我要做的就是通過匹配相同的projectid,把兩個bean合併成乙個bean反饋給前端,讓前端顯示相關功能。一開始思路 for int i...

行為樹之我見

對於目前ai中常用的演算法或模型,如a 演算法 有限狀態機 行為樹,從本質上都是乙個對於圖的一種路徑選擇演算法。應用行為樹可以帶來如下好處 1 讓功能模組與邏輯模組解耦。具體來說是指乙個功能模組agent 類似於mvc裡的model 只需要包含資料和功能介面,不需要包含外部邏輯。而邏輯模組 類似於m...

打破 Swift 結構體中的迴圈引用

本文講的是打破 swift 結構體中的迴圈引用,嘗試從乙個閉包中訪問結構體 瘋狂的迴圈 我們要怎樣破解這個迴圈?複製行不通,共享引用怎麼樣?一些觀點 說在最後 final class ondelete deinit deletionlogger do deletionlogger deleted 嘗...