即時戰略遊戲(比如 WAR3)的 AI 是怎樣實現的? | 知乎問答精選

 

A-A+

即時戰略遊戲(比如 WAR3)的 AI 是怎樣實現的?

2018年03月27日 知乎問答精選 暫無評論 閱讀 9 ℃ 次

【苗憶南的回答(171票)】:

War3的AI沒有必要使用你提及的算法,或者說,根本無法使用。

有相關經驗表明,遊戲的AI如果採用神經網絡等算法,會傻得出奇。

使用學院派算法的AI總會做出匪夷所思的動作,讓人無法理解,遊戲性盡失。

其主要原因在於遺傳算法、模擬退火算法、神經網絡算法、各種分類算法等等,都是高度概括化的,旨在找到最優解/或者找到全局關係。但是我們的AI實際不需要最優解和全局關係,一是你的電腦沒那麼叼,這麼複雜的情況,如果真的高度概括出來了,其複雜程度是很高的,你的電腦也帶不動,其次是算法在訓練過程中收斂也會很慢,因為樣本太過複雜,所以也許要花上很久(幾年?猜的)來收斂,如果我們降低收斂精度要求來使速度加快,AI就會變得非常傻,做遊戲明顯不能這樣。即使上述問題都被解決了,還有個問題就是,電腦得到了最優解和最優數學模型,你作為玩家就沒有勝利的希望了,這遊戲 給誰玩?

即使設計公司神經病般的決定如此設計,每當你的遊戲有更新,兵種變化,數據變化,整個算法 就要重新訓練,玩家需要重新下載AI的全部內容,對用戶的體驗和公司的工作效率都有損害。

戰略類遊戲的AI,還是有限狀態機。

根據不同情況分類做不一樣的事情,全都設計好,設計的盡量詳細,就OK了。

關於其複雜度:

這類AI的程序體往往超乎想像的長,當然具體長度和遊戲本身的設計也有一定關係,和遊戲其它部分代碼的設計優化程度也有關係,但是即使在較優環境中,其AI長度也是很長的。具體原因就在於其事無鉅細的分類了所有情況,規定了AI在不同時間不同情況所做的不同事情,作為一個戰略類遊戲,尤其是即時戰略類遊戲,這是十分複雜的,情況十分多,因此程序本身也會相當的長。

但是他運行速度又快!又像人類在玩!又給了玩家勝利的可能!又容易設計和更改!

何樂而不為呢?

【五八的回答(17票)】:

我war3作圖五年,題主問的那些算法一個都不清楚——那時候才初三好嗎 - -#

做AI其實得票第一的那位已經說得很好了:暴雪也好,你也好,造個AI是陪人玩的,不是把人虐的滿地找牙……事實上,暴雪內置的AI編輯器也十分簡單,界面基本上分為兩部分:

  • 獲取資源進行發展的部分

——設計一個混合的發展樹(裡邊有建築科技小兵,包括分礦、第1/2/3英雄等)

——根據發展樹逐一建造資源能夠提供的東西

——*這弊端很明顯,暴雪官方的AI永遠是一個模樣,並沒有多樣的戰術

——**AMAI可以有各種奇怪的戰術,比如 Tower Rush 吹風流 骷髏海等等……

  • 消耗資源進行對戰的部分

——設計一個進攻樹(裡邊包含野點(低中高級)和敵人基地),進攻樹可以重複

——設計一些小分隊陣容,比如一個近戰陣容可以包括大G狼騎等等,一般還要加上英雄,每次貌似隨機出一隊人去進攻

——交戰時,既能自己釋放就不用說了;血少的會往後撤退,誰打自己的英雄友軍就打誰,這是臨場戰略

——*實際上,這樣的AI還是不夠智能,至少戰術上從來不顧及玩家。比如你的AI盟友總是笑呵呵的打個歎號,然後等都不等你就出征了……

仔細想想對戰大體不就是這麼兩件事麼:找資源和耗資源。這兩個處理好就可以應付大部分情況。

除此之外,還有一些雜項設置,比如根據攻擊護甲類型自動選目標優先攻打,優先幹掉敵方英雄……

