最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

模塊化的AI(上) | Game AI Pro

2020-05-25 16:42 作者:有木乘舟  | 我要投稿

Modular AI?

Kevin Dill and Christopher Dragert

8.1 Introduction

? 重復(fù)在人工智能中無處不在。相同的模式、相同的代碼片段、相同的數(shù)據(jù)塊,相同的子決策在一個又一個決策中反復(fù)使用。一般情況下,工程師看到有重復(fù)的代碼,都會試圖將其封裝起來:將其放入程序中,放入類中,或著構(gòu)建一些抽象,使得重復(fù)的模式只有單個實(shí)例。這樣就可以重用這些封裝,而不需要為每個新的用例再重寫一次。

? 封裝在軟件工程中是很常見的方法:在程序、類、設(shè)計(jì)模式、C++模板和宏中,以及在數(shù)據(jù)驅(qū)動設(shè)計(jì)。

? 減少重復(fù)有很多好處。它減小了可執(zhí)行文件的大小,它減少了引入bug的可能性,并增加了測試代碼的方式,它避免了你只能在一個地方修復(fù)bug或改進(jìn)功能。

? 封裝和復(fù)用能節(jié)省大量的開發(fā)時間,關(guān)注于新功能的實(shí)現(xiàn),而不用重寫已經(jīng)存在的代碼。它允許您構(gòu)建健壯的、功能豐富的抽象,這些抽象可以執(zhí)行復(fù)雜的操作,這些操作通常需要花費(fèi)大量的時間來實(shí)現(xiàn),且較少使用。

??然而,除了這些附加的優(yōu)勢之外,它還提供了一些基本的東西。它允許你將底層細(xì)節(jié)封裝,用易于理解的方式封裝成可在項(xiàng)目中被重復(fù)利用的模塊。它允許你以最接近人類的思維方式去實(shí)現(xiàn)程序,站在設(shè)計(jì)師的角度而不是機(jī)器的角度去思考實(shí)現(xiàn)。

? 它會改變一些東西,比如:

? 變成:? ? ?d = Distance(a, b);

? 然而,人工智能面臨的挑戰(zhàn)是,雖然決策的某些方面往往與其他決策相似,但也總是有一些完全不同的方面。比如射擊和吃飯,人工智能都需要測量自己跟對象之間的距離,以確定是否射擊,或在那里吃午飯,但受評估的物體和距離的長短肯定是不同的(除非你構(gòu)建的 NPC喜歡在餐廳射擊敵人并且把敵人吃掉)。

??因此,雖然距離函數(shù)本身是大多數(shù)數(shù)學(xué)庫的標(biāo)準(zhǔn)部分,但在基于距離的決策中涉及的代碼量要大得多,這就更難封裝和重用。

? 模塊化人工智能本質(zhì)上就是封裝和復(fù)用。它能讓你站在人類思維的角度將決策邏輯轉(zhuǎn)化為模塊化的組件。它是關(guān)于創(chuàng)建這些模塊化組件的集合,能讓你在下一個、下一個的下一個的游戲的AI中反復(fù)使用。它能讓你在大部分時間里站在人的角度去思考問題,去建立起從個體概念(如距離、視線、移動、用武器攻擊)到更大范圍的行為(掩護(hù)、選擇和攻擊目標(biāo))到整場演出(遠(yuǎn)程武器戰(zhàn)斗)的逐步增長的視角,然后在其他地方重新使用這些片段,并進(jìn)行適當(dāng)?shù)亩ㄖ啤?/p>

??這種方法將使您能夠更快地創(chuàng)建決策邏輯,更容易地更改它,并更廣泛地重用它。同時使工作更可靠,產(chǎn)生的錯誤更少,因?yàn)榈讓哟a的大量重復(fù)使用,讓測試更加魯棒性,也因?yàn)榭芍赜媒M件的改進(jìn),使得根據(jù)需要立即向某種情況中添加新的功能成為可能。

