地形ジェネレーターの進化


12

私は最近この質問をしましたが、結論は、手続き型ゲームコンテンツの作成に遺伝的プログラミング(GP)を使用することは実際には行われていないということです。それを変えたいです。

新しい地形ジェネレーターを見つけるのに役立つGPを展開できると確信しています。私が得ようとしている質問は、これをどのように達成できるかということです。

すべてのGPには、すべてのGPに一般化できるいくつかの基本的な部分があります(親選択、組換え、突然変異、生存)。私はそれらを自分で理解することができます。問題は、問題固有の部分で発生します。これらは、コードで問題を表現する方法(これは通常ツリーを使用します)、およびジェネレーターがどれほど優れているかを評価する方法です(これは1つ以上の値です)。

簡単に言うと質問:

  • ツリーに解析できる方法で地形ジェネレータをどのように表現しますか?

  • これはどのような地形を生成する必要がありますか?(高さマップ、頂点グラフ、...)

    これは、hightmapに基づいているものが少ないほど良いです。

  • ソリューションの適合性を評価するために何が使用されますか?

    例:興味深い地形が必要なため、値の1つを、地形上の各頂点の法線の平均変化とすることができます。


1
本当にGPが欲しいのではなく、GAが欲しいと思う。たとえば、ノイズを作成するアルゴリズムは、オンザフライで生成するのが非常に難しく、それを満たすシステムを作成するよりも、フィットネス関数を作成するのは困難です。GAは、既存のシステムのパラメーターを調整するのにより適しています。
DampeS8N

GPは、人間が決して考えもしない興味深いソリューションを作成します。それが私が探しているものです。GPの使用は困難であり、これはおそらく業界でこれを使用する最良の方法ではありませんが、判明した場合には大きな実現可能性が示されます。
アレックスシェパード

回答:


11

カール・シムズの遺伝的画像に似たアプローチで幸運になるかもしれません。

彼は、いくつかのシェーダー言語と同様に、LISPのような言語で単純な演算子のセットを使用して、任意の演算子の出力を利用して画像に影響を与えることができます(つまり、スカラーはグレースケール値、a vector3RGBなど)。 )。

