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

8.5 Modular AI: Conceptual Abstractions and Modular Components
??概念抽象定義了體系結(jié)構(gòu)支持的基類類型。換句話說,這些抽象定義了GAIA其余部分將使用的接口。模塊化組件是對(duì)應(yīng)的組件,每個(gè)組件為概念抽象提供具體的實(shí)現(xiàn)。這種方法允許GAIA提供一個(gè)環(huán)境,支持松散耦合的模塊化組合,而不受特定實(shí)現(xiàn)的限制。開發(fā)人員可以自由地思考,這些可以生成所需行為的抽象應(yīng)該屬于哪種類型,然后通過重用和定制現(xiàn)有的模塊化組件,或者根據(jù)需要?jiǎng)?chuàng)建新組件來配置實(shí)現(xiàn)。
??本節(jié)將描述GAIA使用的主要概念抽象,提供它們的使用示例,并給出它們的接口。
8.5.1 Considerations
?Considerations是最有用的概念抽象。如果您不確定是否要構(gòu)建一個(gè)完整的模塊化人工智能,或者只是在尋找一個(gè)可以用來改進(jìn)現(xiàn)有體系結(jié)構(gòu)的技巧,那就可以從它開始。
??Considerations被用來表示每一個(gè)不同的因素,這些因素可能被權(quán)衡在一起以做出決定。核心是,每一種考慮都提供了一種方法來評(píng)估一項(xiàng)行動(dòng)相對(duì)于所考慮的因素的適宜性。清單8.1完整地顯示了考慮事項(xiàng)界面。

