我基於該學會在Python 2.7發揮Atari Breakout克隆NEAT algorithm神經網絡的工作設計的健身評估,我把所有的工作件的,但我認爲用更好的計算物種適應度的算法可以大大改善進化。需要幫助的NEAT基於算法的神經網絡
到神經網絡的輸入爲:
- X座標槳的中心
- 球的中心的
- Y座標球的中心的X座標
- 球的DX(在X速度)
- 球的DY(沿Y速度)
輸出爲:
- 移動槳左
- 移動槳權
- 別動槳
我有可用的物種適應度計算如下參數:
breakout_model.score
-int
:sp所玩遊戲的最終分數ECIESbreakout_model.num_times_hit_paddle
-int
:次數槳擊出的球breakout_model.hits_per_life
-int
:槳擊出的球每個生命,以列表的形式的次數;例如第一元件是所述第一壽命值,第二元素是第二生命的值,依此類推,直到4breakout_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;我不知道這種情況會更好
我不知道如何對這些值進行操作,使他們適當地影響整體健康。
在此先感謝您提供的任何幫助。
也許健身的最佳標準是類似於如下:(得分/擊球次數) - 擊球失誤次數。即您希望最大化每槳擊中得分並最大限度地減少槳缺失的次數。 – Alex
你應該先定義你認爲「玩得好」的意思,然後才能合理地爲它定義一個適應度函數。 Alex建議你想最大限度地提高每個槳的打分? –
@Alex我本來就有這麼簡單的東西,但是它造成了它的行爲,如果它從一次擊球命中超過一個方塊,它就會故意錯過球,並且會陷入局部最小值;我不確定如何幫助它逃脫這個最低限度,所以我慢慢開始使健身功能越來越複雜,希望能夠解決這個問題。 –