閱讀403 返回首頁    go 阿裏雲 go 技術社區[雲棲]


使用神經網絡和遺傳算法玩轉 Flappy Bird

我們創建一個人工智能機器人,它能夠學習如何把Flappy Bird這個遊戲玩出最高分。這樣,我們的小鳥就能安全地飛過一些障礙物了。在最好的情況下,它永遠不會死。

歡迎閱讀這篇完整的HTML5教程,本文展示了針對Flappy Bird遊戲設計的**機器學習算法**。本實驗的目標是使用**神經網絡**和**遺傳算法**編寫一個人工智能遊戲控製器。

因此,我們打算創建一個人工智能機器人,它能夠學習如何把Flappy Bird這個遊戲玩出最高分。這樣,我們的小鳥就能安全地飛過一些障礙物了。在最好的情況下,它永遠不會死。

在閱讀項目背後原理的時候,你可以在本教程末尾下載源代碼。所有的代碼都是基於Phaser框架編寫的。此外,我們還使用了Synaptic神經網絡庫來實現神經網絡。

演示程序

首先,讓我們從演示程序開始,看一下遊戲過程中的算法:

1.png

點擊此處進入全屏演示(需科學上網)

視頻演示

除了上麵的演示程序之外,你還可以觀看這部簡單展示了算法的視頻短片。這對那些喜歡快進的人來說簡直太棒了!

https://youtu.be/aeWmdojEJf0(需科學上網)

什麼是機器學習算法

根據1959年亞瑟·塞繆爾(Arthur Samuel)的說法,機器學習是讓計算機在不顯式編程的情況下行動的科學。一般來說,這是一個循序漸進地改進初始隨機係統的學習過程。

因此,實現人工智能的目標是通過對一個差的係統進行模型參數的微調來找到一個適當的解決方案。為此,機器學習算法使用了許多不同的方法。

對於本項目,機器學習算法(ML,Machine Learning)的主要方法是基於神經演化的。這種機器學習在形式上使用了遺傳算法(GA,Genetic Algorithm)等進化算法來訓練人工神經網絡(ANN,Artificial Neural Network)。

所以,在這個例子中,我們可以說:機器學習 = 遺傳算法 + 人工神經網絡(ML = GA + ANN)。

人工神經網絡

人工神經網絡是機器學習算法的一個子集。它的誕生受到了生物神經網絡結構和功能的啟發。這些網絡由許多發送信號的神經元組成。

因此,要創建一個人造大腦,我們需要模擬出神經元並將它們連接成一個神經網絡。

通用人造神經網絡是由輸入層、一個或多個隱藏層,以及輸出層組成。每一層都有一定數量的神經元。輸入和輸出神經元直接與外部環境相連,而隱藏的神經元則將以上兩者連接起來。

在本項目中,每個單元(小鳥)都有自己的神經網絡作為AI大腦來玩遊戲。它由以下三層組成:

  1. 一個具有2個神經元的輸入層,表示一隻小鳥看到的東西:    - 與最近間隙的水平距離    - 與最近間隙的高度差
  2. 具有6個神經元的隱藏層
  3. 具有1個神經元的輸出層,提供如下動作:    - 如果 輸出 > 0.5,則扇動翅膀,否則什麼也不做

下圖顯示了本演示程序的神經網絡架構:

2.png

遺傳算法

在談論到機器學習算法的時候,可以說,遺傳算法可以用來訓練和改進神經網絡。

遺傳算法是一種基於搜索的優化技術,其靈感來自於自然選擇和遺傳過程。它采用選擇、交叉和變異相結合的方法來進化初始隨機種群。

以下是遺傳算法實現的主要步驟:

  1. 用**隨機神經網絡**創建10個單元(小鳥)的初始鳥群
  2. 讓所有的單元同時使用自己的神經網絡進行遊戲。
  3. 對於每個單元,計算其**適應度**函數來衡量其質量(詳情請參閱下麵的“適應度函數”章節)
  4. 當所有的單元都死亡時,使用遺傳算子來評估當前鳥群以生成下一個鳥群(詳情請參閱下麵的“替換策略”章節)
  5. 返回到步驟2

適應度函數

除了遺傳算法(步驟3)之外,下麵我們將了解一下有關適應度函數的一些細節,例如,適應度函數是什麼,如何定義。