? 為了了解這些行動(dòng)是如何進(jìn)行的,讓我們以狙擊手做出狙擊敵人的這一決定,它只有在以下這些情況滿足時(shí)才會(huì)執(zhí)行:
撤退路線是無阻礙的。
殺戮區(qū)域中有一個(gè)目標(biāo)。
離狙擊手上次射擊已經(jīng)過了“一兩分鐘”。
? 為這個(gè)決定構(gòu)建配置需要實(shí)現(xiàn)上面三種情況,每種情況對(duì)應(yīng)一個(gè)組件,每個(gè)組件都是實(shí)現(xiàn)考慮接口的模塊化組件。
??首先,一個(gè)實(shí)體存在考慮(EntityExists consideration)是用來檢查是否有敵人在狙擊手將要撤退的區(qū)域里。實(shí)體存在考慮(EntityExists consideration)通過遍歷所有聯(lián)系表(或所有參與者,或所有威脅,具體取決于配置方式)來查看是否至少有一個(gè)符合某些約束集。
? 在這種情況下,限制條件是實(shí)體必須是敵人,并且必須在狙擊手計(jì)劃逃離的區(qū)域內(nèi)。該區(qū)域是使用區(qū)域定義的,區(qū)域是另一個(gè)概念抽象(如下所述)。如果有敵人封鎖撤退線,這一首要考慮將否決這一選擇(即不允許選擇),否則它將允許執(zhí)行這一選擇(但其他考慮仍可能否決這一選擇)。
? 接下來,狙擊手需要選擇一個(gè)射擊目標(biāo)(a contact),這時(shí)候就需要用到第二個(gè)實(shí)體存在考慮(EntityExists consideration),目標(biāo)必須是敵人,并且在殺戮區(qū)域內(nèi)。要加入其它條件限制也非常容易,只需要在聯(lián)系表上進(jìn)行配置即可,比如讓狙擊手更傾向于接近掩護(hù)較少、級(jí)別更高的敵人??紤]事項(xiàng)(consideration)的是使用選擇器(在后面的章節(jié)中討論)來選擇最佳目標(biāo)并將其存儲(chǔ)在大腦的黑板上。如果選擇了一個(gè)選項(xiàng),那么開槍動(dòng)作將會(huì)從黑板上直接選取這個(gè)目標(biāo),而不是再全部遍歷一遍。如果找不到目標(biāo),則該選項(xiàng)無效。
? 最后,一個(gè)ExecutionHistory consideration用來檢查自狙擊手上一次射擊后過了多久。這個(gè)考慮選項(xiàng)有60到120秒的延遲,如果時(shí)間低于這個(gè)延遲,則否決該選項(xiàng)。每次這個(gè)選項(xiàng)被選中時(shí)(推理機(jī)選中該選項(xiàng)并執(zhí)行),consideration會(huì)重新開始一個(gè)延遲計(jì)時(shí)。
??考慮事項(xiàng)是最強(qiáng)大的概念抽象,可以隨意與本章中描述的其他思想配合使用。它們很容易實(shí)現(xiàn)(唯一稍微棘手的部分是決定如何將它們組合在一起本章稍后將詳細(xì)介紹),并且能大大減少重復(fù)并提高代碼重用。一旦擁有了它們,配置決策就變成了一個(gè)簡(jiǎn)單的枚舉選項(xiàng)并為每個(gè)選項(xiàng)指定注意事項(xiàng)的問題。配置一個(gè)主意事項(xiàng)比用代碼寫一個(gè)函數(shù)簡(jiǎn)單得多,通常只需要幾秒到幾分鐘,但每個(gè)注意事項(xiàng)底層卻包含了幾十上百行代碼。新的考慮事項(xiàng)或能力只需要配置一次,就能夠無限次重復(fù)使用。
? 由于考慮事項(xiàng)被大量重復(fù)使用,因此它也允許你花時(shí)間來為復(fù)雜決策做差異化設(shè)計(jì)。EntityExists是一個(gè)很好的例子,它展示了考慮事項(xiàng)可以變得多么復(fù)雜和強(qiáng)大,但是即使是像ExecutionHistory這樣非常簡(jiǎn)單的考慮事項(xiàng),也可以根據(jù)選項(xiàng)執(zhí)行的時(shí)間、上次運(yùn)行的時(shí)間或是否運(yùn)行過來做出決定。這使得我們可以實(shí)現(xiàn)像冷靜、目標(biāo)慣性(延遲)、重復(fù)懲罰和單次獎(jiǎng)勵(lì)(這些概念在我們之前的工作[Dill 2006]中進(jìn)行了詳細(xì)討論)。它還可以支持廣泛的評(píng)估功能,這些功能可以根據(jù)經(jīng)過的時(shí)間來驅(qū)動(dòng)決策----例如,通過比較隨機(jī)值(如本例所述)或應(yīng)用響應(yīng)曲線(如Lewis關(guān)于效用函數(shù)選擇的章節(jié)和Mark關(guān)于行為數(shù)學(xué)的書籍[Lewis 2016,Mark 2009]所述)。有了考慮事項(xiàng),意味著你需要的時(shí)候可以在幾秒鐘內(nèi)就能用上它,而不用花幾分鐘甚至幾小時(shí)重新實(shí)現(xiàn)它。并且由于已經(jīng)經(jīng)過了大量的使用和測(cè)試,它的bug也會(huì)非常的少。上面沒有討論的一個(gè)問題是,為了評(píng)估每一個(gè)選項(xiàng),推理機(jī)實(shí)際上是如何綜合考慮的。這是一個(gè)很大的話題,所以我們暫時(shí)不談它(我們?cè)谙旅嬗靡徽?jié)的篇幅討論它)。簡(jiǎn)單地說,返回一組權(quán)重值,這些權(quán)重值組合在一起決定推理機(jī)的決策。
8.5.2 Weight Functions
? 雖然考慮事項(xiàng)可以減少基礎(chǔ)代碼中的重復(fù)部分,但是不同類型的考慮事項(xiàng)之間仍然有很多重復(fù)。??因此,剩下的許多概念抽象都是為了讓我們能夠?qū)⒅貜?fù)的代碼封裝在考慮事項(xiàng)中。首先是權(quán)重函數(shù)。
? 許多不同類型的注意事項(xiàng)計(jì)算一個(gè)浮點(diǎn)值,然后將該單個(gè)浮點(diǎn)值轉(zhuǎn)換為一組權(quán)重值。權(quán)重函數(shù)抽象負(fù)責(zé)進(jìn)行這一轉(zhuǎn)換。例如,Distance consideration計(jì)算兩個(gè)位置之間的距離,然后使用權(quán)重函數(shù)將該浮點(diǎn)值轉(zhuǎn)換為一組權(quán)重值。有些游戲可能會(huì)有Health consideration,這和NPC的健康(或者敵人的健康)是一樣的。其他有可能需要Ammo consideration。我們?cè)诰褤羰稚砩鲜褂玫腅xecutionHistory consideration,它實(shí)際上有三個(gè)權(quán)重函數(shù):一個(gè)是當(dāng)選項(xiàng)被選擇時(shí)使用,一個(gè)是當(dāng)它從未被選擇時(shí)使用,一個(gè)是當(dāng)它以前被選擇過但現(xiàn)在沒被選擇時(shí)使用。
? 當(dāng)然,并非所有考慮事項(xiàng)都會(huì)產(chǎn)生浮點(diǎn)值。例如,EntityExists consideration會(huì)生成一個(gè)布爾值:如果找到實(shí)體,則為TRUE;如果沒有找到實(shí)體,則為FALSE。但其不同的實(shí)例可能會(huì)為TRUE或FALSE返回不同的權(quán)重值。在狙擊手的例子中,一個(gè)EntityExists consideration會(huì)否決一個(gè)選項(xiàng),當(dāng)區(qū)域中有目標(biāo)被檢測(cè)到時(shí)(檢查撤離路線);也可能是因?yàn)闆]有目標(biāo)被檢測(cè)到時(shí)(選擇射擊目標(biāo))。這是通過改變每個(gè)人使用的權(quán)重函數(shù)的配置來實(shí)現(xiàn)的。其他考慮因素也可能產(chǎn)生布爾值----例如,有的游戲會(huì)有LineOfSight consideration,如果兩個(gè)角色之間有視線交流則返回True,否則返回FALSE。
??有許多不同的方法可以將輸入值轉(zhuǎn)換為一組權(quán)重值。對(duì)于浮點(diǎn)數(shù),我們可以應(yīng)用一個(gè)響應(yīng)曲線(BasicCurve權(quán)重函數(shù)),或者我們可以將可能的輸入值分成若干部分,并為每個(gè)部分返回一組不同的權(quán)重值(例如,如果跟敵人的距離小于50米或大于300米,則否決射擊選項(xiàng),但如果它位于FloatSequence權(quán)重函數(shù)之間,則不否決),或者我們可以簡(jiǎn)單地將其視為布爾值(布爾權(quán)重函數(shù))。我們甚至可能完全忽略輸入值,并且總是返回一個(gè)固定的結(jié)果(恒重函數(shù),the Constant weight function)----這通常是和ExecutionHistory consideration一起配合完成的,以確保特定的選項(xiàng)只被選中一次。例如,如果它從未被選中,它將獲得一次固定的獎(jiǎng)金。
? 考慮事項(xiàng)不必知道使用了哪種技術(shù),因此我們使用概念抽象,其中轉(zhuǎn)換是使用一致的接口完成的,不同的方法是作為模塊組件實(shí)現(xiàn)的(例如,BasicCurve、FloatSequence、Boolean或恒重函數(shù))。清單8.2給出了這個(gè)概念抽象的接口。

