新手指南 | 創建一個遊戲AI,你需要什麼技術

新手指南 | 創建一個遊戲AI,你需要什麼技術

來自專欄論智5 人贊了文章

作者:Ben Sizer

編譯:Bing

本文將介紹大量遊戲中使用的人工智慧概念,你將會了解解決AI問題有哪些可用的工具,它們是如何一起工作的,以及你將如何在所選語言或引擎中實施這些工具。

本文需要你對遊戲有基本的理解,同時掌握一些數學概念,例如幾何、三角函數等等。其中舉出的代碼例子都是虛擬代碼,所以不用具備特別的編程語言水平。

什麼是遊戲AI

遊戲AI主要解決的是遊戲人物根據當前條件應該做出哪些動作。傳統AI環境中所指的智能體通常是遊戲中的人,但現在也可以指一輛車、機器人或更抽象的,例如一群目標對象、一個國家或人口。它們都需要觀察周圍的環境,並基於環境做出決定、執行動作。通常這一過程是感知/思考/行動的循環。

  • 感知(Sense):智能體檢測或被告知環境中有可能會影響其動作的物體(附近有危險、要撿的物品、需要查看的地點)
  • 思考(Think):智能體要想出應對方法(比如要選擇一個安全的時機撿東西,或者決定是先攻擊還是隱藏)
  • 行動(Act):智能體將之前的決策付諸行動(例如開始向敵人或目標物體移動)
  • 環境變化,在新數據下重複這一循環……

在現實AI問題中,大部分公司重點關注的是「感知」這一環節。例如,自動駕駛汽車必須給前方道路拍照,並將其與雷達或LIDAR數據進行對比,之後嘗試解讀它們看到了什麼。這通常由機器學習方法來完成。

遊戲卻不同,因為它們不需要複雜的系統來提取信息,因為大部分信息都在模擬系統內部。我們不需要運行圖片識別演算法來發現敵人的位置;遊戲知道敵人在哪,可以直接將信息反饋給決策過程。所以遊戲中的「感知」環節比較簡單,難的是後兩步。

遊戲AI的發展限制

遊戲中的AI通常會面臨以下幾種限制:

  • 通常不會像機器學習演算法那樣「預訓練」;寫一個神經網路觀察上千名玩家並學習是不現實的,因為這種方法在遊戲還未發布的時候根本無法進行。
  • 遊戲應該提供趣味性和挑戰性,而不是追求「最優」。所以即使智能體的水平能超過人類,也不會是設計師追求的目的。
  • 智能體還不能太「機械」,要讓對手真的認為他的隊友是「人」而不是「機器」。AlphaGo雖然厲害,但與之交手的選手們都覺得它下棋的方法很不尋常,感覺像和外星人對戰。所以遊戲AI也要調整得更「擬人化」一些。
  • 要支持實時處理,演算法不能長時間佔用GPU就為了想出對策。10毫秒已經過長了。
  • 理想的系統是數據驅動而不是硬編碼,這樣即使不會編程的人也能做出調整。

有了這些原則,我們可以開始看看在感知、思考、行動循環中所使用的簡單AI方法了。

基本決策制定

讓我們以簡單的遊戲《乓》為例,要保證乒乓球可以彈到球拍上,如果掉落就算輸了。AI的任務就是決定球拍的移動方向。

硬編碼條件語句

如果我們相用AI控制球拍,那麼最直接最簡單的方法就是嘗試讓球拍一直位於乒乓球的下方。當球接觸球拍後,球拍的位置就是合適的。

用虛擬代碼表示:

every frame/update while the game is running:if the ball is to the left of the paddle: move the paddle leftelse if the ball is to the right of the paddle: move the paddle right

這種方法太簡單了,但是在代碼中:

  • 「感知」部分有兩個「if」語句。遊戲知道球和球拍的位置,所以AI詢問遊戲二者的位置,從而感知到球的運動方向。
  • 「思考」部分同樣在兩個「if」語句之中。它包含了兩個決策,最終會決定向左、向右或不移動球拍。
  • 「行動」表現在代碼中就是向左或向右移動。但是在其他與戲中可能包括移動的速度。

我們將這種方法稱為「reactive」,因為規則很簡單。

決策樹

乒乓球遊戲也可以用決策樹模型進行可視化:

第一眼看去,你可能覺得決策樹和if語句沒什麼區別。但是這個系統中,每個決策都包括一個精確的條件和兩種可能的輸出,可以讓開發者不用硬編碼就能從代表決策樹的數據中搭建AI。用簡單的表格來描繪決策樹是這樣的:

如果樣本很多,決策樹真的非常強大,可以高效地進行情境分辨。

腳本撰寫

設計AI的人員可以根據自己的想法安排決策樹,但是他們必須依靠編程人員提供的所需條件和動作。如果我們給設計人員更好的工具,可以讓他們創造自己的條件,那會怎樣呢?

編程者可以將條件(判斷球在球拍的左邊還是右邊)換成某項值,決策樹的數據看起來可能像這樣:

跟上面的表格相同,但是決策有它們各自的代碼。更進一步,將這樣的表達方式(用腳本語言而不是數據)帶入邏輯結論也是可能並且常見的。

對事件做出反應

以上的乒乓遊戲中,核心思想就是不斷運行三步循環,並根據上一步的環境狀態採取行動。但是在更複雜的遊戲中,與評估各項條件相比,更多的是對情況做出反應,這在遊戲場景的變換中是很常見的。

比如在一項射擊遊戲中,敵人首先是靜止的,一旦他們發現了玩家,不同角色的敵人就會採取不同行動。衝鋒兵可能會向玩家攻擊,狙擊手會位於後方準備射擊。這也是基本的應對系統,但是它需要更高級的決策過程。

高級決策制定

