グラフに関する知識がなくても、2つのノード間の幅優先トラバースを追跡する優れたアプローチを探します。デプス - ファースト(パスが外れない場合はパスを捨てることができます)では、トラバーサル中にかなりの「オープン」可能性があります。C#グラフトラバーサル - 任意の2つのノード間のトラッキングパス
答えて
単純なアプローチは、ソースノードをルートとして、すべての接続をその子としてツリーを構築することです。あなたが持っているスペースの量に応じて、あなたは行くサイクルを排除する必要があります。これは、各ビットがグラフの別個のノードに対応するビットマップを使って行うことができます。ターゲットノードに到達すると、親リンクをルートに戻すことができます。これがあなたのパスです。最初に幅を広げているので、サイクルを排除しなくても最短パスであることが保証されます。
幅優先検索では、少なくとも2つのものを保存する必要があります。 1つは既に訪問されたノードのセットであり、もう1つは訪問先ノードから直接到達可能であるが訪問されていないノードのセットである。その後、状態を後者のセットから前者のセットに移動し、新しく到達可能な状態を後者のセットに追加します。ルートからいくつかのノードへのパスが必要な場合は、上記のセットに各ノード(ルートを除く)の親ノードも格納する必要があります。
通常、訪問されたノードのセットと訪問されていない子ノードのセット(すなわち、見られるノードのセット)の和集合はハッシュテーブルに格納されます。これは、以前に「新しい」状態が見られたかどうかを素早く判断し、そうであれば無視することができます。本当に大きな数の州がある場合、ビット配列(Joseph Bui(57509)のように)が必要になるかもしれませんが、あなたの州をその配列のインデックスとして(直接的または間接的に)使用できる場合を除いて、ハッシュ後者の場合は、別の(見た)ノードと同じインデックスにマップされているので、特定の状態を完全に無視するかもしれないので、これを慎重にしたいかもしれません。
参照されていないが見えているノードのセットをキューとして保存することができます(ビット配列はこのセットには使用できません)。アレイはほとんど空であり、次のセットビットを見つけることは比較的高価である)
この質問にも該当する解決策over hereを提出しました。
基本的には、訪問したノードのリスト(実際にスタック)を1つだけ保持しています。ソリューションを再帰または保存する直前にノードをリストに追加します。直後には必ずリストから削除してください。
.NET 3.5を使用している場合は、重複するノードが展開されないようにHashsetを使用することを検討してください。これは、グラフにサイクルがある場合に発生します。グラフの内容に関する知識がある場合は、展開するノードの数を減らすためにA* searchを実装することを検討してください。幸運と私はそれがあなたのために働くことを願っています。
まだトロイアのファンであれば、Peter NorvigとStuart RussellによるArtificial Intelligence:A Modern Approachのようなグラフやグラフ検索のトピックに関する多くの優れた書籍があります。 http://msdn.com/en-us/library/bb359438.aspxと*検索:http://en.wikipedia.org/wiki/A*_search_algorithm
私の応答内のリンクは、彼らはHashSetのあるバグを持っているように見えます
- 1. 任意の幅を持つ2点間の矩形を描く
- 2. Javaの2つのコレクション任意
- 3. 任意の数の子を持つノードのツリー内のノードを見つける
- 4. 2つのノード間の通信
- 5. グラフの2つの互いに素なサブセットに属する任意の2つのノード間の最短経路を見つける
- 6. GWT CellTree任意のノードにスクロール
- 7. 任意の順序で任意の回数表示される混在コンテンツを持つXSDノード
- 8. DirectX9任意のサイズのテクスチャ(非2^n)
- 9. Pythonで任意のデータ型の任意の2つのオブジェクトを比較します。
- 10. 任意のC/C++オープンソースRTMPストリーミングサーバ?
- 11. グラフ内の2つのノード間の距離を維持する方法は? C++
- 12. 追加2セット[任意]
- 13. ツリー内の任意のノードを追加するJavaの
- 14. 任意の領域に制限をつけて2次元空間内の有効な点を見つける
- 15. 任意の戻り値の型と任意のパラメータを持つ派生Functor
- 16. boost ::任意のデストラクタクラッシュ
- 17. 無向グラフの入力として与えられた2つの任意の頂点間の最小カット
- 18. Cの2つのレジスタ間のシフト
- 19. WiXで任意のC#コードを実行
- 20. C++固有は:任意の行列クラス
- 21. C#の正規表現マッチ改行を含むタグの間の任意のテキスト
- 22. バッチ:SETLOCALの外に2つの任意の文字列を連結するEnableDelayedExpansion
- 23. VBAとdllの間で任意の型のデータを渡す
- 24. 2つのリストビュー間のC#通信
- 25. 2つのC#アプリケーション間の通信
- 26. 2つのC#アプリケーション間の接続
- 27. 任意のスナップポイントを持つ範囲スライダ
- 28. boost :: char []を持つ任意のマップ
- 29. 任意のJSONキーを持つJackson ObjectMapper
- 30. 1桁または2桁の正規表現、任意の非英数字、2つの既知の英字