??回到狙擊手的例子,EntityExists的兩個(gè)注意事項(xiàng)都將使用布爾權(quán)重函數(shù)。布爾權(quán)重函數(shù)配置了兩組權(quán)重值:一組在輸入值為TRUE時(shí)返回,另一組在輸入值為FALSE時(shí)返回。在這兩種情況下,一組權(quán)重值將配置為否決某個(gè)選項(xiàng)(TRUE值分配給逃生路線檢查,F(xiàn)ALSE值分配給目標(biāo)選擇),而另一組權(quán)重值將被配置為對(duì)最終決策沒有影響。
??ExecutionHistory consideration更有趣一些。它有三個(gè)權(quán)重函數(shù):一個(gè)在選項(xiàng)執(zhí)行時(shí)使用(評(píng)估選項(xiàng)被選中后的時(shí)間增量),一個(gè)在選項(xiàng)從未被選中時(shí)使用(評(píng)估游戲加載后的時(shí)間增量),如果選項(xiàng)在過去已被選中但當(dāng)前未被選中,則使用此選項(xiàng)(它計(jì)算自上次停止執(zhí)行以來的時(shí)間增量)。在這種情況下,當(dāng)選擇這個(gè)選項(xiàng)時(shí)(即當(dāng)狙擊手正在射擊時(shí)),我們使用一個(gè)被配置為無效的恒重函數(shù)。我們同樣為一個(gè)選項(xiàng)從未被選擇時(shí)這種情況配置了權(quán)重函數(shù),如當(dāng)狙擊手第一次遇到目前并開槍時(shí)。第三個(gè)權(quán)重函數(shù)(如果當(dāng)前未選擇該選項(xiàng),但在過去已執(zhí)行過該選項(xiàng),則使用該函數(shù))使用FloatSequence權(quán)重函數(shù)檢查輸入值是否大于我們的冷卻時(shí)間,并返回相應(yīng)的結(jié)果。此權(quán)重函數(shù)還配置為在每次選擇該選項(xiàng)時(shí)隨機(jī)化冷卻時(shí)間。
8.5.3 Reasoners
??如前幾節(jié)所述,推理機(jī)實(shí)現(xiàn)了負(fù)責(zé)決策的概念抽象。推理機(jī)的組件決定了推理機(jī)的類型和選項(xiàng)。每個(gè)選項(xiàng)包含一系列的注意事項(xiàng)和操作。推理機(jī)使用這些注意事項(xiàng)來評(píng)估每個(gè)選項(xiàng)并決定要選擇哪個(gè)選項(xiàng),這些操作決定當(dāng)關(guān)聯(lián)選項(xiàng)被選擇時(shí)應(yīng)會(huì)發(fā)生什么。清單8.3給出了這個(gè)抽象的接口。

? ? GAIA目前提供四種不同的模塊化推理機(jī)組件:
序列推理機(jī),按照配置中列出的順序執(zhí)行其選項(xiàng)(非常像BT中的序列節(jié)點(diǎn))。與其他類型的推理機(jī)不同,序列推理機(jī)總是執(zhí)行其每個(gè)選項(xiàng),因此它忽略了任何可能被配置到他們上面的考慮事項(xiàng)。
基于規(guī)則的推理機(jī),它使用每個(gè)選項(xiàng)的注意事項(xiàng)來確定該選項(xiàng)是否有效(即,在當(dāng)前情況下,是否應(yīng)該執(zhí)行該選項(xiàng))。每勾選一個(gè),這個(gè)推理器都會(huì)按照配置中指定的順序向下排列選項(xiàng)列表,并選擇第一個(gè)有效的選項(xiàng)。這與許多BT實(shí)現(xiàn)中的選擇器節(jié)點(diǎn)的方法基本相同。
FSM推理機(jī),它允許我們實(shí)現(xiàn)一個(gè)有限狀態(tài)機(jī)。對(duì)于這個(gè)推理機(jī),每個(gè)選項(xiàng)包含一個(gè)轉(zhuǎn)換列表,而不是考慮事項(xiàng)。每個(gè)轉(zhuǎn)換都指定了一組注意事項(xiàng)(決定是否應(yīng)進(jìn)行轉(zhuǎn)換),以及在轉(zhuǎn)換確實(shí)啟動(dòng)時(shí)應(yīng)選擇的選項(xiàng)(即狀態(tài))。推理器使用選擇器(在下面的8.7節(jié)中描述)從轉(zhuǎn)換列表中進(jìn)行選擇。
雙效用推理機(jī)(DualUtility reasoner),GAIA使用的基于效用的推理機(jī)。雙效用推理機(jī)計(jì)算兩個(gè)浮點(diǎn)值:秩(the rank)和權(quán)重。然后使用這兩個(gè)值和隨機(jī)數(shù)生成器來選擇一個(gè)選項(xiàng)。在我們之前的工作中討論了雙效用推理機(jī)(Dill 2015,Dill et al。以及第8.6.2節(jié)。
? 當(dāng)然,模塊化的體系結(jié)構(gòu)可以不局限于以上這些設(shè)定來做決策。例如,我們經(jīng)??紤]實(shí)現(xiàn)一個(gè)面向目標(biāo)的動(dòng)作規(guī)劃器(GOAP)推理機(jī)(當(dāng)我們想要搜索滿足某個(gè)目標(biāo)的動(dòng)作序列時(shí))。像FSM推理機(jī)一樣,可以通過構(gòu)建新組件的方式來很好的組合進(jìn)GAIA里。
8.5.4 Actions
? 動(dòng)作是推理機(jī)的輸出,它們負(fù)責(zé)將命令發(fā)送回游戲、更改黑板或推理機(jī)決定執(zhí)行的其他操作。它們的接口如清單8.4所示。

? 如上所述,動(dòng)作可以是抽象的,也可以是具體的。抽象動(dòng)作是指導(dǎo)決策過程的行為,如子推理動(dòng)作。其他抽象動(dòng)作包括暫停(the Pause)和設(shè)置變量(SetVariable),暫停動(dòng)作在將其自身標(biāo)記為完成之前會(huì)延遲指定的時(shí)間量,它常用于序列推理機(jī)中,用來控制具體動(dòng)作的時(shí)序
。設(shè)置變量動(dòng)作用于在數(shù)據(jù)存儲(chǔ)區(qū)上設(shè)置變量(通常是大腦的黑板)。
??就其本質(zhì)而言,具體動(dòng)作不能作為GAIA庫(kù)的一部分來實(shí)現(xiàn)。它們包含特定游戲代碼,用于使npc執(zhí)行任務(wù)。常見的具體動(dòng)作包括移動(dòng)、播放動(dòng)畫、播放聲音、使用武器等。
? 我們的工廠系統(tǒng)允許開發(fā)人員將特定游戲代碼注入人工智能(Dill 2016)。
8.5.5 Targets
? 目標(biāo)為組件配置提供了一種抽象的方法來指定位置和/或?qū)嶓w。例如,Distance consideration測(cè)量?jī)蓚€(gè)位置之間的距離。為了使這個(gè)考慮事項(xiàng)可以復(fù)用,GAIA需要在配置中指定這兩個(gè)位置應(yīng)該是什么。也許一個(gè)是NPC的位置,另一個(gè)是玩家的。也許一個(gè)是敵人的位置,另一個(gè)是需要保護(hù)的目標(biāo)的位置(如奪旗模式中的旗幟)。理想情況下,Distance consideration不必知道它所測(cè)量的點(diǎn)之間的距離是如何計(jì)算的,只需有某種機(jī)制來獲得這兩個(gè)位置,然后它就可以從那里進(jìn)行計(jì)算。類似的,LineOfSight consideration需要知道要檢查視線之間的位置或?qū)嶓w,Move action需要知道要移動(dòng)到哪里,?FireWeapon action需要知道要射擊的目標(biāo),等等。
??GAIA對(duì)此的解決方案是目標(biāo)概念抽象,其接口如清單8.5所示。目標(biāo)為其他組件提供位置和/或?qū)嶓w。例如,Self target 返回AI控制的NPC的actor和位置。ByName target按名稱查找角色(也會(huì)從actors或聯(lián)系表中查找,根據(jù)不同的配置方式)。

