2016-11-29 74 views
14

我基於該學會在Python 2.7發揮Atari Breakout克隆NEAT algorithm神經網絡的工作設計的健身評估,我把所有的工作件的,但我認爲用更好的計算物種適應度的算法可以大大改善進化。需要幫助的NEAT基於算法的神經網絡

到神經網絡的輸入爲:

  • X座標槳的中心
  • 球的中心的
  • Y座標球的中心的X座標
  • 球的DX(在X速度)
  • 球的DY(沿Y速度)

輸出爲:

  • 移動槳左
  • 移動槳權
  • 別動槳

我有可用的物種適應度計算如下參數:

  • breakout_model.score - int:sp所玩遊戲的最終分數ECIES
  • breakout_model.num_times_hit_paddle - int:次數槳擊出的球
  • breakout_model.hits_per_life - int:槳擊出的球每個生命,以列表的形式的次數;例如第一元件是所述第一壽命值,第二元素是第二生命的值,依此類推,直到4
  • breakout_model.avg_paddle_offset_from_ball - decimal:在球和擋板的中心之間的X方向上的平均直線距離
  • breakout_model.avg_paddle_offset_from_center - decimal:在幀的中心,並且該槳葉
  • breakout_model.time的中心之間的X方向上的平均直線距離 - int:遊戲的總持續時間以幀爲單位
  • breakout_model.stale - boolean :遊戲是否是人爲的由於陳舊而終止(例如,球卡住彈跳直接垂直和槳不動)

如果你認爲我需要更多關於遊戲的最終狀態的數據比這些,我可能會實現一種方法來很容易地得到它。

這是我目前的適應度計算,我不認爲這是很好的:

def calculate_fitness(self): 
    self.fitness = self.breakout_model.score 
    if self.breakout_model.num_times_hit_paddle != 0: 
     self.fitness += self.breakout_model.num_times_hit_paddle/10 
    else: 
     self.fitness -= 0.5 
    if self.breakout_model.avg_paddle_offset_from_ball != 0: 
     self.fitness -= (1/self.breakout_model.avg_paddle_offset_from_ball) * 100 
    for hits in self.breakout_model.hits_per_life: 
     if hits == 0: 
      self.fitness -= 0.2 
    if self.breakout_model.stale: 
     self.fitness = 0 - self.fitness 
    return self.fitness 

這是我認爲健身計算應該做,語義:

  • 該分數顯然應該對整體健康有最顯着的影響。也許0分應該對健身稍有負面影響?
  • 槳每次擊球的次數應該有一些的影響,但不是一個貢獻/重量的顯着。例如如果這個數字是0,那麼它在這個生命中根本沒有嘗試擊球,所以它應該有負面效果
  • 槳的擊球次數總計也應該有一些效應,其貢獻應基於得分。例如如果它沒有多次擊球並且也沒有得到很多分數,那應該會有明顯的負面影響;如果它多次沒有觸球,但得分很高,那應該會有顯着的積極效果。總體而言,(I 認爲)該值越接近等於該遊戲得分,該值對健身的貢獻/權重就越小。
  • 幀的中心與中心之間在X方向上的平均距離的槳應基本上鼓勵槳的中心「休息」位置
  • 如果由於過時而人爲地結束遊戲,則這應該具有顯着的負面影響,或者它應該自動強制適應度爲0.0;我不知道這種情況會更好

我不知道如何對這些值進行操作,使他們適當地影響整體健康。

在此先感謝您提供的任何幫助。

+1

也許健身的最佳標準是類似於如下:(得分/擊球次數) - 擊球失誤次數。即您希望最大化每槳擊中得分並最大限度地減少槳缺失的次數。 – Alex

+0

你應該先定義你認爲「玩得好」的意思,然後才能合理地爲它定義一個適應度函數。 Alex建議你想最大限度地提高每個槳的打分? –

+0

@Alex我本來就有這麼簡單的東西,但是它造成了它的行爲,如果它從一次擊球命中超過一個方塊,它就會故意錯過球,並且會陷入局部最小值;我不確定如何幫助它逃脫這個最低限度,所以我慢慢開始使健身功能越來越複雜,希望能夠解決這個問題。 –

回答

1

我會盡量減少你的健身功能的條件邏輯,只有在你想強制健身分數爲0或主要的懲罰的情況下使用它。我只會決定分數的每個組成部分應該有多少分量和多重分量。負成分只會增加理解適應度函數的複雜性,而沒有真正的好處;該模型從分數的相對差異中學習。因此,我的版本的函數會是這個樣子:

def fitness(...): 
    if total_hits == 0: 
     return 0 
    return (game_score/max_score) * .7 \ 
      + game_score/total_hits * .2 \ 
      + game_score_per_life/hits_per_life * .1 

(題外話:我並沒有包括「從畫面中央的距離」,因爲我認爲這是欺騙,如果逗留在該中心是個好東西如果你把所有的智能潛入到健身功能中,那麼你的智能體就不是智能的了。)