? 本章將首先討論模塊化人工智能的理論基礎(chǔ),并將它們與軟件工程中廣泛接受的概念聯(lián)系起來,然后詳細(xì)描述游戲人工智能架構(gòu)(GAIA)。

? GAIA是洛克希德馬丁公司Rotary and Mission Systems開發(fā)的一種模塊化架構(gòu),在許多不同的游戲和模擬引擎,包括(但不限于)教育游戲和訓(xùn)練模擬引擎中,它被用于驅(qū)動許多非常不同的項(xiàng)目的行為。

? 它的根源可以追溯到Blue Fang Games的動物人工智能,Mad Doc Software的動作游戲中的boss人工智能,?以及Rockstar Games的人群(ambient human,圍觀群眾?吃瓜群眾?)人工智能上。

8.1.1 Working with this Chapter

? 這篇文章會深入探討一些問題,不同的讀者可能會對不同的方向感興趣。如果你的主要興趣是模塊化人工智能背后的核心思想,以及模塊化部件如何協(xié)同工作,那么你的重點(diǎn)應(yīng)該放在8.2、8.5和8.6部分。

??如果您感興趣的方法是可以馬上用在現(xiàn)有的體系結(jié)構(gòu)中,而不必從頭開始,那么您應(yīng)該重點(diǎn)關(guān)注實(shí)現(xiàn)需要考慮的事項(xiàng)(第8.5.1節(jié)和第8.6節(jié))。

??最后,如果你對一個完整的架構(gòu)感興趣,這個架構(gòu)可以在許多項(xiàng)目中,在許多游戲引擎中重用,并且允許你以模塊化的方式快速配置你的人工智能,那么整個章節(jié)就為你準(zhǔn)備好了!

8.2 Theoretical Underpinnings

? 模塊化人工智能,以及一般的模塊化方法,試圖提高開發(fā)的抽象層次。一個好的模塊化解決方案不是關(guān)注算法和代碼,而是關(guān)注人工智能行為以及它們?nèi)绾谓M合在一起,從而抽象出實(shí)現(xiàn)細(xì)節(jié)。問題是如何安全、正確地完成這項(xiàng)工作,同時仍然為設(shè)計(jì)人員和開發(fā)人員提供獲取預(yù)期行為所需的細(xì)粒度控制。

??模塊化人工智能開發(fā)的成功取決于良好軟件開發(fā)中的相同原則:封裝、多態(tài)性、松耦合、清晰的操作語義和復(fù)雜性管理。這些熟悉的概念在模塊化上下文中都獲得了新的含義。

??模塊本身封裝了一個人工智能功能單元。好的模塊遵循“金發(fā)女郎法則(Goldilocks Rule)”:?不要太大,不要太小,但尺寸要剛剛好。太大的模塊往往包含多個功能并禁止重用,那如果一個新的人工智能只需要部分功能怎么辦?太小的模塊則不足以提高抽象級別。

? 我們的目標(biāo)是將游戲設(shè)計(jì)師在游戲中為npc設(shè)計(jì)的基本邏輯行為(同一水平的、相似的那些)收集起來,將其抽象化、模塊化。然后,開發(fā)問題就變成了選擇和集成新NPC所需的行為和能力,而不是從頭實(shí)現(xiàn)這些能力,這是一個非常合適的抽象級別。

? 以這種方式使用模塊需要安全地重用模塊。為此,必須嚴(yán)格執(zhí)行模塊封裝。防止模塊之間的意大利面條式交互(spaghetti interactions,互相糾纏分不清)可以確保每個模塊可以獨(dú)立地正確運(yùn)行。這對于重用是必不可少的——即使模塊之間的細(xì)微依賴也會很快成為問題。

