1.完全なナップザック問題の形式的な記述
次のようにナップザック問題は完全に古典的なクラスDP(ダイナミックプログラミング、動的プログラミング)の問題があり、問題が記載されています。
ありnはそれぞれ重さと値の種類は、W I、V Iのこれらの項目から選択された記事は、総重量超えていないWの記事を、すべてのプログラムが選択されている値が必要ですV Iの最大の和を。これは、各項目は無制限選ぶことができることは注目に値します。
i番目の項目が選択されたと仮定KをI番目、K I ∈N、
目的関数は以下のとおりです。
最大{ΣのK iは、V Iを }
制約は以下のとおりです。
σ kはiが wがI <= W
2.自明な解完全なナップザック問題
まず番号1〜n個の商品のすべてのタイプの。
再帰ボトムアップ方式。
セット関数F(I、jは)〜数を表す。1つのI選択された記事のタイプを、最大の充電の重量許可jは、最大合計値バックパックを得ることができます。
0から選択された物品、即ち、I = 0、この場合:まず、参照場合を考えます。
F(i、j)は= F(0、J)= 0
アップ再帰的。この数〜。1からI選択された記事のクラス、最適解をセクションから生成された〜に依存している。1(I. 1 -現在生成された意思決定の最適解)。
決定を行うために、次の2つの状況に分けK Iアイテム(kはゼロであってもよい)、から選択されます。
1 。物品の重量があればW Iは、バックパックjの許容量を超えない、独立して物品Aの0、...、kから選択することができる、K W Iは、許容重量jを超えません。最後に、現在の最適なソリューションとして、結果の最大合計値から[すべて選択]を選択します。
F(i、j)は=最大{F(I-1、J - K× W I)+ K× V iは | (K> = 0、K W I <= J) }
2 。記事の重み場合W 私はバックパックjの許容重量を超え、現在の記事に配置することはできません。
F(I、J)= F(I-1、j)は
上記は、現在の状態と以前の状態の間に2つの再帰的な伝達関係を明らかにする。ベースケースと相まって、我々はアルゴリズムが閉じられたことを、あなたが達成するためにプログラムを書くことができます見つけます。
コアプログラム
入力:数値アイテムタイプN、バックパックTの最大許容重量、[I]、V [i]の値W i番目の項目の重み。
出力:最大値DP [n]は[T]。
初期化:クリアDPアレイ
以下のために(INT iが= 1 ; I <= N; ++ I){ ため(INT J = 0 ; J <= T; ++ J){ 場合(j < W [i])と{ DP [I] [J ] = DP [I- 1 ] [J]。 } 他{ ための(int型のk = 0 ; K * W [i]は<= J; ++ K){ DP [I] [J] = MAX(DP [I]、[J]、MAX(DP [I- 1 ] [J]、DP [I- 1 ] [[I W JK *]] + K * V [I]))。 } } } }
プログラムは非常に限られた大きさの問題を解決することができるので、簡単には、漸近Oの複雑さ(N×T×W)、複雑さの三ことを確認します。しかし、この問題は、最適化することができ、大きなスペースがあることを、このセクションのタイトルが示すように、通常の解決手段、解決不可能ではありません。
3.データ依存性の使用 - 時間計算の最適化
(について観察J循環用)及び(Kサイクルの)、データ推測2巡回相関は、例えば、存在する:F(I-1、J ) kの選択された記事の場合、およびF(I-1、jは- W I)K-1を選択し、F(I-1、J-演算部におけるk> = 1の再帰的推定F(I-1、j)が同一であるW Iの時間)が求めています、k個のサイクルは、計算を繰り返すし続ける、循環ループjのkのにマージすることが可能です。
次のようにこの考えを試験するために、状態遷移方程式が導出されます。
タイトルデザイン:
F(i、j)は= 最大{F(I-1、J - K× W I)+ K× V iは |(K> = 0) } ......①
== 0を考慮すると、K、F(1-I、J - K× W I)+ K× V Iは、 F(I-1、j)に減少し 、 したがって
F(i、j)は= MAX(F(I-1、j)は、最大{F(I-1、J - K× W I)+ K× V iは |(K> = 1) })
以前の投機、置換K = K + 1を検証するために、変形K> = 0と等価です。
F(i、j)は= MAX(F(I-1、j)は、最大{F(I-1、J - (K + 1) × W I)+ (K + 1) × V iは |(K> = 0) })
= MAX(F(I-1、J)MAX {F(I-1、(J - W I) - K× W I)+ K× V I + V I |( K> = 0) })··· ...②
結論は未だ明らかではないが、式②挙げ{}後、最大の下線部分は、実測値:
F(i、j)は= MAX(F(I-1、j)の最大値{F(I-1、(J - W I) - K× W I)+ K× V iは | ( K> = 0) } + V I )
①公知のコントラスト、F.にn型と同等の青色部分(I、J - W I)。
F(i、j)は= MAX(F(I-1、j)は、 F(I、J - W I) + V I)
これは究極の表現である、あなたは成功消去kは見ることができます。
状態派生転送プログラミング方程式によれば、第2の3つのまっすぐ下からの時間の複雑さは、我々は再びDPの電源を参照してください。
F(I-1、j)はF(1-I、Jに依存するので、ことが留意されるW I演算結果)、jをする増分計算の正確さを確保するために、トラバース。
以下のために(INT iが= 1 ; I <= N; ++ I){ ため(INT J = 0 ; J <= T; ++ J){ 場合(j < W [i])と{ DP [I] [J ] = DP [I- 1 ] [J]。 } 他{ DP [I] [J] = MAX(DP [I- 1 ] [j]は、DP [I] [JW [I] + V [I])。 } } }
4.配列の次元を減らすDP - 空間複雑さの最適化を
最適化の前に、DP配列空間の複雑さはO(N×T)です。
各要素の配列DP、DP [I]に注目すると、DPの[I-2]、...、DP [0]ラインを依存することなく、唯一の行DP [I-1]の前の行の値に依存します。これが唯一のラインDPのストレージアレイに私たちを触発し、行のデータを更新し、「その場インチ」
2つのケースがまだあります。
1 。jに対して<W [i]は、DPは、行を更新する必要はありません。
2 。他の非1の場合。場合、DP、更新すべき行のニーズDP [J] = MAX(DP [J]、DP [JW [I] + V [I])を、太字は、 "その場で"更新戦略を反映しています。
以下のために(INT iは= 1 ; iが<= N; ++ i)が{ ため(INT J = <W [i]は、J <= T; ++ J){ DP [j]が最大値(DP [j]を= DP [JW [I] + V [I])。 } }
状況ので、1。存在は、[i]はW jの値マストは間隔の開始点です。
従って省スペースの複雑さはO(n))。
5.まとめ
最初は完全にナップザック問題を説明し、その後、最も直感的な自明な解を解析し、溶液をループ状態遷移方程式の間で通常のデータの相関により求め結論Oの低下時間計算由来ように、最適化された(N導出×トン)。次に、別の角度から - DP空間複雑解析アレイ次元削減の最適化の空間的複雑度はO(N)に還元されます。統合された空間的、時間的な側面は、このような問題を解決するためのDP最適化方法に来ます。