動的プログラミングとブルートフォースの違い


19

次の引用に出会ったとき、私はダイナミックプログラミングを読んでいました

動的プログラミングアルゴリズムは、問題を解決するために考えられるすべての方法を調べ、最適なソリューションを選択します。したがって、ダイナミックプログラミングは、インテリジェントなブルートフォースの方法であるとおおまかに考えることができます。これにより、考えられるすべてのソリューションを選択して、最良のソリューションを選択できます。問題の範囲がすべての可能なソリューションを通過することが可能であり、十分に高速である場合、動的プログラミングは最適なソリューションを見つけることを保証します

次の例を示しました

たとえば、ラッシュアワー中に特定の都市で、できるだけ早くポイントAからポイントBに移動しなければならないとしましょう。ダイナミックプログラミングアルゴリズムは、トラフィックレポート全体を調べて、考えられるすべての道路の組み合わせを調べて、どちらの方法が最も速いかを示します。もちろん、アルゴリズムが終了するまでしばらく待たなければならない場合があり、そうして初めて運転を開始できます。あなたが進む道は最速のものになります(外部環境で何も変わらないと仮定すると)

ブルートフォースは、最善の解決策を決定する前に、考えられるあらゆる解決策を試みています。

それがまたあればどのように動的ブルートフォースは異なるプログラミングされて最適なものを選ぶ前に、すべての可能な解決策を通過し、私が見る唯一の違いは、動的プログラミングは、アカウントに追加の要因(この場合は交通状況を)取ることです。

動的計画法はブルートフォース法のサブセットであると言ってもいいですか?


1
交通状況はニシンです。任意のアルゴリズムでそれらを検討できます。
ユヴァルフィルマス14


最初の引用では、動的プログラミングを定義していません。
reinierpost 14

まあ@reinierpost、それはしようとするとそこにintelligent, brute force、が、その後「インテリジェント」の部分を説明するのを忘れた
Izkata

@Izkataその推論では、すべてのアルゴリズムは「インテリジェントなブルートフォース」です(とにかく矛盾表現です)。
ラファエル

回答:


17

動的プログラミングアルゴリズムは、問題を解決するために考えられるすべての方法を調べ、最適なソリューションを選択します。

この声明はまったく間違っています。

動的なプログラミングの繰り返しで、特定の問題のインスタンスを何らかのスキームに従ってより小さなインスタンスに分割するためのすべての可能な方法(多くの場合)考慮されます。ただし、すべての部分的な問題に対するすべてのソリューションを相互に組み合わせて最適なものを選択するわけではありません。最適な部分的なソリューションのみを組み合わせます(そして、それらの中から最適なものを選択します)。

これが元の問題の最適な解決策をもたらすという事実は些細なことではなく、実際にはいくつかの問題にしか当てはまりません。つまり、ベルマンの最適性の原則を満たしているもの(定期的に引用されている最も怪しい、誤解された「定義」の1つ)。それについてのさらなる考えについては、こちらをご覧ください。

KnΘ(n2)(n1)!


「この文は単純に間違っています」 - 修正してください
nmclean 14

4
@nmclean Wikipediaでのアルゴリズム関連の記事の編集に関する私の経験は楽しいものではありませんでした。ここで時間をかけたいです。
ラファエル

私は運を試し、記事を編集しました。今では少し間違えないことを願っています。
C4stor 14

9

動的プログラミングは計算を再利用するため賢いのですが、ブルートフォースはそうではありません。f(6)を解くには、両方ともf(3)を呼び出す2つの副問題を解く必要があるとします。ブルートフォースメソッドはf(3)を2回計算するため、労力が無駄になりますが、動的プログラミングでは1回呼び出され、将来の計算で使用する必要がある場合に備えて結果を保存します。多くの問題では、動的により、ブルートフォースの指数関数的な複雑さが多項式の複雑さに改善されます。


9
だとメモ化 DPが採用していること、多くのトリックの一つです。
ベンフォイト14

4
メモ化を伴うブルートフォースは依然として非効率的です。DPの再発によって提供される追加の構造/プルーニングのみが、メモ化の成果をもたらします。
ラファエル

3
動的プログラミングについては何も知りませんが、ブルートフォースアルゴリズムにキャッシュを追加する以上のことがあると確信しています。ダイナミックプログラミングは、問題空間を細分化し、小さな細分化ごとに最適なソリューションを見つけ、それらを組み合わせて全体的な最適なソリューションを作成することにより、あらゆる組み合わせをテストすることを避けていると思います。(これを再帰的に行い、サブディビジョンをサブディビジョンします。)これは、このようなソリューションの組み合わせを可能にする方法で問題を表現でき、それでも全体的に最適な場合にのみ機能します。
ジョナサンハートリー14