??

? 所有目標(biāo)都可以提供位置信息,但有些目標(biāo)不提供實(shí)體信息。例如,Position target返回一個(gè)固定(x,y,z)位置(在目標(biāo)的配置中指定),但不返回實(shí)體。編寫配置的人員應(yīng)該意識(shí)到這一點(diǎn),并確保在需要實(shí)體的情況下不使用不提供實(shí)體的目標(biāo),但GAIA也有檢測(cè)功能。實(shí)際上,這從來不是一個(gè)問題,在需要實(shí)體的情況下使用Position target是沒有意義的。
??與所有概念抽象一樣,一些類型的目標(biāo)可以在GAIA中實(shí)現(xiàn),而另一些則需要通過游戲?qū)崿F(xiàn)。例如,某些游戲可能會(huì)添加一個(gè)玩家目標(biāo),為計(jì)算機(jī)返回聯(lián)系人(或參與者)。對(duì)于其他游戲(如多人游戲),這種類型的目標(biāo)是沒有意義的。
8.5.6 Regions
??區(qū)域與目標(biāo)類似,不同的是,它們指定的區(qū)域更大,而不是指定空間中的單個(gè)(x,y,z)位置。它們通常用于觸發(fā)器和觸發(fā)區(qū)之類的事情,盡管它們還有很多其他用途。例如,狙擊手配置將使用它們來指定殺戮區(qū)(它應(yīng)該射擊的區(qū)域)和撤退路線(它計(jì)劃逃離的路線中需要通過的區(qū)域)。
??區(qū)域是一個(gè)概念抽象,因?yàn)樗兄跒槿斯ぶ悄茉O(shè)計(jì)師提供各種方法來指定它們。具體實(shí)現(xiàn)可以為圓形區(qū)域(目標(biāo)/圓心和半徑),平行四邊形區(qū)域(位置和兩個(gè)向量),多邊形區(qū)域(頂點(diǎn)序列)。
? 類似地,一些游戲會(huì)非常喜歡簡(jiǎn)單的二維區(qū)域,另一些游戲則需要在三維空間中指定區(qū)域。
清單8.6給出了這個(gè)抽象的接口。


8.5.7 Other Conceptual Abstractions
??概念抽象提供了一種強(qiáng)大的機(jī)制,它允許我們封裝和重用代碼。之前討論的都是比較常用的,GAIA還有一些其他的:
傳感器,它提供了一種將數(shù)據(jù)傳送到人工智能的機(jī)制(盡管大多數(shù)項(xiàng)目只是直接寫入數(shù)據(jù)存儲(chǔ))。
執(zhí)行過濾器,它可以控制推理器和/或傳感器的頻率。
實(shí)體過濾器,它是選擇滿足某些約束集的實(shí)體的選擇器的替代方法。
數(shù)據(jù)元素,它封裝存儲(chǔ)在數(shù)據(jù)存儲(chǔ)中的內(nèi)容。
向量,它抽象出一個(gè)游戲?qū)ξ恢帽硎镜姆椒ǖ膶?shí)現(xiàn)細(xì)節(jié)。
??此外,隨著GAIA的不斷改進(jìn),不時(shí)會(huì)發(fā)現(xiàn)并添加新的概念抽象(向量是最新的例子)。GAIA包括一個(gè)宏和模板化類系統(tǒng),允許我們通過調(diào)用單個(gè)宏并傳入抽象的名稱來為每個(gè)概念抽象創(chuàng)建大部分基礎(chǔ)結(jié)構(gòu),包括它們的工廠和任何全局配置的存儲(chǔ)(Dill 2016)。
8.6 Combining Considerations
??注意事項(xiàng)是模塊化組件中最重要的一種。在許多方面,它們是GAIA運(yùn)轉(zhuǎn)的關(guān)鍵部分。一般來說,它們是建立決策邏輯的最小模塊。它們可以表示的概念包括:兩個(gè)目標(biāo)之間的距離、目標(biāo)所剩的血量,或者自上次選擇特定選項(xiàng)以來的時(shí)間變化量。推理機(jī)使用考慮事項(xiàng)來評(píng)估每個(gè)選項(xiàng),并選擇它們將要執(zhí)行的選項(xiàng),但是推理機(jī)如何結(jié)合考慮事項(xiàng)的輸出呢?
? 多年來,我們嘗試了許多不同的方法來解決這個(gè)問題,有的很簡(jiǎn)單,有的很復(fù)雜。本章將介紹幾種方法:一種非常簡(jiǎn)單的布爾方法,用于實(shí)驗(yàn)性教育游戲中的觸發(fā)系統(tǒng)(Dill and Graham 2016,Dill et al)。一種更復(fù)雜的基于效用的方法,結(jié)合三個(gè)值來執(zhí)行選項(xiàng)評(píng)估(Dill 2015,Dill et al,. 2012)。最后一種方法雖然看起來很難用,但實(shí)驗(yàn)經(jīng)驗(yàn)表明只要理解其基本規(guī)則就能很方便的用于各種決策。
8.6.1 Simple Boolean Considerations
? 最簡(jiǎn)單的組合考慮事項(xiàng)的方法就是把它們當(dāng)做布爾值。每個(gè)選項(xiàng)都有一個(gè)單獨(dú)的考慮事項(xiàng),返回TRUE(可以選擇該選項(xiàng))或FALSE(不能)。邏輯操作(如AND、OR和NOT)可以視為常規(guī)考慮事項(xiàng),除非它們包含一個(gè)或多個(gè)子考慮事項(xiàng),并返回對(duì)其子考慮事項(xiàng)的綜合評(píng)估。因此,一個(gè)選項(xiàng)的單一考慮事項(xiàng)通常是一個(gè)AND或OR,它包含一個(gè)附加考慮事項(xiàng)的列表(其中一些本身可能是布爾操作)。
? 這一方法被用于The Mars Game中的觸發(fā)系統(tǒng),這是一個(gè)實(shí)驗(yàn)性教育游戲,背景是火星,用于九年級(jí)和十年級(jí)的數(shù)學(xué)和編程教育。清單8.7顯示了一個(gè)Mars Game觸發(fā)器的示例(在YAML中指定)。這個(gè)特定的觸發(fā)器在關(guān)卡開始后,先等待15秒,然后播放一行對(duì)話框提示如何解決有種的特定挑戰(zhàn),同時(shí)觸發(fā)器會(huì)在Blackboard中標(biāo)記提示已被觸發(fā)。但是,它只在以下情況下播放提示:
這個(gè)提示在上個(gè)關(guān)卡中沒有出現(xiàn)過。
玩家還沒有在他們的漫游者(rover)中執(zhí)行一個(gè)阻塞程序(Blockly program) 。
玩家的漫游者面朝南或西(即180°或270°),因?yàn)樘崾久枋隽巳绾翁幚黹_始時(shí)面朝錯(cuò)誤方向的情況。

