あなたはあなたの迷路を木と考えることができます。
A
/ \
/ \
紀元前
/ \ / \
DEFG
/ \ \
HIJ
/ \
LM
/ \
** O
(おそらく表すことができます)
始める
+ + --- + --- +
| ACG |
+ --- + + + +
| DB | F | J |
+ --- + --- + + --- + --- +
| LHEI |
+ --- + + --- + --- +
| MO |
+ + --- +
終了
(ツリーの左右の順序を無視します)
各ノードはパスのジャンクションです。D、I、J、L、Oは行き止まりで、**が目標です。もちろん、実際のツリーでは、各ノードに最大3つの子が存在する可能性があります。
あなたの目標は、フィニッシュを見つけるためにトラバースするノードを見つけることです。どんな古いツリー検索アルゴリズムでもかまいません。
ツリーを見ると、ツリーの最深部にある**から「トレースアップ」するだけで、正しい解決策を簡単に見つけることができます。
A B E H M **
迷路に「ループ」がある場合、このアプローチは少しだけ複雑になることに注意してください(つまり、可能であれば、バックトレースせずに、すでに通過したパッセージに再度入ります)。コメントを確認して、1つの優れた解決策を見つけてください。
それでは、このツリーに適用された、最初に言及したソリューションを見てみましょう。
最初の解決策は基本的に深さ優先探索ですが、これはそれほど悪くはありません。これは実際にはかなり良い再帰検索です。基本的には、「常に一番右のアプローチを最初に取ってください。そこに何もない場合は、最初の場所まで直進または左に戻ってから、繰り返してください。
深さ優先探索では、上記のツリーが次の順序で検索されます。
A B D (backtrack) E H L (backtrack) M ** (backtrack) O (backtrack thrice) I
(backtrack thrice) C F (backtrack) G J
**を見つけたらすぐに停止できることに注意してください。
ただし、実際に深さ優先探索をコーディングする場合は、再帰的プログラミングを使用するとすべてがはるかに簡単になります。反復法でも機能し、バックトラックの方法を明示的にプログラムする必要はありません。実装については、リンクされた記事を確認してください。
樹木を検索するもう1つの方法は、幅優先探索ソリューションです。これは、樹木を深さで検索します。上記のツリーを次の順序で検索します。
A (next level) B C (next level) D E F G (next level)
H I J (next level) L M (next level) ** O
迷路の性質上、幅優先ではチェックするノードの平均数がはるかに多いことに注意してください。幅優先は、検索するパスのキューを用意し、各反復でパスをキューからポップし、1つのステップの後に変換できるすべてのパスを取得して「展開」し、それらの新しいパスを配置することで、簡単に実装できます。キューの最後に。コーディングするための明示的な「次のレベル」のコマンドはなく、理解を助けるためにそこにありました。
実際、ツリーを検索する方法の完全なリストがあります。最も単純で最も簡単な2つの方法について説明しました。
迷路が非常に長く、深く、ループやクレイジーがあり、複雑な場合は、幅優先探索とヒューリスティックを組み合わせた業界標準のパスファインディングアルゴリズムであるA*アルゴリズムをお勧めします... 「インテリジェントな幅優先探索」。
基本的には次のように機能します。
- 1つのパスをキューに入れます(迷路の中に1歩だけまっすぐ歩くパス)。パスには、現在の長さ+端からの直線距離(数学的に計算できます)によって与えられる「重み」があります。
- キューから重みが最も小さいパスをポップします。
- パスを1つのステップの後にある可能性のあるすべてのパスに「分解」します。(つまり、パスが右左左右の場合、分解されたパスはRLLRRとRLLRLであり、壁を通過する違法なパスは含まれません)
- これらのパスの1つに目標がある場合は、Victory!さもないと:
- 展開されたパスの重みを計算し、それらすべてをキューに戻します(元のパスを除く)
- キューを重みで並べ替えます。一番小さいものから順に並べ替えます。次に、ステップ2から繰り返します。
これはA*です。これは、オフロードのパスや山などを避けながら、マップの一方の端からもう一方の端に移動するなど、パスファインディングのすべてのアプリケーションで業界標準のパスファインディングアルゴリズムであるため、特に強調表示されています。可能な限り最短の距離ヒューリスティックを使用しているため、非常に優れています。これにより、「インテリジェンス」が得られます。A *は非常に用途が広いので、問題があれば、可能な限り最短の距離ヒューリスティックが利用できる場合(私たちの方法は簡単です-直線)、それを適用できます。
しかし、A*が唯一の選択肢ではないことに注意することは非常に価値があります。
実際、ツリートラバーサルアルゴリズムのウィキペディアカテゴリには、 97個だけがリストされています。(最高のものは、以前にリンクされたこのページにまだあります)
長さ=Pでごめんなさい(私は歩き回る傾向があります)