ファーストフィット (FF) は、ビンパッキングのオンラインアルゴリズムです。入力は、異なるサイズのアイテムのリストです。出力はパッキングです。パッキングとは、各ビンのアイテムのサイズの合計が最大で容量以下になるように、アイテムを固定容量のビンに分割することです。理想的には、ビンの数はできるだけ少なくしたいのですが、ビンの数を最小化することは NP 困難な問題です。ファーストフィットアルゴリズムは、次のヒューリスティックを使用します。
- 最初は空である、開いているビンのリストを保持します。
- 商品が到着したら、その商品が収まる
最初のビン(ある場合)を探します。
- そのようなビンが見つかった場合、新しいアイテムはその中に配置されます。
- それ以外の場合は、新しいビンが開かれ、その中に新しいアイテムが配置されます。
近似比
FF(L) は First-Fit で使用されるビンの数、OPT(L) はリスト L で可能な最適なビンの数を表します。FF(L) の分析はいくつかのステップで実行されました。
- FFの上限は1971年にUllman [1]によって初めて証明されました。
- 1972年に、この上限はGarey、Graham、Ullman、[2] Johnson、Demersによって改善されました。[3]
- 1976年にGarey、Graham、Johnson、Yao、Chi-Chih [4]によってに改良され、との整式性によりと等しくなった。
- 2010年にXiaとTan [5]が行った次の改良では、上限が まで引き下げられました。
- 最終的に、2013年に、この境界はDósaとSgallによってまで改良されました。 [6]彼らはまた、 がこの境界に一致する入力リストの例も提示しています。
以下に証明の考え方を説明します。
漸近比は最大2
漸近比が最大 2 であることの証明を次に示します。合計が 1/2 未満の FF ビンがある場合、残りのすべてのアイテムのサイズは 1/2 より大きいため、後続のすべてのビンの合計は 1/2 より大きくなります。したがって、最大 1 つを除くすべての FF ビンの合計は少なくとも 1/2 になります。すべての最適なビンの合計は最大 1 であるため、すべてのサイズの合計は最大 OPT です。したがって、FF ビンの数は最大 1+OPT/(1/2) = 2*OPT+1 です。
漸近比は最大1.75
まず、すべてのアイテムのサイズが最大で 1/2 である特殊なケースを考えます。合計が 2/3 未満の FF ビンがある場合、残りのすべてのアイテムのサイズは 1/3 より大きくなります。サイズが最大で 1/2 であるため、後続のすべてのビン (最後のビンを除く) には少なくとも 2 つのアイテムがあり、合計は 2/3 より大きくなります。したがって、最大で 1 つを除くすべての FF ビンの合計は少なくとも 2/3 であり、FF ビンの数は最大で 2+OPT/(2/3) = 3/2*OPT+1 です。
「問題のある」アイテムとは、サイズが 1/2 より大きいアイテムです。したがって、分析を改善するために、1/2 より大きいすべてのアイテムにR のボーナスを与えましょう。アイテムの重量を、そのサイズとボーナスの合計として定義します。アイテム セットの重量を、その内容の重量の合計として定義します。
ここで、1 つのアイテム (最大 1 つを除く) を含む各 FF ビンの重みは少なくとも 1/2+R であり、2 つ以上のアイテム (最大 1 つを除く) を含む各 FF ビンの重みは 2/3 です。R=1/6 とすると、すべての FF ビンの重みは少なくとも 2/3 になります。
一方、最適梱包の各ビンの重量は最大で 1+R = 7/6 です。これは、各ビンには 1/2 より大きいアイテムが最大で 1 つあるためです。したがって、すべてのアイテムの合計重量は最大で 7/6*OPT であり、FF ビンの数は最大で 2+(7/6*OPT/(2/3)) = 7/4*OPT+2 です。
漸近比は最大1.7
以下の証明は[6]から引用したものです。 : sec.1.2 入力アイテムの重みをアイテムサイズ×以下のように計算されたボーナスとして定義します。
。
漸近近似比は、次の 2 つの主張から導かれます。
- 最適な梱包では、各ビンの重量は最大で 17/12 になります。
- First-Fit パッキングでは、各ビンの平均重量は少なくとも 5/6 = 10/12 になります。
したがって、漸近的には、FF パッキング内のビンの数は最大で 17/10 * OPT である必要があります。
主張1については、合計が1以下の任意の集合Bに対して、ボーナス( B )が5/12以下であること を証明すれば十分である。実際、
- Bに 1/2 より大きい項目がない場合、1/6 より大きい項目は最大で 5 つあり、それぞれのボーナスは最大で 1/12 です。
- B に1/2 より大きいアイテムがあり、[1/3,1/2] にアイテムがない場合、(1/6,1/3) には最大で 2 つのアイテムを配置できる余地があり、それらのボーナスの合計は最大で (1/2 / 2 - 1/6) = 1/12 なので、合計ボーナスは 4/12+1/12=5/12 になります。
- B に1/2 より大きいアイテムと [1/3,1/2] 内のアイテムがある場合、1/6 より大きいサイズのアイテムを配置する余地はもうないため、合計ボーナスは再び 4/12+1/12 = 5/12 になります。
したがって、 Bの重みは最大で 1+5/12 = 17/12 になります。
クレーム2については、まず1つのアイテムを持つ FFビンBを検討します。
- sum( B )<1/2 の場合、FF の仕組みにより、Bの後に処理されるすべての項目は 1/2 より大きくなければなりません (そうでない場合は、 Bに挿入されます)。したがって、sum<1/2 となる FF ビンは最大で 1 つ存在します。
- ここで、合計( B )>1/2となる単一のアイテムを含む他のすべてのビンBについて考えます。これらのすべてのビンについて、重み( B )>1/2+1/3 = 5/6となります。
ここで、2 つ以上のアイテムを含む FF ビンBについて考えます。
- sum( B )<2/3 の場合、FF の仕組みにより、Bの後に処理されるすべての項目は 1/3 より大きくなければなりません (そうでない場合は、 Bに挿入されます)。したがって、2 つ以上の項目を含む後続のビンはすべて 2/3 より大きくなります。したがって、2 つ以上の項目があり、sum<2/3 である FF ビンは最大で 1 つ存在します。
- ここで、2 つ以上のアイテムがあり、合計が 2/3 を超える他のすべてのビンについて考えます。これらを、開かれる順序で B[1]、B[2]、...B[k] と表記します。1 、...、k内の各iについて、 B[i] の合計と B[i+1] のボーナスが少なくとも 5/6 であることを証明します。つまり、合計 (B[i]) + ボーナス (B[i+1]) ≥ 5/6 です。実際、合計 (B[i]) ≥ 5/6 の場合、不等式は自明です。それ以外の場合は、合計 (B[i]) := 1 - xとします。合計 (B[i]) が 2/3 から 5/6 の間であるため、 x は1/6 から 2/6 の間であることに注意してください。B[i+1]はB[i]の後に開かれるので、B[i+1]にはB[i]に収まらない少なくとも2つの項目、たとえばc 1とc 2が含まれます。つまり、c1,c2 > 1-sum(B[i]) = x > 1/6です。この場合、c1とc2のそれぞれのボーナスは少なくともx/2 - 1/12です。したがって、B[i+1]のボーナスは少なくともx-1/6なので、sum(B[i]) + bonus(B[i+1]) ≥ (1-x)+(x-1/6) = 5/6となります。
- 上記の不等式を連続するペアに適用すると、sum(B[1]) + bonus(B[2]) + sum(B[2]) + bonus(B[3]) + ... + sum(B[k-1]) + bonus(B[k]) ≥ 5/6*(k-1) となります。
したがって、すべての FF ビンの合計重みは少なくとも 5/6*(FF - 3) になります (ここで、合計が 1/2 未満の単一の 1 項目ビン、合計が 2/3 未満の単一の 2 項目ビン、および合計が 2/3 以上の 2 項目ビンから k-1 を減算します)。
全体として、17/12*OPT ≥ 5/6*(FF-3) となり、FF ≤ 17/10*OPT+3 となります。
DósaとSgall [6]は、 3を取り除いたより厳密な分析を提示し、FF≤17/10*OPTとなることを明らかにした。
下限
1.7OPTのパフォーマンス境界が厳しいインスタンスがあります。次の例は、次のものに基づいています。[7] [8]ビン容量は101で、
- 順序は、6 (x7)、10 (x7)、16 (x3)、34 (x10)、51 (x10) です。
- 最適なパッキングには10 個のビンが含まれます: [51+34+16] (x3)、[51+34+10+6] (x7)。すべてのビンの合計は 101 です。
- ファーストフィットパッキングには17個のビンが含まれています: [6 (x7) + 10 (x5)], [10 (x2) + 16 (x3)], [34+34] (x5)、[51] (x10)。
- ビンの合計は、92、68、68 (x5)、51 (x10) です。
- 報酬(101 に正規化)は 0、0、16.8(x5)、33.7(x10)です。
- 合計重み(101 に正規化)は、92、68、84.8(x5)、84.7(x10)です。ほぼすべての重みが 101*5/6=84.1 に近いことがわかります。
分割可能なアイテムサイズのパフォーマンス
ビンパッキングの重要な特殊なケースは、アイテムのサイズが割り切れるシーケンス(因数分解とも呼ばれる)を形成する場合です。割り切れるアイテムサイズの特殊なケースは、アイテムのサイズがすべて 2 の累乗であるコンピュータシステムのメモリ割り当てで発生します。アイテムのサイズが割り切れ、さらに最大のアイテムサイズがビンサイズを割り切る場合、FF は常に最適なパッキングを見つけます。[9] : Thm.3
改良されたファーストフィット
Refined-First-Fit(RFF)はビンパッキングのための別のオンラインアルゴリズムであり、以前に開発されたFFアルゴリズムを改良したものである。これはAndrew Chi-Chih Yaoによって発表された。[10]
アルゴリズム
アイテムは、サイズに応じて 4 つのクラスに分類されます (ビンの容量は 1 です)。
- -ピース-サイズインチ。
- -ピース-サイズインチ。
- -ピース-サイズインチ。
- -ピース-サイズインチ。
同様に、ビンは 1、2、3、4 の 4 つのクラスに分類されます。
を固定整数とします。次の項目は、次のビンに割り当てられます。
- クラス1、が- ピースの場合、
- クラス2、が - ピースの場合、
- クラス 3、任意の整数に対して、 が -ピースであるが、これまでに見た番目の-ピースではない場合。
- クラス1、 がこれまでに見た番目の作品である場合、
- クラス 4、が - ピースの場合。
アイテムのクラスが選択されると、ファーストフィットビンパッキングを使用してそのクラスのビン内に配置されます。
RFF は、現在のアイテムが (別のクラスの) 開いているビン内に収まるにもかかわらず、新しいビンを開く可能性があるため、Any-Fit アルゴリズムではないことに注意してください。
近似比
RFFは の近似保証を持つ。に対してとなるリストの族が存在する。[10]
参照
- First-Fit-Decreasing (FFD)は、First-Fit のオフライン版です。すべての入力項目を受け入れ、降順で並べ替えて、First-Fit を呼び出します。漸近近似比ははるかに優れており、1.7 ではなく約 1.222 です。
実装
- Python: prtpy パッケージには first-fit の実装が含まれています。
参考文献
- ^ Ullman, JD (1971). 「メモリ割り当てアルゴリズムのパフォーマンス」.技術レポート 100 プリンストン大学.
- ^ Garey, M. R; Graham, R. L; Ullman, JD (1972). 「メモリ割り当てアルゴリズムの最悪ケース分析」。第 4 回 ACM コンピューティング理論シンポジウム議事録 - STOC '72 。pp . 143–150。doi : 10.1145/800152.804907。S2CID 26654056。
- ^ David S. Johnson、Alan J. Demers、Jeffrey D. Ullman、MR Garey、Ronald L. Graham。単純な 1 次元パッキング アルゴリズムの最悪ケース パフォーマンス境界。SICOMP、第 3 巻、第 4 号。1974 年。
- ^ Garey, M. R; Graham, R. L; Johnson, D. S; Yao, Andrew Chi-Chih (1976). 「一般化ビンパッキングとしてのリソース制約スケジューリング」Journal of Combinatorial Theory, Series A . 21 (3): 257–298. doi : 10.1016/0097-3165(76)90001-7 . ISSN 0097-3165.
- ^ Xia, Binzhou; Tan, Zhiyi (2010年8月). 「ビンパッキング問題に対するファーストフィットアルゴリズムのより厳しい境界」.離散応用数学. 158 (15): 1668–1675. doi : 10.1016/j.dam.2010.05.026 .
- ^ abc ドーサ、ジェルジュ;スガール、ジリ (2013)。 「First Fit ビンのパッキング: 綿密な分析」。コンピュータサイエンスの理論的側面に関する第 30 回国際シンポジウム (STACS 2013)。20. Schloss Dagstuhl–Leibniz-Zentrum für Informatik: 538–549。土井:10.4230/LIPIcs.STACS.2013.538。
- ^ Garey, MR; Graham, RL; Ullman, JD (1972-05-01)。「メモリ割り当てアルゴリズムの最悪ケース分析」。第4 回 ACM コンピューティング理論シンポジウムの議事録 - STOC '72。米国ニューヨーク州: Association for Computing Machinery。pp. 143–150。doi : 10.1145 /800152.804907。ISBN 978-1-4503-7457-6. S2CID 26654056。
- ^ Johnson, DS; Demers, A.; Ullman, JD; Garey, MR; Graham, RL (1974 年 12 月)。「単純な 1 次元パッキング アルゴリズムの最悪ケース パフォーマンス境界」。SIAM Journal on Computing。3 ( 4): 299–325。doi :10.1137/0203025。ISSN 0097-5397 。
- ^ Coffman, E. G; Garey, M. R; Johnson, D. S (1987-12-01). 「分割可能なアイテムサイズによるビンパッキング」Journal of Complexity . 3 (4): 406–428. doi :10.1016/0885-064X(87)90009-4. ISSN 0885-064X.
- ^ ab Yao, Andrew Chi-Chih (1980 年 4 月). 「ビンパッキングの新しいアルゴリズム」. Journal of the ACM . 27 (2): 207–227. doi : 10.1145/322186.322187 . S2CID 7903339.