? 這種方法的優(yōu)點(diǎn)是十分簡(jiǎn)單,大多數(shù)開發(fā)人員甚至游戲設(shè)計(jì)者都很熟悉布爾邏輯,因此它不僅易于實(shí)現(xiàn),而且易于使用。它非常適用于觸發(fā)系統(tǒng)和基于規(guī)則的推理機(jī)這樣的系統(tǒng),它們可以獨(dú)立地對(duì)每個(gè)選項(xiàng)進(jìn)行決策,而無需將兩個(gè)選項(xiàng)進(jìn)行比較,就可以確定哪個(gè)選項(xiàng)是最好的。然而,如果你真的想做出更細(xì)微的決定,并且這些情況經(jīng)常出現(xiàn)在項(xiàng)目的后期,當(dāng)設(shè)計(jì)師(或QA,或出版商,或公司所有者)來找你說“它做的大多是偉大的,但在這種情況下,我希望它能……”時(shí),它會(huì)受到很大的影響。
? 考慮到這一點(diǎn),最好有一種方法,它允許用簡(jiǎn)單的方式指定布爾型決策,但也支持在需要時(shí)進(jìn)行復(fù)雜的比較----這時(shí)候就輪到雙重效用考慮事項(xiàng)出場(chǎng)了。
8.6.2 Dual Utility Considerations
? 雙重效用考慮事項(xiàng)是GAIA使用的方法,每個(gè)考慮事項(xiàng)返回三個(gè)值:加數(shù)、乘法器和秩。然后將這三個(gè)值組合起來以創(chuàng)建選項(xiàng)的總體權(quán)重和秩,該方法的名稱就是這樣來的(權(quán)重和秩)。
8.6.2.1 Calculating Weight and Rank?
? 一次一個(gè)地執(zhí)行這些步驟,首先要做的是將加法器和乘法器組合成選項(xiàng)的總權(quán)重(W)。這是通過首先將所有的加數(shù)相加,然后將結(jié)果乘以所有的乘法器來完成的。

? 接下來,計(jì)算考慮事項(xiàng)的總秩R,通過計(jì)算全體考慮事項(xiàng)的最大秩來實(shí)現(xiàn):

