【Game A Week】GA Race【番外1】

GA Raceのゲーム画面 Game A Week

【Game A Week】GA Race【番外1】

GA Raceはカエルが周回数に応じて進化していくレースシミュレーションです。

こちらから実際に見ていただけたら嬉しいです。webブラウザ上で見れます。

Game A Weekを始める前に作ったゲームですが、同様の形式で記事にしておきたいと思います。Daniel Shiffmanがyoutubeの動画上で説明している遺伝的アルゴリズムを自分で実装してみようと作りました。

【ひきこもり脱却チャレンジ】p5.jsとの出会い。私の先生 Daniel Shiffman【プログラミング】
プログラミングの勉強をしていたら、Daniel Shiffmanという男の動画を見つけ、p5.jsを知り、彼からプログラミングのいろはを学ぶことになりました。彼のNature of Codeというコースは、遺伝的アルゴリズムをはじめとして、私に影響を与えました。

ゲームと言うよりはシミュレーションです。私の究極目標的には割と自然なことです。プレイヤー(?)はただカエルたちを眺めているだけです。ある程度まとまりをもったプログラムを作った初めての経験でもありました。

【ブログコンセプト】私の究極目標【Part 2/2】
私の究極目標で書いたことは、なんというか表面上の目標です。長期的な究極目標はまた別のところにあるんです。一言でいえば、それは「もう一つの世界を創造する」ことです。その具体的な一つの方法がゲームを作ることです。ひきこもり宣言ひきこも...

idea

  • 遺伝的アルゴリズム/GA: Genetic Algorithm
    • 集団の中(遺伝子プール)に遺伝的多様性がある
    • 遺伝子は個体の行動に影響を与える
      • それが個体の適応度を決める
    • 適応度に比例して子孫を残すための交配を行う
    • 世代を更新し続けるために一定周期で種は交配を繰り返す
  • 選択圧/Selection(自分で便宜的に分けているので一般的な定義とは違います)
    • natural selection
    • sexual selection
    • mutual selection
    • interactive selection
  • 自律エージェント?/autonomous agent
    • 一つ一つの個体が自分が置かれている状況を判断して行動する
    • トップダウンで群集を操作しているわけではない
  • steering force
    • 個体がどう動くかは様々な力の和で決まる
      • 他の個体から一定の距離をとろうとする力
      • 慣性移動の力
      • 道に沿って動こうとする力

What went right

  • 遺伝子が持つ値が進化によって単純化しなかったこと
    • 単純に「値が高ければ高いほど、もしくは低ければ低いほど良い」といったようには必ずしもならなかった点
    • 例えば、カエルたちは「どれだけ生真面目に道に沿って動きたがるか」を表す遺伝子を0から1の値で保持している(実際の値は少し違います)。プログラムを実際に実行してみると、この値の最適解がおよそ0.65あたりと言うことが予想できる結果になった。これは最適な解を見つけるという遺伝的アルゴリズム本来の意図が実現できたと言える。
  • 個人的な話ですが、高校に行っていないということもあって物理の計算式をほとんどしらないのですが、基礎を勉強しつつ作りました。結果的にそれっぽいシステムが書けたらしく元気に動いているカエルを見ると、ちゃんと理解できたんだという達成感はありました。

What went wrong

  • 開発途中でコースに変化が欲しくて一部に摩擦の高いエリアを実現した。
    • friction関係のベクトル計算が正しくできているのかがわからないです。質量が小さいカエルが有利すぎる気がするんですよね…多分接する面積の計算が抜けてるとかかな
  • 数値データとかはconsoleに出力している感じなので、全然ユーザーフレンドリーじゃないです。
  • 環境が動的ではないと言う点が悪かった点と言うわけではないですが、自分としては一番気に食わないところです。進化が一方向的に進むだけですからね。selectionは実装したかったものよりだいぶ単調になっています。

What I learned

  • 自分で考えて設計したプログラムを作ることは達成感がある。
  • GAは美しい。概念を知った時からいつか実現してみたいと思っていましたが、10年越しぐらいに実装できました。
  • 遺伝子の実装方法を考察する中で、一世代目生成当初には存在した遺伝子間の関連性が崩れる場合がある、ということに気づきました。そこから、遺伝子のゲーム内での実現方法を考えました。例えば、以下の3段階に分ける方法です。このゲームにおいて実装しているわけではないですが、次に活かせる知見だったと思います。
    1. genotype
      : 遺伝子クラスが配列として持つ単純な数値
    2. phenotype
      : genotypeから計算した低級能力値
    3. ability
      : phenotypeから計算した高級能力値

コメント

タイトルとURLをコピーしました