נרמול לפי חצי הסכום, קיבולת $1$, שני תאים

PARTITION ≤p BIN-PACKING

PARTITION≤pBIN-PACKING\mathrm{PARTITION}\le_p\mathrm{BIN\text{-}PACKING}, ולכן BIN-PACKING\mathrm{BIN\text{-}PACKING} היא NP-קשה — ונשארת קשה גם כאשר מספר התאים הוא k=2k=2 קבוע.

הבנייה

הרעיון: נרמול לפי חצי הסכום. קלט של BIN-PACKING\mathrm{BIN\text{-}PACKING} הוא מספרים בקטע (0,1](0,1] ומספר תאים kk, והשאלה היא אם אפשר לחלק אותם ל-kk תאים שבכל אחד הסכום ≤1\le1. אם נחלק כל aia_i בחצי הסכום, סכום כל המספרים יהיה בדיוק 22, ואז חלוקה לשני תאים בקיבולת 11 אפשרית אם ורק אם יש חלוקה שווה.

המכשול: ייתכן aia_i ענק שאחרי הנרמול יעלה על 11 — פלט לא חוקי. אבל אם 2ai>T2a_i>T אז אין בכלל חלוקה שווה, ולכן אפשר להחזיר במקרה זה מחרוזת קבועה שאיננה בשפה.

אלגוריתם R′R'. על קלט (a1,…,an)(a_1,\dots,a_n), מספרים טבעיים (בלי הגבלת הכלליות ai>0a_i>0; אפסים אפשר להשמיט מבלי לשנות את התשובה):

  1. חשב T←∑jajT\leftarrow\sum_j a_j.
  2. אם קיים ii כך ש-2ai>T2a_i>T: החזר (34,34,34, 2)\left(\tfrac34,\tfrac34,\tfrac34,\,2\right).
  3. אחרת, לכל ii הגדר bi←2ai∑jajb_i\leftarrow\dfrac{2a_i}{\sum_j a_j}, והחזר (b1,…,bn, 2)(b_1,\dots,b_n,\,2).

התכונה המרכזית של הפלט. בשלב 3, ∑i=1nbi=∑i2aiT=2T∑iai=2T⋅T=2,\sum_{i=1}^{n}b_i=\sum_i\frac{2a_i}{T}=\frac{2}{T}\sum_i a_i=\frac{2}{T}\cdot T=2 , כאשר הוצאת 2T\frac2T מחוץ לסכום מותרת כי הוא קבוע ואינו תלוי ב-ii. כמו כן bi>0b_i>0 ו-bi≤1b_i\le1 (כי 2ai≤T2a_i\le T בשלב זה), ולכן bi∈(0,1]b_i\in(0,1] והפלט חוקי.

על הייצוג. ה-bib_i רציונליים ומיוצגים כזוג שלמים — מונה 2ai2a_i ומכנה TT — ואורך כל אחד O(m+log⁡n)O(m+\log n). אין דרישה שקלט BIN-PACKING\mathrm{BIN\text{-}PACKING} יהיה שלם; ההגדרה מדברת על מספרים בקטע (0,1](0,1].

המחשה

בנייה מודרכת

חלוקה → אריזת פחים ומחסום ה־3/2

שלב 1 מתוך 6
A′ = {3, 5, 6, 11, 39, 36}S = 100
חלוקה הממופה לפחים בקיבולת S/2 יחד עם סרגל יחס ה־3/2מלבני פריטים המשורטטים לפי גודלם ממלאים פחים בקיבולת 50 עד קו הקיבולת במופע הפתיר, ומשאירים שארית מוצללת בשלושה פחים בקיבולת 51 במופע שאינו פתיר, לצד סרגל יחסים המסומן ב־1, 11/9, 3/2, 1.7 ו־2.הפריטים משורטטים לפי גודלם356113936
מלבן פריט, גובהו פרופורציוני לערכו

נכונות — שני הכיוונים

PARTITION ∈ ⟹ BIN-PACKING ∈

נניח (a1,…,an)∈PARTITION(a_1,\dots,a_n)\in\mathrm{PARTITION}; קיימת II עם ∑i∈Iai=∑i∉Iai=T/2\sum_{i\in I}a_i=\sum_{i\notin I}a_i=T/2.

האלגוריתם הגיע לשלב 3. נניח בשלילה שהוא נעצר בשלב 2, כלומר קיים i0i_0 עם 2ai0>T2a_{i_0}>T. הצד המכיל את ai0a_{i_0} סוכם ללפחות ai0>T/2a_{i_0}>T/2 — בסתירה לכך ששני הצדדים סוכמים ל-T/2T/2 בדיוק. לכן האלגוריתם אכן הגיע לשלב 3.

האריזה. נשים את {bi}i∈I\{b_i\}_{i\in I} בתא הראשון ואת {bi}i∉I\{b_i\}_{i\notin I} בשני. סכום התא הראשון הוא ∑i∈Ibi=2T∑i∈Iai=2T⋅T2=1  ≤  1,\sum_{i\in I}b_i=\frac{2}{T}\sum_{i\in I}a_i=\frac{2}{T}\cdot\frac{T}{2}=1\;\le\;1 , ובאותו חשבון גם השני. שני התאים מקיימים את הקיבולת, והשתמשנו ב-22 תאים בדיוק. לכן (b1,…,bn,2)∈BIN-PACKING(b_1,\dots,b_n,2)\in\mathrm{BIN\text{-}PACKING}.

