動的プログラミングと貪欲なアプローチの使用法の主な違いは何ですか?
私の知る限り、greedyアプローチは最適なソリューションを提供する場合があります。それ以外の場合、動的プログラミングアプローチが最適なソリューションを提供します。
1つのアプローチ(または他のアプローチ)を使用して最適なソリューションを得るために満たす必要がある特定の条件はありますか?
ウィキペディアの記事に基づく
欲張りアルゴリズムは、グローバル最適を見つけることを期待して、各段階で局所的に最適な選択をするという問題解決ヒューリスティックに従うアルゴリズムです。多くの問題では、貪欲な戦略は一般に最適なソリューションを生成しませんが、それでも貪欲なヒューリスティックは妥当な時間でグローバルな最適なソリューションに近似するローカルな最適なソリューションを生成する場合があります。
現時点で最適と思われる選択を行い、後で発生するサブ問題を解決できます。 貪欲なアルゴリズムによって行われる選択は、これまでに行われた選択に依存する可能性がありますが、将来の選択や部分問題のすべての解決策には依存しません =。それは、貪欲な選択を次々と繰り返し、与えられた各問題をより小さなものに減らします。
動的プログラミングの背後にある考え方は非常に簡単です。一般に、特定の問題を解決するには、問題のさまざまな部分(サブ問題)を解決する必要がありますサブ問題の解決策を組み合わせて全体的な解決策に到達する。多くの場合、より素朴な方法を使用すると、多くのサブ問題が何度も生成および解決されます。ダイナミックプログラミングアプローチ各副問題を解決しようとする一度だけ、したがって、計算の数を減らします。サブ問題は計算され、保存または「メモ化」されます。次回同じソリューションが必要になったときに、単純に検索されます。このアプローチは、繰り返しサブ問題の数が入力のサイズの関数として指数関数的に増加する場合に特に役立ちます。
現時点で最適と思われる選択を行い、後で発生するサブ問題を解決できます。貪欲なアルゴリズムによって行われる選択は、これまでに行われた選択に依存する可能性がありますが、将来の選択や部分問題のすべてのソリューションには依存しません。それは、貪欲な選択を次々と繰り返し、与えられた各問題をより小さなものに減らします。言い換えれば、貪欲なアルゴリズムはその選択を再考することはありません。
これが動的プログラミングとの主な違いです。動的プログラミングは網羅的であり、解決策が見つかることが保証されています。すべての段階の後、ダイナミックプログラミングは前の段階で行われたすべての決定に基づいて決定を下し、ソリューションへの前の段階のアルゴリズムパスを再検討します。
たとえば、ラッシュアワー中に特定の都市で、できるだけ早くポイントAからポイントBに移動する必要があるとしましょう。ダイナミックプログラミングアルゴリズムは、トラフィックレポート全体を調べて、考えられるすべての道路の組み合わせを調べて、どちらの方法が最も速いかを示します。もちろん、アルゴリズムが終了するまでしばらく待たなければならない場合があり、そうして初めて運転を開始できます。あなたが取る道は最速のものになります(外部環境で何も変わらないと仮定します)。
一方、貪欲なアルゴリズムは、すぐに運転を開始し、すべての交差点で最も速く見える道路を選択します。あなたが想像できるように、この戦略は、いくつかの「簡単な」通りを取り、絶望的に交通渋滞で立ち往生するかもしれないので、最速の到着時間につながらないかもしれません。
数学的最適化では、貪欲なアルゴリズムmatroids の特性を持つ組み合わせ問題を解きます。
動的プログラミングは、重複する部分問題と最適な部分構造のプロパティを示す問題に適用できます。
貪欲なアルゴリズムと本で述べられている動的プログラミングアルゴリズムの主な違いを説明する段落を引用したい Introduction to Algorithms(第3版) Cormen、第15.3章、381ページ:
貪欲なアルゴリズムと動的プログラミングの大きな違いの1つは、最初にサブ問題の最適な解決策を見つけてから、情報に基づいた選択を行うことです。貪欲なアルゴリズムは、最初に貪欲な選択を行います。これは、その時点で最もよく見える選択肢であり、次に、関連するすべての小さな副問題を解決することなく、結果の副問題を解決します。
貪欲な方法と動的プログラミングの違いを以下に示します。
貪欲な方法はその選択を決して再考しませんが、動的プログラミングは以前の状態を考慮するかもしれません。
貪欲なアルゴリズムはあまり効率的ではありませんが、動的プログラミングはより効率的です。
貪欲なアルゴリズムは部分的な問題をローカルで選択しますが、動的プログラミングはすべての部分的な問題を解決してから、最適な解決策につながるものを選択します。
貪欲なアルゴリズムは一度に決定を行いますが、動的プログラミングはすべての段階で決定を行います。
Biswajit Roy:Dynamic Programmingを参照して、まずGoを計画します。貪欲なアルゴリズムは貪欲な選択を使用し、最初に移動してから継続的に計画します。
簡単な言葉で言うと、Dynamic Programming
(ネットワークでのメッセージ送信に問題がある場合)では、最初に最短時間のパスを調べてから旅を始めることができます。
一方、Greedy algorithm
は、次のステップを考えずにその場でoptimal decision
を取得し、次のステップでその決定を再度変更します...
Notes:
Dynamic programming
は信頼できますが、貪欲なアルゴリズムは常に信頼できるとは限りません。