介紹
本文將介紹大量游戲中使用的人工智能概念,你將會(huì)了解解決AI問題有哪些可用的工具,它們是如何一起工作的,以及你將如何在所選語(yǔ)言或引擎中實(shí)施這些工具。
本文需要你對(duì)游戲有基本的理解,同時(shí)掌握一些數(shù)學(xué)概念,例如幾何、三角函數(shù)等等。其中舉出的代碼例子都是虛擬代碼,所以不用具備特別的編程語(yǔ)言水平。
什么是游戲AI
游戲AI主要解決的是游戲人物根據(jù)當(dāng)前條件應(yīng)該做出哪些動(dòng)作。傳統(tǒng)AI環(huán)境中所指的智能體通常是游戲中的人,但現(xiàn)在也可以指一輛車、機(jī)器人或更抽象的,例如一群目標(biāo)對(duì)象、一個(gè)國(guó)家或人口。它們都需要觀察周圍的環(huán)境,并基于環(huán)境做出決定、執(zhí)行動(dòng)作。通常這一過程是感知/思考/行動(dòng)的循環(huán)。
感知(Sense):智能體檢測(cè)或被告知環(huán)境中有可能會(huì)影響其動(dòng)作的物體(附近有危險(xiǎn)、要撿的物品、需要查看的地點(diǎn))
思考(Think):智能體要想出應(yīng)對(duì)方法(比如要選擇一個(gè)安全的時(shí)機(jī)撿東西,或者決定是先攻擊還是隱藏)
行動(dòng)(Act):智能體將之前的決策付諸行動(dòng)(例如開始向敵人或目標(biāo)物體移動(dòng))
環(huán)境變化,在新數(shù)據(jù)下重復(fù)這一循環(huán)……
在現(xiàn)實(shí)AI問題中,大部分公司重點(diǎn)關(guān)注的是“感知”這一環(huán)節(jié)。例如,自動(dòng)駕駛汽車必須給前方道路拍照,并將其與雷達(dá)或LIDAR數(shù)據(jù)進(jìn)行對(duì)比,之后嘗試解讀它們看到了什么。這通常由機(jī)器學(xué)習(xí)方法來(lái)完成。
游戲卻不同,因?yàn)樗鼈儾恍枰獜?fù)雜的系統(tǒng)來(lái)提取信息,因?yàn)榇蟛糠中畔⒍荚?a href="http://www.nxhydt.com/analog/" target="_blank">模擬系統(tǒng)內(nèi)部。我們不需要運(yùn)行圖片識(shí)別算法來(lái)發(fā)現(xiàn)敵人的位置;游戲知道敵人在哪,可以直接將信息反饋給決策過程。所以游戲中的“感知”環(huán)節(jié)比較簡(jiǎn)單,難的是后兩步。
游戲AI的發(fā)展限制
游戲中的AI通常會(huì)面臨以下幾種限制:
通常不會(huì)像機(jī)器學(xué)習(xí)算法那樣“預(yù)訓(xùn)練”;寫一個(gè)神經(jīng)網(wǎng)絡(luò)觀察上千名玩家并學(xué)習(xí)是不現(xiàn)實(shí)的,因?yàn)檫@種方法在游戲還未發(fā)布的時(shí)候根本無(wú)法進(jìn)行。
游戲應(yīng)該提供趣味性和挑戰(zhàn)性,而不是追求“最優(yōu)”。所以即使智能體的水平能超過人類,也不會(huì)是設(shè)計(jì)師追求的目的。
智能體還不能太“機(jī)械”,要讓對(duì)手真的認(rèn)為他的隊(duì)友是“人”而不是“機(jī)器”。AlphaGo雖然厲害,但與之交手的選手們都覺得它下棋的方法很不尋常,感覺像和外星人對(duì)戰(zhàn)。所以游戲AI也要調(diào)整得更“擬人化”一些。
要支持實(shí)時(shí)處理,算法不能長(zhǎng)時(shí)間占用GPU就為了想出對(duì)策。10毫秒已經(jīng)過長(zhǎng)了。
理想的系統(tǒng)是數(shù)據(jù)驅(qū)動(dòng)而不是硬編碼,這樣即使不會(huì)編程的人也能做出調(diào)整。
有了這些原則,我們可以開始看看在感知、思考、行動(dòng)循環(huán)中所使用的簡(jiǎn)單AI方法了。
基本決策制定
讓我們以簡(jiǎn)單的游戲《乓》為例,要保證乒乓球可以彈到球拍上,如果掉落就算輸了。AI的任務(wù)就是決定球拍的移動(dòng)方向。
硬編碼條件語(yǔ)句
如果我們相用AI控制球拍,那么最直接最簡(jiǎn)單的方法就是嘗試讓球拍一直位于乒乓球的下方。當(dāng)球接觸球拍后,球拍的位置就是合適的。
用虛擬代碼表示:
every frame/update while the game is running:
if the ball is to the left of the paddle:
move the paddle left
else if the ball is to the right of the paddle:
move the paddle right
這種方法太簡(jiǎn)單了,但是在代碼中:
“感知”部分有兩個(gè)“if”語(yǔ)句。游戲知道球和球拍的位置,所以AI詢問游戲二者的位置,從而感知到球的運(yùn)動(dòng)方向。
“思考”部分同樣在兩個(gè)“if”語(yǔ)句之中。它包含了兩個(gè)決策,最終會(huì)決定向左、向右或不移動(dòng)球拍。
“行動(dòng)”表現(xiàn)在代碼中就是向左或向右移動(dòng)。但是在其他與戲中可能包括移動(dòng)的速度。
我們將這種方法稱為“reactive”,因?yàn)橐?guī)則很簡(jiǎn)單。
決策樹
乒乓球游戲也可以用決策樹模型進(jìn)行可視化:
第一眼看去,你可能覺得決策樹和if語(yǔ)句沒什么區(qū)別。但是這個(gè)系統(tǒng)中,每個(gè)決策都包括一個(gè)精確的條件和兩種可能的輸出,可以讓開發(fā)者不用硬編碼就能從代表決策樹的數(shù)據(jù)中搭建AI。用簡(jiǎn)單的表格來(lái)描繪決策樹是這樣的:
如果樣本很多,決策樹真的非常強(qiáng)大,可以高效地進(jìn)行情境分辨。
腳本撰寫
設(shè)計(jì)AI的人員可以根據(jù)自己的想法安排決策樹,但是他們必須依靠編程人員提供的所需條件和動(dòng)作。如果我們給設(shè)計(jì)人員更好的工具,可以讓他們創(chuàng)造自己的條件,那會(huì)怎樣呢?
編程者可以將條件(判斷球在球拍的左邊還是右邊)換成某項(xiàng)值,決策樹的數(shù)據(jù)看起來(lái)可能像這樣:
跟上面的表格相同,但是決策有它們各自的代碼。更進(jìn)一步,將這樣的表達(dá)方式(用腳本語(yǔ)言而不是數(shù)據(jù))帶入邏輯結(jié)論也是可能并且常見的。
對(duì)事件做出反應(yīng)
以上的乒乓游戲中,核心思想就是不斷運(yùn)行三步循環(huán),并根據(jù)上一步的環(huán)境狀態(tài)采取行動(dòng)。但是在更復(fù)雜的游戲中,與評(píng)估各項(xiàng)條件相比,更多的是對(duì)情況做出反應(yīng),這在游戲場(chǎng)景的變換中是很常見的。
比如在一項(xiàng)射擊游戲中,敵人首先是靜止的,一旦他們發(fā)現(xiàn)了玩家,不同角色的敵人就會(huì)采取不同行動(dòng)。沖鋒兵可能會(huì)向玩家攻擊,狙擊手會(huì)位于后方準(zhǔn)備射擊。這也是基本的應(yīng)對(duì)系統(tǒng),但是它需要更高級(jí)的決策過程。
高級(jí)決策制定
有時(shí),我們想根據(jù)智能體目前的狀態(tài)做出不同的決策,對(duì)決策樹或腳本來(lái)說(shuō),條件過多時(shí)就無(wú)法高效地運(yùn)行。有時(shí),我們要提前思考并估計(jì)環(huán)境會(huì)如何變化,所以就需要更復(fù)雜的剞劂方法。
有限狀態(tài)機(jī)(Finite state machine)
一個(gè)有限狀態(tài)機(jī)(FSM)指的是某個(gè)物體,例如AI智能體,目前處在某個(gè)狀態(tài)中,之后會(huì)轉(zhuǎn)移到另一個(gè)狀態(tài)中。由于狀態(tài)的總數(shù)是有限的,所以稱為“有限狀態(tài)機(jī)”。現(xiàn)實(shí)中此類例子是紅綠燈。
在游戲中,讓衛(wèi)兵巡邏、攻擊或逃跑等動(dòng)作可以用簡(jiǎn)單的if語(yǔ)句表示。但是如果加上狀態(tài),例如游蕩、搜查、跑步尋求救援等動(dòng)作,if條件句就會(huì)變得很復(fù)雜。考慮到所有狀態(tài),我們列出了各狀態(tài)之間需要的過渡狀態(tài)。
用可視化圖表示:
層次狀態(tài)機(jī)(Hierarchical state machine)
你也許注意到上表中有些過渡狀態(tài)是相同的游蕩狀態(tài)中的大部分過渡和巡邏中的狀態(tài)相同,但最好是互相區(qū)分開。游蕩和巡邏都是非戰(zhàn)斗狀態(tài)下的一部分,所以我們可以看做它的“子狀態(tài)”:
主要狀態(tài)
非戰(zhàn)斗狀態(tài)
可視化
行為樹(behavior trees)
在決策過程中,有個(gè)小問題,即過渡原則和當(dāng)前狀態(tài)緊密相關(guān)。在很多游戲中,這種方法沒為題,使用上述層次狀態(tài)機(jī)還能減少重復(fù)。但是有時(shí)你想有一種通用的規(guī)則,不需要考慮狀態(tài)。例如當(dāng)智能體的健康值減少到25%,你可能想趕快逃跑。當(dāng)設(shè)計(jì)師把這一數(shù)值降到10%時(shí),你可能會(huì)改變所有相關(guān)的過渡狀態(tài)。
對(duì)于這種情況,理想狀態(tài)下需要一個(gè)系統(tǒng),該系統(tǒng)決定哪些狀態(tài)可以在另一些狀態(tài)之外存在,以便能在一個(gè)地方正確轉(zhuǎn)換。這就是行為樹(behavior tree)。
部署行為樹的方法有很多,但是核心思想都相同:算法開始于一個(gè)“根節(jié)點(diǎn)”,樹中的各個(gè)節(jié)點(diǎn)表示決策或動(dòng)作。例如前面提到的衛(wèi)兵層次狀態(tài)機(jī),用行為樹表示:
你可能會(huì)發(fā)現(xiàn),這個(gè)樹中從巡邏狀態(tài)返回到游蕩狀態(tài)沒有過度,這時(shí)就需要引入無(wú)條件的“重復(fù)”節(jié)點(diǎn):
行動(dòng)和導(dǎo)航
我們有了乒乓球拍移動(dòng)和衛(wèi)兵作戰(zhàn)的例子,但是我們要怎樣真正地在一段時(shí)間內(nèi)讓它們移動(dòng)呢?如何設(shè)置速度、如何躲避障礙、設(shè)計(jì)線路等等?這一部分我們將詳細(xì)講解。
控制
從基礎(chǔ)層面來(lái)說(shuō),我們可以認(rèn)為每個(gè)智能體有自己的行動(dòng)速度和方向,它們會(huì)在思考階段計(jì)算速度和方向,在行動(dòng)階段執(zhí)行。如果我們知道智能體的目的地,就可以用等式表示:
desired_travel = destination_position – agent_position
但是,在更復(fù)雜的環(huán)境中,簡(jiǎn)單的等式是處理不了的,也許速度過慢、智能體會(huì)在半路遇到障礙等。所以,有時(shí)需要考慮加入其他值,讓行走動(dòng)作更復(fù)雜。
找路
在網(wǎng)格中,如果要走到目的地,要先看看周圍可以移動(dòng)的網(wǎng)格。下圖是一個(gè)簡(jiǎn)單的搜索動(dòng)作案例,首先從起點(diǎn)開始搜索,知道找到目的地,再規(guī)劃路線:
但是,這種尋找方式好像太浪費(fèi)了,擴(kuò)展了很久才找到最佳路線。下面這種方法在找路時(shí),每次只選擇目標(biāo)坐標(biāo)方向的最佳方塊,從而能減少很多候選方塊:
學(xué)習(xí)與適應(yīng)
雖然文章開頭我們提到,游戲AI不常用到機(jī)器學(xué)習(xí),但是我們從中也可以有所借鑒,在設(shè)計(jì)類游戲或?qū)诡愑螒蛑幸苍S有用。例如在數(shù)據(jù)和概率方面,我們可以用樸素貝葉斯分類器來(lái)檢查大量輸入的數(shù)據(jù),并嘗試分類,讓智能體對(duì)當(dāng)前情況做出合適的反應(yīng)。在預(yù)測(cè)方面可以用到馬爾可夫模型等等。
知識(shí)表示(Knowledge representation)
我們已經(jīng)討論了做決策、計(jì)劃、預(yù)測(cè)的各種方法,但是如何才能更有效地掌握整個(gè)游戲世界呢?我們應(yīng)該如何收集并組織所有的信息?如何將數(shù)據(jù)轉(zhuǎn)化成信息或知識(shí)?各種游戲的方法各不相同,但是有幾種相同的辦法可以使用。
將用于搜索的碎片化信息打標(biāo)簽,這是最常見的方法。在代碼中,標(biāo)簽常用字符串表示,但是如果你知道所有使用的標(biāo)簽,你就能將字符串轉(zhuǎn)換成唯一的數(shù)字,從而節(jié)省空間,加速搜索。
智能目標(biāo)
有時(shí),標(biāo)簽不足以涵蓋所有需要的有用信息,所以另一種存儲(chǔ)信息的方式就是告訴AI它們的備選項(xiàng),讓它們根據(jù)需要選擇。
回應(yīng)曲線
回應(yīng)曲線,簡(jiǎn)單地說(shuō)就是它是一張圖,輸入用x軸表示,虛擬的值,例如“最近的敵人距離”和輸出用Y軸表示,通常從0.0到1.0之間。該圖表示了輸入到輸出之間的映射關(guān)系。
黑板
黑板,顧名思義,記錄的是游戲中各個(gè)參與者做出的找路動(dòng)作或決定,其他人也可以使用其中記錄的數(shù)據(jù)。
影像力圖
游戲AI經(jīng)常需要考慮向哪里移動(dòng)等問題,這類問題通常可以看做是“地理”問題,需要了解環(huán)境的形式和敵人的位置。我們需要一種方法將地形考慮進(jìn)去,對(duì)環(huán)境有個(gè)大概了解,影像力圖就是為了解決這個(gè)問題做出的數(shù)據(jù)機(jī)構(gòu)。
結(jié)語(yǔ)
本文對(duì)游戲中使用的AI進(jìn)行了大致講解,它們的使用場(chǎng)景都很有用,其中的一些技術(shù)也許不常見,但是很有潛力。由于本文篇幅較長(zhǎng),我們并未對(duì)各項(xiàng)方法做詳細(xì)介紹。感興趣的同學(xué)可查閱原文。
-
編程語(yǔ)言
+關(guān)注
關(guān)注
10文章
1938瀏覽量
34598 -
人工智能
+關(guān)注
關(guān)注
1791文章
46859瀏覽量
237579
原文標(biāo)題:新手指南 | 游戲AI所需技術(shù)詳解
文章出處:【微信號(hào):jqr_AI,微信公眾號(hào):論智】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論