線形時間の分数ナップザックを解く方法は?これは Google で見つけましたが、よくわかりません。
- $ R $からランダムに要素$ r $を選択してください。 (利益/重量比のセット)
- 決定
- $ R_1 = \ {p_i / w_i | p_i / w_i > r、1 \ leq i \ leq n \}、W_1 = \ sum_ {i \ in R_1} w_i $
- $ R_2 = \ {p_i / w_i | p_i / w_i = r、for 1 \ leq i \ leq n \}、W_2 = \ sum_ {i \ in R_3} w_i $
- $ R_3 = \ {p_i / w_i | p_i / w_i < r、for 1 \ leq i \ leq n \}、W_3 = \ sum_ {i \ in R_3} w_i $
- if $ W_1 > W $
- $ R_1 $を繰り返し、計算された解を返します
- else
- while(ナップザックと$にスペースがありますR_2 $は空ではありません)
- $ R_2 $からアイテムを追加します
- if(ナップサックがいっぱいになります)
- $ R_1にアイテムを返します$と$ R_2 $から追加されたばかりのアイテム
- else
- ナップザックの容量を$ W_1 + W_2 $削減します
- $で繰り返しますR_3 $および$ R_1 \ cuの返品アイテムp R_2 $
- 再帰呼び出しから返されたアイテムを追加する
- while(ナップザックと$にスペースがありますR_2 $は空ではありません)
方法がわかりません動作します、$ R $と$ W $は何を表すことになっています…誰かが説明できますか?または、提案する別のアルゴリズムがある場合はどうでしょうか。
回答
問題を述べていただければ幸いです。 $ n $ のアイテム
これが例です。生の金があり、利益は $ 1000 $ 、重量は $ 1 $ です。バナナもあり、利益は $ 1 $ 、重量は $ 10 $ です。 $ 2 $ の重さを運ぶことができると仮定します。あなたならどうしますか?当然のことながら、最初にできるだけ多くの金、つまりすべてを入れ、次にできるだけ多くのバナナ、つまり10分の1を入れて、合計利益を $ 1000.1 $ 。
一般的なアルゴリズムも同様です。 $ W $ を
これは分割せずに実装できます。 $ W $ を
アルゴリズムを理解するには、次のルートをお勧めします。
- フラクショナルナップザックの古典的な欲張りアルゴリズムを理解します。
- クイックセレクトを理解します。
- 引用するアルゴリズムが、クイックセレクトの手法と欲張りアプローチをどのように組み合わせているかをご覧ください。
回答
R は、すべてのオブジェクトの利益/重量の比率のセットであり、オブジェクトの利益と重量が示されます。そして、 W はナップザックの容量です。
これで、1ステップでランダムな要素を選択する代わりに、中央値検出アルゴリズムをに適用できます。 O(n)回の中央値を見つけます。
これで、残りのすべての手順を実行できます。したがって、時間計算量の分析は次のようになります-
T(n)= T(n / 2)+ O(n)。
そして、解決策として O(n)を取得します。何かが適切に説明されておらず、もっと知りたい場合は教えてください。
回答
線形時間で、単位重量あたりの値に関する中央値の項目。次に、線形時間でも、少なくともその価値のあるすべてのアイテムをナップザックに収めることができるかどうかを判断できます。可能であれば、そうして、 n / 2 の値の低いアイテムについてこの問題を再帰的に解決してください。」すでにナップザックを埋めています。できない場合は、値の低い n / 2 アイテムを捨てることができます。次に、最も価値の高い n / 2 アイテムのみを使用して問題の解決を再試行します。
ここでの再帰は T(n)= T(n / 2)+ O(n)であり、 T(n)= O(n)、必要に応じて。
貼り付けたソリューション: R は比率のセットであり、利益/重み W はこのセットの全体の重みの合計です、ナップザックの容量と比較するために使用されます。同様に、{pi / wi | pi / wi}は、利益がi番目の重み値に対するi番目の要素を表します。この値をランダムに選択された r 値と比較し、比率の比較に基づいて分離しています。 R1、R2、R3 は、比率が以下、等しい、または大きい場合に応じて、比率セットのサブセットになります。中央値要素。
同様に、 W1、W2、W3 は、これらのセットの重みの合計です。
ここで、最初に説明したように、比率の値に応じて適切なソリューションセットを選択します。