アルゴリズム:ゲーム内のダンジョンを通る最短経路を見つける


8

バックグラウンド

最近PCゲーム「ダーケストダンジョン」をプレイしていた。ゲームでは、下の図に示すように、部屋がつながったダンジョンを探索する必要があります。 Darkest_Dungeon_Minimap

ルールは次のとおりです。

  • 固定の部屋(入り口)から始めます。開始する場所を選択することはできません。
  • 目標は、すべての部屋を少なくとも1回訪問することです
  • 隣接する部屋間の距離は、すべての部屋で同じです。
  • 部屋や散歩道は何度でも訪れることができます

質問

少なくとも一度はすべての部屋を訪れる入り口からの最短経路は何ですか?

サブ質問:

  • この問題を解決するために使用できるアルゴリズムは何ですか?
  • 私のような人が自由に(そしてかなり簡単に)使用できる実装はありますか?

私が試したこと

私はこれまたはこれのような他の質問を答えを見つけることなく見つけました。(基本的な)TSPに精通しており、簡単なTSPをコーディングして解決できます。ハミルトニアンパスは複数回の訪問を許可しないため、私の問題を解決しませんでした。中国の郵便配達の問題は、私はすべてのエッジを訪問する必要はありませんので、また、その基本的な形で、ここでは適用されません。

更新

コメントで述べたように、私はコンピュータサイエンティストではなく、数学的なステートメントを証明することにも興味がありません(おそらく、この質問を後でスタックオーバーフローに投稿します)。また、私はプログラマーではないため、自分でソリューションをコーディングできる可能性は非常に低くなっています。しかし、私はその性質の問題を扱う最初の人ではないと思います。

@Shreeshおよび@Dibによると、次の手順を適用できます。

  1. すべての部屋でペアワイズ距離行列を作成し、すべての部屋の間にエッジを追加します。
  2. 標準ソルバー(例:concorde)を使用してTSPを解く
  3. 入り口から始めて、解決策に従ってすべての部屋を訪れます。隣接していない部屋の場合は、それらの部屋の間の最短距離に置き換えます。

この手順は問題の答えを提供しますか?


6
問題はTSPの特殊なケースのようです。多くの特殊なケースでは、一般的なケースよりも上手くいくことができます。この方向を調べましたか?
Yuval Filmus

@YuvalFilmusコメントありがとうございます。私はこの質問をグーグルで試しましたが、簡単な解決策を見つけることができませんでした。私はコンピュータ科学者ではないので、学術論文はほとんど私の理解レベルを超えています。TSPのこのバリアントがよく知られていて、解決策がすでに存在していることを願っています。後でモデレーターにこの質問をstackoverflowに移行するよう依頼するでしょう。ご協力ありがとうございます。
COOLSerdash 2016

すべてのコメントをありがとう、COOLSerdash。質問を編集して、コメントにまとめた形で提供してきたすべての情報を含めると役立つと思います。
DW

1
1つ以上の「...からの最短パス」は簡単に1つ以上存在する可能性がありますが、1.2.3。提供します「...少なくとも一回から最短経路を」。

回答:


3

巡回セールスマン問題は、繰り返しノードを許可しても、NP困難です。TSPの計算の複雑さを参照してください。

UmansとLenhartは、1997年にSolid Grid Graphsでハミルトニアングラフの硬度の結果を示しています。

ユークリッドケースのTSP(または三角形の不等式を含むグラフ)も、ノードの繰り返しによるTSPのNP困難さを意味します。マンハッタン距離でもTSPL1 (または L)メトリックはNP完全です。このトピックに関する元のPapadimitriouの論文を参照してください。

ノードの繰り返しをシミュレートするノード間の最短経路の長さとして対応する距離を持つノードにアークを追加することにより、ケースのTSPのNP硬さを証明できる場合があります。特殊なケースのTSPは、NP完全な問題のように見えます。

したがって、十分に優れた(ヒューリスティックな)指数分岐とバインドされたアルゴリズムを記述して最短のツアーを計算するか(グラフが小さい場合はそれほど効率的ではない可能性があります)、最適化を忘れて十分な近似を計算します。


答えてくれてありがとう、シュリーシュ。残念ながら、私はコンピュータサイエンティストではなく、数学的なステートメントを証明することにも興味がありません(この質問は、後の段階でStackoverflowに投稿します)。また、私はプログラマーではないので、自分でソリューションをコーディングできる可能性は非常に低くなっています。しかし、私はその性質の問題を扱う最初の人ではないと思います。再度、感謝します。
COOLSerdash 2016

これを行う簡単な方法の1つは追加です C2最短パスに対応するエッジを抽出し、既存のアルゴリズムを使用してTSPを解きます。あなたがコンコルドをすでに知っているように、それは簡単でしょう。
Shreesh

1
ここには、単位重み付きのグリッドグラフがあります。問題はユークリッドTSPよりもはるかに簡単であると疑われています。(cc @COOLSerdash)
ラファエル

いいえ、グリッドが疎である場合、基本的には有理点に頂点を持つTSPがあり、 L1メトリック。ただし、グリッドが密集している場合、つまり基本的にグリッドのほぼすべてのポイントにアクセスする必要がある場合、いいえ、グリッドのすべてのポイントにアクセスすると、非常に優れています。2道。こちらこちらをご覧ください。
Shreesh

2

これは、いくつかの簡単な手順で解決できる修正されたパスカバレッジ計画問題のように扱うことができます。

1)グリッドルームから重み付けされていない無向グラフを作成します。パスジャンクションはノードであり、これらのノード間のパスのエッジになります。

2)深さ優先検索を使用して、開始点から最小全域木を見つけます。

3)基になるグリッドを「分割」して、最小全域木が2つの「レーン」を作成するようにします。

4)開始点から右レーンをノード間で時計回りに歩き、補完レーンの開始点に戻ります。

これは、ダンジョン内のタイルの数に比例して、最小限の部屋のツアーを提供します。これは基本的に、スパイラルスパニングツリーカバレッジパスプランニングアルゴリズムであり、削減された設定に適用されます。(「Spiral-stc:移動ロボットによるグリッド環境のオンラインカバレッジアルゴリズム」を参照)


グリッドを細分割することの意味を説明できますか?グラフがグリッド上にない場合はどうなりますか?すなわち、imgur.com
a

1

上記の回答に加えて、すでに利用可能なTSPソルバーがいくつかあります。

  1. コンコルドTSPソルバー
  2. ストーニーブルックス大学が提供するTSPソルバー
  3. Google Direction APIを使用したTSPソルバー
  4. そして、もっとたくさん

お返事ありがとうございます。しかし、述べたように、私はコンコルドを使用してTSPを解決する方法をすでに知っています。私の問題は元のTSPには直接適していないため、現在のところそれがどのように役立つかわかりません。
COOLSerdash 2016

最短経路は、すべての部屋を1回だけ訪れる経路です。追加のノードを追加することで、問題をTSPの問題に減らすことができます。TSPの問題の答えは、質問に対する答えを直接提供します。
2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.