電子遊戲嘅人工智能

出自維基百科,自由嘅百科全書
Jump to navigation Jump to search
一班人喺度玩食鬼;啲鬼由電腦操控,但曉追捕玩家-展現咗簡單嘅智能。

電子遊戲嘅人工智能係指電子遊戲粵拼din6 zi2 jau4 hei3英文video game)當中嘅人工智能粵拼jan4 gung1 zi3 nang4英文artificial intelligence,以下簡稱「AI」):

  • 電子遊戲係能夠同玩家互動、以娛樂玩家為目的嘅電腦程式;而電子遊戲入面好多時會涉及由電腦控制,同玩家進行對局嘅角色NPC[1]遊戲開發者為咗想玩家得到樂趣,通常會想呢啲由電腦控制嘅角色有返咁上下聰明,能夠為玩家提供一定嘅挑戰(睇埋心流[2];噉即係話佢哋會想 NPC 展現一定程度嘅智能,而「教電腦程式做出類似有智能噉嘅行為」正正就係 AI 呢個領域嘅重心[3][4]
  • 喺另一方面,又有 AI 領域嘅科學家指出,電子遊戲本質上就係設計嚟俾一個心靈慢慢學習(遊戲難度一般會慢慢提高)嘅,所以電子遊戲係一個好便於研究點樣教 AI 學習嘅環境-遊戲製作同 AI 呢兩個領域做到相輔相成[5][6]

舉個簡單例子,食鬼入面嘅敵人由電腦控制,一個教電腦控制啲敵人嘅可能演算法如下[7]

Pac-Man.pos
clyde_target = random_tiles // 將 clyde_target 設做隨機一格

while game == in_play: // 當隻遊戲進行嘅每一個時間點,
    case player of:
      Blinky:  move 1 tile toward Pac-Man.pos // 第一隻鬼要向主角位置(Pac-Man.pos)行一步。
      Inky:    move 1 tile toward (Pac-Man.pos + 4) // 第二隻鬼要向主角位置前四格行一步。
      Clyde:   if Clyde.pos == clyde_target: // Clyde 呢隻鬼要向佢嘅目標位置前進,如果到咗目標位置,揀個新嘅目標位置。
                   clyde_target = (clyde_target + 1) % 10 
               else:
                   move 1 tile toward clyde_target

上述嘅會令啲敵人曉追趕主角-有少少似有智能嘅噉[8]

早期-廿世紀中-嘅電子遊戲經已有喺度用相對簡單嘅 AI,而廿一世紀初及後,電子遊戲嘅 AI 仲成為咗遊戲製作上嘅一個大課題。遊戲製作嘅專家會研究用乜嘢演算法整一隻遊戲嘅 AI 先最可以令玩家過癮,而且 AI 仲有俾人運用嚟做控制 NPC 以外嘅工作,例如係做遊戲測試(game testing;喺隻遊戲出街前測試隻遊戲玩起上嚟點)以及對局配對(matchmaking;喺網上 PvP 遊戲當中、搵若干個玩家、再將佢哋擺喺一個對局嘅過程)等等都有用到 AI 相關嘅技術[9][10]

基本概念[編輯]

遊戲程式[編輯]

內文: 遊戲程式

電子遊戲電腦程式嘅一種,而一個遊戲程式嘅根基係遊戲迴圈(game loop):隻遊戲嘅程式係一個程式迴圈(loop),要係噉重複做同一樣嘅工作(而唔係將個程式啲逐句逐句行一次就算)-呢樣工作就係攞「玩家透過手掣等架生俾嘅輸入」以及「隻遊戲喺上一刻嘅狀態」等嘅資訊,再按呢啲資訊同隻遊戲嘅法則,計遊戲世界下一刻嘅狀態應該係點。一隻電子遊戲大致上可以想像成噉樣(用咗 while 迴圈)嘅虛擬碼[11][12]

 while game is running
   process inputs
   update game world
   generate outputs
 loop
1982 年嘅食鬼遊戲

用以下呢段食鬼嘅虛擬碼為例[11]

 while player.lives > 0 當玩家有多過 0 條命嗰陣一路做...
    // Process Inputs
    JoystickData j = grab raw data from joystick 由手掣嗰度探測玩家撳咗乜掣
    
    // Update Game World
    update player.position based on j 基於玩家撳嘅掣,更新玩家角色嘅位置
    foreach Ghost g in world for 每一隻鬼
       if player collides with g 如果玩家撞到嗰隻鬼
          kill either player or g 玩家就死
       else
          update AI for g based on player.position 基於隻鬼嘅 AI,更新佢嘅位置;例子有上面提到嘅演算法。
       end
    loop
    
    // Pac-Man eats any pellets
    ...
    
    // Generate Outputs
    draw graphics 喺熒光幕上面畫相應嘅影像
    update audio ... 同埋整聲效
 loop

遊戲 AI 嘅碼位於 update game world 當中:有好多 PvE 遊戲嘅關卡入面都會有敵人俾玩家打,甚至有啲遊戲會喺 PvP 對局入面有由 AI 控制嘅個體[13];每當個程式更新遊戲世界嘅狀態嗰陣,佢都要估計每個 AI 個體需要採取乜嘢行動-呢啲個體要識探測玩家嘅位置,攻擊玩家,以及對玩家嘅攻擊作出迴避等等-即係話要按照呢啲 AI 嘅運作原理,計出佢哋每個個體喺下一刻會變成乜嘢狀態[14]

人工智能[編輯]

內文: 人工智能

人工智能(AI)泛指教機械展示有智能行為嘅一類技術,喺電子遊戲業當中好常用:喺實際應用上,好多遊戲都會俾遊戲設計師設計成由玩家負責操控嘅主角打低一啲敵人通過關卡,而呢啲敵人喺美術上通常都會被設成「敵人士兵」等理應有智能嘅物體,所以玩家自然會期望呢啲個體識得或多或少噉展現出智能;喺認知科學(cognitive science)等嘅領域上認為,一個有智能嘅物體至少會曉感知周圍嘅環境,然後按收到嘅資訊同自己嘅目的決定要做出點嘅行為[15]

所以一般嘅遊戲 AI 至低限度會有以下兩大部份:

  • 刺激詮釋器(stimulus interpreter):刺激詮釋器會話俾一個 AI 程式知個遊戲狀態係點;一般嚟講,每個個體敵人都會有個獨立嘅 AI,每個智能會透過刺激詮釋器得到佢哋應該得到嘅資訊(例如一個敵人士兵應該知道佢視線範圍內發生緊乜事),即係話個程式要有方法表示「foreach AI ,嗰個智能手上有乜資訊」[16];刺激詮釋器喺某啲遊戲類型-例如係隱蔽類遊戲(stealth game;指重視要玩家避開敵人偵察嘅遊戲)-入面零舍重要,例:一隻俾玩家扮演忍者嘅遊戲,有機制決定一個敵人有冇睇到玩家,喺每個時間點,foreach 敵人,遊戲程式由個敵人對眼射幾條隱形嘅光出去,睇吓嗰幾條光有冇同玩家嘅命中框(hitbox)相交,而如果有,嗰個敵人就算睇到玩家[17]
  • 決策系統(decision system):呢個部份嘅碼一般會喺刺激詮釋器嘅碼後面;每一個 AI 都要按手上嘅資訊同自己嘅目的,計出跟住要採取乜嘢行動;例如一個敵人見到玩家,知道玩家嘅位置,而佢目的係要行埋玩家度攻擊佢,佢個 AI 程式就要有個方法教佢點樣用「玩家嘅位置」同「自己嘅位置」(個決策系統嘅輸入)計出「自己應該向乜方向移動」(個決策系統嘅輸出)[16]

攞返上面食鬼嗰個例子,段虛擬碼嘅其中一行 move 1 tile toward Pac-Man.pos 涉及要隻鬼移向主角嘅位置,即係話個程式知道主角嘅位置(Pac-Man.pos),並且直接當隻鬼知道呢個資訊(刺激詮釋器),而隻鬼嘅智能按一條好簡單嘅法則運行-向主角嘅位置移一格(決策系統),喺下刻,遊戲程式就按此知道隻鬼嘅狀態(位置)要點樣改變[7]

啟發法[編輯]

內文: 啟發法

啟發法(heuristics)係認知科學同相關領域上嘅一個概念,指一啲用嚟解難嘅簡單法則:喺現實生活當中,人類好多時會用一啲過往經驗顯示咗係解到難嘅「認知捷徑」嚟應付佢哋面對嘅問題;舉個例子說明,想像有個人家陣去超市買餸,想買意粉,如果佢想做完全理性嘅決策,(根據理性嘅定義)佢要諗過度過嗮所有有得買嘅意粉牌子,諗出一套基準決定一隻牌子點先算「好」,量度吓每一款有幾能夠滿足佢嘅慾望(價錢貴唔貴、有幾好食等),再用一個效益函數(utility function)計吓邊隻牌子效用最高,而某隻牌子嘅效用可以(例如)用呢條式計:

當中 效益(utility), 係買咗之後淨低嘅錢反映嘅效用, 反映隻牌子有幾好食,而 反映隻牌子有幾健康(假設呢幾個數都可以用同一單位量度)。計咗呢條數之後,嗰個人就要揀效用最高嗰隻牌子,令自己效用最大化;佢又可以就噉揀佢買開嗰隻牌子-「揀我買開嗰隻牌子嘅意粉」就係一個啟發法;呢個啟發法未必可以達到最理想嘅結果-例如可能有一隻好好味、但佢未試過嘅意粉牌子(搞到用呢個啟發法達唔到最高嘅可能效用),但就幫到個人手慳好多時間。喺日常生活當中,人類做嘅經濟決策多數都係用啟發法做嘅-事實係,如果人類吓吓用完全理性嘅方法做決策嘅話,佢哋就要嘥好多時間做運算,喺實際應用上根本唔可行[18]

同一道理,如果要一個遊戲 AI 做完美運算,往往會嘥極大量嘅時間同精神,而且亦有搞到個 AI 唔似現實世界嘅智能嘅憂慮,所以遊戲 AI 嘅設計者一般會用大量嘅啟發法嚟教 AI 解決問題;好似係上面嗰段食鬼碼噉,原則上,個遊戲程式可以寫成(例如)每隻鬼都曉做運算,計算玩家跟住落嚟嗰 50 步嘅概率分佈(跟住落嚟嗰 50 步嘅所有可能性以及每個可能性發生嘅機會率),然後再攞每個可能性,計算喺每個可能性下,自己要用乜嘢移動軌跡,先可以令自己捉到玩家嘅機會率最大化-相比之下,move 1 tile toward Pac-Man.pos(靠近玩家嘅位置)或者 move 1 tile toward (Pac-Man.pos + 4)(靠近玩家位置前四格嘅位置)呢啲解難法則就簡單好多[19]

移動[編輯]

睇埋:遊戲物理

教 AI 移動嘅演算法係遊戲 AI 嘅基礎之一:除咗好似互動式小說等嘅類型之外,絕大多數嘅遊戲都會包含一個遊戲空間,俾遊戲角色喺個空間入面移動;好似食鬼等嘅早期電子遊戲經已有喺度用演算法教 NPC 點樣探索遊戲空間,而呢個時期用嘅演算法有啲到咗廿一世紀都仲有人用[7]

喺比較簡單嘅情況下,一個電子遊戲 AI 移動演算法會攞遊戲空間入面其他物件嘅運動屬性做輸入,並且用呢啲輸入計出個 AI 角色應該要移去邊個方向或者位置:

  • 輸入 input:第啲物件或者個 AI 角色本身嘅
 position(位置) # 一個二至三維嘅向量,用坐標表達位置。
 orientation(方向) # 一個單一嘅數值,用離正北方嘅角度表達個角色面向邊個方向。
 velocity(速度,) # 另一個二至三維嘅向量,表示個角色喺三條軸分別嘅速度。
 rotation(旋轉) # 一個單一嘅數值,degree per second
  • 輸出 output:個 AI 角色跟住落嚟嘅
 acceleration(加速度) # 一個二至三維嘅向量,
 force(力) # 另一個二至三維嘅向量

舉個簡單例子,好似係一個教 NPC 避子彈嘅演算法,就通常要有方法俾個 AI 角色知道子彈嘅位置、方向同速度,再計出個 AI 角色應該向自己施一股點嘅,或者有個點嘅加速度,先可以避開粒子彈(有關相關嘅物理學概念,可以睇吓牛頓力學向量[20]

例子碼 1

喺遊戲 AI 上,其中一樣最基本嘅嘢係教 AI 追敵人,例如遊戲敵人追蹤玩家,嘗試接近同攻擊玩家角色。以下係教一個 AI 追蹤(seek)一件物件嘅演算法[21]

class KinematicSeek:
  // Declare 個演算法控制緊邊個角色同要追嘅目標
    character, target
  // Declare 個角色嘅最大速度
    maxSpeed

  def getSteering():
    // 整個 output 嘅結構
    steering = new KinematicSteeringOutput()
    // 攞個 steering 嘅方向
    steering.velocity = target.position - character.position // 如果將呢個數變成隨機,可以用嚟教個 AI 隨機行嚟行去(wandering)。
    if steering.velocity.length() < radius: // 如果同目標之間嘅距離細過某個特定數值,就唔使郁。
      return none
    // 計出個 exact 嘅速度
    steering.velocity.normalize()
    steering.velocity *= maxSpeed
    // 轉向要郁嘅方向
    character.orientation = getNewOrientation(character.orientation,steering.velocity)
    // 將個 steering 俾做 output
    steering.rotation = 0
    return steering

順帶一提,將 target.position - character.position 改做 character.position - target.position 就可以令段演算法變成教個 AI 避開一件物件[21]。再進一步嘅演算法仲會教埋個 AI 離目標有返咁上下近就要剎掣、將方向對準、以及將自己嘅速度變成同目標一致等等嘅功能[22]

例子碼 2

以下呢段碼定義咗兩個子程式用嚟教人工智能避開障礙物[23]

private function collisionAvoidance() :Vector3D { // 計要點樣避,呢個子程式俾嘅結果會係一股力(睇返上面遊戲物理嗰度)。
    ahead = ...; // calculate the ahead vector
    ahead2 = ...; // calculate the ahead2 vector
 
    var mostThreatening :Obstacle = findMostThreateningObstacle(); // 用「findMostThreateningObstacle」呢個子程式搵出最有威脅性嘅障礙物。
    var avoidance :Vector3D = new Vector3D(0, 0, 0);
 
    if (mostThreatening != null) { // 如果有障礙物,計避開嗰股力要係幾多,用「最有威脅性嘅障礙物」嘅位置同個角色嘅速度計。
        avoidance.x = ahead.x - mostThreatening.center.x;
        avoidance.y = ahead.y - mostThreatening.center.y;
 
        avoidance.normalize();
        avoidance.scaleBy(MAX_AVOID_FORCE);
    } else {
        avoidance.scaleBy(0); // nullify the avoidance force // 如果冇,避開嗰股力變 0(唔使避)。
    }
 
    return avoidance;
}
 
private function findMostThreateningObstacle() :Obstacle { // 用嚟搵出環境入面邊件障礙物最危險嘅子程式
    var mostThreatening :Obstacle = null; // 首先將「最有威脅性嘅障礙物」設做「冇嘢」。
 
    for (var i:int = 0; i < Game.instance.obstacles.length; i++) { // 逐件逐件障礙物計一次
        var obstacle :Obstacle = Game.instance.obstacles[i];
        var collision :Boolean = lineIntersecsCircle(ahead, ahead2, obstacle); // 計吓個角色會唔會同件障礙物相撞
 
        // "position" 係個角色現時嘅位置
        if (collision && (mostThreatening == null || distance(position, obstacle) < distance(position, mostThreatening))) { 
        // 如果會相撞,而且件障礙物近過目前手上最近嗰件「最有威脅性嘅障礙物」嘅話,將件障礙物設做「最有威脅性嘅障礙物」。
            mostThreatening = obstacle;
        }
    }
    return mostThreatening; // 將最後「最有威脅性嘅障礙物」俾做輸出。
}

喺個遊戲程式「更新遊戲狀態」嘅部份入面會有「foreach 人工智能角色,幫佢做 collisionAvoidance()」噉嘅碼[23]

搵路[編輯]

一幅圖論當中嘅圖;通常一個搵路演算法會用呢啲圖做輸入。
內文: 搵路

搵路(pathfinding / pathing)係人工智能上嘅一個大課題,指教一個 AI 喺空間入面指定兩個點,並且搵出一條連接兩點嘅線。做搵路嘅演算法有好多用途,例如喺機械人學上教機械人探索自己周圍嘅空間,以及喺遊戲製作上教遊戲 AI 喺遊戲空間入面搵出要行嘅路線[24][25]

一般嚟講,搵路演算法-無論係咪電子遊戲用嘅都好-都會[26][27]

  • 攞一幅圖做輸入 input:呢類演算法通常唔能夠直接處理一個環境,而係要靠第個演算法,simplify,將個環境變成一幅(graph);圖論(graph theory)當中嘅一幅圖會有若干個節點(node),並且指明邊啲節點之間有連結,喺應用上,一個可能嘅做法係個輸入最先嗰個數字代表節點嘅數量,跟住嘅數字表示邊啲節點之間有連結,例如 [6, 1-2, 1-5, 2-5, 2-3, 5-4, 3-4, 4-6] 表示幅圖有 6 個節點,節點 1 同節點 2 之間有連結(可以由節點 1 行去節點 2 或者相反)、節點 1 同節點 5 之間有連結(可以由節點 1 行去節點 5 或者相反)... 如此類推;simplify 要做嘅嘢係攞要探索嗰個環境做輸入,輸出一個表示個環境當中有邊啲重要位置(節點)同邊啲位置之間有路能夠互通(連結)嘅圖,等搵路演算法做嘅嘢容易啲[26]
  • 喺電子遊戲入面用嘅搵路演算法通常會用權重表(weighted graph),意思即係話個表每條連結都會有個數值[註 1],表示嗰條路線嘅成本(cost)[28]:例如有一個 simplify 演算法會每條路都俾個權重值佢,個數值愈大表示條路愈難行(成本高);想像其中兩個節點之間有兩條可能路線 aba 係一條完全冇機關嘅平路,而 b 長過 a 之餘仲有十個陷阱設咗喺度,噉正路嚟講,假設 ab 喺其他因素上完全相等,b 嘅權重值理應會大過 a[註 2][29]
  • 最後個演算法會俾一條路線嚟做輸出 output [30]
一個權重表;一條路掕住嘅數字表達嗰條路有幾易行[註 3]

一個搵路演算法嘅輸入 input 望落大致上係噉嘅[26]

class Graph:
  // 搵出柞連結
  def getConnections(fromNode)

class Connection: // 每條連結...
  // 條連結有個非負嘅數做佢權重
  def getCost()
  // 條連結由邊個節點出發
  def getFromNode()
  // 條連結去邊個節點
  def getToNode()
例子碼

迪卡斯特拉演算法(Dijkstra's algorithm)係由荷蘭電腦科學家艾斯加·迪卡斯特拉(Edsger W. Dijkstra)諗出嚟嘅一個演算法。呢個演算法會攞三樣嘢做輸入 input:一個圖、一個起點節點同一個終點節點;目的係俾出「成本最低嗰條路線」嚟做輸出 output,而如果有多過一條「成本最低路線」嘅話,是但俾其中一條做輸出。虛擬碼如下[31][32]

def pathfindDijkstra(graph, start, end): // 個演算法有三個 input,個圖(graph)、起點(start)同終點(end)
  struct NodeRecord: // 個演算法需要三件資訊:
    node // 節點
    connection // 連結
    costSoFar // 「目前嘅成本」

  // 初始化
  startRecord = new NodeRecord()
  startRecord.node = start
  startRecord.connection = None
  startRecord.costSoFar = 0
  open = PathfindingList() // 「開放表」(open list)
  open += startRecord // 將起點加入開放表。
  closed = PathfindingList() // 「封閉表」(closed list)

  // while 開放表入面仲有嘢,做...
  while length(open) > 0:
    current = open.smallestElement() // 攞開放表入面最細嗰件做現時點。
    if current.node == goal: break // 如果現時點係終點,break。
    // 如果冇 break 到,個程式會繼續行落去...
    connections = graph.getConnections(current) // 將同現時點有連結嘅節點冚唪唥搵嗮出嚟。

    for connection in connections: // 同搵到嘅連結每個做以下嘅嘢...
      endNode = connection.getToNode() // 設嗰條連結去嘅點做終點。
      endNodeCost = current.costSoFar + connection.getCost() // 計個成本。
      if closed.contains(endNode): continue // 如果嗰點係冇路走嘅,skip 去計下一條連結。
      else if open.contains(endNode):
        endNodeRecord = open.find(endNode)
        if endNodeRecord.cost <= endNodeCost: continue // 如果呢個點嘅成本並唔細過已知嘅點嘅話,skip 去計下一條連結。
      else:
        endNodeRecord = new NodeRecord() // else,將呢個點加入紀錄嗰度。
        endNodeRecord.node = endNode
      // Update 成本同連結
      endNodeRecord.cost = endNodeCost
      endNodeRecord.connection = connection
      // 再將呢點加入開放表嗰度。
      if not open.contains(endNode):
        open += endNodeRecord
      // 將現時點移出開放表,並且加佢入封閉表。

    open -= current
    closed += current

  // 做完個 while 之後...
  if current.node != goal: // 如果冇去到終點嘅話,表示搵路失敗。
    return None
  else: // 否則,compile 一個列嗮搵到嗰條路涉及嘅連結嘅表,表示條路線。
    path = [] 
    while current.node != start: 
      path += current.connection
      current = current.connection.getFromNode()
    return reverse(path) // 將條路線俾出嚟做 output。

除咗迪卡斯特拉演算法之外,會用某啲啟發法考慮預計成本嘅 A* 搜尋演算法(A* search algorithm,簡稱「A*」)係另一個常用嘅搵路演算法[26][33][34]。可以睇埋解迷宮演算法

決策[編輯]

睇埋:有限狀態機

決策(decision making)係指由一柞可能選擇當中揀一個嘅過程。想像一個寫嚟教電腦玩射擊遊戲嘅 AI,個 AI 係一部有限狀態機(finite-state machine),有「防守」、「進攻」同「去搵彈藥」等嘅多個可能狀態,佢內置嘅 AI 演算法就要教佢幾時進入邊個狀態(例:if 自己淨低嘅生命值低過 50%,then 進入防守狀態-教佢喺自己血低嗰陣要防守)。呢類決策演算法會攞同遊戲輸贏相關嘅資訊(自己同對手血量等等),並且計出要進入邊個狀態(採取邊個策略)。有限狀態機同搵路呢兩個概念係遊戲 AI 嘅基礎[35][36]

一個以有限狀態機形式存在嘅遊戲 AI 望落會有類似噉嘅碼[35][37]

void Update(){ // 呢段碼教一個 AI 玩揸戰機。
  switch(state){ // 視乎 state(狀態)係乜,做...
    case State.PURSUIT: // 如果狀態係 pursuit(追擊)嘅話,做...
      CheckForDanger(); // 一個睇吓周圍有冇危險嘅子程序
      Chase(target, true); // 追目標;呢個子程序當中會有演算法,決定幾時要將 state 呢個變數改變並且離開個子程序。
      break;

    case State.DARWINISM: // 如果狀態係 Darwinism 嘅話,做...
      var angle = GetDeltaAngle(target); // ... 同一道理
      SteerClear(angle);
      if(!IsOnCollisionCourse) state = pausedState;
      break;

    case State.FOLLOW: // ...
      CheckForDanger();
      Chase(squadron.leader);
      EvaluateSquadron();
      break;

    case State.PATROL: // ...
      CheckForDanger();
      FlyTo(route.goingTo);
      PatrolManagement(20);
      break;
  }

void Chase(target, true){ // Chase 呢個子程序
    ... // 做 chase 狀態要做嘅行動。
    if (.....) // 如果某啲條件達到...
       break; // 離開子程序,令個程式返到去揀狀態嘅點。
  }

快思邏輯[編輯]

睇埋:快思邏輯

快思邏輯(fuzzy logic)係相對於一係「真」一係「假」嘅布林邏輯嘅一種邏輯。想像家陣有杯水,研究者想按杯水嘅攝氏溫度將杯水分落「熱」、「暖」同「凍」三個類別,佢可以用布林邏輯嚟分-15 度以下嘅係凍、15 至 40 度嘅係暖... 如此類推,即係話「杯水屬熱」呢句陳述式只能夠係真(1)或者假(0);另一方面,佢可以用快思邏輯嚟分-10 度以下嘅實係凍,而 10 至 20 度之間嘅水會介乎於凍同暖之間,例如一杯 15 度嘅水會係 0.5 凍 0.5 暖... 如此類推,「杯水屬熱」呢句陳述式嘅數值可以喺真(1)同假(0)之間。快思邏輯呢種思考法係喺 1960 年代中興起嘅[38]

用快思邏輯斷定一個溫度係熱、暖定凍;X 軸係溫度,而 Y 軸係真假。

快思邏輯喺電子遊戲上都會有用:想像一隻射擊遊戲當中曉同玩家角色戰鬥嘅 AI 角色;佢具有生命值呢個屬性,而且係一部有限狀態機-喺每個時間點,佢有「去搵藥包回復生命值」同「繼續戰鬥」呢兩個可能狀態,

  • 如果個程式用嘅係布林邏輯,佢可能會按「if 生命值 < 50%, then 去搵藥包回復生命值, else 繼續戰鬥」嘅邏輯行事,
  • 另一方面,佢又可以用快思邏輯行事,例:
 if 生命值 < 20%, then
   去搵藥包,
 else if 20% <= 生命值 < 40%, then 
   一路繼續戰鬥一路同藥包位置維持 x 咁多嘅距離,當中 x = f(淨低嘅生命值),即係一個介乎於「繼續戰鬥」同「去搵藥包」之間嘅狀態。
 ...

喺多數情況下,用快思邏輯製作遊戲 AI 會令個 AI 變得更加似人-人類做起決策上嚟都係一定程度跟快思邏輯嘅[37][39]

決策樹[編輯]

一樖決定去玩(play)定唔好去玩(don't play)嘅三步決策樹
睇埋:蒙地卡羅樹搜索

決策樹(decision tree)係一種用樹狀圖做決策嘅做法。一樖決策樹會有若干個節點(node),每個節點代表一個決策點,會若干個箭咀指去下一柞節點(下一步),每個箭咀表示「如果揀咗呢個選項,就去呢個決策點」。想像附圖嗰樖決策樹,個決策者想決定好唔好去玩,喺開頭,去玩嘅價值有 9 分,唔好去玩嘅價值有 5 分,而如果天氣係晴天(sunny),去玩嘅價值變成 2 分,唔好去玩嘅價值變成 3 分,然後個決策者會睇濕度(HUMIDITY)... 如此類推。喺運算上,一樖決策樹節點數量 愈大,運算樖樹要用嘅時間就愈多[40][41]

喺遊戲 AI 上,蒙地卡羅樹搜索(Monte Carlo tree search,MCTS)係一種比較實際嘅做法:現實世界嘅電子遊戲嘅決策樹通常都大得好交關,可能去到第二第三步經已有成幾千個節點,夾硬考慮嗮所有嘅可能性喺實際應用上根本唔可行;MCTS 簡單啲講就係有技巧噉搜索一樖決策樹-會揀定一個深度值 做「要考慮幾多步」,並且喺每步按某啲準則揀邊啲節點嘅下一步值得考慮(例如可能搵個人工神經網絡計吓邊啲節點比較有可能發生),而如果上述嘅演算法設計得夠好,MCTS 可以有效噉教電腦玩遊戲[42][43]。2016 年打贏九段圍棋棋手李世石而出名嘅人工智能程式 AlphaGo 就係用咗 MCTS 嘅技術[44]

決策樹可以用相對簡單嘅條件運算式編寫[37]

struct RandomDecision (Decision):
  lastFrame = -1
  lastDecision = false
  
  def test():
    if frame() > lastFrame + 1:
      lastDecision = randomBoolean()
    lastFrame = frame()
    return lastDecision

策略戰術[編輯]

睇埋:博弈論同埋軍事策略

一個遊戲 AI 唔淨只要識得做決策,而且仲有識得判斷邊個選擇能夠令佢打贏嘅機會率最大化。一般嚟講,一個遊戲 AI 需要有一套策略(strategy),套策略會講明「喺情況 我會採取噉嘅行動」、「喺情況 我會採取噉嘅行動」... 等等嘅資訊,令佢喺適當嘅時候用適當嘅戰術(tactics);策略喺遊戲 AI 上係一個重大課題-聰明嘅 AI 能夠令一隻遊戲更加好玩,而且理論性啲嘅人工智能研究亦都對「點樣令一部電腦出現有智能嘅策略性行動」呢個問題感興趣[45][46]

喺有地圖嘅遊戲類型當中,遊戲 AI 演算法好多時會運用對地圖唔同位置嘅戰略價值嘅判斷:例如想像一隻射擊遊戲,設計者想教遊戲 AI 有策略噉喺地圖上移動同揀企嘅位置,佢可以用演算法將地圖變成一幅圖論入面嘅圖(睇返上面搵路),然後按照一套事先制訂咗嘅演算法 judge valuejudge value 會每個節點都俾個數值 佢, 代表咗嗰個位置喺戰術上有幾有利( 會取決於嗰個位置嘅高度、掩護物嘅存在、有冇逃走路線以及有冇彈藥供應等嘅因素),並且喺每個時間點一路決定自己應該要喺邊個狀態(睇返上面有限狀態機嘅嘢)一路嘗試盡量將自己移向 值高嘅位置[註 4];當中 judge value 嘅質素-有幾能夠準確噉判斷一個位置嘅戰略價值-反映個 AI 嘅戰略能力。呢種做法喺現實嘅軍事策略入面都會用到。事實係,喺動作遊戲戰略遊戲嘅 AI 設計當中,設計師往往會參考現實世界嘅軍事策略[46]

協調行動[編輯]

睇埋:群體智能

喺廿一世紀嘅電子遊戲當中,一個 AI 角色好多時唔淨只要單獨噉行動,仲要識得同(由 AI 或者玩家控制嘅)第啲個體合作:喺好多戰略遊戲同動作遊戲入面都會有成隊人一齊上嘅 AI 敵人角色,又有啲戰略射擊遊戲會俾玩家扮演指揮官,一路戰鬥一路指揮住由 AI 控制嘅隊友,例:隊友係有限狀態機,有「掩護玩家」、「去搵彈藥」同「進攻」等多個狀態,玩家可以指定佢哋要去邊個狀態[註 5]。喺呢啲情況下,一個噉嘅 AI 角色內部嘅演算法要攞「同佢合作緊嗰啲個體嘅行動」作為 input;呢類 AI 大致上可以按「會唔會由高層嗰度收 input」分做兩類-

  • 由上至下(top-down),指某個高層個體會攞一啲 input,並且對下層嘅個體落命令,好似現實世界由將軍等高階將士指揮軍隊作戰噉;呢啲高層個體好多時能夠鳥瞰遊戲地圖,所以佢哋手上會有一啲下層個體冇嘅資訊;同埋
  • 由下至上(bottom-up),指各個個體分別噉對自己周圍嘅環境嘅變數(包括視線範圍內嘅隊友)作出判斷,並且 output 各自嘅行動,而唔會由任何高層嗰度收命令;喺某啲情況下,呢類演算法可以引致望落好似成個隊伍有一個智能噉嘅行為(可以睇埋群體智能[46][47]

學習[編輯]

一班機械人學識慢慢噉學識一齊合作推郁物件。
睇埋:機械學習

機械學習(machine learning,簡稱「ML」)係人工智能上嘅一種技術。指用程式編寫教一部電腦做學習,典型做法如下[48][49]:p. 2

  1. 編寫一個程式,教部電腦點樣由數據嗰度建立一個數學模型嚟描述佢對啲變數之間嘅關係嘅知識;
  2. 搵啲樣本數據(即係所謂嘅「訓練數據」)返嚟,俾個程式處理吓啲數據入面嘅個案,等部電腦按個程式建立一個數學模型;跟住
  3. 喺將來再撞到同類個案嗰時,部電腦就會曉按佢個程式,用建立咗嗰個模型,對呢啲之前未見過嘅個案作出預測-個設計者唔使明文噉教部電腦點樣應對呢啲前所未見嘅個案,部電腦都會有能力一定程度上應對。

原則上,如果一個遊戲 AI 能夠記住玩家過去嘅行為(描述玩家行為嘅變數數值就係數據),再按呢樣資訊改變自己嘅行為,噉就會做到「遊戲 AI 曉學習同適應,持續為玩家提供新挑戰」嘅效果。一個簡單嘅例子有以下噉嘅做法[50]

 記低玩家而家選擇咗邊個戰術,
 按手上數據(玩家喺過去 n 個時間點每一個當中揀咗邊個戰術),計算玩家揀每個戰術嘅機會率,
 將出現機會率最大嘅戰術做「預佢會用嘅戰術」。
 揀選能夠最有效噉應對「預佢會用嘅戰術」嘅戰術。

有好多遊戲設計師都希望自己嘅遊戲嘅 AI 可以做到曉學習,不過另一方面又有遊戲設計學者指出,曉學習嘅遊戲程式有「難控制難預測」嘅問題,而遊戲環境太難預測好多時會搞到玩家冇癮[3][51]-廿一世紀初嘅遊戲 AI 界變得重視對機械學習嘅討論[4][52]

喺現實世界嘅遊戲製作當中,機械學習嘅遊戲 AI 通常係離線(offline)做嘅:想像有個[網上遊戲]]程式,會一路俾玩家玩一路學習,所以會係噉變化,但噉通常會引致一個問題-喺管理網上遊戲嘅途中,製作組要做程式除錯(debugging)嘅工作,而要檢查程式錯誤,個錯誤就一定要能夠重複出現,等編程員慢慢研究個錯誤係點嚟,所以俾個遊戲程式係噉變化會搞到除錯嘅工作變得撈絞。因為呢個緣故,遊戲 AI 機械學習(尤其係網上遊戲)比較常用嘅做法係離線做,即係例如每隔一段時間就要個網上遊戲程式離線,按機械學習演算法更新,先至再上返線[50]

第啲應用[編輯]

六樖用程序化生成嘅虛擬樹

喺廿世紀嗰陣,遊戲 AI 嘅用途幾乎完全局限於教遊戲程式點樣控制啲 NPC,搵路、有限狀態機同蒙地卡羅樹搜索等嘅技術都係噉。但自從廿一世紀開始,遊戲 AI 界開始將人工智能嘅相關技術應用落去其他嘅用途嗰度,包括[3]

  • 玩家體驗模擬(player experience modeling):遊戲製作其中一個最重要嘅目的係要令玩家玩嗰陣開心過癮;人工智能相關技術可以用嚟建立模擬玩家體驗嘅模型,呢啲模型會攞描述遊戲體驗嘅變數做 input,例如係關卡嘅參數(有幾多敵人、幾長...)同遊戲畫面呀噉,而 output 就係(個模型所預測嘅)玩家體驗,例如係玩家玩完之後,問佢哋 1 至 10 分會俾隻遊戲幾多分,再唔係可以用腦電圖(EEG)等嘅方法量度玩家嘅腦活動有幾似反映開心嘅腦活動-即係話呢個模型可以話到俾製作組聽,「如果隻遊戲係噉噉噉樣,玩家嘅體驗會係噉噉噉樣」[53]。呢啲模型可以攞過往數據做機械學習嚟製作,例子可以睇吓偏好學習(preference learning)方面嘅嘢[54][55]
  • 程序化生成(procedural generation):程序化生成係電腦科學上嘅概念,指用演算法嚟生成數據嘅做法。舉個例子說明,程序化生成喺電子遊戲設計上好常用:有啲遊戲可能會想幅地圖嘅地形有啲隨機性嘅起伏-例子有做個創世神(Minecraft)-於是個遊戲程式要嘅嘢就唔係好似一般嘅遊戲噉,死記住幅地圖係乜嘢樣嘅,而係記住一段演算法,並且喺個玩家要求個程式整一幅地圖(撳「開始遊戲」)嗰時,即場用段演算法整一幅地圖出嚟。呢啲演算法當中可以有隨機性,所以次次產生地圖嗰陣,最後出嗰幅地圖都唔同樣[56][57]。而家想像一個遊戲程式,要用程序化生成整一個關卡出嚟俾玩家玩,佢可以用類似噉嘅做法嚟將玩家滿足感最大化[58][59]
 用程序化生成,產生 n 個關卡;
 Foreach 產生出嚟嘅關卡,
   用一個事先訓練好嘅人工神經網絡(睇返上面玩家體驗模擬),預計呢個關卡會造成幾高嘅玩家滿足感;
 揀預計玩家滿足感最高嗰個關卡俾玩家玩。
  • 遊戲分析法(game analytics):遊戲分析法係行為分析法(behavioral analytics)嘅一種,指遊戲製作者特登將遊戲程式編寫成曉紀錄玩家行為嘅相關數據,並且按呢啲數據做有關管理隻遊戲嘅決策;舉個簡單例子說明,一隻網上遊戲,製作者將個遊戲程式編寫成曉紀錄遊戲世界入面每個地點有幾多玩家到訪同每個玩家喺嗰度逗留幾耐,而佢哋發現有個地點零舍唔受歡迎(好少玩家到訪,玩家平均逗留時間短),於是就更改嗰個地點嘅設計,等嗰個地點有趣啲,打後嘅數據反映玩家到訪次數多咗同逗留時間長咗[60][61]。有唔少人工智能相關嘅技術都可以攞嚟幫手做遊戲分析法方面嘅工作,例如聚類分析(cluster analysis;一種按若干個變數將個案分做聚類嘅分析方法)就試過俾人攞嚟將一隻遊戲嘅玩家按「玩遊戲嗰陣嘅行為」嚟分類[62]
  • 電子遊戲機械人(video game bot):係一啲特殊嘅人工智能程式,曉一定程度上代人打機;用家要用某啲方法將隻遊戲嘅狀態做 input 俾個機械人,然後個程式又要曉用某啲方法做運算,再俾出一個 outputoutput 代表佢決定要撳嘅掣,靠噉嚟俾個機械人玩隻遊戲。寫得夠好嘅機械人表現仲可以超越人類玩家,有啲玩家會用機械人嚟出茅招-聲稱佢係靠自己玩,但查實係用機械人代佢玩嘅;另一方面,喺遊戲製作過程當中,遊戲製作者有陣時亦會用機械人嚟測試隻遊戲[63][64]

註釋[編輯]

  1. 喺實際應用上,呢啲數值通常一定係 0 或者正數,因為好多常用嘅搵路演算法一撞到負數嘅權重值就會出錯。
  2. 喺實際應用上,一個 AI 角色本身嘅特性亦都可能會影響佢搵路嘅權重。想像有隻戰略遊戲,玩家旗下嘅軍隊有兩種單位:步兵同偵察兵,當中偵察兵有特殊能力,令佢哋行起崎嶇不平嘅路嗰陣快啲。噉對於由 AI 控制嘅偵察兵嚟講,「條路嘅平坦程度」對佢哋路線權重嘅影響會冇咁大。
  3. 有啲演算法仲會精細到考慮埋連結之間嘅方向性:即係有啲路可能淨係可以向其中一個方向通行,又或者由一個方向行嘅成本同由第個方向行嘅唔同。
  4. 個 AI 嘅狀態可能會影響一個位置嘅 值。例:如果一個 AI 生命值低,進入咗「搵地方匿埋同回復生命值」嘅狀態,佢理應會想去便於防守嘅位置多過想去便於攻擊嘅位置。
  5. 順帶一提,現實嘅遊戲通常都係玩家指揮 AI 而唔係 AI 指揮玩家,因為主流遊戲設計師認為俾玩家做指揮,隻遊戲會好玩啲。

睇埋[編輯]

參考文獻[編輯]

[編輯]

  1. "The Next Generation 1996 Lexicon A to Z: NPC (Nonplayer Character)". Next Generation. No. 15. Imagine Media. March 1996. p. 38.
  2. Yannakakis, G. N., & Hallam, J. (2007). Towards optimizing entertainment in computer games. Applied Artificial Intelligence, 21(10), 933-971.
  3. 3.0 3.1 3.2 Yannakakis, Geogios N (2012). "Game AI revisited" (PDF). Proceedings of the 9th Conference on Computing Frontiers: 285–292.
  4. 4.0 4.1 Stanley, K. O., Bryant, B. D., & Miikkulainen, R. (2005). Evolving neural network agents in the NERO video game. Proceedings of the IEEE, 182-189.
  5. Video Games as a Perfect Playground for Artificial Intelligence. Towards Data Science.
  6. Artificial Intelligence in Video Games. Towards Data Science.
  7. 7.0 7.1 7.2 Pac-Man[失咗效嘅鏈].
  8. Bogost, Ian (March 2017). ""Artificial Intelligence" Has Become Meaningless". Retrieved 22 July 2017.
  9. Lu, F., Yamamoto, K., Nomura, L. H., Mizuno, S., Lee, Y., & Thawonmas, R. (2013, October). Fighting game artificial intelligence competition platform. In 2013 IEEE 2nd Global Conference on Consumer Electronics (GCCE) (pp. 320-323). IEEE.
  10. Delalleau, O., Contal, E., Thibodeau-Laufer, E., Ferrari, R. C., Bengio, Y., & Zhang, F. (2012). Beyond skill rating: Advanced matchmaking in ghost recon online. IEEE Transactions on Computational Intelligence and AI in Games, 4(3), 167-177.
  11. 11.0 11.1 Game Programming Algorithms and Techniques: Overview, p. 2. informIT.
  12. "Programming Linux Games, Chapter 1" (PDF). ISBN 1-886411-48-4.
  13. Titanfall 2 will bring back Attrition mode. Polygon.
  14. Yannakakis, Geogios N (2012). "Game AI revisited" (PDF). Proceedings of the 9th Conference on Computing Frontiers: 285–292.
  15. Belkin, N. J. (1990). The cognitive viewpoint in information science. Journal of information science, 16(1), 11-15.
  16. 16.0 16.1 McShaffry, M. (2014). Game coding complete. Nelson Education. p. 45 - 46.
  17. Schreiner, Tim. "Artificial Intelligence in Game Design." Artificial Intelligence Depot. Web. 19 November 2009.
  18. Slovic, P., Finucane, M., Peters, E., & MacGregor, D. G. (2002). Rational actors or rational fools: Implications of the affect heuristic for behavioral economics. The Journal of Socio-Economics, 31(4), 329-342.
  19. Millington, I. (2019). AI for Games. CRC Press. p. 25.
  20. Millington, I. (2019). AI for Games. CRC Press. p. 42 - 48.
  21. 21.0 21.1 Millington, I. (2019). AI for Games. CRC Press. p. 52 - 53.
  22. Millington, I. (2019). AI for Games. CRC Press. p. 62 - 64.
  23. 23.0 23.1 Understanding Steering Behaviors: Collision Avoidance.
  24. Cui, X., & Shi, H. (2011). A*-based pathfinding in modern computer games. International Journal of Computer Science and Network Security, 11(1), 125-130.
  25. Boyarski, E., Felner, A., Stern, R., Sharon, G., Tolpin, D., Betzalel, O., & Shimony, E. (2015, June). ICBS: improved conflict-based search algorithm for multi-agent pathfinding. In Twenty-Fourth International Joint Conference on Artificial Intelligence.
  26. 26.0 26.1 26.2 26.3 Millington, I. (2019). AI for Games. CRC Press. Ch. 4.
  27. Hagelback, Johan, and Stefan J. Johansson. "Dealing with fog of war in a real-time strategy game environment." In Computational Intelligence and Games, 2008. CIG'08. IEEE Symposium On, pp. 55-62. IEEE, 2008.
  28. Fletcher, Peter; Hoyle, Hughes; Patty, C. Wayne (1991). Foundations of Discrete Mathematics (International student ed.). Boston: PWS-KENT Pub. Co. p. 463. ISBN 978-0-53492-373-0. "A weighted graph is a graph in which a number w(e), called its weight, is assigned to each edge e."
  29. Antsfeld, L., Harabor, D. D., Kilby, P., & Walsh, T. (2012, October). Transit routing on video game maps. In Eighth Artificial Intelligence and Interactive Digital Entertainment Conference.
  30. Goodwin, S. D., Menon, S., & Price, R. G. (2006). Pathfinding in open terrain. In Proceedings of International Academic Conference on the Future of Game Design and Technology.
  31. Cormen, Thomas H.; Leiserson, Charles E.; Rivest, Ronald L.; Stein, Clifford (2001). "Section 24.3: Dijkstra's algorithm". Introduction to Algorithms (Second ed.). MIT Press and McGraw–Hill. pp. 595–601.
  32. Knuth, D.E. (1977). "A Generalization of Dijkstra's Algorithm". Information Processing Letters. 6 (1): 1–5.
  33. Barnouti, N. H., Al-Dabbagh, S. S. M., & Naser, M. A. S. (2016). Pathfinding in strategy games and maze solving using A* search algorithm. Journal of Computer and Communications, 4(11), 15.
  34. Abd Algfoor, Zeyad; Sunar, Mohd Shahrizal; Kolivand, Hoshang (2015). "A Comprehensive Study on Pathfinding Techniques for Robotics and Video Games". International Journal of Computer Games Technology. 2015: 1–11.
  35. 35.0 35.1 Designing a simple game AI using Finite State Machines. Gamasutra.
  36. Orkin, J. (2006, March). Three states and a plan: the AI of FEAR. In Game Developers Conference (Vol. 2006, p. 4).
  37. 37.0 37.1 37.2 Millington, I. (2019). AI for Games. CRC Press. Ch. 5.
  38. Zadeh, L. A. (1988). Fuzzy logic. Computer, 21(4), 83-93.
  39. Game AI: The State of the Industry. Gamastura. p. 2.
  40. Bontrager, P., Khalifa, A., Mendes, A., & Togelius, J. (2016, September). Matching games and algorithms for general video game playing. In Twelfth Artificial Intelligence and Interactive Digital Entertainment Conference.
  41. Kleinsmith, A., & Gillies, M. (2013). Customizing by doing for responsive video game characters. International Journal of Human-Computer Studies, 71(7-8), 775-784.
  42. Cameron Browne; Edward Powley; Daniel Whitehouse; Simon Lucas; Peter I. Cowling; Philipp Rohlfshagen; Stephen Tavener; Diego Perez; Spyridon Samothrakis; Simon Colton (March 2012). "A Survey of Monte Carlo Tree Search Methods". IEEE Transactions on Computational Intelligence and AI in Games. 4 (1): 1–43.
  43. Monte Carlo Tree Search. Towards Data Science.
  44. Liu, Michael (10 October 2017). "General Game-Playing With Monte Carlo Tree Search". Medium.
  45. Game AI: The State of the Industry. Gamastura. p. 1.
  46. 46.0 46.1 46.2 Millington, I. (2019). AI for Games. CRC Press. Ch. 6.
  47. Díaz, G., & Iglesias, A. (2017, July). Intelligent behavioral design of non-player characters in a FPS video game through PSO. In International Conference on Swarm Intelligence (pp. 246-254). Springer, Cham.
  48. The definition "without being explicitly programmed" is often attributed to Arthur Samuel, who coined the term "machine learning" in 1959, but the phrase is not found verbatim in this publication, and may be a paraphrase that appeared later. Confer "Paraphrasing Arthur Samuel (1959), the question is: How can computers learn to solve problems without being explicitly programmed?" in Koza, John R.; Bennett, Forrest H.; Andre, David; Keane, Martin A. (1996). Automated Design of Both the Topology and Sizing of Analog Electrical Circuits Using Genetic Programming. Artificial Intelligence in Design '96. Springer, Dordrecht. pp. 151–170.
  49. Bishop, C. M. (2006), Pattern Recognition and Machine Learning, Springer.
  50. 50.0 50.1 Millington, I. (2019). AI for Games. CRC Press. Ch. 7.
  51. HOW ARTIFICIAL INTELLIGENCE WILL REVOLUTIONIZE THE WAY VIDEO GAMES ARE DEVELOPED AND PLAYED. The Verge.
  52. Stanley, K. O., Bryant, B. D., & Miikkulainen, R. (2005). Real-time neuroevolution in the NERO video game. IEEE transactions on evolutionary computation, 9(6), 653-668.
  53. Yannakakis, G. N., & Hallam, J. (2008). Entertainment modeling through physiology in physical play. International Journal of Human-Computer Studies, 66(10), 741-755.
  54. G. N. Yannakakis. Preference Learning for Affective Modeling. In Proceedings of the Int. Conf. on Affective Computing and Intelligent Interaction, pages 126–131, Amsterdam, The Netherlands, September 2009. IEEE.
  55. G. N. Yannakakis, M. Maragoudakis, and J. Hallam. Preference Learning for Cognitive Modeling: A Case Study on Entertainment Preferences. IEEE Systems, Man and Cybernetics; Part A: Systems and Humans, 39(6):1165–1175, November 2009.
  56. Shaker, Noor; Togelius, Julian; Nelson, Mark J. (2016). Procedural Content Generation in Games: A Textbook and an Overview of Current Research. Springer.
  57. Moss, Richard (January 1, 2016). "7 uses of procedural generation that all developers should study 互聯網檔案館歸檔,歸檔日期2019年8月27號,.". Gamasutra.
  58. Togelius, J., De Nardi, R., & Lucas, S. M. (2007, April). Towards automatic personalised content creation for racing games. In 2007 IEEE Symposium on Computational Intelligence and Games (pp. 252-259). IEEE.
  59. A. Martin, A. Lim, S. Colton, and C. Browne. Evolving 3D buildings for the prototype video game subversion. Applications of Evolutionary Computation, pages 111–120, 2010
  60. El-Nasr, M. S., Drachen, A., & Canossa, A. (2016). Game analytics. Springer London Limited.
  61. Bauckhage, C., Drachen, A., & Sifa, R. (2014). Clustering game behavior data. IEEE Transactions on Computational Intelligence and AI in Games, 7(3), 266-278.
  62. Drachen, A., Canossa, A., & Yannakakis, G. N. (2009, September). Player modeling using self-organization in Tomb Raider: Underworld. In 2009 IEEE symposium on computational intelligence and games (pp. 1-8). IEEE.
  63. Kaminka, G. A., Veloso, M. M., Schaffer, S., Sollitto, C., Adobbati, R., Marshall, A. N., ... & Tejada, S. (2002). Gamebots: a flexible test bed for multiagent team research. Communications of the ACM, 45(1), 43-45.
  64. Villanes, A. (2013). Analytical approach for bot cheating detection in a massive multiplayer online racing game. North Carolina State University.

[編輯]