? 還有其他的公式可以用來計(jì)算權(quán)重和秩,GAIA也支持一些替代方案(在后面的章節(jié)中會(huì)有更多介紹),但絕大多數(shù)情況下,主要使用這兩個(gè)公式。
8.6.2.2 Selecting an Option
? 計(jì)算出權(quán)重和秩后,推理機(jī)需要使用它們來選擇一個(gè)選項(xiàng)。具體如何做到這一點(diǎn)取決于推理機(jī)的類型,但所有這些都基于雙重效用推理機(jī)。雙重效用推理背后的想法是,人工智能將使用秩將選項(xiàng)劃分為不同的類別,然后使用基于權(quán)重的隨機(jī)選擇從排名最高的類別中選擇。實(shí)際上,實(shí)現(xiàn)這一目標(biāo)有四個(gè)步驟:
排除任何W0≤0的選項(xiàng)。它們不能在步驟4中選擇,并且會(huì)使步驟2更加復(fù)雜,因此最好在前面消除它們。
從剩下的選項(xiàng)中找出最高級(jí)別,并刪除任何級(jí)別低于該級(jí)別的選項(xiàng)。此步驟確保僅考慮排名最高類別的選項(xiàng)。
從剩下的選項(xiàng)中找出最大權(quán)重,并刪除權(quán)重“遠(yuǎn)小于”該權(quán)重的選項(xiàng)?!斑h(yuǎn)遠(yuǎn)小于”是指在推理機(jī)配置中指定的百分比,在許多情況下,推理機(jī)的配置為完全跳過此步驟。這一步可以確?;跈?quán)重的隨機(jī)選擇在存在更好的選項(xiàng)時(shí)不會(huì)選擇權(quán)重非常低的選項(xiàng),因?yàn)檫@樣做看起來很蠢----雖然在技術(shù)上是可行的,但考慮到其他可用的選項(xiàng),這樣做不太明智。
使用“基于權(quán)重的隨機(jī)”從保留的選項(xiàng)中進(jìn)行選擇。
? 有幾件事值得一提。首先,注意步驟1。任何選項(xiàng)都可以通過將其權(quán)重設(shè)置為0來消除,不管其他選項(xiàng)的權(quán)重和級(jí)別如何。更重要的是,回顧等式8.1,任何考慮事項(xiàng)都可以通過返回0的乘數(shù),將一個(gè)選項(xiàng)的權(quán)重強(qiáng)制為0(即否決它),不管其他考慮事項(xiàng)的值是什么。任何乘以0的值都是0,這提供了一種簡(jiǎn)單的方法來處理雙重效用選項(xiàng)。如果一個(gè)選項(xiàng)的W0>0,我們就說它是有效的(也就說它是可選擇的),反之無效?;谝?guī)則的推理機(jī)通過按順序檢查其選項(xiàng)并選擇第一個(gè)有效選項(xiàng)來工作,而不考慮優(yōu)先級(jí)。
8.6.2.3 Configuring Dual Utility Considerations
? ?實(shí)現(xiàn)雙重效用考慮事項(xiàng)的關(guān)鍵是提供默認(rèn)值,以確保即使系統(tǒng)具有相當(dāng)大的復(fù)雜性,在配置考慮事項(xiàng)時(shí)也會(huì)隱藏復(fù)雜性。本節(jié)將討論GAIA用于完成此任務(wù)的默認(rèn)值、命名約定和其他技巧。在這個(gè)過程中,它會(huì)給出一些例子,狙擊手將會(huì)使用這些例子來選擇目標(biāo)。
??在GAIA中,指定權(quán)重值的最基本方法是簡(jiǎn)單地將addend、multiplier或rank指定為XML中的屬性。三個(gè)值中未指定的那個(gè)將會(huì)被設(shè)置為無效的默認(rèn)值(addend=0,multiplier=1,rank=-FLT_MAX)。因此,配置AI的開發(fā)人員只需要指定他或她想要更改的值即可。
? 舉個(gè)例子,一個(gè)優(yōu)秀的狙擊手應(yīng)該更傾向于對(duì)軍官開火。為了實(shí)現(xiàn)這一點(diǎn),游戲可以在每個(gè)聯(lián)系表上放置一個(gè)布爾值“IsOfficer”。當(dāng)狙擊手認(rèn)為目標(biāo)是軍官時(shí),該布爾值為“真”,反之為“假”。然后,在配置中,我們使用BooleanVariable考慮事項(xiàng)從PickerEntity目標(biāo)(狙擊手的目標(biāo))中查找這個(gè)值。如果該值為真,則考慮使用布爾權(quán)重函數(shù)將乘數(shù)設(shè)置為10,否則不執(zhí)行任何操作(即返回默認(rèn)值)。假設(shè)有一個(gè)10個(gè)士兵的隊(duì)伍(每個(gè)士兵的權(quán)重為1)和一個(gè)軍官(每個(gè)軍官的權(quán)重為10),所有其他條件相同的情況下,那么狙擊手大概有一半的時(shí)間會(huì)朝軍官射擊。表8.8顯示了這個(gè)考慮事項(xiàng)的配置:

? 在有些情況下,考慮事項(xiàng)不想自己的選項(xiàng)被選擇,不論何種情況。例如,當(dāng)狙擊手選擇了一個(gè)目標(biāo)時(shí),我們需要確保他只會(huì)朝敵人開火。這可以通過在聯(lián)系表中存儲(chǔ)一個(gè)Side來實(shí)現(xiàn),SIde有三個(gè)值:朋友,敵人或平民。如果Side的值不是“敵人”,那么狙擊手就不會(huì)選擇這個(gè)目標(biāo),不管他的其他屬性是什么。這可以通過指定乘數(shù)0來配置,但是這樣配置應(yīng)該更明確,更易于閱讀。考慮到這一點(diǎn),權(quán)重可以指定一個(gè)布爾值vote,如果該布爾值為“真”,那么乘法器將設(shè)置為0。反之,所有三個(gè)權(quán)重值將設(shè)置為默認(rèn)值。
? 表8.9是狙擊手的考慮事項(xiàng)結(jié)果。這種考慮與清單8.8中的非常相似,只是它查找一個(gè)字符串變量,而不是布爾變量,并將結(jié)果傳遞給一個(gè)字符串權(quán)重函數(shù)。該函數(shù)會(huì)將字符串與每個(gè)條目進(jìn)行匹配。如果字符串與任何條目都不匹配,則返回默認(rèn)值。在這種情況下,這意味著如果字符串是“敵人”,那么考慮事項(xiàng)將無效(因?yàn)楫?dāng)vote為假時(shí),它返回默認(rèn)值),否則它將設(shè)置乘數(shù)為0(因?yàn)関ote為真),從而使選項(xiàng)無效。