? 封裝自然會導(dǎo)致模塊接口的創(chuàng)建。與API非常相似,模塊接口準(zhǔn)確地描述了如何與該模塊交互。它顯示了它可以接受的輸入、它提供的輸出,并詳細(xì)說明了應(yīng)用于特定AI時為自定義模塊行為而公開的參數(shù)。它顯示了它可以接受的輸入、它提供的輸出,并詳細(xì)說明了應(yīng)用于特定AI時為自定義模塊行為而公開的參數(shù)。有了顯式接口,處理行為之間的依賴關(guān)系(即連接正確表達(dá)行為時所需的輸入和輸出)就變成了一個更簡單的問題。每個模塊都被正確的封裝后,添加和刪除新模塊所導(dǎo)致的結(jié)果將變得可預(yù)測、可控。

??多態(tài)性是這種松散耦合(loose coupling)的結(jié)果。想象一下一個模塊的功能是逃離敵人,作為一個比特大小的模塊,它可以執(zhí)行所需的檢查和測試,以找到合適的逃離目的地,然后發(fā)出一個移動的輸出信號。接收此輸出的模塊不再是關(guān)鍵問題,一個人工智能可以使用某種類型的移動模塊,而另一個人工智能可以使用另一個。移動模塊的確切類型不應(yīng)該是關(guān)注的重點(diǎn)。復(fù)雜的因素,比如“我的NPC是騎自行車的嗎”或者“她是騎馬的嗎”等等,都可以由移動模塊或者其他子模塊來處理。這使得每個模塊都能清晰地專注于單一的功能目的,同時確保相似的行為不會在模塊之間重復(fù)出現(xiàn)。

8.3 GAIA Overview

? GAIA是一個模塊化、可擴(kuò)展、可重用的工具集,用于指定過程決策邏輯(即a i行為)。GAIA強(qiáng)調(diào)了游戲設(shè)計(jì)者在創(chuàng)建決策邏輯方面的作用,同時仍然允許行為的產(chǎn)生是靈活的,并對應(yīng)用程序中的即時情況做出響應(yīng)。

? GAIA有以下特點(diǎn):

  • 可用于指定過程決策邏輯(或“人工智能行為”)的工具庫。

  • 專注于提供創(chuàng)作層面的控制權(quán)。換言之,GAIA的目標(biāo)不是創(chuàng)造一種真正的人工智能(它可以自行決定做什么),而是向設(shè)計(jì)師提供確定決策的工具,來實(shí)現(xiàn)預(yù)期的體驗(yàn),同時仍然保持足夠的靈活性,以處理各種各樣和意料之外的情況。

  • 模塊化,這意味著行為通常是通過插入預(yù)定義的組件來構(gòu)建的。經(jīng)驗(yàn)表明,這種方法大大提高了設(shè)計(jì)和開發(fā)的速度。

  • 可擴(kuò)展,使向庫中添加新組件或更改現(xiàn)有組件的行為變得容易。

  • 可重用,這意味著GAIA是從一開始就考慮重用的。這包括代碼和數(shù)據(jù)的重用,以及當(dāng)前項(xiàng)目、未來項(xiàng)目甚至不同游戲引擎中的重用。

? GAIA是數(shù)據(jù)驅(qū)動的:行為在XML文件中指定,然后由代碼在運(yùn)行時加載。本章一般將XML稱為配置或數(shù)據(jù),C++為實(shí)現(xiàn)或代碼。為簡單起見,本章還將使用術(shù)語NPC表示GAIA控制實(shí)體,PC表示玩家控制實(shí)體,角色表示為NPC或PC的實(shí)體。

8.3.1 GAIA Control Flow

? GAIA通過決策樹(推理樹)進(jìn)行決策,這在許多方面與Damian Isla最初的行為樹(BT)愿景相似(Isla 2005)。與在BT中一樣,不同的推理機(jī)可以使用不同的方法來做決策,這使得體系結(jié)構(gòu)更具有靈活性,這在按性質(zhì)分層的方法中是不可能實(shí)現(xiàn)的(例如,分層有限狀態(tài)機(jī)、遠(yuǎn)程主動編程、分層任務(wù)網(wǎng)絡(luò)規(guī)劃器等)。

