グリッド上で有向グラフをランダムに生成します


11

ポケモンのアイススライディングパズルに似たパズルゲームを作成するために、有向グラフをランダムに生成しようとしています。
これは基本的に、http//bulbanews.bulbagarden.net/wiki/Crunching_the_numbers_Graph_theoryをランダムに生成できるようにしたいものです。

xおよびy次元でグラフのサイズを制限できる必要があります。リンクに示されている例では、8x4グリッドに制限されます。
私が直面している問題は、グラフをランダムに生成するのではなく、ノードの反対側に何か(岩のようなもの)が必要なので、2D空間に適切にマップできるグラフをランダムに生成することですスライドを止めると視覚的に意味があります。これに伴う問題は、岩が他の2つのノード間のパスまたは場合によっては別のノード自体のパスになり、グラフ全体が破損することがあることです。

私が知っている少数の人々と問題について議論した後、解決策につながる可能性のあるいくつかの結論に達しました。

  • グリッドを構築するときに、グリッドの障害物をグラフの一部として含める。
  • 完全に満たされたグリッドから始めて、ランダムなパスを描画し、そのパスを機能させるブロックを削除します。

問題は、追加の短いパスの導入を避けるために、どれを削除するかを判断することとなります。また、動的プログラミングアルゴリズムは有益であると考えていましたが、動的プログラミングアルゴリズムをゼロから作成するのに熟練している人はいませんでした。この問題が公式に呼ばれているものについてのアイデアや参考文献(公式のグラフの問題である場合)が最も役立ちます。

ブロックをランダムに配置し、選択した開始/終了からナビゲーショングラフを生成することで、これまでに達成したことの例をいくつか示します。アイデア(前のリンクで説明)は、緑のSから始めて緑のFに到達することです。これを行うには、上/下/左/右に移動し、選択する方向に移動し続けます。壁。これらの写真では、灰色が壁、白が床、紫色の線が開始から終了までの最小の長さであり、黒い線と灰色の点が可能な経路を表しています。

ランダムに生成されたグラフの悪い例は次のとおりです。

ここに画像の説明を入力してください

ランダムに生成された(または手で調整された)グラフの良い例を次に示します。

ここに画像の説明を入力してください

また、パズルとして実際にこれをプレイするときに、より難しいものが最小パスに沿って多くの高度なノードを持つものであることに気づいたようです。


1
完全にランダムな岩のセットを生成し、対応するグラフに解があるかどうかを確認し、そうでない場合は、それを捨てて最初からやり直すことができます。8x4グリッドでは、これにはそれほど時間がかかりません。よりクリーンなソリューションがあると確信しています。
ジョブ

これは私の最初のアプローチでしたが、やや大規模にそれを行う必要があり、それを強引に強制するのには時間がかかるようで、より良いアプローチを見つけようとしていました。
タロン876

回答:


2
  • 氷だから、岩にぶつからない限り動きます。
  • 方向を変える唯一の方法は岩を打つことです。
  • 岩にぶつかった場合は、方向を変える必要があります。
  • 明らかな理由から、サイクルは良好です。
  • 複数の開始点と複数の終了点があります。

より高度なプロパティ:

  • 隣接する岩のないセルには到達できません(一部は横断できます)
  • 壁も岩です。壁を取り除けば、包み込むことができます。
  • サブグリッドをパターンとして使用できます(3x3、3x4、5x5など)。
  • パズルMxNタイルを通過できないMxNエリアの上にオーバーレイし、岩を追加してそこに出入りできます。
  • タイルの回転または対称性が興味深い場合があります
  • 氷のような行/列を挿入してタイルを展開できます

例:

S=start, E=end, o=rock, .=ice

3 . 2 o        3 . . 2 o         . . . . . o o
4 . . E   ~=   4 . . . E   ~=    . . . . . 2 E
o . . .        o . . . .         . . . . . . .
S . 1 o        S . . 1 o         S . . . . 1 o

タイルを組み合わせる例:

3 . . 2 o       o 2 . . 3      3 . . 2 o 7 . . 6
4 . . . E   +   E . . . 4  =   4 . . . . . . . 5
o . . . .       . . . . o      o . . . . . . . o
S . . 1 o       o 1 . . S      S . . 1 o 8 . . E

ゲームTsuroが好きかもしれませんがタイルを使用してランダムなボードを生成します。


0

リバースエンジニアリングは、そのための準備ができている場合に役立つかもしれません。

各問題に対する唯一の解決策がある場合は、おそらく一意の回答に基づいてグラフを生成できます。これにより、動的プログラミングを実行したり、ブルートフォースをスキップしたり、系統的な生成を選択したりする必要がなくなります。

あなたはそれについて行くことができます:

  1. MxNグラフを準備する
  2. 1つまたは複数のソリューションの作成
  3. それが特異な解決問題である場合、それについて質問する
  4. 問題の解決策が複数ある場合は、現在の反復が別の解決策を妨げないように、上記の手順を繰り返すことができます。

ただし、この質問を生成する問題の複雑さと問題のサイズに応じた方法でデバイスを作成する必要があります。ただ力ずくで行くのではありません。代わりにランダム化アルゴリズムを試してください。これはあなたを助けることができます。


去年その本を売り返して後悔することはわかっていましたが、友人の誰かがそれをどこかに持っていると思います。探している特定のアルゴリズムはありますか?または、グラフですべてを調べて、便利なものが見つかるかどうかを確認しますか?ああ、最適な解決策が1つあります(ただし、それと結びつく可能性があると思います)。また、2つのノード間を何度でもやり取りして解決できるため、他の無限の解決策があります。
タロン876

0

別のアプローチはどうですか?空の迷路から始めて、次のようなブロックを追加します。

  1. ランダムに開始するブロックと終了するブロック。
  2. 1〜3の「スライド」ステップをランダムな方向(ただし、戻ることはありません)で、ランダムな長さ(*)で行います。各ステップの後にブロックを配置します(スライドを停止します)。
  3. 出口への最短経路を見つけます。セグメントが少なすぎる場合(低レベルの難易度)、パスのランダムセグメントを取得し、ブロックで分割します。それ以外の場合は、ステップ1のようにブロックを配置して終了します。
  4. 1を慎重に繰り返します(*):スライドするステップの長さを選択するときは、配置するブロックが前のパスを閉じないようにします。

最後の仕上げ:指定したアルゴリズムで最短ルートを見つけます。使用されているすべてのセルをメモし、残りをランダムに埋め始めます。そのたびに、最短ルートが短くならないようにします。

最後のブロックを使用できないパスに渡らないように最後のブロックを配置できない場合、ステップ2に注意点がありますが、これには2つの解決策があります。

また、スライディングステップのランダムな長さに関する別の考え-パスが重ならない限り、以前に配置されたブロックが再利用されるように選択することもできます。


@ Talon876これは、私が話していた一種のランダム化アルゴリズムです。
-c0da
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.