??另外,清單8.8和中的考慮事項(xiàng)很好地展示了模塊化人工智能如此強(qiáng)大的原因。這些考慮事項(xiàng)評(píng)估數(shù)據(jù)存儲(chǔ)上的變量的值。它可以是任何數(shù)據(jù)存儲(chǔ)上的任何變量。在這種特殊情況下,數(shù)據(jù)存儲(chǔ)是使用一個(gè)目標(biāo)(而不是NPC或大腦黑板)來指定的,它同樣可以是指定實(shí)體的任何類型的目標(biāo)。一旦考慮事項(xiàng)找到了變量的值,它就會(huì)將該值傳遞給一個(gè)權(quán)重函數(shù)以轉(zhuǎn)換為權(quán)重值。如果沒有考慮事項(xiàng)、數(shù)據(jù)存儲(chǔ)和權(quán)重函數(shù)的思想,我們將不得不為這些檢查編寫專門的代碼塊,這些代碼塊只在狙擊手的目標(biāo)選擇中使用,并且在使用布爾數(shù)據(jù)存儲(chǔ)變量的任何其他地方重復(fù)實(shí)現(xiàn)。此外,該代碼將是幾十行C++代碼,而不是一行XML。不過,最重要的是,XML中指定的值在很大程度上是我們?cè)谙蛲禄蚺笥衙枋鲞壿嫊r(shí)使用的人類化的概念。
? 人工智能應(yīng)該評(píng)估什么?它正在考慮是否射擊的目標(biāo)(PickerEntity目標(biāo))。它應(yīng)該如何評(píng)估這個(gè)目標(biāo)?檢查它是不是敵人,是不是軍官。這個(gè)評(píng)估應(yīng)該怎么做?只向敵人開槍,一半的時(shí)間就干掉敵人的軍官。
??配置注意事項(xiàng)還有一個(gè)細(xì)節(jié)尚未討論。為了被選中,每個(gè)選項(xiàng)都需要有一個(gè)大于0的權(quán)重,但是所有考慮事項(xiàng)的默認(rèn)加法器都是0。我們至少需要一個(gè)考慮事項(xiàng)的加法器大于0,不然總權(quán)重將會(huì)為0。此外,我們希望所有選項(xiàng)的默認(rèn)權(quán)重都合理,如1。
? 可以通過設(shè)置一個(gè)Tuning考慮事項(xiàng)來解決這個(gè)問題,是一個(gè)只返回指定的加數(shù)器、乘法器和秩的考慮事項(xiàng),它的默認(rèn)加法器是1。該選項(xiàng)的配置可以(而且通常會(huì))指定一個(gè)Tuning考慮事項(xiàng),但如果沒有,則會(huì)自動(dòng)添加一個(gè)addend為1的默認(rèn)Tuning考慮事項(xiàng)。
8.6.2.4 Changing Combination Techniques at Runtime
??到目前為止,我們已經(jīng)說過選項(xiàng)擁有這些考慮事項(xiàng),并負(fù)責(zé)為推理機(jī)將它們組合在一起。這實(shí)際上有點(diǎn)不準(zhǔn)確。選項(xiàng)有一個(gè)AIConsiderationSet,它反而包含了注意事項(xiàng)。考慮事項(xiàng)集合負(fù)責(zé)組合其考慮事項(xiàng),并返回總權(quán)重和秩,它還可以返回其考慮事項(xiàng)的組合加法器和乘法器,而無需將其乘以總權(quán)重。其接口如清單8.10所示。這種區(qū)別很重要,因?yàn)樗馕吨覀兛梢栽诳紤]事項(xiàng)集合上放置標(biāo)志,以指定該特定集合中的考慮事項(xiàng)應(yīng)與不同的規(guī)則組合。此外,還有一種特殊類型的考慮事項(xiàng),它包含另一個(gè)考慮事項(xiàng)集合(AIConsideration_ConsiderationSet)。

??最常用的組合注意事項(xiàng)的替代方法是對(duì)權(quán)重應(yīng)用不同布爾運(yùn)算。默認(rèn)情況下,如果任何考慮事項(xiàng)否決了一個(gè)選項(xiàng)(即,返回0的乘數(shù)),則該選項(xiàng)將不會(huì)被選中。這本質(zhì)上是一個(gè)連接詞(即一個(gè)邏輯和)----所有的考慮必須是“真”(即乘數(shù)大于0),以便選項(xiàng)是“真”(即有效)。在某些情況下,我們需要的不是AND,而是一個(gè)邏輯OR,也就是說,只要至少有一個(gè)對(duì)價(jià)的乘數(shù)不為0,我們就希望選項(xiàng)vt是有效的。在某些情況下,我們需要的不是AND,而是邏輯OR,也就是說,只要至少有一個(gè)考慮事項(xiàng)的乘法器不為0,我們就希望該選項(xiàng)有效。這是通過讓考慮事項(xiàng)集合忽略乘法器小于或等于0的任何考慮事項(xiàng)來實(shí)現(xiàn)的,除非每個(gè)考慮事項(xiàng)都具有小于或等于0的乘法器。類似地,NOT的實(shí)現(xiàn)方式是將小于或等于0的任何乘法器替換為1,將大于0的任何乘法器替換為0。GAIA還支持不同的組合秩的方法:它不需要取最大值,而可以取最小值或?qū)⑺锌紤]事項(xiàng)的秩加在一起得到總的秩。所有這些更改的配置都與所有其他更改一樣,也就是說,有一個(gè)屬性告訴考慮事項(xiàng)集合要使用哪種計(jì)算方法,默認(rèn)值(未指定該屬性時(shí))將使用標(biāo)準(zhǔn)方法。
? 更多關(guān)于配置雙重效用注意事項(xiàng)的技術(shù),請(qǐng)參見Dill (2006), Dill et al. (2012), Lewis (2016), and Mark (2009)。
8.7 Pickers
??我們將在本章中討論的最后一個(gè)主題是pickers。選取器使用推理機(jī)來查看事物列表(通常是聯(lián)系表、參與者或威脅的列表,但也可能是FSM選項(xiàng)的轉(zhuǎn)換列表),并為某個(gè)目的選擇最佳的一項(xiàng)(例如,最好的交談對(duì)象、最好的拍攝對(duì)象、最好的掩護(hù)對(duì)象等)。EntityExists考慮事項(xiàng)使用的選取器和FSM推理機(jī)使用的略有不同,但核心思想是一樣的。
? 雖然大多數(shù)推理機(jī)在其配置中定義了所有選項(xiàng),但選擇器的推理機(jī)必須從運(yùn)行時(shí)確定的選項(xiàng)中進(jìn)行選擇。例如,我們可以使用一個(gè)選擇器來查看我們的聯(lián)系人以選擇要拍攝的內(nèi)容,或者查看我們的威脅以選擇一個(gè)要做出反應(yīng)的內(nèi)容,或者查看附近的掩護(hù)位置以選擇一個(gè)要使用的內(nèi)容(盡管游戲必須擴(kuò)展GAIA以支持掩護(hù)位置來完成最后一個(gè))。在我們的狙擊手例子中,EntityExists考慮事項(xiàng)使用選擇器來選擇要射擊的對(duì)象,并檢查是否有其他目標(biāo)在其撤退路線上。? 第一個(gè)選取器應(yīng)該使用雙重效用推理機(jī),因?yàn)樗Mx擇最佳實(shí)體。第二種可以使用基于規(guī)則的推理器,因?yàn)樗恍枰肋@樣的實(shí)體是否存在。
??Picker選項(xiàng)是通過獲取某個(gè)類別中的所有實(shí)體(例如所有參與者、所有聯(lián)系表或所有威脅)并為每個(gè)實(shí)體創(chuàng)建一個(gè)選項(xiàng)而動(dòng)態(tài)創(chuàng)建的。每個(gè)選項(xiàng)都有相同的注意事項(xiàng),在配置中指定。考慮事項(xiàng)可以通過使用PickerEntity目標(biāo)訪問它們負(fù)責(zé)評(píng)估的實(shí)體。例如,用來選取狙擊手目標(biāo)的選取器可能會(huì)檢查與目標(biāo)的距離、是否在殺傷區(qū)、有多少掩護(hù)、是否是敵人、是否是軍官等等。檢查撤退線的選取器只需檢查每個(gè)實(shí)體是否是敵人,以及是否處在撤退路線經(jīng)過的區(qū)域內(nèi)。
??將所有內(nèi)容放在一起,狙擊手考慮射擊的一個(gè)簡(jiǎn)單選項(xiàng)可能如清單8.11所示。此選項(xiàng)使用EntityExists考慮事項(xiàng)來選擇目標(biāo),然后將選定的目標(biāo)存儲(chǔ)在大腦黑板上的SnipTarget變量中。選取器有兩個(gè)考慮事項(xiàng),一個(gè)是檢查目標(biāo)是否是敵人,另一個(gè)是檢查目標(biāo)是否在50米到300米之間。如果找不到目標(biāo),則使用布爾權(quán)重函數(shù)否決該選項(xiàng)。如果找到目標(biāo),它會(huì)使用Fire Action來射擊。實(shí)際上,我們可能希望在選擇器中添加更多的考慮事項(xiàng)(以使目標(biāo)選擇更加智能化),這里體現(xiàn)了關(guān)鍵思想。