? 每個推理機(jī)從它的選項(xiàng)池中選擇策略。選項(xiàng)池中包含了一些考慮事項(xiàng)(considerations),推理機(jī)可以通過這些注意事項(xiàng)來決定選擇哪個選項(xiàng),以及選擇了這個選項(xiàng)后可執(zhí)行的操作。動作可以是具體的,也就是說它們代表了被控制角色應(yīng)該實(shí)際做的事情(例如移動、射擊、說一行對話、害怕地畏縮等),或者是抽象的,也就是說它們包含了更多的決策邏輯。

??最常見的抽象操作是AIAction_Subreasoner,它包含另一個推理機(jī)(帶有自己的選項(xiàng)、考慮事項(xiàng)和操作)。子推理機(jī)行動是GAIA用來創(chuàng)建其層次結(jié)構(gòu)的機(jī)制。當(dāng)選擇包含子推理機(jī)的選項(xiàng)時,該子推理機(jī)將開始計(jì)算自己的選項(xiàng)并選擇要執(zhí)行的選項(xiàng)。這一選擇可能包含具體行動,也可能反過來包含另一個次級推理機(jī)行動。

??選項(xiàng)還可以包含多個操作,這允許它們具有多個具體操作、子推理機(jī)或兩者的組合,所有操作都并行進(jìn)行。

8.3.2 GAIA Implementation Concepts

??推理、選擇、考慮和行動都是概念抽象的例子。概念抽象是構(gòu)成模塊化人工智能的基本對象類型。每個概念抽象都有一個定義它的接口,以及一組實(shí)現(xiàn)該接口的模塊化組件(或僅僅是組件)。如上所述,有多種不同類型的推理機(jī),但所有推理機(jī)(即,實(shí)現(xiàn)推理器概念抽象的所有模塊組件)共享同一接口。因此,周圍的代碼不需要知道它擁有什么類型的組件。例如,推理機(jī)不需要知道正在使用什么特定類型的考慮因素(considerations)來評估一個選項(xiàng),或者這些考慮因素是如何配置的,它只需要知道如何使用考慮因素接口來獲得它需要的評估。

??這是模塊化人工智能背后的關(guān)鍵思想:識別人工智能的基本部分(概念抽象),為每個抽象聲明一個接口,然后定義實(shí)現(xiàn)該接口的可重用模塊組件。

? 模塊化組件構(gòu)成了模塊化人工智能重用的核心,每種類型的組件只實(shí)現(xiàn)一次,就能重復(fù)使用。為了實(shí)現(xiàn)這一點(diǎn),每種類型的組件都需要知道如何從配置中加載自己,因此,定義模塊化組件的特定實(shí)例功能的所有參數(shù)都可以在數(shù)據(jù)中定義。

? 介紹中的距離示例,GAIA通過提供距離考量模塊(Distance consideration)使距離評估這一功能可復(fù)用。一個特定的距離考量模塊中的配置,可以是通過確定位置坐標(biāo)來測量它們之間的距離。例如,狙擊手選擇要射擊的目標(biāo)時,可能需要距離考量模塊來評估每個潛在目標(biāo)。這種計(jì)算可能被配置成只允許狙擊手射擊距離50米到500米的目標(biāo),且優(yōu)先選擇更近的目標(biāo)。然后,這種考量可以與其他考量結(jié)合起來,這些考量可以衡量未來目標(biāo)是朋友還是敵人,目標(biāo)有多少掩護(hù),是否是高價值目標(biāo)(如軍官),等等。

? 此外,考慮并不是孤立地工作,而是在配置中使用其他概念抽象。例如,使用目標(biāo)指定這兩個位置,并使用權(quán)重函數(shù)指定將距離與其他注意事項(xiàng)結(jié)合起來的方式。目標(biāo)和權(quán)重函數(shù)是GAIA中另外兩個概念抽象。