私はそれが実装のものだと思うので、おそらくあなたが望むのは彼のキーワードであり、(iirc)にはすべての基本が含まれています:

  • トリガー関数(sin, cos, tanなど)
  • 位置(x, y
  • 基本的な数学演算子(sqrt, pow, abs, inverse
  • ノイズ関数(fBm, noise2, noise3
  • その他のフラクタル(mandelbrot, julia
  • 補間関数(lerp, quad, step, smoothstep

(上記のいくつかは彼の実装に含まれていない可能性があります;私はずっと前に彼の仕事を見つけて、実際にあなたが長年にわたって記述していることでいくつかの試みをしました-そのため思い出が漏れているかもしれません:)

面白く(そして高速に)保つ

多層進化アプローチにより、死んだ進化の量を大幅に削減することができました。

  1. 各演算子に対して一連の範囲が生成されます(または前のラウンドから変更されます)
    • これらは理想的には各関数の値を「適切な」範囲内に保ちますが、驚くべき有用な結果をもたらす範囲に進化することができます。これは「正しい」ことのように思えます
  2. いくつかのアルゴリズムツリーを生成する
    • これらのそれぞれについて、ランダムな位置でいくつかのハイトマップを生成し、フィットネスを評価します
    • 多数の良好な一致がある場合は、このブランチを少し進化させ、各子でステップ1の範囲をわずかに混乱させます
    • そうでない場合、おそらく範囲が悪いので、ステップ1に戻ります。

しかしながら...

フィットネスアルゴリズムを簡単にスキップしました。主に、カールシムズの「不自然な選択」のアプローチを使用しました。私が意味するものイメージ)..

ただし、おそらく衛星画像や特定の品質を備えたいくつかの人工画像からのトレーニング画像のセットを使用し、テスト対象の地形に対してウェーブレットまたは2D FFT分析を使用することができますか?

これは興味深いトピックですが、あなたが答えを必要としていたことを疑います:)

編集:ああ。私は新しいユーザーだからリンクの束を削除しなければなりませんでした:-|


これは私が得ていたものと同じものにつながるようです。アルゴリズムはコンテンツの一定のランダム生成ではなく、単一または限られた結果セットに向けて生成を訓練することを意図しています...
ジェームズ

私が理解できることから、フィットネスは結果の統計分析に基づいている必要があります。私が思いつく可能性のある要因は、いくつかの生成された地形で平均化された単一の生成された地形内の分散の量(最大化)と、標準偏差(最小化、分散の安定性)です。しかし、その後、2つの生成された地形間の高さの平均変化も最大化する必要があると思います。
アレックスシェパード

1
@Alexはおそらくこの論文も興味深いものになるでしょう。上記のテクニックのいくつかを頭の中で回せば、それを使ってフィットネスをガイドできると思います。(または、単にあなたが望むものになります:)
ペンタフォベ

@phobius WOAH !! 涼しい。私はそれをさらに探求する必要がありますが、本当に有望に見えます。それを検索問題に変えるために...
アレックスシェパード

2

この質問に答えられるかどうかはわかりませんが、なぜ役立つ答えになるのかについて説明を感じています。だから、一言で答え:

  • 特定の側面がデータ値に基づいているだけの地形生成を選択する必要があります。これは難しくありませんが、地形生成を選択する必要があります。私が働いている領域はボクセル生成であるため、サンプリングレート、トンネリングパス、標高レベルなどはデータに入れて「進化」させることができるものです。
  • 種類は、最初の部分と手をつないで行きます。さまざまなプロパティを設定できる限り、どの生成形式を使用するかは問題ではありません。この選択は、あなたが作りたいゲームのタイプともっと関係があるはずです。
  • これが故障する場所です。実際に世界を見て、「ああ、それはいい」と言っている人とは別に、これを測定する方法を考えることはできません。しかし、これにより、コンピューターは独自の自己反復を実行しなくなります。これはまた、この生成形式を使用して、最終的に単一の世界を作成し、毎回ランダムな世界とは対照的に「最良の」世界を探すことを意味します。

通常、遺伝的アルゴリズムは、ルールを使用して環境を定義できる既知の問題を解決するために使用されます。次に、ルールに対する物事の反応に影響するさまざまなプロパティを表すデータセットを作成できます。その後、コンピューターは初期データセットで「ラウンド」を再生し、上位X番号を選択し、ペアリング後にそれらの値を混合し、別のラウンドを実行します。これの一般的な例は、「より良いトロールの繁殖」です。トロルが一般的にその環境で非常によく機能する値のセットを見つけます(村人を狩ったり食べたり、殺したり、離れたり、戦利品を集めたり、望んでいるすべての光沢のあるオブジェクトを集めたりすることができます)。

あなたが成し遂げようとしていることが、地形生成の領域に適用できるかどうかはわかりません。私が思いつくことができるのは、世界を計画したくないが、AIパスをうまく計算できるようなものを作りたいというゲームコンテンツのような評価です。ただし、これを使用しても、単一または少なくとも限られた世界のセットを探しています。


ああ...進化的アルゴリズムと遺伝的プログラムを混同していると思います。EAは、アルゴリズムへの入力の最適化と調整に使用されます。GPはアルゴリズム自体の構築に使用され、それが私が探しているものです。いい答えです。注:これらの地形は現実的である必要はなく、単に興味深いものです。
アレックスシェパード

プログラム的な方法で「興味深い」を定義できない場合は、答えで解決しようとしている問題が発生します。
ジェームズ

0

これはどのような地形を生成する必要がありますか?(高さマップ、頂点グラフ、...)

確かに頂点グラフ(メッシュ)であり、ストレージに関してコンパクトであり、必要に応じてラスタライズ(テッセレーション)できます。

ツリーに解析できる方法で地形ジェネレータをどのように表現しますか?

セルオートマトン。私は2つの実装を考えることができます:

  1. 有限オートマトンの要素を使用したルールセットオートマトン(試行カウンターやアイドル時間などの現在の状態が考慮される場合)。

    • 各ノードはランダムな状態で初期化されます
    • 各ノードにはソルバーのインスタンスが添付されています
    • 各ソルバーは、ルールがなくなるか、理想的な状態に達するまで次の状態を計算し続けます(ここで終わりです)
    • すべての次の状態が最初に計算され、次の計算が始まる前に一度にすべて適用されるため、計算の順序は重要ではありません

ルールセット自体は、分岐決定ツリーまたは単純なコマンドバッチとして表される場合があります(機能するかどうかは不明です)

すべてのノードに設定された1つのルールのみ

  1. 世界のビルダー。すべての単一ノードにソルバーを適用する代わりに、それらの束だけを作成して、それらがメッシュをナビゲートできるようにすることができます。

    • 各ビルダーには独自のルールセットがあります
    • 別のビルダーが占有しているノードに入らないようにする
    • 各ビルダーは、ツリーのブランチとして表すことができます
    • 進化の過程でビルダーは重複する可能性があります

それでも、2番目のアプローチは最初のアプローチに裏打ちされる必要があるのではないかと心配しています。最初のランダム性を滑らかにする必要があり、ビルダーがトリックを実行できるかどうかはわかりません。結局、すべての生きている細胞にはミトコンドリアがあります。

ソリューションの適合性を評価するために何が使用されますか?

結果として生じる地形の完全性-それはミッシュマッシュのように見えるべきではありません。そして、多様性-一般的に、可能な限り多くのバリエーションを表現したいと考えています(端から端までの平坦な荒れ地は楽しいものではありません)。たぶん、近隣のノードが互いにどのように適合するかなどのもっと複雑なもの(砂漠の真ん中のツンドラ、何?)

メッシュジェネレーターを使って自分で試してみてください(空き時間がある場合/)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.