Design-and-analysis-of-algorithms-fractional-knapsack

提供:Dev Guides
移動先:案内検索

DAA-フラクショナルナップザック

Greedyアルゴリズムは、ナップザック問題と呼ばれるよく知られた問題で非常によく理解できました。 同じ問題は他のアルゴリズム手法を使用することで解決できますが、貪欲な手法はフラクショナルナップザック問題を適時に合理的に解決します。 ナップザック問題について詳しく説明しましょう。

ナップザックの問題

それぞれが重みと値を持つアイテムのセットを指定して、コレクションに含めるアイテムのサブセットを決定し、合計重量が所定の制限以下で、合計値が可能な限り大きくなるようにします。

ナップザックの問題は、組み合わせ最適化の問題です。 それは、現実世界の問題の多くのより複雑な数学モデルの下位問題として現れます。 難しい問題に対する一般的なアプローチの1つは、最も制限の厳しい制約を特定し、他の制約を無視し、ナップザック問題を解決し、無視された制約を満たすように何らかの方法でソリューションを調整することです。

アプリケーション

何らかの制約とともにリソースを割り当てる多くの場合、問題はナップザック問題と同様の方法で導き出すことができます。 以下に例を示します。

  • 原材料をカットする最も無駄のない方法を見つける
  • ポートフォリオ最適化
  • 在庫切れの問題

問題シナリオ

泥棒は店を強奪し、ナップザックに W の最大重量を運ぶことができます。 ストアにはn個のアイテムがあり、 _ i ^ th ^ ' アイテムの重量は _w〜i〜' で、その利益は p〜i〜 です。 泥棒はどのようなアイテムを取るべきですか?

これに関連して、アイテムは、泥棒が最大の利益を得るアイテムを運ぶような方法で選択されるべきです。 したがって、泥棒の目的は利益を最大化することです。

アイテムの性質に基づいて、ナップザックの問題は次のように分類されます。

  • フラクショナルナップザック
  • ナップザック

フラクショナルナップザック

この場合、アイテムは小さな断片に分割される可能性があるため、泥棒はアイテムの一部を選択できます。

問題の声明によると、

  • ストアには n 個のアイテムがあります
  • i ^ th ^ アイテムの重量$ w _ \ {i}> 0 $
  • i ^ th ^ 項目の利益$ p _ \ {i}> 0 $および
  • ナップザックの容量は W です

ナップザック問題のこのバージョンでは、アイテムを小さな断片に分割できます。 したがって、泥棒は i ^ th ^ アイテムの x〜i〜 の一部のみを取得できます。

0 \ leqslant x _ \ {i} \ leqslant 1

*i ^ th ^* アイテムは、ナップザックの総重量に重量$ x _ \ {i} .w _ \ {i} $を提供し、総利益に$ x _ \ {i} .p _ \ {i} $を提供します。

したがって、このアルゴリズムの目的は

maximize \:\ displaystyle \ sum \ limits _ \ {n = 1} ^ n(x _ \ {i} .p _ \ {} i)

制約の対象

\ displaystyle \ sum \ limits _ \ {n = 1} ^ n(x _ \ {i} .w _ \ {} i)\ leqslant W

最適なソリューションがナップザックを正確に満たす必要があることは明らかです。そうしないと、残りのアイテムの一部を追加して全体の利益を増やすことができます。

したがって、最適な解は次のようにして得られます。

\ displaystyle \ sum \ limits _ \ {n = 1} ^ n(x _ \ {i} .w _ \ {} i)= W

このコンテキストでは、まず$ \ frac \ {p _ \ {i}} \ {w _ \ {i}} $の値に従ってこれらのアイテムを並べ替えて、$ \ frac \ {p _ \ {i} + 1} \ {w _ \ {i} +1} $≤$ \ frac \ {p _ \ {i}} \ {w _ \ {i}} $ ここで、 _ x_ はアイテムの一部を格納する配列です。

Algorithm: Greedy-Fractional-Knapsack (w[1..n], p[1..n], W)
for i = 1 to n
   do x[i] = 0
weight = 0
for i = 1 to n
   if weight + w[i] ≤ W then
      x[i] = 1
      weight = weight + w[i]
   else
      x[i] = (W - weight)/w[i]
      weight = W
      break
return x

分析

指定されたアイテムが既に$ \ mathbf \ {\ frac \ {p _ \ {i}} \ {w _ \ {i}}} $の降順でソートされている場合、while_loopは O(n)で時間がかかります ;したがって、ソートを含む合計時間は O(n logn) になります。

ナップザックの容量 W = 60 と提供されたアイテムのリストが次の表に示されていることを考えてみましょう-

Item A B C D
Profit 280 100 120 120
Weight 40 10 20 24
Ratio $(\frac\{p_{i}}\{w_{i}})$ 7 10 6 5

提供されたアイテムは$ \ mathbf \ {\ frac \ {p _ \ {i}} \ {w _ \ {i}}} $に基づいてソートされないため。 ソート後、アイテムは次の表のようになります。

Item B A C D
Profit 100 280 120 120
Weight 10 40 20 24
Ratio $(\frac\{p_{i}}\{w_{i}})$ 10 7 6 5

溶液

$ \ frac \ {p _ \ {i}} \ {w _ \ {i}} $に従ってすべてのアイテムを並べ替えた後。 B の重量がナップザックの容量より小さいため、最初にすべての B が選択されます。 次に、ナップザックの使用可能な容量が A の重量よりも大きいため、アイテム A が選択されます。 現在、 _ C_ が次の項目として選択されています。 ただし、ナップザックの残りの容量が C の重量よりも小さいため、アイテム全体を選択することはできません。

したがって、 _ C_ の端数(つまり、 (60 − 50)/20)が選択されます。

これで、ナップザックの容量は選択したアイテムと等しくなります。 したがって、これ以上アイテムを選択できません。

選択したアイテムの合計重量は 10 + 40 + 20*です。 (10/20)= 60

合計利益は 100 + 280 + 120*です。 (10/20)= 380 + 60 = 440

これが最適なソリューションです。 アイテムの異なる組み合わせを選択しても、それ以上の利益は得られません。