? 這種方法的一個優(yōu)點(diǎn)是它具有高度的可擴(kuò)展性。隨著開發(fā)的進(jìn)展,您發(fā)現(xiàn)了應(yīng)該在決策中權(quán)衡的新因素,您可以創(chuàng)建新類型的考量來評估這些新因素,并簡單地將它們放入其中。因?yàn)樗鼈兣c所有其他考量共享相同的接口,所以無需更改其他任何內(nèi)容。

??這不僅讓開發(fā)、迭代人工智能更迅速?,而且還降低了引入bug的可能性(因?yàn)樗懈亩季窒抻谝砑拥目紤]事項(xiàng),可以單獨(dú)測試)。因此,在開發(fā)周期末進(jìn)行較大的改動會更安全一些,游戲邏輯和QA反饋都確定好之后,就能在開發(fā)末期真正的改進(jìn)AI。

? 這種快速確定、簡單復(fù)用基礎(chǔ)功能模塊的開發(fā)方式大大減少了開發(fā)時間和開發(fā)成本。我們已經(jīng)在幾個項(xiàng)目中使用了模塊化人工智能,并取得了巨大的成功,其中只有幾個月的時間來實(shí)現(xiàn)整個人工智能,包括一個在不到4個月的時間內(nèi)實(shí)現(xiàn)人工智能的游戲,該游戲后來售出了數(shù)百萬份。

8.3.3 An Example Character: The Sniper

??在本章中,我們將以狙擊手角色為例,他基于專門為戰(zhàn)斗而創(chuàng)建出來的角色為模板來構(gòu)建,但不會完全相同。一般來說,狙擊手應(yīng)該等到殺戮區(qū)(碰巧是一個戶外市場)有敵人,然后每隔一兩分鐘就開槍,只要市場上還有敵人可打,但前提是(a)它沒有受到攻擊,(b)它有明確的撤退線。如果它受到攻擊,它就會試圖撤退,但如果它的撤退線被封鎖,它就會更積極的反擊敵人,盡最大努力去攻擊目標(biāo)(不管他們是否在殺傷區(qū))。此配置的總體結(jié)構(gòu)如圖8.1所示。

? 在其頂層決策邏輯中,我們的狙擊手只有四個選擇:狙擊殺傷區(qū)內(nèi)的目標(biāo),撤退,交戰(zhàn)時反擊,或者躲起來等待其他選擇。在這些選擇之間進(jìn)行決定應(yīng)當(dāng)是簡單的,所以簡單的推理機(jī)就能起作用。GAIA包含一個基于規(guī)則的推理機(jī),它的工作原理與BT中的選擇節(jié)點(diǎn)非常相似,也就是說,它只是按照指定的順序評估其選項(xiàng),并在當(dāng)前情況下獲取第一個有效的選項(xiàng)。在這種情況下,基于規(guī)則的推理器可以設(shè)置如下:

  • 如果狙擊手受到攻擊,且撤退路線不受阻,則撤退。

  • 如果狙擊手受到攻擊,反擊!

  • 如果狙擊手的撤退路線是暢通無阻的,殺戮區(qū)域有個有效目標(biāo),且離狙擊手開最后一槍已經(jīng)過去一兩分鐘了,那就開槍狙擊這個目標(biāo)。

  • 躲藏

? 這些選擇都不可能包含具體行動。例如,撤退需要人工智能選擇一條路線,沿著這條路線移動,觀察敵人,對沿途敵人做出反應(yīng),等等。反擊需要人工智能選擇目標(biāo),選擇要攻擊的位置,瞄準(zhǔn)并開火,重新裝彈,等等。躲藏要求人工智能從目標(biāo)的視野中消失,且要時刻觀察目標(biāo)是否進(jìn)入視野中。

??因此,一旦頂層推理機(jī)選擇了一個選項(xiàng)(如Snipe),該選項(xiàng)的子推理機(jī)將評估其自己的選項(xiàng)。在圖8.1中,我們可以看到狙擊手選項(xiàng),例如,使用序列推理器逐步完成射擊過程,首先進(jìn)入適當(dāng)?shù)淖藙荩ɡ?,“俯臥”姿勢),然后舉起武器,暫停(模擬瞄準(zhǔn)),最后開火。

