序文 バックトラッキング アルゴリズムについては、ある程度理解しています。バックトラッキング アルゴリズムは DFS に基づいていますが、違いは、検索プロセス中に、終了条件に到達した後、状態が復元され、前のレイヤーにバックトラッキングされて、再度検索されることです。したがって、バックトラッキング アルゴリズムと DFS の違いは、状態のリセットがあるかどうかであると理解できます。 バックトラッキング アルゴリズムが何であるか分からない場合、または少しは知っているが具体的な実装方法が分からない場合は、この記事を読むとよいでしょう。 次に、以下の点を中心にバックトラッキングアルゴリズムを紹介します👇
バックトラッキングアルゴリズムの起源 Wikipediaの定義によると👇 バックトラッキング アルゴリズムは、ヒューリスティック メソッドとも呼ばれ、問題の解決策を体系的に検索する方法です。 バックトラッキング アルゴリズムを使用して問題を解決するための一般的な手順: 1. 与えられた問題に対して、その問題に対する少なくとも 1 つの (最適な) 解決策を含むソリューション空間を定義します。 2. バックトラッキングを使用してソリューション空間全体を簡単に検索できるように、検索しやすいソリューション空間構造を決定します。 3. 深さ優先方式でソリューション空間を検索し、検索プロセス中に無効な検索を回避するためにプルーニング関数を使用します。 もっと簡単に説明すると👇 バックトラッキング法は、道のさまざまな分岐点を選択し、一度に 1 つの分岐点から目的地を見つけようとすることで目的地を見つける方法と理解できます。間違った道を進んでしまった場合は、目的地が見つかるまで、前の分岐点にある別の道に戻り続けます。 基本的な考え方 このタイプのバックトラッキング問題は、決定木を解決するためのトラバーサル プロセスとして考えることができ、これにより、後続の説明が容易になります。 基本的な考え方:
たとえば、8 人のクイーン問題を例に挙げて説明しましょう。
これを別の例で見てみましょう。バックトラッキングは迷路探索でも非常に一般的です。簡単に言うと、このパスがブロックされている場合は、「最後の操作を元に戻し」、前の交差点に戻り、次のパスに進む必要があります。 バックトラッキングは究極的には「徹底的な方法」であることがわかったようですが、プルーニングを行わずに単に徹底的な方法を実行すると、時間の計算量が非常に大きくなります。では、どのようにプルーニングするのでしょうか? バックトラッキング最適化手法をプルーニング、またはプルーニング関数と呼びます。この機能により、いくつかの状態を減算し、到達不可能な状態 (「最終状態」) をプルーニングできます。ここでの最終状態は、回答状態と見なすことができます。このようにして、一部の空間ツリー ノードの生成が削減されます。具体的なプルーニング方法については、問題解決の経験に基づいてさらに練習することができますので、ここでは詳細には触れません。 アルゴリズムフレームワーク 以下は私自身の理解です。次の手順で理解していただければ分かりやすいと思います👇 この種の質問については、次の 3 つのステップで考えることができます。
同様の問題を解いたことがある人なら誰でも、コア処理は for ループ内の再帰操作であることを知っています。各再帰の前に、「選択を行います」。このソリューションが完了したら、「選択を元に戻す」必要があります。そうすることで、決定木の同じレベルの他の選択に影響を与えなくなります。 たとえば、迷路のような問題では、答えを探し続けて試行錯誤を続ける必要があります。このプロセスはバックトラッキング アルゴリズムです。次のグリッドに移動するたびに、まずグリッドを「マーク」して、そこを通過したことを示す必要があります。その後、検索を続けます... この解決策が合理的でない場合は、以前にマークしたグリッドをクリアする必要がありますか?よく考えてみると、これは非常に合理的です。現在の解決策が機能しない場合は、「このステップを元に戻す」必要があります。 上記の基礎知識についてある程度理解できたので、この基礎知識を使って問題を解決することができます。 バックトレースの書き方
このバックトラッキング アルゴリズムの要約は非常に優れており、参考として使用できると思います。 2 例 すべての大文字と小文字⭐ 文字列 S が与えられた場合、文字列 S 内の各文字の大文字と小文字を変更することで新しい文字列を取得できます。すべての可能な文字列のセットを返します。 例: 入力: S = "a1b2" 出力: ["a1b2", "a1B2", "A1b2", "A1B2"] 入力: S = "3z4" 出力: ["3z4", "3Z4"] 入力: S = "12345" 出力: ["12345"] ヒント: Sの長さは12を超えてはならない。 S は数字と文字のみで構成されます。 出典: LeetCode リンク: https://leetcode-cn.com/problems/letter-case-permutation 著作権は LeetCode Network に帰属します。商用目的での複製については、正式な許可を得るためにお問い合わせください。非商用目的での複製については、出典を明記してください。 さて、この質問については、絵を描いて例を挙げることができます。私はインターネットから写真を使います。 アルファベット順 数字の場合はそのままスキップします。文字の場合は大文字と小文字の2つの状態しかないので、次のアイデアがあります👇
この考え方に従えば、問題を解決する完全なコードを書くことができる。 コード👇 バックトラッキングアルゴリズムコード1 コードはこちらをクリック☑️ サブセット 🐍⭐⭐ 重複要素のない整数配列 nums が与えられた場合、配列のすべての可能なサブセット (べき乗集合) を返します。 注意: ソリューション セットには重複したサブセットを含めることはできません。 例: 入力: nums = [1,2,3] 出力: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ] 出典: LeetCode リンク: https://leetcode-cn.com/problems/subsets 著作権は LeetCode Network に帰属します。商用目的での複製については、正式な許可を得るためにお問い合わせください。非商用目的での複製については、出典を明記してください。 このタイプの質問をするとき、理解できない場合は、まず図を描くことができます。上記の質問から、ツリーのような構造を描き、決定木をどのようにトラバースするかを見て、剪定できるかどうかを確認します。インターネット上の図を参照してください👇 部分集合の再帰木 実際、この絵を描くことができれば、成功の半分は達成したことになります。この絵から、この木をもう一度横断できそうです。 まずは自分の考えを整理しなくてはいけません👇
上記の疑似コードによれば、基本的にこの問題は解決できます👇 バックトラッキングアルゴリズム問題解決-2 コードはこちらをクリック☑️ 答えるべき質問は無限にあります。これらの質問を終えた後、バックトラッキング アルゴリズムのルールを見つけ、より深く理解できるようになることを願っています。次に、いくつかの質問セットを用意しました。お役に立てば幸いです。 上級者向け質問のまとめ |
<<: 危険信号:Google AIはマスクを着用した女性を口をテープで塞いでいる女性と認識
>>: 深い思考: テイクアウトの背後にある人工知能アルゴリズムの秘密_IT テクノロジーウィークリー 647 号
なぜ良いチャットボットがないのでしょうか? これは私がかなり頻繁に、おそらく平均して週に 2 回は聞...
置き換えられるというよりは、スキルの反復の方が心配です。 2017年は、人工知能が世界中で大きな注目...
人工知能とモノのインターネットは、ビジネスの運営方法に革命をもたらしています。一方、AI は、リアル...
この記事は公開アカウント「Reading Core Technique」(ID: AI_Discov...
2021年3月3日、GGVファミリーKuobo Intelligenceは、Pre-B-4ラウンドの...
光ファイバーを光子のメモリとして使用し、光子メモリを使用してフォールトトレラント量子コンピューティン...
2023年10月11日、北京の黄金の秋に、第9回HAOMO AI DAYが予定通り開催されました。今...
10月25日、AIの大規模モデルトレーニングデータソースの著作権問題は、常に業界にとって頭痛の種とな...
6月29日、最新の研究により、人工知能によって生成されたツイートは実際の人間が書いたものよりも説得...
ディープラーニングは新たな時代を迎えた。Transformerの優位性は覆されるのか? 2017年6...