如果要研究代碼肯定讓樓主失望了,但要做個戰略AI大概就是這些相對簡單的步驟,這通常已經能取悅大部分玩家。

如果真的能做出那種戰無不勝的AI,那麼說到暴雪時大家一定不會認為這是個偉大的遊戲公司,他早就有更賺錢的生意了。

【skycannnan的回答(21票)】:

我來賣個萌 呵呵

有限狀態機 幾乎是2005年以前所有遊戲的ai解決方案

但是即使是 有限狀態機 ,在刻畫複雜的遊戲場景時,也會陷入冗長的代碼鏈之中而喪失代碼可讀性

所以 behavior tree(行為樹)出現了

本質上說,behavior tree的原理並不比 有限狀態機 高明多少

但是behavior tree可以大大簡化ai控制流程,使解決方案更加清晰

一個用有限狀態機寫的ai控制,用behavior tree大概只需要1/3的代碼,並且可讀性更強

要瞭解behavior tree,請查看cry engine 相關資料,

或者havok的行為樹資料更加翔實

同時也有一個基於c#的實現,叫做tree sharp ,可以搜下

【知乎用戶的回答(11票)】:

war3的AI我沒寫過,別的即時戰略遊戲的AI我倒是分析過。舉個例子,神話時代、帝國時代3、國家的崛起的AI都差不多,前半截出農民分配礦工去不同資源上都是設定好的,幾分幾秒造哪種建築出什麼兵種都是設計好的。然後都是照方抓藥,人類來什麼兵AI就派某種兵來頂,發生什麼狀況就會觸發什麼預案,都是設計好的。所謂自我學習的AI也只不過是把某情況觸發某預案的閾值變量變化了,不會出現特別複雜的「算」法,沒什麼可算的,都是條件觸發罷了。國家的崛起的AI不過是一堆幾kb的C++語言文件。至於微操方面的AI也是如此,一堆條件觸發罷了。

【伍一峰的回答(11票)】:

贊同樓上所有答案。

傳統即時戰略 [1] 的AI其實可以分為兩個部分,一個是資源管理AI,一個是戰爭AI。

資源管理AI就是決定建築、科技樹、建兵的AI。

資源管理AI一般採用的是規則式AI。

規則式AI簡單來說,就是一大堆if-else語句。

它有兩個主要的部分,一個是工作記憶,另一個是規則記憶。[2]

工作記憶儲存已知的遊戲世界信息,這部分是動態的。

規則記憶儲存設遊戲計師設計的的規則。

正如 @五八 所說,規則都是pre-scripted的。

而當工作記憶符合規則記憶的某一條規則時,相應的行動就會被觸發。

這樣做的好處是,遊戲設計師擁有完全的掌控權。

而它的壞處也是十分明顯的——因為是pre-scripted,所以整個規則是靜止的。

但是畢竟在即時戰略中,「正確合理」的發展方式就那麼幾套方案,所以規則式AI帶來的好處多於壞處。

當然,規則式AI也有一些手段來動態學習。

例如給規則的觸發條件並不是一些具體的「錢多少、兵多少」,而是權重。

每次分析時,根據上一次觸發的結果的好壞來調整所有規則的權重,然後選出權重最高的規則,觸發相應行為。〔3〕

然而動態有時會帶來不確定性,所以採取與否,需要看遊戲的設計來決定。

戰爭AI其實可以分為兩層 〔4〕,一層是將軍AI,一層是士兵AI。

將軍AI的工作是分析遊戲世界,然後告訴所有士兵AI 「去哪裡,做什麼」。

士兵AI的工作是分析自己附近的遊戲世界,然後決定相應的行為。

將軍AI分析遊戲世界時,有可能會採用Planner〔8〕、Utility-Based AI或者Neural Network〔11〕等能夠帶來不確定性的AI算法。

我對Planner不熟悉,就不多說了,大家可以看看〔8〕鏈接。

Utility-Based AI是指一套打分系統,根據遊戲世界的信息對行為庫〔5〕打分,然後選出或者組合出〔6〕一套行為〔12〕。

Neural Network是指幾層神經元,例如經典的三層網絡——輸入層、隱藏層、輸出層,世界信息通過輸入層輸入Neural Network系統,然後輸出層輸出一個結果〔7〕。

