とてもいい質問です!
あなたは二度正しいです:
- ナップザックのアイテム数を伝播しても、最適なソリューションは得られません。
- 1つの解決策は、3番目の次元を追加することです。これはかなり単純ですが、その際にはいくつかの事実を考慮する必要があります。ただし、これが唯一の選択肢ではないことに注意してください。
以下では、動的プログラミングに基づくソリューションに精通していることを前提としています。特に、解決策を決定するためにテーブルを逆方向にたどる方法については説明しません。
TTi,jij
Ti,j=max{Ti,j−1,Ti−wj,j−1+vj}
ここで、とは、それぞれ番目の項目の重みと値を表します。場合あなたのナップザックの全体的な容量であり、合計である最適解は、アイテムによって与えられる。このアルゴリズムは疑似多項式時間で実行されることが知られており、その美しさの1つは、最大容量に適合する組み合わせのみを考慮することです。v j j C N T C 、NwjvjjCNTC,N
ただし、制約を追加する場合、これでは不十分です。最大アイテム数です。その理由は、以前の繰り返し式ではアイテムのさまざまな組み合わせが考慮されていないためです。p
- まず、場合、となります。考慮されるアイテムの最大数にもかかわらず、番目のアイテムがナップザックに追加されるため、制約に違反している可能性があります。さて、ここで、各ステップで挿入されたアイテムの数を追跡する前述の式を適用し、現在ナップザックにあるアイテムの数がを超えている場合は他の数式を追加しないようにしたいと思うかもしれませんが、Ti,j−1<(Ti−wj,j−1+vj)Ti,j=(Ti−wj,j−1+vj)jpp
- 次に、場合、なので、このアイテムは追加されませんが最適解がナップザックに挿入するアイテムの最大数で既に構成されている場合、これは大きな間違いになる可能性があります。その理由は、適切に比較していないためです。一方では、前のから選択された個のアイテムで構成される最適な解を保持するためです。一方、番目のアイテムを挿入し、さらに、前の中でアイテムを持つ最良のサブセットを検討します。Ti,j−1>(Ti−wj,j−1+vj)Ti,j=Ti,j−1Ti,j−1p(j−1)j(p−1)(j−1)
したがって、最初のソリューションは、3番目の次元を追加することで構成されます。あなたのケースについて、聞かせてナップサックの容量があるときに、最適なソリューションである、最初の項目が考慮され、より多く置くことは許されないリュックサック内の項目。さて、Ti,j,kijk
- 挿入できるアイテムの数()と同じかそれより少ない数のアイテムのを計算する場合は、通常どおり続行しますが、同じ値を使用します:Ti,j,kj≤kkTi,j,k=max{Ti,j−1,k,Ti−wj,j−1,k+vj}
- ここで、挿入できる項目の数()よりも厳密に多い数の項目についてを計算する必要がある場合、次のようになりますTi,j,kj>kTi,j,k=max{Ti,j−1,k,Ti−wj,j−1,k−1+vj}
最初の表現は明確でなければなりません。テーブルの番目のレイヤーは、上記の必要に応じて、最初の中でアイテムの最適な組み合わせを追跡しているため、2 番目は機能します。(k−1)T(k−1)(j−1)
このアルゴリズムの効率的な実装では、すべてのについてを計算する必要はありません。前述の反復関係はレイヤーとを関連付けているため、2つの連続するレイヤーを交互に使用することができます(たとえば、最適解に興味がある場合は、2つの連続するレイヤーを使用するだけです:0 1、1、2、2、3、3、4で完了です)。つまり、このアルゴリズムは、動的プログラミングに基づく従来のアプローチで必要なメモリの2倍を消費するため、疑似多項式時間で実行できます。 k k (k − 1 )k = 4Ti,j,kkk(k−1)k=4
ただし、これが唯一の解決策ではないことに注意してください。そして、もっとエレガントに見えるかもしれません。上記の式では、最初のうちアイテムで構成される最適な解をとして取得しました。ただし、元のテーブルを使用するだけで、これがと正確に等しいことは明らかです。つまり、1アイテム、2アイテム、3アイテム、...の最適解を考慮することにより、アイテム以下の最適解も取得できます。(j − 1 )T i 、j − 1 、k − 1 最大p = 0 、j − 1 { T i 、p } k (j − 1 )k(k−1)(j−1)Ti,j−1,k−1maxp=0,j−1{Ti,p}k(j−1)アイテム...この定式化を機能させるには、セルごとに2つの整数が必要になるように、すべての部分解で考慮されるアイテムの数も追跡する必要があります。このメモリ占有は、上に示したアルゴリズムとまったく同じメモリ要件になります(レイヤー形で3次元を使用)k。
お役に立てれば、