8.4 GAIA Infrastructure

??在深入研究不同的概念抽象和模塊化組件之前,了解周圍的基礎(chǔ)設(shè)施是有幫助的。本節(jié)概述了主要的單例、數(shù)據(jù)存儲和其他對象,這些對象本身并不模塊化,但支持模塊化組件之間的評估和通信。

8.4.1 The AIString Class

??字符串非常有用,但它們也占用了不合理的空間,而且比較起來很慢。這個問題有很多解決方案;GAIA的是使用djb2散列函數(shù)(http://www.cse.yorku.ca/~oz/hash.html)為字符串生成64位哈希,然后保留包含所有原始字符串(如std::strings)的全局字符串表。這允許GAIA進(jìn)行恒定時間比較,并以64位的方式存儲字符串的副本。它還允許GAIA在對字符串進(jìn)行散列時對其進(jìn)行小寫轉(zhuǎn)換,這樣比較就不區(qū)分大小寫(這使它們更適合設(shè)計(jì)人員)。另一方面,它有一個預(yù)先的性能開銷,并對使用的每個字符串(不管字符串本身是否是臨時的)進(jìn)行永久復(fù)制,因此GAIA仍然在AIString沒有意義的地方(例如調(diào)試輸出)使用char*和std::string。

??值得注意的是,沒有哈希函數(shù)是一個保證。如果采用這種方法,最好有一個檢查散列沖突的斷言(assert);只要在每次散列字符串時查看字符串表,并確保存儲的字符串與剛剛散列的字符串相同。

8.4.2 Factories

??GAIA使用工廠模式來實(shí)例化構(gòu)成AI的所有模塊化對象。換句話說,定義考量(consideration)的配置部分將包含在單個XML節(jié)點(diǎn)中。GAIA通過將XML節(jié)點(diǎn)(以及一些支持信息,例如指向此配置將控制的NPC的指針)傳遞到AIConsiderationFactory來創(chuàng)建實(shí)際的C++考量對象,該工廠類實(shí)例化并初始化適當(dāng)類型的對象。

??GAIA的工廠系統(tǒng)是本書前一章的主題,因此我們不會在這里重復(fù)細(xì)節(jié)(Dill 2016)。

8.4.3 The AIDataStore Base Class

? 數(shù)據(jù)存儲類是一個AIString-indexed哈希表,可以存儲任何類型的數(shù)據(jù)。GAIA使用它們作為黑板(blackboards)的基礎(chǔ),也作為所有不同類型實(shí)體的基礎(chǔ)。結(jié)果,單個模塊化組件可以在黑板和(或)實(shí)體之間存儲、共享和檢索信息,而不需要其他人工智能知道存儲了什么,甚至不知道信息的類型。這允許數(shù)據(jù)被存放在配置表中,在執(zhí)行操作的時候引擎直接讀取配置表,甚至允許游戲引擎將數(shù)據(jù)傳遞給自身。

??當(dāng)然,它也允許人工智能組件彼此共享數(shù)據(jù),我們將在下面的狙擊手配置中看到一個例子。

??實(shí)現(xiàn)這種散列表的方法有很多,而GAIA的方法并不特別,因此我們將跳過實(shí)現(xiàn)細(xì)節(jié)。不過,值得一提的是,由于數(shù)據(jù)存儲本質(zhì)上是全局內(nèi)存,因此它們存在名稱沖突的風(fēng)險(即,兩組不同的組件都試圖使用相同的名稱存儲數(shù)據(jù))。經(jīng)驗(yàn)表明,只要您有一個合理的描述性命名約定,這通常不是一個問題。盡管如此,如果存儲的數(shù)據(jù)類型不是預(yù)期的類型,GAIA應(yīng)該要有斷言(assert)來發(fā)出警告。這不會捕捉到所有可能的名稱沖突,但能防范大部分情況。

??GAIA目前有兩種黑板和三種實(shí)體,如下所述。

8.4.3.1 The AIBlackboard_Global Data Store

? 這個游戲有一個單獨(dú)的全局黑板,它可以作為每個人工智能組件都可以使用的信息的中央存儲庫,而不管這個組件屬于哪個角色,或者這個角色在哪一邊。

8.4.3.2 The AIBlackboard_Brain Data Store

? 每一個人工智能控制的角色的大腦里都有一塊黑板。大腦黑板允許組成該角色的人工智能的組件之間互相交流。

8.4.3.3 The AIActor Data Store

? 每個NPC都是一個演員。游戲存儲了人工智能需要的關(guān)于角色的所有信息(如位置、方位、可用武器等),人工智能組件可以根據(jù)需要查找這些信息。演員還包含一個AIBrain,其中包含頂層推理機(jī)和該角色的所有決策邏輯。

? 在一些項(xiàng)目中,演員被用來代表每一個角色,不管人工智能控制與否。在這些情況下,非人工智能控制的演員可能沒有大腦,或者,如果他們在人工智能和玩家控制之間來回切換,他們將有大腦,但當(dāng)人工智能不在控制中時,大腦將被禁用。

8.4.3.4 The AIContact Data Store

? 如上所述,有兩種方法可以跟蹤NPC對游戲中其他角色的了解。首先是用演員來代表每個角色,讓每個NPC大腦中的AI組件直接訪問其他角色的演員。

??這是可行的,但這要么意味著所有的npc都將擁有全部完整的信息,要么意味著每個AI組件都必須正確地檢查它們是否應(yīng)該知道某個特定的信息。此外,即使人工智能組件進(jìn)行這些檢查,它仍然意味著他們所知道的一切都是正確的。例如,我們只想讓人工智能知道敵人的大概位置,而不是準(zhǔn)確的位置,這時候就會變得十分困難。

??另一種選擇是讓每個npc為它所知道的其他角色創(chuàng)建一個聯(lián)系表,并將其對該NPC的了解存儲在聯(lián)系表上。例如,想象一個角色扮演游戲中,玩家偷了一套制服,以便從敵對的警衛(wèi)身邊溜走。每個守衛(wèi)都會有一張聯(lián)系表來存儲他們對玩家的認(rèn)識,如果守衛(wèi)被愚弄了,那么該聯(lián)系表會將玩家列為他們的一方,即使玩家實(shí)際上是敵人。這使得每個NPC都能對其所感知的角色有自己的認(rèn)知,但這也意味著AI必須為每個角色存儲大量冗余的信息副本。

??這里沒有一個正確的答案,這就是為什么GAIA支持這兩種方法-最好的方法滿足當(dāng)前項(xiàng)目需求的那個方法。

8.4.3.5 The AIThreat Data Store

??人工智能應(yīng)該要能夠?qū)λ芯哂型{的事物做出反應(yīng)。威脅可以是敵人角色,但也可以包括更抽象的東西,例如最近的爆炸,或子彈撞擊的位置。這使得角色能夠?qū)褤羰稚涑龅淖訌椧鸬臎_擊波做出反應(yīng),即使他們實(shí)際上并不知道射擊者的情況,或者根據(jù)子彈撞擊的地點(diǎn)而不是子彈射出的方向,來突破包圍。與聯(lián)系表一樣,威脅是存儲在大腦黑板上的,但威脅并不是每個項(xiàng)目都使用。

