天天看點

基于遺傳算法(GA)進化的小遊戲

在這篇文章中,我們模拟了一個包含生物體和食物的環境,生物體為了生存必須盡可能多的消耗食物。在模拟環境中,生物體将由一個簡單的、完全連接配接的神經網絡來控制。神經網絡的輸入是一種标準化值,從-1到+1之間,這表示最近的食物顆粒的方向。這個方向是通過最近的食物顆粒(+/-180度)方向計算出來的。下面是兩個生物體和食物顆粒的示例:

基于遺傳算法(GA)進化的小遊戲

因為我們的輸入範圍從-1到+1,是以輸出範圍應當也從-1到+1,是以tanh函數将會成為理想的激活函數。下面是一個神經網絡的圖和它的輸入、輸出以及它的隐藏層:

基于遺傳算法(GA)進化的小遊戲

由于神經網絡僅僅是簡單的矩陣乘法,是以利用NumPy隻需要幾行代碼就可以了。在進化過程中,一些權重會被優化。最後,我将預設的隐藏節點數設定為5,這個可以根據你自己的喜好設定。接下來是編寫Python代碼模拟整個生态:

<b>一、生物</b>

<b></b>

生物類包含了神經網絡以及更新它的速度和位置的函數。當一個生物體被初始化時,它的位置、方向、速度、加速度和神經網絡的權重都會随機産生。下面是這個生物類的代碼:

<b>二、食物</b>

食物類包含坐标位置和能量值,能量值的多少将直接影響生物體的健康。現在,這個能量值保持不變,并設為1,但如果你想要修改它,它可以被随機化或改變為任何值。此外,當食物被生物體消耗後,respawn函數就會被調用,用于重新生成食物顆粒的位置。這使得每個模拟時間内的食物顆粒總數保持不變。

<b>三、進化</b>

生物體将使用遺傳算法(GA)進行優化,遺傳算法(GA)是屬于進化算法(EA)的更大範圍。遺傳算法模仿自然的生物進化過程,從最初的種群開始,通過選擇、交叉和變異産生後代,形成一個最優的解決方案。對于本教程,EA計劃如下:

<b>1、選擇:</b>簡單的選擇形式被稱為精英主義,即選擇最優秀的下一代。

<b>2、跨界:</b>在精英主義階段中随機選擇個體作為父母,并産生一個新的後代。是以我們要處理神經網絡的權重,下面的方程将兩個父母之間的性狀遺傳給後代:

<b>offspring=parent1(a)+parent2(1−a)</b>

a是在0和1之間随機生成的值,而父1和父2表示神經網絡的權重。因為有兩個正在混合的矩陣(wih和who),是以方程實際上是這樣的:

<b>offspring_wih=parent_wih1(a)+parent_wih2(1−a)</b>

<b>offspring_who=parent_who1(a)+parent_who2(1−a)</b>

<b>3、突變:</b>一旦産生新的後代就會産生一個介于0和1之間的随機數。如果這個值低于使用者初始化的突變門檻值,就會發生突變。在發生突變的情況下,兩個神經網絡權重矩陣中的一個随機權重将被一個随機值所取代,這個值在初始值的+/-10%之間。這将會在生物體中産生微小的變化,進而有可能産生更健康的生物體。突變效果僅限于原始值的+/-10%,因為我們希望避免在神經網絡中造成災難性的故障而導緻整個生物群體癱瘓。

下面的圖顯示了這個EA方案:

基于遺傳算法(GA)進化的小遊戲

這個EA代碼程式如下所示:

<b>四、模拟</b>

最後是模拟實際運作的關鍵代碼,模拟函數将在每一代調用一次。模拟時間步驟則是通過将總模拟時間除以時間間隔dt來确定的。例如,如果模拟時間設定為100秒,而dt等于1/25秒,那麼總共需要模拟2500個時間步驟。在每一個步驟中,将進行以下操作:

<b>1、碰撞檢測:</b>檢查生物和食物顆粒之間的碰撞。當檢測到碰撞時,該生物體将得到更新,食物顆粒将在一個新的随機位置上重生。

<b>2、尋找最近的食物顆粒:</b>對于每一個生物體,必須确定最近的食物顆粒。

<b>3、确定最近的食物顆粒的方向:</b>一旦最近的食物顆粒被一個生物體确定,就必須計算出這個顆粒的方向。

<b>4、查詢神經網絡:</b>由于使用了更新的方向值,是以每個生物的神經網絡都将變得不同。

<b>5、更新生物體:</b>基于神經網絡的響應,生物體的速度和位置都得到了更新。

下面是模拟函數:

<b>五、結果</b>

我使用了matplotlib來顯示模拟。當你運作整個代碼時,輸出應該與此類似:

基于遺傳算法(GA)進化的小遊戲

<b>以上為譯文</b>

<b>文章原标題《</b>

<a><b>Evolving Simple Organisms using a Genetic Algorithm and Deep Learning from Scratch with Python</b></a>

<b>》,作者:Nathan,譯者:黃小凡,審校:袁虎。</b>