私は動的計画法を理解しようとしてきましたが、私が理解したのは、DPには2つの部分があるということです。 1。最適部分構造2.重複する部分問題
私は2番目のものを理解していますが、1番目のものを取得することもできません。
わかりやすい平易な英語で例を挙げて説明してもらえますか?
最適な部分構造とは、サイズn
の問題に対する最適な解決策が、n' < n
要素を検討する際の同じ問題に対する最適な解決策に基づいていることを意味します。
つまり、サイズn
の問題のソリューションを構築するときは、問題をより小さな問題に分割します。そのうちの1つはサイズn'
です。ここで、最適な下部構造プロパティに基づいて、n'
の最適なソリューションを検討するだけでよく、考えられるすべてのソリューションを検討する必要はありません。
例は ナップサック問題 :です。
D(i,k) = min { D(i-1,k), D(i-1,k-weight(i)) + cost(i) }
ここでの最適な部分構造の仮定は、D(i,k)
はD(i-1,k)
の最適解のみをチェックでき、最適解は考慮されません。
これが当てはまらない例は、 頂点被覆問題 です。
グラフG =(V、E)がある場合、V' <= V
のようなサブグラフG'=(V',E[intersection]V'xV')
の最適解があると仮定します-G
の最適解はG'
/の最適解で構成されている
もう1つの良い例は、グラフ内の頂点のすべてのペア間で最短単純パスを見つけることと、これらの各ペア間で最長単純パスを見つけることの違いです。 (「単純」とは、パス上の頂点に2回アクセスできないことを意味します。問題の「最長」バージョンにこの制約を適用しないと、グラフにサイクルが含まれるたびに無限に長いパスを取得できます。)
Floyd-Warshallアルゴリズム は、uからvへのパスが最短である可能性があるという事実を利用して、最初の問題に対する答えを効率的に計算できます。このパス上の任意の頂点xについて、mustuからxへのサブパス、およびxからvへのサブパスも最短である可能性があります。 (逆に、uからvへの「可能な限り最短の」パス上に頂点xがあり、uからxへのサブパスが最短ではなかったと仮定します-可能性:uからxへの他のより短いパスを見つけることが可能です-これを使用して、uからvへの全体的なパスを同じ量だけ短くすることもできるため、元のuからvへのパスを最短にすることはできませんでした-結局のところ可能です。)つまり、最短のu-to-vパスの場合、アルゴリズムは、他の頂点のペア間の最短の(つまり、最適な)サブパスから構築することを検討するだけで済みます-はるかに多数のすべてからではありませんそのようなサブパス。
対照的に、グラフ内の任意の2つの頂点間の最長単純パスを決定する問題を検討してください。同様に、uからvへの最長パスが頂点xを通過する場合、uからxへのサブパス、およびxからvへのサブパスも必然的に最長になる可能性がありますか?残念ながらそうではありません:uからxへの最長パスは、xからvへの最長パスでも必要とされる内部の頂点を使用している可能性があります。つまり、これら2つのパスを単純に接着して最長にすることはできません。単純uからvへのパス。
原則として、解決するサブ問題の十分に詳細な定義を使用することを選択することで、この問題を常に「回避」できます。この場合、2つの指定された頂点uとvの間の最長パスを要求する代わりに、次のことができます。与えられた2つの頂点uとvの間の最長パスを要求します。これは、与えられたセットSからの頂点のみを使用します。以前は2つのパラメーターを受け取る関数shortest(u, v)
を作成できましたが、今度は3つを使用する関数longest(u, v, S)
を作成する必要があります。次に、2つの頂点uとvの間の全体的な最長パスは、longest(u, v, V)
を使用して計算できます。ここで、Vはグラフの頂点セット全体です。この新しい定義により、サブ問題の最適ソリューションのみを組み合わせることで、最適なソリューションを生成できるようになりました。これは、Sセットが互いに素であるサブ問題から生じるパスのみを結合しようとするためです。これで、正しくSの頂点xのみを使用する、uからvまでの最長パス、つまりlongest(u, v, S)
を、Sのすべての頂点x、およびS- {x}をlongest(u, x, A) + longest(x, v, B)
の2つのサブセットAとBに分割します。
残念ながら、n個の頂点のセットを2 ^(n-1)の異なる方法で分割できるため、解決すべきサブ問題の数は指数関数的になりました。 (今説明したアルゴリズムは、この問題に対して可能な限り最も効率的なDPではありませんが、最も効率的な既知のDPでさえ、実行時間にこの指数因子があります。)DPアルゴリズムを設計する際の課題は、常にサブ問題を定義する方法を見つけることです。その結果、重複するサブ問題と最適な部分構造の2つの特性を維持しながら、十分に少ない異なるサブ問題(理想的には、多項式でのみ)が発生します。
簡単な言葉で: "最適化の問題を解決する際の最適化の原理は、サブ問題を解決する必要があります。サブ問題の解決は最適化問題の一部になります"、問題が次の方法で解決できる場合最適サブ問題は、それが最適な下部構造で構成されていることを意味します。
例:グラフで、ソース頂点がs、デスティネーションがdであるとします。最短のものを見つける必要があります
graph is
a g
b e h d
s c f i
d
length(s,a)=14
length(s,b)=10
length(s,c)=1
length(s,d)=6
length(c,b)=1
注:(s、e)または(s、f)の直接エッジはありません。このためのアルゴリズムを見つけることを考えている間、最小の合計PATH_Lengthでトラバースする優先キュー構造を記述している場合。ソース頂点から各頂点PATH_LENGTHを割り当てます。
新しいpath_length <既存のパス長の場合、隣接する頂点にpath_lengthを割り当て続けます。
Example : Len(s,b) > Len(s,a)+Len(a,b);
reset len(s,b)=2;
Sからの隣接ノードは、宛先ノードに関係なく、最小のpath_lengthを取得するためのパスを作成します。これは、ソリューションにつながるサブ構造を作成しているため。