BIN-PACKING ∈ ⟹ PARTITION ∈

נניח שהפלט ב-BIN-PACKING\mathrm{BIN\text{-}PACKING}.

מקרה 1: האלגוריתם עצר בשלב 2. אז הפלט הוא (34,34,34,2)\left(\tfrac34,\tfrac34,\tfrac34,2\right). שלושה פריטים בגודל 34\tfrac34 אינם נכנסים לשני תאים בקיבולת 11: כל תא יכול להכיל לכל היותר פריט אחד (שכן 34+34=32>1\tfrac34+\tfrac34=\tfrac32>1), ולכן דרושים לפחות 33 תאים. אז הפלט אינו ב-BIN-PACKING\mathrm{BIN\text{-}PACKING} — סתירה להנחה. לכן מקרה זה אינו יכול להתרחש, והאלגוריתם הגיע לשלב 3.

מקרה 2: האלגוריתם הגיע לשלב 3. אז קיימת אריזה של b1,…,bnb_1,\dots,b_n לשני תאים, כל אחד בסכום ≤1\le1. נסמן ב-II את קבוצת האינדקסים שנארזו בתא הראשון. אז ∑i∈Ibi≤1וגם∑i∉Ibi≤1.\sum_{i\in I}b_i\le1\qquad\text{וגם}\qquad\sum_{i\notin I}b_i\le1 . אבל סכום כל ה-bib_i הוא בדיוק 22, ולכן ∑i∈Ibi=2−∑i∉Ibi  ≥  2−1=1.\sum_{i\in I}b_i=2-\sum_{i\notin I}b_i\;\ge\;2-1=1 . משתי אי-השוויונות ∑i∈Ibi=1\sum_{i\in I}b_i=1 בדיוק, ובאותו חשבון גם ∑i∉Ibi=1\sum_{i\notin I}b_i=1.

נתרגם חזרה: ∑i∈I2aiT=1\sum_{i\in I}\frac{2a_i}{T}=1, כלומר ∑i∈Iai=T2\sum_{i\in I}a_i=\frac{T}{2}, ולכן גם ∑i∉Iai=T−T2=T2\sum_{i\notin I}a_i=T-\frac T2=\frac T2. שני הצדדים שווים, ומכאן (a1,…,an)∈PARTITION(a_1,\dots,a_n)\in\mathrm{PARTITION}.

סיבוכיות הרדוקציה

זמןO(|x|²)
מקוםO(|x|)
גודל הפלטO(|x|)

חישוב TT עולה O(n(m+log⁡n))O(n(m+\log n)); שלב 2 הוא nn השוואות; שלב 3 הוא nn פעולות של כתיבת הזוג (2ai,T)(2a_i,T) — אין צורך בחילוק ממשי. סך הכול O(∣x∣2)O(|x|^2), ואורך הפלט O(∣x∣)O(|x|).

מה זה קונה

BIN-PACKING\mathrm{BIN\text{-}PACKING} היא NP-קשה — ובונוס מאותה הוכחה: הפלט תמיד משתמש ב-k=2k=2, ולכן הבעיה נשארת NP-קשה גם כשמספר התאים הוא קבוע. זו גם נקודת הפתיחה לחסם אי-הקירוב: אלגוריתם קירוב ביחס מוחלט טוב מ-3/23/2 היה מבחין בין OPT=2\mathrm{OPT}=2 ל-OPT=3\mathrm{OPT}=3 ולכן היה מכריע את PARTITION\mathrm{PARTITION}.

מלכודות

  • התנאי בשלב 2 חייב להיות >> ולא ≥\ge. אם ai=T/2a_i=T/2 בדיוק, אז {i}\{i\} מול המשלים היא חלוקה חוקית והקלט כן ב-PARTITION\mathrm{PARTITION} — ואילו הפלט של שלב 2 אינו ב-BIN-PACKING\mathrm{BIN\text{-}PACKING}, והרדוקציה הייתה נשברת. עם >> הכול תקין, ואף מתקיים bi=1b_i=1 במקרה הגבול, שהוא ערך חוקי.

  • למה מ-PARTITION\mathrm{PARTITION} ולא מ-SUBSET-SUM\mathrm{SUBSET\text{-}SUM}. שוב עיקרון הבעיה הקרובה: ב-PARTITION\mathrm{PARTITION} אין סכום יעד חיצוני, וגם ב-BIN-PACKING\mathrm{BIN\text{-}PACKING} אין — הקיבולת מוכתבת מבפנים. יציאה מ-SUBSET-SUM\mathrm{SUBSET\text{-}SUM} הייתה מחייבת להטמיע את SS שוב, עבודה שכבר נעשתה.

השרשרת

משמשת בהמשך ל

מאיפה זה נקרא

  • שיעור 12משפט 4: PARTITION≤pBIN-PACKING\mathrm{PARTITION} \le_p \mathrm{BIN\text{-}PACKING}
  • תרגיל מודרךbin-packing-approximation
  • 2026"בשאלה זו נוכיח כי בעיית Bin-PackingBin\text{-}Packing שראינו בשיעור היא NPNP-שלמה."