8.4.4 Singletons

??Singletons提供了全局可訪問的管理器。只需調(diào)用該類的靜態(tài)Get()函數(shù),就可以從代碼庫中的任何位置訪問Singleton。還可以通過調(diào)用Set()將任何Singleton的默認(rèn)實(shí)現(xiàn)替換為項(xiàng)目特定的版本(必須是子類)。

8.4.4.1 The AIManager Singleton

? AI管理器負(fù)責(zé)存儲所有的演員(actors)。它還有一個Update()函數(shù)負(fù)責(zé)更新所有的actors和大腦。

8.4.4.2 The AISpecificationManager and AIGlobalManager Singletons

??正如我們所說,GAIA是數(shù)據(jù)驅(qū)動的。npc的所有決策都存儲在它的配置中,用XML表示。規(guī)范管理器負(fù)責(zé)加載、解析和存儲所有配置。然后,當(dāng)游戲創(chuàng)建NPC的大腦時,它指定角色應(yīng)該使用的配置的名稱。

? 數(shù)據(jù)和代碼都可能會有重復(fù)的現(xiàn)象。GAIA通過允許配置包含全局變量(globals)來部分解決了這個問題,全局變量是可以在配置內(nèi)或所有配置中重用的組件規(guī)范。全局變量由全局管理器存儲。關(guān)于全局變量已經(jīng)在前一章的工廠模式中討論過了(Dill 2016)。

