web-dev-qa-db-ja.com

すべてのノードを訪問する有向グラフを介して最短経路を見つける

私はグラフを介して可能な限り最短のパスすべてのノードを訪問するを見つけようとしています(ノードは複数回訪問される場合があり、ソリューションは任意のノードを開始ノードとして選択する場合があります)。グラフは有向であり、ノードAからノードBに移動できることは、ノードBからノードAに移動できることを意味しない。ノード間の距離はすべて等しい。 27のノードがあり、各ノードに2つまたは1つの他のノードへの接続がある場合、27ノードのみのパスを検出するブルートフォース検索をコーディングすることができました。ただし、私が解決しようとしている実際の問題は256ノードで構成され、各ノードは4つまたは3つの他のノードに接続しています。 27ノードグラフを解決したブルートフォースアルゴリズムは、数秒以内に415ノードソリューション(最適ではない)を生成できますが、私が自由に使える処理能力を使用すると、402ノードソリューションに到達するまでに約6時間かかります。

確信できるが最適な解決策に到達するには、どのアプローチを使用する必要がありますか?たとえば、オプティマイザーアルゴリズムを使用して、最適でないソリューションを短縮しますか?または、どういうわけか、最適ではないパスを破棄するブルートフォース検索を採用しますか?

編集:(質問をより明確にするためにコメントをここの回答にコピーします)明確にするために、ハミルトニアンパスがあることを言っているわけではありません。それを見つける必要があります。256ノードグラフで最短パスを見つけようとしています。各ノードを訪問AT LEASTを1回。27ノードの実行で、ハミルトニアンパスを見つけることができました。これは、それが最適なソリューションであることを保証しました。256のソリューションを見つけたいです。最短のノードグラフ。

3

これはNPハードです。この問題の解決策がある場合は、すべてのエッジの重みを1に設定してグラフで使用できます。ハミルトンパスがある場合に限り、結果のパスはグラフと同じノード数になります。特定の解決策を見つけなくても、ハミルトニアンパスの存在を決定することはNP困難であるため、この問題の解決策は少なくとも同じくらい困難です。

ウィキペディアのページ: http://en.wikipedia.org/wiki/Hamiltonian_path

編集:おおよその解決策を見たいと思うかもしれませんが、私はそれらの経験がほとんどありません。 wikiページは私ができる以上のことを教えてくれます: http://en.wikipedia.org/wiki/Approximation_algorithm

5
Joseph Pepper

すべてのノードを訪問したい場合、巡回セールスマン問題のバリエーションがあります。

ノードを複数回訪問することが許可されている場合、2つのノード間の最短パスのコストで欠落を生成できます。

たとえば、V2を渡す必要があるV1からV3に到達するには、(V1、V2)+(V2、V3)のコストでV1とV3の間にエッジを追加できます。

この方法では、巡回するセールスマンの問題のようにそれを解決することができ、最適なルートは不必要な旅行をしません。上記の例では、構築されたEdgeが使用される場合、V2への他の訪問は最適パスの一部です。それ以外の場合は、V2を通るパスが使用されます。

2
ratchet freak

あなたの説明から、これは強く接続された有向グラフの最短経路の問題のようです。シングルペアソリューションとオールペアソリューションのどちらが実際に必要かは完全にはわかりません。

後者の場合、フロイドワーシャルアルゴリズムがO(n ^ 3)の複雑さでうまく機能するようです。それ以外の場合は、こちらをご覧ください: http://en.wikipedia.org/wiki/Shortest_path_problem

0
david.pfx