上面提到的這些算法有一個共同的好處,能夠根據遊戲世界的變化帶來不確定性。

因為即時戰略中的戰爭部分是最難預測的,玩家可以有無窮無盡的戰術變化,所以將軍AI需要更加動態來產生更加動態的戰術。

然而,這些算法,特別是Nerual Network,它們產生的結果的過程是「黑箱的」——即使是我設計的將軍AI,我也不知道它是怎麼工作的...遊戲設計師可以說失去了掌控權。

不過,有研究表明,神經質AI在即時戰略中表現最好〔9〕....或許,這也是算是 「出其不意」吧...

相反地,士兵AI需要比將軍AI更加靜態。

如果你把士兵拉到敵人旁邊,他卻在那邊Idle的話...

所以樓上都有提到的有限狀態機、行為樹等更加靜態的算法〔10〕會更合適,因為遊戲設計師可以設計好士兵的行動規則。

例如弓箭手在距離敵人大於XX米的情況下射箭,距離小於X米的時候肉搏,士氣低於XX的時候走佬。

如果用Neural Network來實現這些設計的話就會哭笑不得...對的,我就用過Neural Network設計過士兵AI,是我們大學的神經網絡的作業...

除了上面的提到的算法,還有另外一些提高遊戲性的算法可以採用。

模糊邏輯,Fuzzy Logic,讓遊戲世界的信息模糊化,帶來合理的不確定性。

勢力圖,Influence Map,讓遊戲世界的信息可視化或者是規範化,有助於將軍AI分析。

隨機,Randomization,在適當的時候做出適當的隨機選擇〔13〕。

註釋或資料來源:

〔1〕我個人喜歡劃分《星際》《紅警》《帝國》等遊戲為「傳統即時戰略」,通常都有資源管理和戰爭兩部分組成。區別於塔防、即時戰術等即時的策略遊戲。

〔2〕〔3〕資料來源:《遊戲開發中的人工智能》第十一章,規則式AI。

〔4〕也可以是多層,視乎需求而定。

〔5〕行為庫指的是一個很多單元行為的集合。一個例子就是行為樹裡面的「行為」。

〔6〕單元行為如果設計得好、相互沒有依賴關係得話,它們之間可以相互組合。

〔7〕「結果」可以是一個行為的代號,也可以是一個權重。

〔8〕Planner資料來源:intrinsicalgorithm.com/

〔9〕資料來源:Solidot | "神經質"AI在即時戰略遊戲中表現最突出

〔10〕如 @Freelancer 所說,稱之為框架會更加合適。

〔11〕Flanking Total War』s AI: 11 Tricks to Conquer for Your Game 提到《全面戰爭》有用到Neural Network,但是我對文章的說的 「Neural Network用在士兵AI上」 表示懷疑,我猜測是用在將軍AI上的。

〔12〕一個利用Utility-Based AI的成功例子 christophermpark.blogspot.sg

〔13〕感謝 @HARDCOREGAME 提醒 :)

【kubisoft的回答(5票)】:

瀉藥。

當然是狀態機,樓上幾位已經說得很好了。

我能補充的是:

1. 類似遺傳算法這種AI算法都是計算量極大、需要等幾小時、幾天、幾個月才能出結果的算法,而遊戲的AI必須在一個tick內迅速作出決定;

2. 重量級的AI算法是解決不知道答案的問題用的。對於已知答案的問題,當然直接給答案就好;

3. 遊戲中的AI有兩個目標:更像人/更有趣。為了讓他更像人,直接採用預定的策略就可以;為了更有趣,加入一些隨機因素就成。

【知乎用戶的回答(5票)】:

遊戲的AI只有一個目的,那就是讓玩家玩的爽。

模擬退火,神經網絡這些算法不能達成這唯一的要求,所以遊戲中一般不會採用。

現在業界用的最多的是行為樹,可以簡單理解為加強版的狀態機。

【承天一的回答(3票)】:

war3里是不可能使用類似「遺傳,模擬退火」等學院派算法的,主要還是有限狀態機,消息機制,控制行為,群狀態控制等,具體到策略上的規則依然是人為設定好的。