8.4.4.3 The AIOutputManager Singleton

??良好的調(diào)試輸出是人工智能開發(fā)的關(guān)鍵。GAIA通常混合了日志消息、警告、錯誤和斷言,以及描述當(dāng)前決策的“狀態(tài)文本”(以及,適合在引擎中直接顯示在有問題的NPC旁邊)。輸出管理器負(fù)責(zé)處理所有這些消息,將它們路由到正確的位置,啟用/禁用它們,等等。

8.4.4.4 The AITimeManager Singleton

??不同的游戲引擎(和不同的游戲)以不同的方式處理游戲時間。時間管理器只有一個函數(shù)GetTime(),在整個人工智能中使用它來實(shí)現(xiàn)冷卻和最大持續(xù)時間等功能。

??內(nèi)置的實(shí)現(xiàn)只是從CPU獲取系統(tǒng)時間,但是大多數(shù)項(xiàng)目實(shí)現(xiàn)了自己的時間管理器,它提供了游戲中的時間。

8.4.4.5 The AIBlackboard_Global Singleton

??如上所述,全局黑板是可用于在游戲和AI之間和/或AI組件之間傳遞信息的共享內(nèi)存空間。它是一個單例,可以在全局訪問,也可以讓項(xiàng)目實(shí)現(xiàn)他們自己的版本,這個版本可以與從游戲引擎共享的數(shù)據(jù)更緊密地耦合在一起。

8.4.4.6 The AIRandomManager Singleton

??隨機(jī)數(shù)是許多游戲的核心,無論是在人工智能內(nèi)部還是外部。隨機(jī)管理器包含獲取隨機(jī)值的函數(shù)。默認(rèn)實(shí)現(xiàn)使用Jacopin在本卷其他地方描述的dual-LCG方法?(Jacopin 2016),但與其他單例一樣,單個項(xiàng)目可以用自定義實(shí)現(xiàn)來替換此方法,如果它們愿意,可以使用一些不同的RNG實(shí)現(xiàn)。例如,我們有一個單元測試項(xiàng)目,它的RNG總是返回0,這使得編寫確定性測試更加容易。

文章來源:http://www.gameaipro.com/??

如侵犯版權(quán),請聯(lián)系譯者刪除。???

讀者若需要轉(zhuǎn)載,請注明出處。???

若有錯誤,歡迎指正。

模塊化的AI(上) | Game AI Pro的評論 (共 條)

分享到微博請遵守國家法律
乐安县| 宁晋县| 绥阳县| 台安县| 丘北县| 唐河县| 平武县| 饶平县| 疏勒县| 四川省| 田东县| 丹东市| 深州市| 肃宁县| 乐亭县| 柘城县| 迁西县| 长汀县| 凉城县| 阳朔县| 伊宁县| 辛集市| 九龙城区| 平利县| 谢通门县| 大冶市| 贺州市| 陕西省| 洪湖市| 桐梓县| 杨浦区| 库车县| 宁晋县| 土默特右旗| 伊川县| 江孜县| 苍梧县| 澜沧| 托克托县| 汝城县| 霍山县|