8.8 Conclusion
??模塊化人工智能是一種人工智能規(guī)范的方法,它大量地利用軟件工程的原理來顯著地減少代碼重復(fù)和提高重用性。它允許開發(fā)者以能夠表達(dá)人類邏輯概念的模塊化組件來實(shí)現(xiàn)決策邏輯,而不是單純的通過c++代碼來實(shí)現(xiàn)。由于組件會(huì)被重復(fù)使用,因此組件也會(huì)變得更加健壯、更多的特性負(fù)載(實(shí)現(xiàn)更多微妙的差別)。?更重要的是,因?yàn)榇蟛糠止ぷ鞫际钦{(diào)用已經(jīng)編寫好的代碼,所以人工智能規(guī)范可以做得比其他方法快得多。模塊化人工智能已經(jīng)成功地應(yīng)用于幾個(gè)只剩幾個(gè)月開發(fā)時(shí)間的項(xiàng)目中,其中一款游戲的銷量超過5000000份,我們?cè)诓坏?個(gè)月的時(shí)間內(nèi)實(shí)現(xiàn)了所有的boss人工智能,從頭開始(包括實(shí)現(xiàn)架構(gòu))。
? 本章介紹了一個(gè)完整的模塊化體系結(jié)構(gòu)(GAIA),它使用各種不同類型的模塊化組件。在所有這些概念抽象中,考慮事項(xiàng)是最強(qiáng)大的。對(duì)于那些受限于在現(xiàn)有體系結(jié)構(gòu)中工作的人來說,即使在現(xiàn)有體系結(jié)構(gòu)中,也很可能獲得模塊化人工智能的許多好處,只要實(shí)現(xiàn)考慮事項(xiàng)并允許它們驅(qū)動(dòng)您的評(píng)估功能。我們?cè)诹硪豢顣充N游戲中采用了這種方法,并取得了巨大的成功。
References
Dill, K. 2006. Prioritizing actions in a goal based RTS AI. In AI Game Programming Wisdom? ? ? ? ?3, ed. S. Rabin. Boston, MA: Charles River Media, pp. 321–330.?
Dill, K. 2015. Dual utility reasoning. In Game AI Pro 2, ed. S. Rabin. Boca Raton, FL: CRC? ? ? ? ? ? ?Press, pp. 23–26.?
Dill, K. 2016. Six factory system tricks for extensibility and library reuse. In Game AI Pro 3,? ? ? ? ? ?ed. S. Rabin. Boca Raton, FL: CRC Press, pp. 49–62.?
Dill, K., B. Freeman, S. Frazier, and J. Benito. 2015. Mars game: Creating and evaluating an? ? ? ? ?engaging educational game. Proceedings of the 2015 Interservice/Industry Training,? ? ? ? ? ? ?Simulation & Education Conference, December 2015, Orlando, FL.?
Dill, K. and R. Graham. 2016. Quick and dirty: 2 lightweight AI architectures. Game? ? ? ? ? ? ? ? ? ? ? ?Developer’s Conference, March 2016, San Francisco, CA.?
Dill, K., E.R. Pursel, P. Garrity, and G. Fragomeni. 2012. Design patterns for the? ? ? ? ? ? ? ? ? ? ? ? ? ? ?configuration of utility-based AI. Proceedings of the 2012 Interservice/Industry Training,? ? ? ? ?Simulation & Education Conference, December 2012, Orlando, FL.
Isla, D. 2005. Handling complexity in Halo 2 AI. http://www.gamasutra.com/view/feature/? ? ? ? ? ? ? 130663/gdc_2005_proceeding_handling_.php (accessed June 26, 2016).?
Jacopin, é. 2016. Vintage random number generators. In Game AI Pro 3, ed. S. Rabin.? ? ? ? ? ? ? ? ? ?Boca? Raton, FL: CRC Press, pp. 471–478.?
Lewis, M. 2016. Choosing effective utility-based considerations. In Game AI Pro 3, ed.? ? ? ? ? ? ? ? ? ? ?S.?Rabin. Boca Raton, FL: CRC Press, pp. 167–178.?
Mark, D. 2009. Behavioral Mathematics for Game AI. Boston, MA: Charles River Media.
文章來源:http://www.gameaipro.com/??
如侵犯版權(quán),請(qǐng)聯(lián)系譯者刪除。??
讀者若需要轉(zhuǎn)載,請(qǐng)注明出處。? ?
若有錯(cuò)誤,歡迎指正。