有時,我們想根據智能體目前的狀態做出不同的決策,對決策樹或腳本來說,條件過多時就無法高效地運行。有時,我們要提前思考並估計環境會如何變化,所以就需要更複雜的剞劂方法。

有限狀態機(Finite state machine)

一個有限狀態機(FSM)指的是某個物體,例如AI智能體,目前處在某個狀態中,之後會轉移到另一個狀態中。由於狀態的總數是有限的,所以稱為「有限狀態機」。現實中此類例子是紅綠燈。

在遊戲中,讓衛兵巡邏、攻擊或逃跑等動作可以用簡單的if語句表示。但是如果加上狀態,例如遊盪、搜查、跑步尋求救援等動作,if條件句就會變得很複雜。考慮到所有狀態,我們列出了各狀態之間需要的過渡狀態。

用可視化圖表示:

層次狀態機(Hierarchical state machine)

你也許注意到上表中有些過渡狀態是相同的遊盪狀態中的大部分過渡和巡邏中的狀態相同,但最好是互相區分開。遊盪和巡邏都是非戰鬥狀態下的一部分,所以我們可以看做它的「子狀態」:

主要狀態

非戰鬥狀態

可視化

行為樹(behavior trees)

在決策過程中,有個小問題,即過渡原則和當前狀態緊密相關。在很多遊戲中,這種方法沒為題,使用上述層次狀態機還能減少重複。但是有時你想有一種通用的規則,不需要考慮狀態。例如當智能體的健康值減少到25%,你可能想趕快逃跑。當設計師把這一數值降到10%時,你可能會改變所有相關的過渡狀態。

對於這種情況,理想狀態下需要一個系統,該系統決定哪些狀態可以在另一些狀態之外存在,以便能在一個地方正確轉換。這就是行為樹(behavior tree)。

部署行為樹的方法有很多,但是核心思想都相同:演算法開始於一個「根節點」,樹中的各個節點表示決策或動作。例如前面提到的衛兵層次狀態機,用行為樹表示:

你可能會發現,這個樹中從巡邏狀態返回到遊盪狀態沒有過度,這時就需要引入無條件的「重複」節點:

行動和導航

我們有了乒乓球拍移動和衛兵作戰的例子,但是我們要怎樣真正地在一段時間內讓它們移動呢?如何設置速度、如何躲避障礙、設計線路等等?這一部分我們將詳細講解。

控制

從基礎層面來說,我們可以認為每個智能體有自己的行動速度和方向,它們會在思考階段計算速度和方向,在行動階段執行。如果我們知道智能體的目的地,就可以用等式表示:

desired_travel = destination_position – agent_position

但是,在更複雜的環境中,簡單的等式是處理不了的,也許速度過慢、智能體會在半路遇到障礙等。所以,有時需要考慮加入其他值,讓行走動作更複雜。

找路

在網格中,如果要走到目的地,要先看看周圍可以移動的網格。下圖是一個簡單的搜索動作案例,首先從起點開始搜索,知道找到目的地,再規劃路線:

但是,這種尋找方式好像太浪費了,擴展了很久才找到最佳路線。下面這種方法在找路時,每次只選擇目標坐標方向的最佳方塊,從而能減少很多候選方塊:

學習與適應

雖然文章開頭我們提到,遊戲AI不常用到機器學習,但是我們從中也可以有所借鑒,在設計類遊戲或對抗類遊戲中也許有用。例如在數據和概率方面,我們可以用樸素貝葉斯分類器來檢查大量輸入的數據,並嘗試分類,讓智能體對當前情況做出合適的反應。在預測方面可以用到馬爾可夫模型等等。

知識表示(Knowledge representation)

我們已經討論了做決策、計劃、預測的各種方法,但是如何才能更有效地掌握整個遊戲世界呢?我們應該如何收集並組織所有的信息?如何將數據轉化成信息或知識?各種遊戲的方法各不相同,但是有幾種相同的辦法可以使用。

標籤

將用於搜索的碎片化信息打標籤,這是最常見的方法。在代碼中,標籤常用字元串表示,但是如果你知道所有使用的標籤,你就能將字元串轉換成唯一的數字,從而節省空間,加速搜索。

智能目標

有時,標籤不足以涵蓋所有需要的有用信息,所以另一種存儲信息的方式就是告訴AI它們的備選項,讓它們根據需要選擇。

回應曲線

回應曲線,簡單地說就是它是一張圖,輸入用x軸表示,虛擬的值,例如「最近的敵人距離」和輸出用Y軸表示,通常從0.0到1.0之間。該圖表示了輸入到輸出之間的映射關係。

黑板

黑板,顧名思義,記錄的是遊戲中各個參與者做出的找路動作或決定,其他人也可以使用其中記錄的數據。

影像力圖

遊戲AI經常需要考慮向哪裡移動等問題,這類問題通常可以看做是「地理」問題,需要了解環境的形式和敵人的位置。我們需要一種方法將地形考慮進去,對環境有個大概了解,影像力圖就是為了解決這個問題做出的數據機構。

結語

本文對遊戲中使用的AI進行了大致講解,它們的使用場景都很有用,其中的一些技術也許不常見,但是很有潛力。由於本文篇幅較長,我們並未對各項方法做詳細介紹。感興趣的同學可查閱原文。

推薦閱讀:

不正經評測之:《Line:迪士尼鬆鬆》
史詩級畫質流暢玩!火影影刃Z6堡壘之夜遊戲首測
都說區塊鏈牛逼,到底哪個場景落地了?答案是「遊戲」
《榮耀戰魂》東方武林陣營中國新英雄怎麼玩?
第五屆新生力量動漫遊戲原創大賽賞金載入完成、大神準備完畢,缺的只有你!

TAG:遊戲 | 人工智慧 | 強化學習 |