1
この答えは実際には非常に正確です。動的プログラミングの詳細については、Cormen et al: "Introduction to Algorithms"などの教科書を読むことをお勧めします。この本にはかなりまともな章があります。簡単に言えば、効率的な動的プログラミングは、解決したい(最適化)問題の2つの特性を利用します。最適なソリューションは、小さなサブ問題の最適なソリューションから構築でき、小さなサブ問題の総数は実際には小さい。その後、すべてのサブ問題ソリューションをボトムアップで構築し、メモリを犠牲にして計算を加速できます。
MRA

または、さらに簡単に言えば、Pascalの三角形を使用して二項係数を計算する方法を知っている場合、動的プログラミングについて知る必要があることはすべてわかります。
MRA

3

ウィキペディアの記事が作成しようとしている区別は、次の3種類のアルゴリズムの間です。

  1. 最適なソリューションを選択して、考えられるすべてのソリューションを検討するアルゴリズム。

  2. 最適なソリューションがサブセットに属するように選択された、可能なすべてのソリューションのサブセットを通過するアルゴリズム。

  3. 最適なソリューションがサブセットに属することを保証せずに、すべての可能なソリューションのサブセットを超えるアルゴリズム。

最初の2つのタイプのアルゴリズムは最適なソリューションを作成し、3番目のタイプは最適なソリューションではなく「良い」ソリューションを作成することを目的としています。私の意見では、最初の2種類の区別はそれほど明確ではありません。

まず、最短パスのコンテキストで、3種類すべてのアルゴリズムの簡単な例を示します(指定した例)。

  1. すべての可能なパスを試してください。これはブルートフォースとして知られています。

  2. これまでの最小のソリューションを追跡しながら、考えられるすべてのパスを試してください。現在構築している現在のパスがこれまでの最小ソリューションよりも高価な場合は、それを放棄して別のパスを選択します(距離はセグメントごとに計算されると考えられます)。これはプルーニングと呼ばれます。

  3. マップを見て、いくつかのパスを検討し、その中から最適なパスを選択してください。これはコンピューターではなく人間用のアルゴリズムです。

これらの例はかなり粗雑であり、おそらく非常に正確な絵を描くことはありません。剪定は、コンピューターチェスなど、多くの状況で重要です。興味があれば、実際に最短経路に使用されるA *アルゴリズムを調べてください。

動的プログラミングは、ブルートフォースアルゴリズムを大幅に高速化するための手法です。ただし、このように考えるのはやや誤解を招く恐れがあります。これは、最適化の問題を解決するためのアルゴリズム手法です。動的プログラミングのコンテキストでプルーニングを実装できます。

ttt+1t


そして、完全に処理せずに候補から検討対象を削除します。たとえば、最小合計で負でない数のセットを見つける場合、実際に各セットを完全に合計する必要はなく、合計が現在のベストを超えるまで進みます。これは枝刈りに似ていますが、直交しています。2つのアイデアを組み合わせると、「分岐限定」が得られます。ここでは、複雑さが軽減された問題が解決され、プルーニングの正当化に使用されます。
ベンフォークト

0

動的プログラミングは、ブルートフォースよりもはるかに高速です。動的プログラミングは通常はるかに高速ですが、ブルートフォースには指数関数的な時間がかかる場合があります。

ブルートフォースへの類推は非常に緩いものです。動的プログラミングは、必要なブルートフォースアルゴリズムを採用して効率的にすることを可能にする魔法の特効薬ではありません。


5
それは結果であり、説明ではありません。
ラファエル

-2

これは簡単です。動的プログラミングは、追加の要因を使用して検索を絞り込む「検索戦略」です。サーチスペースに解決策がない場合、ダイナミックプログラミング(通常)サーチスペースのすべての要素を検索します。しかし、それはそれがブルートフォース検索であることを意味しません。


「サーチスペースに解決策がない場合、ダイナミックプログラミングは(通常)サーチスペースのすべての要素を検索します。」-間違っています、私の答えを見てください。
ラファエル

-2

動的プログラミングはインテリジェントなブルートフォースであるという記述は正しいですが、そのフレージングでは少し理解しにくいです。動的プログラミングのポイントは、一般的に問題を取り上げ、インテリジェントな方法でそれを小さな断片に分割することです。それを行った後、ブルートフォースを使用して各小さなピースを解決し、その後、ブルートフォースを使用してピースを最終的なソリューションに再度結合します。したがって、動的プログラミングは一種のブルートフォースソリューションであると断言できますが、トリックはそのブルートフォースの使用方法にあります。


1
「各小片を解くために総当たり攻撃を使用します」-間違っています。通常、同じアプローチを再帰的に使用します。
FrankW
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.