14

私は、Python 2.7 でAtari Breakoutクローンを再生することを学習するNEAT アルゴリズムに基づくニューラル ネットワークに取り組んでおり、すべての部分が機能していますが、種の適合性を計算するためのアルゴリズムが改善されれば、進化は大幅に改善される可能性があると思います。 .

ニューラル ネットワークへの入力は次のとおりです。

  • パドルの中心の X 座標
  • ボールの中心の X 座標
  • ボールの中心の Y 座標
  • ボールの dx (X 方向の速度)
  • ball's dy (Y 方向の速度)

出力は次のとおりです。

  • パドルを左に移動
  • パドルを右に移動
  • パドルを動かさない

種の適合度の計算に使用できるパラメーターは次のとおりです。

  • breakout_model.score- int: 種族がプレイしたゲームの最終スコア
  • breakout_model.num_times_hit_paddle- int: パドルがボールに当たった回数
  • breakout_model.hits_per_life- : パドルがライフごとintにボールを打った回数 (リスト形式)。たとえば、最初の要素は最初の生命の値、2 番目の要素は 2 番目の生命の値、というように 4 まで続きます。
  • breakout_model.avg_paddle_offset_from_ball- decimal: ボールとパドルの中心との間の X 方向の平均直線距離
  • breakout_model.avg_paddle_offset_from_center- decimal: フレームの中心とパドルの中心の間の X 方向の平均直線距離
  • breakout_model.time- 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 の場合、そのライフの間、実際にボールを打とうとさえしなかったので、負の効果があるはずです。
  • パドルがボールに当たった回数にも何らかの影響があり、その寄与はスコアに基づいている必要があります。たとえば、ボールを何度も打たず、多くのポイントを獲得しなかった場合、それは重大な悪影響を与えるはずです。ボールをあまり打たなかったが、多くのポイントを獲得した場合、それは大きなプラスの効果をもたらすはずです. 全体として、(私が思うに) この値がゲーム スコアに近づくほど、この値がフィットネスに与えるべき寄与/重みは少なくなります。
  • フレームの中心とパドルの中心の間の X 方向の平均距離は、基本的にパドルの中央の「静止」位置を促進する必要があります。
  • 陳腐化のためにゲームが人為的に終了した場合、これは重大な悪影響を与えるか、フィットネスを自動的に 0.0 にする必要があります。どのケースが良いか分からない

これらすべての値を操作して、全体的なフィットネスに適切に影響を与える方法がわかりません。

ご協力いただきありがとうございます。

4

1 に答える 1