ナップザック問題の変種


11

定数によってナップザックの項目数を制限する必要がある場合、動的プログラミングの状況でナップザック問題にどのようにアプローチしpますか?これは同じ問題(最大重みW、すべてのアイテムに値vと重みw)ですが、ナップザックに追加できるのはpアイテムのみで、明らかにナップザックの値を最適化する必要があります。

3次元が必要ですか、それ以外のアプローチを見つけることができますか。セルのナップザックに項目の数を単純に追加しようとし、項目の数<= で最後に最大値を取得しようとしましたpが、これは最善の解決策ではありません。


これは素晴らしい宿題です。何を試しましたか?動的プログラミングを快適に行えますか?(そうでない場合は、いくつかの演習を試してみてください。)ナップザック問題の標準動的プログラミングアルゴリズムを学習しましたか?その標準的なアプローチを変更する方法を探します。あなたの主な仕事は、サブ問題のセットがどうあるべきかを設計することです。標準的なアプローチでは、サブ問題は1つのパラメーター(項目の重みの限界)によって特徴付けられます。2つのパラメーターを使用することを検討してください(したがって、より大きなサブ問題のセット)。さまざまな可能性を試してください-何が得られますか?
DW

回答:


9

とてもいい質問です!

あなたは二度正しいです:

  1. ナップザックのアイテム数を伝播しても、最適なソリューションは得られません。
  2. 1つの解決策は、3番目の次元を追加することです。これはかなり単純ですが、その際にはいくつかの事実を考慮する必要があります。ただし、これが唯一の選択肢ではないことに注意してください。

以下では、動的プログラミングに基づくソリューションに精通していることを前提としています。特に、解決策を決定するためにテーブルを逆方向​​にたどる方法については説明しません

TTi,jij

Ti,j=max{Ti,j1,Tiwj,j1+vj}

ここで、とは、それぞれ番目の項目の重みと値を表します。場合あなたのナップザックの全体的な容量であり、合計である最適解は、アイテムによって与えられる。このアルゴリズムは疑似多項式時間で実行されることが知られており、その美しさの1つは、最大容量に適合する組み合わせのみを考慮することです。v j j C N T C NwjvjjCNTC,N

ただし、制約を追加する場合、これでは不十分です。最大アイテム数です。その理由は、以前の繰り返し式ではアイテムのさまざまな組み合わせが考慮されていないためです。p

  1. まず、場合、となります。考慮されるアイテムの最大数にもかかわらず、番目のアイテムがナップザックに追加されるため、制約に違反している可能性があります。さて、ここで、各ステップで挿入されたアイテムの数を追跡する前述の式を適用し、現在ナップザックにあるアイテムの数がを超えている場合は他の数式を追加しないようにしたいと思うかもしれませんが、Ti,j1<(Tiwj,j1+vj)Ti,j=(Tiwj,j1+vj)jpp
  2. 次に、場合、なので、このアイテムは追加されませんが最適解がナップザックに挿入するアイテムの最大数で既に構成されている場合、これは大きな間違いになる可能性があります。その理由は、適切に比較していないためです。一方では、前のから選択された個のアイテムで構成される最適な解を保持するためです。一方、番目のアイテムを挿入し、さらに、前の中でアイテムを持つ最良のサブセットを検討します。Ti,j1>(Tiwj,j1+vj)Ti,j=Ti,j1Ti,j1p(j1)j(p1)(j1)

したがって、最初のソリューションは、3番目の次元を追加することで構成されます。あなたのケースについて、聞かせてナップサックの容量があるときに、最適なソリューションである、最初の項目が考慮され、より多く置くことは許されないリュックサック内の項目。さて、Ti,j,kijk

  • 挿入できるアイテムの数()と同じかそれより少ない数のアイテムのを計算する場合は、通常どおり続行しますが、同じ値を使用します:Ti,j,kjkkTi,j,k=max{Ti,j1,k,Tiwj,j1,k+vj}
  • ここで、挿入できる項目の数()よりも厳密に多い数の項目についてを計算する必要がある場合、次のようになりますTi,j,kj>kTi,j,k=max{Ti,j1,k,Tiwj,j1,k1+vj}

最初の表現は明確でなければなりません。テーブルの番目のレイヤーは、上記の必要に応じて、最初の中でアイテムの最適な組み合わせを追跡しているため、2 番目は機能します。(k1)T(k1)(j1)

このアルゴリズムの効率的な実装では、すべてのについてを計算する必要はありません。前述の反復関係はレイヤーとを関連付けているため、2つの連続するレイヤーを交互に使用することができます(たとえば、最適解に興味がある場合は、2つの連続するレイヤーを使用するだけです:0 1、1、2、2、3、3、4で完了です)。つまり、このアルゴリズムは、動的プログラミングに基づく従来のアプローチで必要なメモリの2倍を消費するため、疑似多項式時間で実行できます。 k k k 1 k = 4Ti,j,kkk(k1)k=4

ただし、これが唯一の解決策ではないことに注意してください。そして、もっとエレガントに見えるかもしれません。上記の式では、最初のうちアイテムで構成される最適な解をとして取得しました。ただし、元のテーブルを使用するだけで、これがと正確に等しいことは明らかです。つまり、1アイテム、2アイテム、3アイテム、...の最適解を考慮することにより、アイテム以下の最適解も取得できます。j 1 T i j 1 k 1 最大p = 0 j 1 { T i p } k j 1 k(k1)(j1)Ti,j1,k1maxp=0,j1{Ti,p}k(j1)アイテム...この定式化を機能させるには、セルごとに2つの整数が必要になるように、すべての部分解で考慮されるアイテムの数も追跡する必要があります。このメモリ占有は、上に示したアルゴリズムとまったく同じメモリ要件になります(レイヤー形で3次元を使用)k

お役に立てれば、


非常に素晴らしい反応、ありがとうございます。3番目の次元も実装することで、投稿前にそれを乗り越えることができました。
user11536 2013

質問を締めくくってくれてありがとう、そしてあなたがその回答を気に入ってくれてうれしいです。私の考えを明確にするために、このアルゴリズムをPythonで実装することも試みました。あなたがそれを見てみたいと思っているなら、私に知らせてください、そして私はそれを喜んで投稿します(またはあなたに送ります)。乾杯、
カルロスリナレスロペス

多次元ナップザック問題の驚くべき説明。同様のケースがあるのか​​と思っていましたが、要素が正確にkの場合、3次元のk番目の列によって返される値のみを確認します。そこに値がない場合は、0.Iを返します私はまだ動的プログラミングに慣れていないので、私が正しいかどうかはわかりません。
SteveIrwin 2014年

@CarlosLinaresLópez素晴らしい答えです。Pythonスクリプトも共有していただけませんか?多分それをgist.github.comに投稿しますか?
Saad Malik

1
こんにちは@Carlos!私はあなたの代わりの式を使用するためのフォローアップの質問をここに投稿しました:0/1ナップザックでn-bestアイテムを見つける。とにかくあなたがあなたの休暇を楽しんでいることを望みます!
Saad Malik
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.