因為我們希望通過使用最好的小鳥來進化鳥群,所以需要定義一個適應度函數。

通常來說,適應度函數是衡量對象質量的指標。我們會度量每隻鳥的質量,然後選擇最適合的小鳥,並用它來重新生成下一批小鳥。

在本項目中,我們會根據小鳥飛行的距離來進行獎勵。同時,根據小鳥當前到最近間隙的距離進行懲罰。所以,在這過程中,飛行了相同距離的小鳥之間就會產生差別。

因此,適應度函數是“小鳥飛行的總距離”和“與最近間隙的距離”之間的差。

3.png

替代策略

除了遺傳算法(步驟4)之外,以下是將自然進化應用於小鳥死亡的步驟。最好的小鳥生存下來,然後他們的孩子就以下麵這種方式來替代最糟糕的小鳥:

  1. 按照適應度對當前所有的小鳥進行排序
  2. 選擇前4名(勝利者),並將他們直接傳遞給下一個鳥群
  3. 創建一個後代作為兩個最佳勝利者的交叉產品
  4. 創建3個後代作為兩個隨機勝利者的交叉產品
  5. 創建2個後代作為兩個隨機勝利者的直接副本
  6. 對每個後代應用隨機突變,以增加一些變異

源代碼

這是源代碼下載鏈接: https://github.com/ssusnic/Machine-Learning-Flappy-Bird

要求

由於程序是使用HTML5基於Phaser框架Synaptic神經網絡庫編寫的,因此需要這些文件:

  • phaser.min.js
  • synaptic.min.js

gameplay.js

整個遊戲邏輯在**gameplay.js**文件中實現。它由以下類組成:

  • App.Main,主程序,包含以下基本功能:
    • _preload()_ 預加載所有資源
    • _create()_ 創建所有對象並初始化一個新的遺傳算法對象
    • _update()_ 運行遊戲的主循環,並使用遺傳算法進化鳥群
    • _drawStatus()_ 顯示所有小鳥的信息
  • TreeGroup 類,擴展了Phaser Group類,用於移動障礙物,包含頂部和底部的樹。
  • Tree 類,擴展了Phaser Sprite類,用來表示一棵樹。
  • Bird 類,擴展了Phaser Sprite類,用來表示一隻鳥。
  • Text 類,用於繪製文本的Phaser BitmapText類。

genetic.js

遺傳算法在**genetic.js**文件中實現,該文件由以下類組成:

  • GeneticAlgorithm 類,處理所有遺傳算法操作的主類。它需要兩個參數:**_max_units_**用於設置小鳥的總數量,**_top_units_**用於設置獲勝者的數量。以下是其基本函數:     - _reset()_ 重置遺傳算法參數     - _createPopulation()_ 創建新的鳥群     - _activateBrain()_ 激活小鳥的AI神經網絡,並根據輸入獲取其輸出動作     - _evolvePopulation()_ 通過使用遺傳算子(選擇、交叉和突變)來讓鳥群進化     - _selection()_ 從當前鳥群中選擇最佳小鳥     - _crossOver()_ 執行在兩個父節點之間的單點交叉     - _mutation()_ 對後代進行隨機突變

結論

在本教程中,我們成功實現了一個會學習如何玩Flappy Bird遊戲的AI機器人。經過幾次迭代,可以得到一個幾乎無敵的玩家。為了達到這一目標,采用了兩種機器學習算法:人工神經網絡和遺傳算法。

你可以嚐試更改代碼中的一些參數,看看會發生什麼。例如,你可以更改隱藏層中的神經元數量或小鳥的數量。此外,你還可以嚐試以某種方式修改適應度函數,修改一些物理參數,比如障礙物之間的距離、重力等等!

試著將這裏的進化理念應用到其他遊戲中去吧!

文章原標題《Machine Learning Algorithm for Flappy Bird using Neural Network and Genetic Algorithm》,作者:SRDJAN,譯者:夏天,審校:主題曲哥哥。

文章為簡譯,更為詳細的你容,請查看原文

最後更新:2017-08-21 16:33:17

  上一篇:go  天津濱海新區引領行業大數據應用開發
  下一篇:go  如何從傳統的IT遷移到雲端