黎清水推薦的書是遊戲ai編程裡最經典的教程,你可以去大概翻翻前幾章便可以對遊戲的ai設計有個基本大致的認識。

【Freelancer的回答(1票)】:

自己可以打開地圖的jass腳本去看的,星際裡也有script可以看。

War3時代,底層尋路是地圖分Tile之後的A *尋路,上層邏輯估計就是FSM有限狀態機,經過這些年發展,現在遊戲裡尋路還是基於導航網格(NavigationMesh)的A*,上層AI很多是Behavior Tree來實現的。

遊戲和工程的AI目標完全不同的,遊戲的AI是看起來聰明、表現多樣;工程上我熟悉的多是為了解決組合爆炸問題,通過AI算法求解。但工程上的AI算法也有各種限制,例如遺傳算法的過度收斂、收斂到局部解、神經網絡的權重訓練出來人不可理解、多少個神經節點能解決特定問題的沒有定義,等等等等還有大量問題,這些對於遊戲開發這種需要控制開發週期和確定性結果的工程設計都不利啊!所以遊戲這種密集開發的軟件工程,一是AI不需要這麼複雜的算法就能實現,二是AI算法很多不穩定和難理解控制並不適合遊戲快速迭代開發。

順帶一提,遊戲中的AI系統底層A*是圖算法,上層Behavior Tree只是個框架,方便邏輯書寫的。當然這個世界上也有各種嘗試把學院派AI應用在遊戲的項目,例如bwapi - An API for interacting with Starcraft: Broodwar (1.16.1),每年還有AI比賽遊戲界「深藍」 伯克利的《星際爭霸》AI「主宰」這是篇伯克利AI的報道,自己當年畢設就通過這平台搞了個星際微操的遺傳神經網絡玩了玩,滿好玩的。

ps:個人感覺很多遊戲裡的操作集是有限的,遊戲AI在工程意義上去擬真玩家是可解的,某種意義上遊戲AI是可以率先通過工程手段通過圖靈測試。More human than human: AI game bots pass Turing Test

【黎清水的回答(3票)】:

和傳統的機器學習的任務思路還是有一定區別的哈 是一些模糊邏輯狀態機之類的東西

沒有研究過 但是在以前看雲風老師的一篇講遊戲中的人工智能和模糊邏輯的博客雲風的 BLOG: 讀書 Archives中推薦的是下面這本書 lz可以看看感受感受?

遊戲人工智能編程案例精粹 (豆瓣)

【leephilip的回答(1票)】:

有人用強化學習來寫星際AI,鏈接:Berkeley Overmind

【HARDCOREGAME的回答(1票)】:

1 請從角色體驗和遊戲類型考慮AI的複雜度

2 有限狀態機適應大多數系統

3 BT可以有效解決分支邏輯的體驗表達

4 尋路和群組可能會涉及到A*的算法深入 但還是有替代方案

5 基於目標的AI是一個業界嘗試的新思路

6 請製作讓玩家覺得有趣「聰明的」AI 不是搞科研

【田彪的回答(0票)】:

估計是狀態機,要不太複雜了

【陳金桂的回答(0票)】:

有限狀態機可能需要多個,如果只有一個狀態機,攻擊和移動就互斥了,就不能上下半身份離邊打邊跑了。我廠工行為樹。

【李偉的回答(0票)】:

有限狀態機

【鍾典的回答(0票)】:

遺傳算法?模擬退火算法?如果真的我們要在所有遊戲中這樣實現遊戲ai,那麼我們數學系的學生就業就不會那麼困難了。

前面已經把這個問題答得很透徹了,有限狀態機是最「經濟」的解決方法。隨之而來的行為樹規範了這種方法。這些方面我也不專精,所以就不再贅述。

我只想提一下以前初中的時候很無聊做魔獸地圖的時候,有一項就是添加ai。其實魔獸地圖編輯器的ai腳本基本上不需要創作者多少編程知識和數學知識,你只需要把什麼時候怎麼做告訴計算機就好了。

所以遊戲ai的難度在於,人要實現預知大體上的所有可能性。

標籤:-人工智能 -遊戲 -計算機 -遊戲開發 -機器學習


相關資源:





給我留言