12PARTITION ו-BIN PACKING, הבעיות ההמילטוניות ו-TSP

השיעור מרחיב את אוסף הבעיות ה-NP-hard בשתי בעיות מספרים — $PARTITION$ ו-$BIN\text{-}PACKING$ — בשרשרת הרדוקציות $SUBSET\text{-}SUM \le_p PARTITION \le_p BIN\text{-}PACKING$, שבה איבר ריפוד יחיד מחושב אלגברית כדי להמיר סכום יעד שרירותי לחלוקה שווה, וממשיך לארבע הבעיות ההמילטוניות ולרדוקציה $UHC \le_p TSP$.

ביטחון: high1 הקלטות6 עמודי סיכוםpartitionbin-packingnp-hardnessreductionshamiltonian-cycletsp

נשען על: שיעור 9, שיעור 10, שיעור 11

עמודי הסיכום בכתב יד

פתיחת עמוד 1 בגודל מלא

סיבוכיות שיעור 12 Partition BinPacking.pdf

עמוד 1 מתוך 6 בסיכום הכתב יד

בקצרה

  • מרחיבים את "שק" הבעיות ה-NP-hard בשתי בעיות שעוסקות במספרים ולכן הן "קרובות משפחה" של SUBSET-SUM\mathrm{SUBSET\text{-}SUM}: PARTITION\mathrm{PARTITION} (האם אפשר לפצל רב-קבוצה של מספרים לשני חלקים שווי-סכום) ו-BIN-PACKING\mathrm{BIN\text{-}PACKING} (האם אפשר לארוז nn פריטים ב-kk תאים בעלי קיבולת 11).
  • לב השיעור הוא שרשרת הרדוקציות SUBSET-SUM≤pPARTITION≤pBIN-PACKING\mathrm{SUBSET\text{-}SUM} \le_p \mathrm{PARTITION} \le_p \mathrm{BIN\text{-}PACKING}. שני הצעדים משתמשים באותו טריק: מחשבים את הסכום הכולל ומכניסים אותו לתוך הקלט החדש — פעם אחת כאיבר ריפוד נוסף, ופעם אחת כמכנה של נרמול.
  • הליבה החישובית של הצעד הראשון היא איבר ריפוד יחיד an+1=2S−∑aia_{n+1}=2S-\sum a_i (או ∑ai−2S\sum a_i - 2S), שערכו נגזר אלגברית מהדרישה "מה עוד חסר לצד השני כדי להגיע ל-SS". הגזירה הזאת היא כל ההוכחה, ולכן היא נעשית כאן מלכתחילה ולא מוצגת כעובדה.
  • הרדוקציה השנייה מוכיחה יותר ממה שביקשנו: היא מראה ש-BIN-PACKING\mathrm{BIN\text{-}PACKING} נשארת NP-hard גם כאשר מספר התאים קבוע מראש ושווה 22 — בניגוד ל-CLIQUE\mathrm{CLIQUE} ול-IS\mathrm{IS}, שבהן קיבוע kk מפיל את הבעיה ל-P, ובדומה ל-3COL\mathrm{3COL}.
  • חוזרים לעולם הגרפים ומגדירים ארבע וריאציות המילטוניות (DHPDHP, DHCDHC, UHPUHP, UHCUHC). מציינים בלי הוכחה ש-3SAT≤pDHP\mathrm{3SAT} \le_p DHP, ומראים שכל ארבעתן שקולות פולינומית — ולכן די בארבע רדוקציות ולא ב-12.
  • הרדוקציה האחרונה בקורס לזמן הקרוב היא UHC≤pTSPUHC \le_p TSP: משלימים את הגרף לגרף מלא, נותנים משקל 11 לקשתות המקוריות ו-22 לחדשות, ושואלים על מעגל במשקל ≤∣V∣\le|V|. הבחירה ב-{1,2}\{1,2\} ולא ב-{0,1}\{0,1\} אינה מקרית והמרצה הסביר למה.
  • לאורך כל השיעור חוזרת ההבחנה שהתחילה בשיעור 11 — ערך מספר מול אורך הייצוג שלו. זו הסיבה ש"טבלת תכנון דינמי בגודל kk" אינה אלגוריתם פולינומי, וזו הסיבה שהבעיות האלה קשות למרות שהן נראות כמו חשבון פשוט.

רקע ותלויות

השיעור הזה הוא הרביעי ברצף של "אוסף בעיות NP-hard", והוא מניח שלושה דברים משיעורים קודמים.

1. רדוקציית זמן פולינומי וכיוון החץ (שיעורים 7–9). נזכיר את ההגדרה במלואה. שפה AA ניתנת לרדוקציה בזמן פולינומי לשפה BB, ומסמנים A≤pBA \le_p B, אם קיימת פונקציה ff הניתנת לחישוב בזמן פולינומי כך שלכל xx

x∈A  ⟺  f(x)∈B.x \in A \iff f(x) \in B .

כיוון החץ: הסימון A≤pBA \le_p B אומר ש-BB היא הבעיה הקשה יותר — אם היינו יודעים לפתור את BB בזמן פולינומי היינו יודעים לפתור גם את AA. בכל הרדוקציות בקובץ הזה נאמר את הכיוון גם במילים, כי בדיבור חופשי מחליפים אותו כל הזמן. שתי תכונות שבהן נשתמש: ≤p\le_p טרנזיטיבי, ואם AA היא NP-hard ו-A≤pBA \le_p B אז גם BB היא NP-hard.

2. SUBSET-SUM\mathrm{SUBSET\text{-}SUM} ושלמותה ב-NP (שיעור 11). נשתמש בתוצאה במלואה, ולכן נחזור עליה:

(a1,…,an,S)∈SUBSET-SUM  ⟺  ∃ I⊆{1,…,n}  s.t.  ∑i∈Iai=S.(a_1,\dots,a_n,S)\in \mathrm{SUBSET\text{-}SUM} \iff \exists\, I\subseteq\{1,\dots,n\}\ \text{ s.t. }\ \sum_{i\in I} a_i = S .

המספרים a1,…,an,Sa_1,\dots,a_n,S הם מספרים טבעיים הנתונים בייצוג מיקומי (המרצה אומר "בבסיס 10"), והוכח בשיעור 11 ש-VC≤pSUBSET-SUM\mathrm{VC} \le_p \mathrm{SUBSET\text{-}SUM} ולכן SUBSET-SUM\mathrm{SUBSET\text{-}SUM} היא NP-complete.

3. ההבחנה בין ערך לבין אורך ייצוג (שיעור 11). מספר aa הכתוב בבסיס 1010 תופס Θ(log⁡a)\Theta(\log a) תווים. לכן אלגוריתם שרץ בזמן O(n⋅S)O(n\cdot S) הוא פולינומי בערך SS אך מעריכי באורך הייצוג של SS, ואינו אלגוריתם פולינומי. ההבחנה הזאת חוזרת כאן פעמיים: פעם בדיון של המרצה על טבלת תכנון דינמי בגודל kk ([01:05:32]), ופעם בשאלה מה בכלל מותר לוריפייר לעשות.

4. תפקיד ה-kk בקלט (שיעור 10). בשיעור 10 ראינו ש-3COL\mathrm{3COL} נשארת NP-hard גם כאשר מספר הצבעים קבוע ואינו חלק מהקלט, בעוד שב-CLIQUE\mathrm{CLIQUE} ו-IS\mathrm{IS} קיבוע kk מראש מעביר את הבעיה ל-P (אפשר לעבור על כל (nk)=O(nk)\binom{n}{k}=O(n^k) תת-הקבוצות). ההבחנה הזאת תחזור כאן במלוא עוצמתה כשנשאל מה קורה ל-BIN-PACKING\mathrm{BIN\text{-}PACKING} עם k=2k=2 קבוע.


הגדרות

הגדרה 1: הבעיה PARTITION\mathrm{PARTITION}

קלט: nn מספרים טבעיים a1,…,ana_1,\dots,a_n, בייצוג מיקומי (בסיס 1010).

שאלה: האם קיימת קבוצת אינדקסים I⊆{1,2,…,n}I \subseteq \{1,2,\dots,n\} כך ש

∑i∈Iai  =  ∑i∉Iai  ?\sum_{i\in I} a_i \;=\; \sum_{i\notin I} a_i \;?

ניסוח שקול, שהוא זה שבו נשתמש בפועל: האם קיימת I⊆{1,…,n}I\subseteq\{1,\dots,n\} כך ש

∑i∈Iai  =  12∑i=1nai  ?\sum_{i\in I} a_i \;=\; \frac{1}{2}\sum_{i=1}^{n} a_i \;?

השקילות מיידית: אם נסמן T=∑i=1naiT=\sum_{i=1}^n a_i אז ∑i∉Iai=T−∑i∈Iai\sum_{i\notin I}a_i = T - \sum_{i\in I}a_i, והשוויון בין שני הצדדים שקול ל-∑i∈Iai=T/2\sum_{i\in I}a_i = T/2.

אינטואיציה. השאלה היא פשוט "האם אפשר לחלק את ערימת המספרים לשתי ערימות באותו משקל". זו בעיית ההוגנות הפשוטה ביותר שאפשר לנסח: שני שותפים, אוסף חפצים במשקלים ידועים, האם יש חלוקה שווה בדיוק.

למה קבוצת אינדקסים ולא תת-קבוצה של המספרים ([00:03:08]). המרצה הדגיש את הנקודה הזאת במפורש ואמר במכוון "עֲנִיָּה של מספרים" ולא "קבוצה של מספרים": איש לא הבטיח שהמספרים שונים זה מזה, ובקלט יכולות להיות חזרות. אילו היינו מדברים על תת-קבוצה של המספרים עצמם, הקלט (5,5)(5,5) היה מתמוטט לקבוצה {5}\{5\} ומאבד את המידע. לכן החלוקה נעשית תמיד על מרחב האינדקסים {1,…,n}\{1,\dots,n\}: האינדקסים כולם שונים גם כשהמספרים אינם.

דוגמה. (3,4,5,6)∈PARTITION(3,4,5,6)\in \mathrm{PARTITION}: T=18T=18, T/2=9T/2=9, ו-I={1,4}I=\{1,4\} נותנת 3+6=93+6=9 והמשלים 4+5=94+5=9.

אי-דוגמה מסוג ראשון (סכום אי-זוגי). (1,2,4)∉PARTITION(1,2,4)\notin \mathrm{PARTITION}: T=7T=7 אי-זוגי, ולכן T/2T/2 אינו שלם ואף סכום חלקי של שלמים לא יוכל להשתוות לו. זהו תנאי הכרחי שקל לבדוק ולכן הוא אינו מקל על הבעיה.

אי-דוגמה מסוג שני (איבר דומיננטי). (1,1,10)∉PARTITION(1,1,10)\notin \mathrm{PARTITION}: T=12T=12, T/2=6T/2=6, אבל a3=10>6a_3=10>6 — כל צד שמכיל את 1010 עובר את החצי. הדוגמה הזאת אינה שולית: בדיוק המקרה הזה יהפוך למקרה הראשון בטיפול של הרדוקציה הבאה.

הגדרה 2: הבעיה BIN-PACKING\mathrm{BIN\text{-}PACKING} (אריזה בתאים)

קלט: מספרים a1,…,an∈(0,1]a_1,\dots,a_n \in (0,1] ומספר טבעי k∈Nk\in\mathbb{N}.

שאלה: האם ניתן לחלק את המספרים ל-kk תאים כך שסכום המספרים בכל תא הוא לכל היותר 11?

ניסוח פורמלי (המידול המתמטי שנעשה בכיתה ב-[00:35:59]–[00:37:33]). בהגדרות הקודמות ה"קיים" היה בולט — קיימת קבוצת קודקודים, קיימת השמה, קיימת תת-קבוצת אינדקסים. כאן הוא מוסתר במילים "ניתן לחלק", וצריך לחלץ אותו. חלוקה של nn פריטים ל-kk תאים מיוצגת בנוחות המרבית כפונקציה מהאינדקסים לתאים, ולכן:

(a1,…,an,k)∈BIN-PACKING  ⟺  ∃ f:{1,…,n}→{1,…,k}   s.t.   ∀ 1≤ℓ≤k: ∑i : f(i)=ℓai≤1.(a_1,\dots,a_n,k)\in \mathrm{BIN\text{-}PACKING} \iff \exists\, f:\{1,\dots,n\}\to\{1,\dots,k\}\ \ \text{ s.t. }\ \ \forall\, 1\le \ell\le k:\ \sum_{i\,:\,f(i)=\ell} a_i \le 1 .

הביטוי {i:f(i)=ℓ}\{i : f(i)=\ell\} הוא בדיוק אוסף האינדקסים ש-ff מכניסה לתא ה-ℓ\ell, ולכן הסכום שמעליו הוא משקלו הכולל של התא ה-ℓ\ell.

אינטואיציה. יש לי מכולות בקיבולת 11 ופריטים בגדלים שברִיים; האם kk מכולות מספיקות. זו בעיה שממדלת מספר עצום של בעיות עולם אמיתי — הקצאת קבצים לדיסקים, משימות למעבדים, פרסומות לבלוקי שידור.

למה ai>0a_i > 0 ולא ai≥0a_i \ge 0 ([00:33:41]). אפסים הם מיותרים: אפשר להוציא אותם מהקלט מבלי לשנות את התשובה, שהרי אפשר לדחוס את כולם לתא כלשהו בלי להעלות שום סכום. לכן ההגדרה מוציאה אותם מראש והקטע הוא חצי-פתוח (0,1](0,1]. הקצה הימני סגור: פריט בגודל 11 בדיוק הוא קלט חוקי (הוא ממלא תא שלם לבדו).

"לכל היותר kk" מול "בדיוק kk" ([00:34:11]). שאלה טובה שעלתה בכיתה. ההבדל אינו מהותי: אם הצלחנו לארוז ב-j<kj<k תאים, ויש לנו לפחות kk פריטים, אפשר תמיד "לפתוח עוד תא" ולהעביר אליו פריט בודד — הוא בגודל ≤1\le 1 ולכן התא החדש חוקי. הניסוח עם הפונקציה ff שלמעלה תופס ממילא את "לכל היותר", שכן ff אינה נדרשת להיות על.

דוגמה. (13,13,13,12,12 ; k=2)∈BIN-PACKING\left(\tfrac13,\tfrac13,\tfrac13,\tfrac12,\tfrac12\,;\,k=2\right)\in \mathrm{BIN\text{-}PACKING}: תא אחד מקבל את שלושת השלישים (סכום 11) והשני את שני החצאים (סכום 11).

אי-דוגמה. (34,34,34 ; k=2)∉BIN-PACKING\left(\tfrac34,\tfrac34,\tfrac34\,;\,k=2\right)\notin \mathrm{BIN\text{-}PACKING}: לפי שובך היונים תא אחד יקבל לפחות שני פריטים, וסכומם 32>1\tfrac32>1. שימו לב לאי-דוגמה הזאת — היא בדיוק ה"קלט השלילי המומצא" שהרדוקציה במשפט 4 תשתמש בו.

הגדרה 3: ארבע הבעיות ההמילטוניות

נזכיר שני מושגים מקורס האלגוריתמים. מסלול המילטוני בגרף הוא מסלול העובר דרך כל קודקוד בגרף בדיוק פעם אחת. מעגל המילטוני הוא מעגל העובר דרך כל קודקוד בדיוק פעם אחת, פרט לקודקוד ההתחלה שהוא גם קודקוד הסיום וסוגר את המעגל. אפשר לשאול כל אחת מהשאלות בגרף מכוון ובגרף לא מכוון, ומכאן ארבע בעיות:

DHPDHP. קלט: גרף מכוון G=(V,E)G=(V,E). שאלה: האם קיים ב-GG מסלול המילטוני?

DHCDHC. קלט: גרף מכוון G=(V,E)G=(V,E). שאלה: האם קיים ב-GG מעגל המילטוני?

ובאופן מקביל UHPUHP ו-UHCUHC עבור גרפים לא מכוונים (ה-DD הוא directed וה-UU הוא undirected).

וריאציה עם קצוות נתונים ([01:10:55]). אפשר לנסח גם גרסה שבה הקלט כולל שני קודקודים s,ts,t ושואלים אם קיים מסלול המילטוני מ-ss ל-tt. כל הגרסאות שקולות; לא נטפל בהן בנפרד.

דוגמה. הגרף המעגלי C4C_4 (קודקודים 1,2,3,41,2,3,4 וקשתות 12,23,34,4112,23,34,41) שייך ל-UHCUHC — הוא בעצמו מעגל המילטוני.

אי-דוגמה. המסלול P4P_4 (קשתות 12,23,3412,23,34) שייך ל-UHPUHP אך לא ל-UHCUHC: לקודקודים 11 ו-44 יש דרגה 11 כל אחד, ובמעגל כל קודקוד חייב דרגה לפחות 22.

הגדרה 4: הבעיה TSPTSP (בעיית הסוכן הנוסע)

קלט: גרף מלא G=(V,E)G=(V,E), פונקציית משקלים על הקשתות w:E→[0,∞)w:E\to[0,\infty), ומספר K∈NK\in\mathbb{N}.

שאלה: האם קיים ב-GG מעגל המילטוני שמשקלו לכל היותר KK? משקלו של מעגל הוא סכום משקלי קשתותיו.

למה הגרף מלא ולמה צריך את המשקל ([01:19:56]). אם לא היינו מוסיפים משקלים, השאלה הייתה טריוויאלית: בגרף מלא על יותר משלושה קודקודים תמיד קיים מעגל המילטוני, שכן כל הקשתות קיימות ואפשר לעבור על הקודקודים בכל סדר. הקושי כולו טמון במשקל: קל למצוא מעגל, קשה למצוא מעגל זול.

האינטואיציה שנתנה לבעיה את שמה ([01:21:07]). יש nn ערים; סוכן נוסע יוצא מהמפעל, רוצה לעבור בכל אחת מהערים בדיוק פעם אחת ולחזור הביתה, במחיר נסיעה כולל של לכל היותר KK.

דוגמה. V={1,2,3,4}V=\{1,2,3,4\}, כל הקשתות במשקל 11, K=4K=4. המעגל 1 ⁣− ⁣2 ⁣− ⁣3 ⁣− ⁣4 ⁣− ⁣11\!-\!2\!-\!3\!-\!4\!-\!1 הוא המילטוני ומשקלו 4≤44\le 4, ולכן הקלט שייך ל-TSPTSP.

אי-דוגמה. אותו גרף עם K=3K=3: כל מעגל המילטוני על 44 קודקודים מכיל בדיוק 44 קשתות, ולכן משקלו לפחות 4>34>3.

הערה מקדימה על אופטימיזציה ([01:22:12]). TSPTSP היא הגשר לנושא הבא בקורס: גרסת האופטימיזציה שלה אינה מקבלת KK אלא מבקשת את המעגל הזול ביותר. ההגדרה שלמעלה היא גרסת ההכרעה, וזו הגרסה היחידה שעליה NP-hardness מוגדרת פורמלית, מפני שהיא מוגדרת באמצעות רדוקציות בין שפות.


משפטים והוכחות

משפט 1: PARTITION∈NP\mathrm{PARTITION} \in \mathrm{NP}

טענה. PARTITION∈NP\mathrm{PARTITION} \in \mathrm{NP}.

הוכחה (שתי הדרכים שנאמרו בכיתה, [00:03:40]–[00:04:45]).

דרך א — מכונה אי-דטרמיניסטית. על קלט (a1,…,an)(a_1,\dots,a_n) המכונה בוחרת באופן אי-דטרמיניסטי תת-קבוצה I⊆{1,…,n}I\subseteq\{1,\dots,n\} (כלומר, nn צעדים אי-דטרמיניסטיים, בכל אחד "בפנים/בחוץ"), מחשבת את שני הסכומים ומקבלת אם ורק אם הם שווים. חישוב שני הסכומים הוא O(n)O(n) חיבורים של מספרים באורך לכל היותר אורך הקלט, ולכן זמן פולינומי. לפי ההגדרה של NP\mathrm{NP} כמחלקת השפות המוכרעות בזמן פולינומי אי-דטרמיניסטי, PARTITION∈NP\mathrm{PARTITION}\in \mathrm{NP}.

דרך ב — verifier. ה-certificate הוא II עצמה, מקודדת כמחרוזת nn ביטים — אורך nn, בוודאי פולינומי באורך הקלט. הוריפייר קורא את II, מחשב את שני הסכומים ומשווה. זמן פולינומי. ■\blacksquare

הערה: המרצה עצר את השיעור על ניסוח ([00:03:40]): אין לומר "מגרילים" קבוצה, וגם לא "מנחשים". המילה הנכונה היא "בוחרים באופן אי-דטרמיניסטי". הגרלה שייכת לאלגוריתמים אקראיים, שבהם הבחירה נעשית לפי התפלגות ולאלגוריתם יש הסתברות טעות; אי-דטרמיניזם הוא דבר אחר לגמרי — הוא קבלה אם קיים ריצה מקבלת. הבלבול בין השניים הוא מקור טעויות קבוע במבחנים.

משפט 2 (לב השיעור): SUBSET-SUM≤pPARTITION\mathrm{SUBSET\text{-}SUM} \le_p \mathrm{PARTITION}, ולכן PARTITION\mathrm{PARTITION} היא NP-hard

כיוון הרדוקציה במילים. נראה שאם היה בידינו אלגוריתם פולינומי ל-PARTITION\mathrm{PARTITION}, היינו יכולים לפתור בעזרתו את SUBSET-SUM\mathrm{SUBSET\text{-}SUM} בזמן פולינומי. כלומר PARTITION\mathrm{PARTITION} היא הבעיה הקשה יותר מבין השתיים, ומכיוון ש-SUBSET-SUM\mathrm{SUBSET\text{-}SUM} היא NP-hard (שיעור 11), גם PARTITION\mathrm{PARTITION} היא NP-hard.

למה דווקא מ-SUBSET-SUM\mathrm{SUBSET\text{-}SUM} ([00:05:16]–[00:05:47], [00:29:19]–[00:30:24])

בכיתה הוצע לעשות רדוקציה מ-SAT\mathrm{SAT}. המרצה קיבל שזה אפשרי — כל בעיה NP-complete ניתנת לרדוקציה לכל בעיה NP-complete אחרת — אבל דחה את זה כבחירה: "לקודד נוסחה בעזרת קבוצה של מספרים" זו עבודה מיותרת. העיקרון שהוא ניסח: מעבירים בין בעיות מאותו עולם. כאן הקלט מספרים והפלט מספרים, ולכן אפשר לעבור מסכום בפלט לסכום בקלט ובחזרה בלי לתרגם עולמות. רדוקציות שעוברות בין עולמות (כמו VC≤pSUBSET-SUM\mathrm{VC} \le_p \mathrm{SUBSET\text{-}SUM} משיעור 11) הן היפות יותר — אבל כשבונים רדוקציה בפועל, מעדיפים את הבעיה הקרובה ביותר.

הגזירה: מהיכן בא איבר הריפוד

זהו החלק שאסור לדלג עליו. הרעיון: ב-SUBSET-SUM\mathrm{SUBSET\text{-}SUM} יש סכום יעד חיצוני SS, וב-PARTITION\mathrm{PARTITION} אין — הסכום היעד מוכתב מבפנים והוא בהכרח חצי מהסכום הכולל. הרדוקציה חייבת "להטמיע את ה-SS פנימה" ([00:06:51]).

נסמן T=∑i=1naiT=\sum_{i=1}^n a_i. נניח לרגע — רק לצורך החשיבה, לא כחלק מהאלגוריתם — שקיימת II עם ∑i∈Iai=S\sum_{i\in I}a_i=S, ונשאל מה חסר. הצד השני של החלוקה סוכם ל-T−ST-S. אנחנו רוצים ששני הצדדים יסתכמו לאותו דבר, ולכן נוסיף איבר bb לצד ה"קטן". במקרה S>T/2S>T/2 הצד הקטן הוא המשלים, ולכן נדרוש:

∑i∈Iai=S,∑i∉Iai+b=S.\sum_{i\in I} a_i = S, \qquad \sum_{i\notin I} a_i + b = S .

מכאן

b  =  S−∑i∉Iai  =  S−(∑i=1nai⏟= T−∑i∈Iai⏟= S)  =  S−T+S  =  2S−T.b \;=\; S-\sum_{i\notin I} a_i \;=\; S-\Big(\underbrace{\sum_{i=1}^{n} a_i}_{=\,T}-\underbrace{\sum_{i\in I} a_i}_{=\,S}\Big) \;=\; S-T+S \;=\; 2S-T .

וכאן נמצא כל היופי ([00:12:16]–[00:13:20]). הביטוי האמצעי S−∑i∉IaiS-\sum_{i\notin I}a_i הוא בלתי ניתן לחישוב על ידי הרדוקציה: הוא תלוי ב-II, ו-II הוא בדיוק האובייקט שאין לנו ושאותו אנחנו לא מחפשים. אבל הביטוי הסופי 2S−T2S-T תלוי אך ורק בקלט — SS ניתן לנו, ו-TT מחושב בזמן לינארי. שאלת הביניים "מה bb?" עברה מ"תלוי בפתרון" ל"תלוי בקלט", ובזה הרדוקציה הפכה לחוקית.

באופן סימטרי, אם S<T/2S<T/2 הצד הקטן הוא II עצמה, ואז נדרוש ∑i∈Iai+b=∑i∉Iai\sum_{i\in I}a_i + b = \sum_{i\notin I}a_i, כלומר S+b=T−SS+b=T-S ומכאן

b  =  T−2S.b \;=\; T-2S .

בשני המקרים b>0b>0 ממש, בדיוק בגלל תנאי המקרה. וכאשר S=T/2S=T/2 אין מה לרפד.

הערה: בהרצאה ההצדקה למה bb חייב להיות חיובי לא נאמרה במפורש; היא נחוצה כדי שהפלט יהיה קלט חוקי של PARTITION\mathrm{PARTITION} מעל המספרים הטבעיים, והיא נובעת ישירות מתנאי המקרה: S>T/2⇒2S−T>0S>T/2 \Rightarrow 2S-T>0, ו-S<T/2⇒T−2S>0S<T/2 \Rightarrow T-2S>0.

הרדוקציה

אלגוריתם RR. על קלט (a1,…,an,S)(a_1,\dots,a_n,S) — מספרים טבעיים בבסיס 1010:

  1. חשב T←∑i=1naiT \leftarrow \sum_{i=1}^{n} a_i.
  2. אם 2S=T2S = T (כלומר S=12TS=\tfrac12 T): החזר (a1,…,an)(a_1,\dots,a_n) ללא שינוי.
  3. אם 2S>T2S > T (כלומר S>12TS>\tfrac12 T): החזר (a1,…,an, 2S−T)(a_1,\dots,a_n,\,2S-T).
  4. אם 2S<T2S < T (כלומר S<12TS<\tfrac12 T): החזר (a1,…,an, T−2S)(a_1,\dots,a_n,\,T-2S).

הערה: בסיכום ובהרצאה ההשוואה נכתבת כ-SS מול 12∑ai\tfrac12\sum a_i. כאן היא נכתבת כ-2S2S מול TT כדי להישאר בשלמים גם כאשר TT אי-זוגי; זו אותה השוואה בדיוק. שימו לב שכאשר TT אי-זוגי מקרה 2 פשוט אינו יכול להתרחש, ובכל אחד משני המקרים האחרים האיבר המוסף עדיין שלם.

הערה קריטית על מה שהרדוקציה עושה ואיננה עושה ([00:08:29], [00:21:06]–[00:22:11]). האלגוריתם מחשב את TT ומשווה אותו ל-2S2S — וזה בסדר גמור, זו פעולה חשבונית פשוטה. הוא אינו בודק אם קיימת תת-קבוצה שסכומה SS, ואינו יכול. ההבחנה הזאת עלתה כשאלה מהכיתה: "אז החזרנו מספר שעוזר לנו לפתור?" והתשובה הייתה נחרצת — לא. האיבר an+1a_{n+1} אינו מסייע במאום להכריע את השאלה; הוא מבטיח רק את המשפט "אם היה פתרון קודם, יש פתרון עכשיו, ולהפך". רדוקציה לעולם אינה באה להכריע את הבעיה.

עוד אי-הבנה שתוקנה בכיתה ([00:14:53]): הרדוקציה אינה מחזירה זוג מהצורה (מספרים, סכום יעד). הפלט הוא רשימה של n+1n+1 מספרים בלבד, כי כזה בדיוק הוא קלט של PARTITION\mathrm{PARTITION}. איש לא הבטיח ש-nn יישאר קבוע.

ניתוח זמן ריצה

נסמן ב-mm את אורך הייצוג הארוך ביותר מבין a1,…,an,Sa_1,\dots,a_n,S, ובגודל הקלט ∣x∣≥n+m|x|\ge n+m.

  • שלב 1 מבצע n−1n-1 חיבורים. הסכום החלקי אינו עולה על n⋅10mn\cdot 10^m ולכן אורכו לכל היותר m+⌈log⁡10n⌉+1m+\lceil\log_{10}n\rceil+1. חיבור אחד עולה זמן לינארי באורכים, ולכן שלב 1 עולה O ⁣(n (m+log⁡n))=O(∣x∣2)O\!\left(n\,(m+\log n)\right) = O(|x|^2).
  • שלב 2 הוא השוואה אחת (2S2S הוא הזזה/הכפלה ב-22, זמן לינארי).
  • שלבים 3–4 הם חיסור אחד, זמן לינארי.
  • הכתיבה של הפלט: n+1n+1 מספרים, כל אחד באורך O(m+log⁡n)O(m+\log n).

סך הכול O(∣x∣2)O(|x|^2) — פולינומי בגודל הקלט. חשוב לשים לב שזמן הריצה נמדד באורך הייצוג ולא בערך המספרים: לו היינו צריכים לספור עד TT הרדוקציה לא הייתה פולינומית.

אורך הפלט הוא O(∣x∣)O(|x|); זה חשוב לטרנזיטיביות של ≤p\le_p (רדוקציה שמנפחת את הקלט מעריכית אינה שמישה בהרכבה).

נכונות, כיוון ראשון: (a1,…,an,S)∈SUBSET-SUM⇒R(x)∈PARTITION(a_1,\dots,a_n,S)\in \mathrm{SUBSET\text{-}SUM} \Rightarrow R(x)\in \mathrm{PARTITION}

יהיו a1,…,an,Sa_1,\dots,a_n,S ונניח (a1,…,an,S)∈SUBSET-SUM(a_1,\dots,a_n,S)\in \mathrm{SUBSET\text{-}SUM}. אז קיימת I⊆{1,…,n}I\subseteq\{1,\dots,n\} כך ש-∑i∈Iai=S\sum_{i\in I}a_i=S. נפצל לשלושה מקרים.

מקרה 2 (זה שהוצג בהרצאה, [00:19:23]–[00:21:06]): 2S>T2S>T. נסמן an+1=2S−Ta_{n+1}=2S-T. האלגוריתם מחזיר (a1,…,an+1)(a_1,\dots,a_{n+1}). הסכום הכולל של הפלט הוא

∑i=1n+1ai  =  T+(2S−T)  =  2S,\sum_{i=1}^{n+1} a_i \;=\; T + (2S-T) \;=\; 2S,

ולכן חצי הסכום הוא בדיוק SS. עבור אותה II עצמה (שהיא תת-קבוצה של {1,…,n}⊆{1,…,n+1}\{1,\dots,n\}\subseteq\{1,\dots,n+1\}) מתקיים

∑i∈Iai  =  S  =  12∑i=1n+1ai,\sum_{i\in I} a_i \;=\; S \;=\; \frac{1}{2}\sum_{i=1}^{n+1} a_i ,

ולכן גם ∑i∉Iai=2S−S=S\sum_{i\notin I}a_i = 2S-S = S. מצאנו חלוקה שווה, ומכאן (a1,…,an+1)∈PARTITION(a_1,\dots,a_{n+1})\in \mathrm{PARTITION}.

מקרה 1: 2S=T2S=T. האלגוריתם מחזיר את הקלט כפי שהוא. חצי הסכום הוא T/2=ST/2=S, ואותה II מקיימת ∑i∈Iai=S=12∑i=1nai\sum_{i\in I}a_i=S=\tfrac12\sum_{i=1}^n a_i. מכאן (a1,…,an)∈PARTITION(a_1,\dots,a_n)\in \mathrm{PARTITION}.

מקרה 3: 2S<T2S<T. נסמן an+1=T−2S>0a_{n+1}=T-2S>0. הסכום הכולל של הפלט הוא T+(T−2S)=2(T−S)T+(T-2S)=2(T-S), וחציו T−ST-S. הפעם ניקח את המשלים J={1,…,n}∖IJ=\{1,\dots,n\}\setminus I כצד אחד:

∑i∈Jai  =  T−S  =  12∑i=1n+1ai.\sum_{i\in J} a_i \;=\; T-S \;=\; \frac{1}{2}\sum_{i=1}^{n+1}a_i .

מכאן (a1,…,an+1)∈PARTITION(a_1,\dots,a_{n+1})\in \mathrm{PARTITION}.

הערה: בהרצאה נאמר "מקרים 1 ו-3 לבית" ([00:28:47]); הם נכתבים כאן במלואם. שימו לב שמקרה 3 אינו העתקה מילולית של מקרה 2 — בו הצד ה"טוב" הוא המשלים של II ולא II עצמה, וזו בדיוק הנקודה שבה סטודנטים נופלים.

נכונות, כיוון שני: R(x)∈PARTITION⇒(a1,…,an,S)∈SUBSET-SUMR(x)\in \mathrm{PARTITION} \Rightarrow (a_1,\dots,a_n,S)\in \mathrm{SUBSET\text{-}SUM}

הערה מתודית שנאמרה בכיתה ובצדק ([00:24:27]–[00:25:28]). כשמוכיחים את הכיוון הזה, יש בידינו שני דברים בו-זמנית: הקלט המקורי (a1,…,an,S)(a_1,\dots,a_n,S), שממנו התחלנו, וגם הפלט של האלגוריתם. אין צורך "לשחזר" את הקלט מן הפלט. בפרט יש לנו גישה חופשית ל-SS ול-aia_i בתוך ההוכחה, למרות שלאלגוריתם עצמו לא הייתה גישה לשום פתרון. זה מקור בלבול קבוע.

מקרה 2: 2S>T2S>T. הפלט הוא (a1,…,an,an+1)(a_1,\dots,a_n,a_{n+1}) עם an+1=2S−Ta_{n+1}=2S-T, וסכומו הכולל 2S2S. נניח שהפלט שייך ל-PARTITION\mathrm{PARTITION}. אז קיימת J⊆{1,…,n+1}J\subseteq\{1,\dots,n+1\} כך ש

∑i∈Jai  =  ∑i∉Jai  =  12⋅2S  =  S.\sum_{i\in J} a_i \;=\; \sum_{i\notin J} a_i \;=\; \frac{1}{2}\cdot 2S \;=\; S .

עכשיו מגיע הצעד שהודגש בכיתה ([00:27:03]): איננו יכולים להחזיר את JJ כפתרון של SUBSET-SUM\mathrm{SUBSET\text{-}SUM}, כי ייתכן ש-n+1∈Jn+1\in J ואז JJ אינה תת-קבוצה של {1,…,n}\{1,\dots,n\}. הפתרון: בלי הגבלת הכלליות n+1∉Jn+1\notin J, שכן אם n+1∈Jn+1\in J נחליף את JJ במשלים שלה J‾={1,…,n+1}∖J\overline{J}=\{1,\dots,n+1\}\setminus J. זה חוקי בדיוק מפני ש-PARTITION\mathrm{PARTITION} סימטרית: שני הצדדים מסתכמים לאותו מספר SS, ולכן המשלים הוא פתרון תקף באותה מידה, והאיבר n+1n+1 נמצא באחד משני הצדדים בלבד.

לאחר ההחלפה, J⊆{1,…,n}J\subseteq\{1,\dots,n\} ומתקיים ∑i∈Jai=S\sum_{i\in J}a_i=S. לפי ההגדרה, (a1,…,an,S)∈SUBSET-SUM(a_1,\dots,a_n,S)\in \mathrm{SUBSET\text{-}SUM}.

מקרה 1: 2S=T2S=T. הפלט הוא הקלט עצמו וסכומו T=2ST=2S. אם קיימת J⊆{1,…,n}J\subseteq\{1,\dots,n\} עם ∑i∈Jai=12T=S\sum_{i\in J}a_i=\tfrac12 T=S, זו בדיוק עדות ל-SUBSET-SUM\mathrm{SUBSET\text{-}SUM}. (כאן לא צריך טיעון משלים, שכן לא נוסף איבר.)

מקרה 3: 2S<T2S<T. הפלט הוא (a1,…,an,T−2S)(a_1,\dots,a_n,T-2S) וסכומו 2(T−S)2(T-S), כך שכל צד מסתכם ל-T−ST-S. תהי JJ צד של חלוקה שווה; בלי הגבלת הכלליות n+1∉Jn+1\notin J (אחרת נעבור למשלים, כמו קודם), ולכן J⊆{1,…,n}J\subseteq\{1,\dots,n\} ומתקיים ∑i∈Jai=T−S\sum_{i\in J}a_i=T-S. נגדיר I={1,…,n}∖JI=\{1,\dots,n\}\setminus J; אז

∑i∈Iai  =  T−∑i∈Jai  =  T−(T−S)  =  S,\sum_{i\in I} a_i \;=\; T-\sum_{i\in J} a_i \;=\; T-(T-S) \;=\; S ,

ולכן (a1,…,an,S)∈SUBSET-SUM(a_1,\dots,a_n,S)\in \mathrm{SUBSET\text{-}SUM}. ■\blacksquare

מסקנה. RR היא רדוקציה בזמן פולינומי מ-SUBSET-SUM\mathrm{SUBSET\text{-}SUM} ל-PARTITION\mathrm{PARTITION}. מכיוון ש-SUBSET-SUM\mathrm{SUBSET\text{-}SUM} היא NP-hard (שיעור 11), גם PARTITION\mathrm{PARTITION} היא NP-hard, ויחד עם משפט 1 — PARTITION\mathrm{PARTITION} היא NP-complete.

משפט 3: BIN-PACKING∈NP\mathrm{BIN\text{-}PACKING} \in \mathrm{NP}

טענה. BIN-PACKING∈NP\mathrm{BIN\text{-}PACKING} \in \mathrm{NP}.

הוכחה. ה-certificate הוא הפונקציה ff עצמה, מקודדת כרשימה של nn ערכים f(1),…,f(n)f(1),\dots,f(n), כל אחד באורך O(log⁡k)O(\log k) ביטים — סך הכול O(nlog⁡k)O(n\log k), פולינומי באורך הקלט. הוריפייר סורק את הרשימה, צובר עבור כל תא את סכום הפריטים שהוקצו אליו, ומוודא שכל סכום הוא ≤1\le 1. לחלופין, מכונה אי-דטרמיניסטית בוחרת את ff באופן אי-דטרמיניסטי ומוודאת. ■\blacksquare

הערה: בהרצאה ([00:37:33]–[00:39:04]) הווידוא תואר כמעבר על ℓ=1,…,k\ell=1,\dots,k. זה מדויק רק אם kk אינו גדול מדי — וזו בדיוק הנקודה שהמרצה עצמו הדגיש ב-[01:05:32]: kk נכתב בייצוג מיקומי ולכן ערכו יכול להיות מעריכי באורך הקלט, ולולאה באורך kk תהיה מעריכית. שני תיקונים אפשריים, ושניהם נכונים: (א) לסרוק רק את התאים שאליהם הוקצה לפחות פריט אחד — לכל היותר nn תאים; (ב) להבחין שאפשר להניח בלי הגבלת הכלליות k≤nk\le n, שכן אם k≥nk\ge n ניתן להכניס כל פריט לתא נפרד וכל תא מסתכם ל-ai≤1a_i\le 1, ולכן הקלט הוא בהכרח כן-קלט. בשני התיקונים הווידוא הוא פולינומי, וכך גם הקידוד של ה-certificate.

משפט 4: PARTITION≤pBIN-PACKING\mathrm{PARTITION} \le_p \mathrm{BIN\text{-}PACKING}, ולכן BIN-PACKING\mathrm{BIN\text{-}PACKING} היא NP-hard

כיוון הרדוקציה במילים. אלגוריתם פולינומי ל-BIN-PACKING\mathrm{BIN\text{-}PACKING} היה נותן לנו אלגוריתם פולינומי ל-PARTITION\mathrm{PARTITION}; BIN-PACKING\mathrm{BIN\text{-}PACKING} היא הקשה מבין השתיים.

למה מ-PARTITION\mathrm{PARTITION} ולא מ-SUBSET-SUM\mathrm{SUBSET\text{-}SUM} ([00:39:47]–[00:41:21])

השאלה נשאלה בכיתה. התשובה: PARTITION\mathrm{PARTITION} היא בדיוק "חלוקה לשני תאים". הבעיה הקטנה ביותר של אריזה בתאים היא k=2k=2, וב-PARTITION\mathrm{PARTITION} סכום היעד קבוע מראש לחצי — כלומר, ה-SS כבר "נבלע" בתוך הבעיה. מ-SUBSET-SUM\mathrm{SUBSET\text{-}SUM} אפשר לעשות רדוקציה, אבל אז צריך לשלב את SS בעצמנו, ו-kk עלול לצאת תלוי בערכי המספרים; והרי מספר התאים מופיע בתיאור הפונקציה ff, ולכן kk גדול מדי היה מנפח את הפלט. המרצה הדגיש: בחירת בעיה אחרת אינה שגויה, היא פשוט פחות פשוטה.

הרעיון: נרמול לפי חצי הסכום ([00:43:26])

אנחנו מקבלים מספרים טבעיים שיכולים להיות עצומים, וצריכים להוציא מספרים ב-(0,1](0,1]. הדבר המתבקש הוא לחלק בקבוע. באיזה קבוע? נסמן T=∑j=1najT=\sum_{j=1}^n a_j. אם נחלק ב-TT נקבל סכום כולל 11 — אפשר לדחוס הכול לתא אחד, והבעיה נעשית טריוויאלית. אם נחלק ב-T/2T/2 נקבל סכום כולל 22 בדיוק, וכעת אריזה ב-22 תאים בעלי קיבולת 11 אפשרית אם ורק אם מתחלקים בדיוק 11 ו-11 — לא נשאר שום מרווח. הצמידות המוחלטת הזאת היא מנוע הרדוקציה.

המכשול והטיפול בו ([00:44:31]–[00:46:45])

הנרמול bi=aiT/2=2aiTb_i = \dfrac{a_i}{T/2} = \dfrac{2a_i}{T} מייצר קלט חוקי רק אם bi≤1b_i \le 1 לכל ii, כלומר רק אם ai≤T/2a_i \le T/2 לכל ii. אם קיים ii עם ai>T/2a_i > T/2, הנרמול נכשל — אבל במקרה הזה אנחנו יודעים בוודאות שהקלט אינו ב-PARTITION\mathrm{PARTITION}, שכן כל צד שמכיל את aia_i עובר את החצי. זהו מקרה פרטי שקל לזהות בזמן פולינומי (השוואה אחת אחרי חישוב TT), ולכן מותר לנו במקרה הזה להחזיר קלט שלילי מומצא כלשהו של BIN-PACKING\mathrm{BIN\text{-}PACKING}. הקלט שנבחר הוא (34,34,34, 2)\left(\tfrac34,\tfrac34,\tfrac34,\,2\right), שאינו ב-BIN-PACKING\mathrm{BIN\text{-}PACKING} מטעמי שובך יונים.

הרדוקציה

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

  1. חשב T←∑j=1najT \leftarrow \sum_{j=1}^{n} a_j.
  2. אם קיים 1≤i≤n1\le i\le n כך ש-2ai>T2a_i > T: החזר (34,34,34, 2)\left(\tfrac34,\tfrac34,\tfrac34,\,2\right).
  3. אחרת, לכל 1≤i≤n1\le i\le n הגדר bi←2ai∑j=1najb_i \leftarrow \dfrac{2a_i}{\sum_{j=1}^{n} a_j}, והחזר (b1,…,bn, 2)(b_1,\dots,b_n,\,2).

הערה: התנאי בשלב 2 נכתב בסיכום (עמוד 2) עם ≥\ge ובהקלטה נאמר "גדול מ" ([00:44:31]). האי-שוויון החד הוא הנכון: אם ai=T/2a_i = T/2 בדיוק, אז {i}\{i\} מול המשלים היא חלוקה חוקית, הקלט כן ב-PARTITION\mathrm{PARTITION}, ואילו הפלט של שלב 2 אינו ב-BIN-PACKING\mathrm{BIN\text{-}PACKING} — הרדוקציה הייתה נשברת. עם >> הכול תקין, ואף מתקיים bi≤1b_i\le 1 במקרה הגבול ai=T/2a_i=T/2 שנותן bi=1b_i=1, שהוא ערך חוקי.

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

התכונה המרכזית של הפלט

בשלב 3 מתקיים

∑i=1nbi  =  ∑i=1n2ai∑j=1naj  =  2∑j=1naj∑i=1nai  =  2T⋅T  =  2,\sum_{i=1}^{n} b_i \;=\; \sum_{i=1}^{n}\frac{2a_i}{\sum_{j=1}^n a_j} \;=\; \frac{2}{\sum_{j=1}^n a_j}\sum_{i=1}^{n} a_i \;=\; \frac{2}{T}\cdot T \;=\; 2 ,

כאשר ההוצאה של 2T\frac{2}{T} מחוץ לסכום מותרת כי הוא קבוע ואינו תלוי ב-ii. כמו כן bi>0b_i>0 (כי ai>0a_i>0) ו-bi≤1b_i\le 1 (כי 2ai≤T2a_i\le T בשלב זה), ולכן bi∈(0,1]b_i\in(0,1] והפלט הוא קלט חוקי.

ניתוח זמן ריצה

חישוב 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|).

נכונות, כיוון ראשון: (a1,…,an)∈PARTITION⇒R′(x)∈BIN-PACKING(a_1,\dots,a_n)\in \mathrm{PARTITION} \Rightarrow R'(x)\in \mathrm{BIN\text{-}PACKING}

נניח (a1,…,an)∈PARTITION(a_1,\dots,a_n)\in \mathrm{PARTITION}: קיימת I⊆{1,…,n}I\subseteq\{1,\dots,n\} עם

∑i∈Iai  =  ∑i∉Iai  =  12∑j=1naj  =  T2.\sum_{i\in I} a_i \;=\; \sum_{i\notin I} a_i \;=\; \frac{1}{2}\sum_{j=1}^n a_j \;=\; \frac{T}{2}.

קודם כול נראה שהאלגוריתם לא נכנס לשלב 2. לכל 1≤i≤n1\le i\le n, האיבר aia_i שייך לאחד משני הצדדים, וסכום הצד כולו הוא T/2T/2; מכיוון שכל האיברים אי-שליליים, ai≤T/2a_i \le T/2, כלומר 2ai≤T2a_i\le T. לכן התנאי בשלב 2 אינו מתקיים לאף ii, והפלט הוא (b1,…,bn,2)(b_1,\dots,b_n,2).

עכשיו נבנה אריזה. נכניס לתא הראשון את כל האיברים שהאינדקס שלהם ב-II, ולתא השני את כל השאר. (מכיוון שיש רק שני תאים, אפשר לתאר חלוקה בעזרת תת-קבוצה של אינדקסים במקום בעזרת פונקציה ff — הן מייצגות אותו דבר, [00:57:27].) אז

∑i∈Ibi  =  ∑i∈I2ai∑j=1naj  =  2T∑i∈Iai  =  2T⋅T2  =  1  ≤  1,\sum_{i\in I} b_i \;=\; \sum_{i\in I}\frac{2a_i}{\sum_{j=1}^n a_j} \;=\; \frac{2}{T}\sum_{i\in I} a_i \;=\; \frac{2}{T}\cdot\frac{T}{2} \;=\; 1 \;\le\; 1,

ובאופן זהה ∑i∉Ibi=1≤1\sum_{i\notin I} b_i = 1 \le 1. שני התאים חוקיים, ולכן (b1,…,bn,2)∈BIN-PACKING(b_1,\dots,b_n,2)\in \mathrm{BIN\text{-}PACKING}.

נכונות, כיוון שני: R′(x)∈BIN-PACKING⇒(a1,…,an)∈PARTITIONR'(x)\in \mathrm{BIN\text{-}PACKING} \Rightarrow (a_1,\dots,a_n)\in \mathrm{PARTITION}

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

שלב א — זיהוי איזה ענף של האלגוריתם רץ ([01:00:12]–[01:01:17]). הפלט של שלב 2 הוא (34,34,34,2)\left(\tfrac34,\tfrac34,\tfrac34,2\right), והוא אינו ב-BIN-PACKING\mathrm{BIN\text{-}PACKING}: יש שלושה פריטים ושני תאים, ולכן לפי שובך היונים תא אחד מקבל לפחות שניים מהם, וסכומם 32>1\tfrac32>1. מכיוון שהפלט כן ב-BIN-PACKING\mathrm{BIN\text{-}PACKING}, האלגוריתם בהכרח לא עבר בשלב 2, ולכן הפלט הוא (b1,…,bn,2)(b_1,\dots,b_n,2) עם bi=2aiTb_i=\frac{2a_i}{T}.

שלב ב — מסקנה על החלוקה. מכיוון ש-k=2k=2, קיימת I⊆{1,…,n}I\subseteq\{1,\dots,n\} (התא הראשון) כך ש

∑i∈Ibi≤1\sum_{i\in I} b_i \le 1

וגם

∑i∉Ibi≤1.\sum_{i\notin I} b_i \le 1 .

אבל ראינו ש-∑i=1nbi=2\sum_{i=1}^n b_i = 2 בדיוק. אילו אחד משני הסכומים היה קטן ממש מ-11, סכומם היה קטן ממש מ-22 — סתירה. לכן שני הסכומים שווים ל-11 בדיוק. זו הנקודה שבה "הצמידות" של הבנייה משתלמת.

שלב ג — חזרה לקלט. מהשוויון ∑i∈Ibi=1\sum_{i\in I} b_i = 1 נקבל

1  =  ∑i∈I2aiT  =  2T∑i∈Iai⟹∑i∈Iai  =  T2  =  12∑j=1naj.1 \;=\; \sum_{i\in I}\frac{2a_i}{T} \;=\; \frac{2}{T}\sum_{i\in I} a_i \quad\Longrightarrow\quad \sum_{i\in I} a_i \;=\; \frac{T}{2} \;=\; \frac{1}{2}\sum_{j=1}^{n} a_j .

זו בדיוק ההגדרה של PARTITION\mathrm{PARTITION}, ולכן (a1,…,an)∈PARTITION(a_1,\dots,a_n)\in \mathrm{PARTITION}. ■\blacksquare

מסקנה. PARTITION≤pBIN-PACKING\mathrm{PARTITION} \le_p \mathrm{BIN\text{-}PACKING}; לפי משפט 2 ולפי הטרנזיטיביות של ≤p\le_p מתקבל SUBSET-SUM≤pBIN-PACKING\mathrm{SUBSET\text{-}SUM} \le_p \mathrm{BIN\text{-}PACKING}, ולכן BIN-PACKING\mathrm{BIN\text{-}PACKING} היא NP-hard. יחד עם משפט 3 — היא NP-complete.

משפט 5 (בונוס של אותה הוכחה): BIN-PACKING\mathrm{BIN\text{-}PACKING} נשארת NP-hard גם כאשר k=2k=2 קבוע

טענה. תהי BIN-PACKING2\mathrm{BIN\text{-}PACKING}_2 הבעיה שקלטה a1,…,an∈(0,1]a_1,\dots,a_n\in(0,1] בלבד והשאלה היא אם ניתן לארוז אותם בשני תאים בעלי קיבולת 11. אז BIN-PACKING2\mathrm{BIN\text{-}PACKING}_2 היא NP-hard.

הוכחה. אותו אלגוריתם R′R' בדיוק, למעט שאינו מדפיס את ה-22 בסוף — כי 22 אינו חלק מהקלט של הבעיה החדשה. כל שלבי ההוכחה של משפט 4 עוברים מילה במילה, שכן בשום שלב לא השתמשנו ב-kk אלא כמספר קבוע. ■\blacksquare

למה זה מעניין ([00:48:20]–[00:53:44]). הרדוקציה שבנינו שולחת את כל הקלטים לתת-קבוצה מאוד צרה של מרחב הקלטים של BIN-PACKING\mathrm{BIN\text{-}PACKING} — רק כאלה שבהם k=2k=2. המרצה נתן את התמונה הכללית: אם AA ניתנת לרדוקציה ל-BB אבל הרדוקציה שולחת את כל הקלטים לתוך תת-בעיה C⊆BC\subseteq B (וכל אי-הקלטים לתוך C‾\overline{C}), אז אותה רדוקציה עצמה מוכיחה גם ש-CC קשה. זה בדיוק מה שהיה בחישוביות ברדוקציות מ-HALT\mathrm{HALT} ל-HALT0\mathrm{HALT}_0 ול-HALTε\mathrm{HALT}_\varepsilon — פונקציית המקבע שלחה את כל הקלטים לקבוצה זעירה ולכן סגרה כמה בעיות במחיר אחד.

ההשוואה שכדאי לזכור. קיבוע kk מראש לא תמיד מוריד את הקושי:

בעיהkk חלק מהקלטkk קבוע מראש
CLIQUE\mathrm{CLIQUE}, IS\mathrm{IS}NP-completeב-P (סריקת O(nk)O(n^k) תת-קבוצות)
kCOL\mathrm{kCOL}NP-completeNP-hard כבר עבור k=3k=3
BIN-PACKING\mathrm{BIN\text{-}PACKING}NP-completeNP-hard כבר עבור k=2k=2

משפט 6: מדוע "תכנון דינמי לפי מספר התאים" אינו אלגוריתם פולינומי

השאלה עלתה מהכיתה ([01:05:00]–[01:05:32]) והתשובה היא ההבחנה המרכזית של שני השיעורים האחרונים, ולכן היא נרשמת כאן כטענה.

טענה. אלגוריתם ל-BIN-PACKING\mathrm{BIN\text{-}PACKING} שמחזיק טבלה שבה kk תאים (או kk שורות) אינו אלגוריתם פולינומי בגודל הקלט.

הוכחה. המספר kk נתון בייצוג מיקומי ולכן אורך הייצוג שלו הוא Θ(log⁡k)\Theta(\log k) תווים. אם ∣x∣|x| הוא גודל הקלט אז log⁡k≤∣x∣\log k \le |x|, כלומר kk יכול להיות עד 2Θ(∣x∣)2^{\Theta(|x|)}. טבלה בגודל kk היא אפוא בגודל מעריכי ב-∣x∣|x|, ובוודאי גם הזמן הדרוש כדי למלא אותה. ■\blacksquare

הערה: ההרחבה הבאה לא נאמרה בהרצאה במפורש, אך היא ההמשך הישיר של אותו טיעון ומופיעה בשיעור 11 עבור SUBSET-SUM\mathrm{SUBSET\text{-}SUM}. אותו הסבר עצמו מסביר מדוע אלגוריתם התכנון הדינמי הידוע ל-SUBSET-SUM\mathrm{SUBSET\text{-}SUM}, הרץ בזמן O(n⋅S)O(n\cdot S), ואלגוריתם דומה ל-PARTITION\mathrm{PARTITION} הרץ בזמן O(n⋅T)O(n\cdot T), אינם אלגוריתמים פולינומיים: הם פולינומיים בערך המספרים ומעריכיים באורך הייצוג שלהם. אלגוריתמים כאלה נקראים פסאודו-פולינומיים, והבעיות SUBSET-SUM\mathrm{SUBSET\text{-}SUM}, PARTITION\mathrm{PARTITION} ו-BIN-PACKING\mathrm{BIN\text{-}PACKING} נקראות NP-hard חלשות: לו המספרים היו נתונים בייצוג אונרי, אורך הייצוג היה שווה לערך והבעיות היו נופלות ל-P. זו הסיבה שהמרצה טורח לומר בכל פעם "בבסיס 10" ([00:02:06], [00:41:54]) — זה אינו קישוט, זו ההנחה שכל הקושי תלוי בה.

משפט 7: ארבע הבעיות ההמילטוניות

טענה א (נאמרת בלי הוכחה). 3SAT≤pDHP\mathrm{3SAT} \le_p DHP, ולכן DHPDHP היא NP-hard.

הערה על הוויתור. המרצה הצהיר במפורש ([01:14:51]–[01:15:25]) שהרדוקציה הזאת "חמודה אבל מאוד מאוד טרחנית" ולכן מוותרים עליה בקורס: את התוצאה צריך לדעת, את ההוכחה לא.

טענה ב. בין כל שתיים מארבע הבעיות DHPDHP, DHCDHC, UHPUHP, UHCUHC קיימת רדוקציה בזמן פולינומי; כלומר כולן שקולות פולינומית, ולכן כולן NP-hard.

איך זה נעשה ביעילות ([01:16:34]–[01:18:11]). לכאורה צריך להראות רדוקציה בין כל זוג סדור, כלומר 4⋅3=124\cdot3=12 רדוקציות. אבל ≤p\le_p טרנזיטיבי, ולכן די במעגל של ארבע רדוקציות:

DHP≤pDHC≤pUHC≤pUHP≤pDHP,DHP \le_p DHC \le_p UHC \le_p UHP \le_p DHP ,

ומכל צומת אפשר להגיע לכל צומת אחר לאורך המעגל. עלינו מ-12 ל-4.

הערה: בהרצאה נאמר "אם אני אראה שמזה יש רדוקציה לזה ומזה לזה... זה מספיק בגלל הטרנזיטיביות" בלי לרשום את המעגל במפורש; הכתיבה המפורשת שלמעלה היא השלמה. הרדוקציות עצמן ניתנו כתרגילי בית ולכן אינן נכתבות כאן.

טענה ג. כל ארבע הבעיות שייכות ל-NP\mathrm{NP}.

הוכחה ([01:12:33]). ה-certificate הוא סדר של הקודקודים (תמורה של VV), באורך O(∣V∣log⁡∣V∣)O(|V|\log|V|). הוריפייר בודק שכל שתי קודקודים עוקבים בסדר מחוברים בקשת (ובגרף מכוון — בקשת בכיוון הנכון), ובמקרה של מעגל בודק גם את הקשת הסוגרת מהאחרון לראשון. זמן פולינומי. ■\blacksquare

אזהרה שעלתה בכיתה ([01:13:05]). סטודנט הזכיר שבקורס האלגוריתמים ראינו אלגוריתם פולינומי בעזרת מיון טופולוגי. זה נכון — אבל רק עבור גרף מכוון חסר מעגלים (DAG), שהוא מקרה מאוד מאוד ספציפי. אין בכך סתירה לקושי של הבעיה הכללית.

משפט 8: UHC≤pTSPUHC \le_p TSP, ולכן TSPTSP היא NP-hard

כיוון הרדוקציה במילים. אלגוריתם פולינומי ל-TSPTSP היה מכריע את UHCUHC בזמן פולינומי; TSPTSP היא הקשה יותר.

למה דווקא מ-UHCUHC ([01:24:53]). אפשר היה לצאת גם ממסלול המילטוני — יש רדוקציות בין כל הגרסאות — אבל TSPTSP שואלת על מעגל בגרף לא מכוון, ולכן UHCUHC היא הבעיה הקרובה ביותר. שוב אותו עיקרון: להתחיל מהבעיה הקרובה ביותר.

הרדוקציה

אלגוריתם R′′R''. על קלט G=(V,E)G=(V,E) — גרף פשוט לא מכוון:

  1. יהי G^=(V,E^)\hat G = (V,\hat E) הגרף המלא על קבוצת הקודקודים VV.
  2. הגדר w:E^→[0,∞)w:\hat E\to[0,\infty) על ידי w(e)={1e∈E2e∉Ew(e)=\begin{cases}1 & e\in E\\ 2 & e\notin E\end{cases}
  3. החזר (G^,  w,  ∣V∣)\left(\hat G,\;w,\;|V|\right).

הערה על שלב 1 ([01:26:59], [01:32:50]). ברגע שקבענו את VV, קיים גרף מלא יחיד על VV; אין כאן שום בחירה. בפועל שלב 1 פירושו "לכתוב את כל הקשתות", כולל אלה שלא היו ב-GG.

הניסיון הראשון וההחלטה לזנוח אותו ([01:27:31]–[01:29:06])

הבנייה הטבעית הראשונה שעלתה בכיתה הייתה: משקל 00 לקשתות המקוריות, משקל 11 לחדשות, ולהחזיר K=0K=0. הבנייה הזאת נכונה לחלוטין והיא עובדת. בכל זאת המרצה החליף אותה מדעת ל-{1,2}\{1,2\} עם K=∣V∣K=|V|, ונימק: בהמשך הקורס תוגדר תת-בעיה של TSPTSP שנרצה שגם היא תישאר NP-hard, ולתת-הבעיה הזאת משקלי אפס אינם מתאימים. הרדוקציה עם {1,2}\{1,2\} נופלת בתוך תת-הבעיה ולכן מוכיחה גם עליה קושי, בדיוק לפי העיקרון של משפט 5.

הערה: בהרצאה לא נאמר במפורש מהי תת-הבעיה. ההשלמה הטבעית: משקלים בערכים {1,2}\{1,2\} מקיימים את אי-שוויון המשולש, שכן לכל שלושה קודקודים u,x,vu,x,v מתקיים w(u,v)≤2=1+1≤w(u,x)+w(x,v)w(u,v)\le 2 = 1+1 \le w(u,x)+w(x,v). לכן אותה רדוקציה בדיוק מוכיחה ש-TSPTSP נשארת NP-hard גם בגרסה המטרית, שבה מובטח שהמשקלים מקיימים את אי-שוויון המשולש — וזו הגרסה שעבורה קיים אלגוריתם קירוב. עם משקלי 00 ו-11 אי-שוויון המשולש נשבר (1≰0+01 \not\le 0+0), ולכן הבנייה הראשונה לא הייתה נותנת את הבונוס.

ניתוח זמן ריצה ([01:29:40]–[01:33:53])

זהו ניתוח שדורש זהירות, והמרצה עמד עליו באריכות. העבודה שהאלגוריתם עושה היא מעבר על כל הקשתות של E^\hat E וכתיבת משקל לכל אחת, כלומר Θ(∣E^∣)\Theta(|\hat E|). הפיתוי הוא לומר "זה לינארי" — אבל לינארי במה? זה לינארי בגודל הגרף החדש, ואת זמן הריצה חייבים לחסום בגודל הקלט.

הבעיה: איננו יודעים כמה קשתות היו ב-GG. תיאורטית ייתכן שהיו מעט מאוד, אפילו אפס. לכן אי אפשר לחסום את ∣E^∣|\hat E| באמצעות ∣E∣|E|. מה שכן ידוע בוודאות הוא

∣E^∣  =  (∣V∣2)  ≤  ∣V∣2,|\hat E| \;=\; \binom{|V|}{2} \;\le\; |V|^2 ,

ומספר הקודקודים אינו משתנה ברדוקציה וחסום בגודל הקלט. לכן זמן הריצה הוא O(∣V∣2)=O(∣x∣2)O(|V|^2) = O(|x|^2) — ריבועי בגודל הקלט, ובפרט פולינומי.

הערה: המרצה ציין ([01:33:22]) שמקובל לעצור בניסוח "ריבועי במספר הקודקודים", כי תמיד אפשר לתרגם זאת לגודל הקלט; אבל formally מה שמעניין הוא גודל הקלט, ובהוכחות הראשונות בקורס זה נכתב במפורש.

נכונות, כיוון ראשון: G∈UHC⇒(G^,w,∣V∣)∈TSPG\in UHC \Rightarrow (\hat G,w,|V|)\in TSP

נניח G∈UHCG\in UHC; אז קיים ב-GG מעגל המילטוני CC. מכיוון ש-E⊆E^E\subseteq\hat E, אותו CC עצמו הוא מעגל בגרף G^\hat G, והוא המילטוני גם שם — קבוצת הקודקודים לא השתנתה, רק הוספנו קשתות ([01:40:12]). מעגל המילטוני על ∣V∣|V| קודקודים מכיל בדיוק ∣V∣|V| קשתות, וכל אחת מהן היא קשת של EE ולכן משקלה 11. לכן

w(C)  =  ∣V∣⋅1  =  ∣V∣  ≤  ∣V∣,w(C) \;=\; |V|\cdot 1 \;=\; |V| \;\le\; |V| ,

ומכאן (G^,w,∣V∣)∈TSP(\hat G,w,|V|)\in TSP.

נכונות, כיוון שני

בהרצאה ניתנו שתי גרסאות של הכיוון השני, במכוון ([01:39:09]) — כדי להראות שאין שום קדושה בשאלה אם מוכיחים "שייך ⇒\Rightarrow שייך" או "לא שייך ⇒\Rightarrow לא שייך". שתיהן נכתבות כאן.

גרסה א (בדרך השלילה, כפי שנעשתה קודם, [01:36:32]–[01:37:37]). נניח G∉UHCG\notin UHC, ויהי CC מעגל המילטוני כלשהו ב-G^\hat G (כזה קיים, שהרי G^\hat G מלא). ל-CC יש בדיוק ∣V∣|V| קשתות ומשקל כל אחת לפחות 11. כמו כן, ב-CC קיימת קשת שאינה ב-EE — אחרת כל קשתותיו היו ב-EE ו-CC היה מעגל המילטוני ב-GG, בסתירה להנחה. משקלה של אותה קשת הוא 22. לכן

w(C)  ≥  (∣V∣−1)⋅1+2  =  ∣V∣+1  >  ∣V∣.w(C) \;\ge\; (|V|-1)\cdot 1 + 2 \;=\; |V|+1 \;>\; |V| .

זה נכון לכל מעגל המילטוני ב-G^\hat G, ולכן אין מעגל המילטוני במשקל ≤∣V∣\le|V|, כלומר (G^,w,∣V∣)∉TSP(\hat G,w,|V|)\notin TSP.

גרסה ב (ישירה, ושתי שורות קצרה יותר, [01:38:07]). נניח (G^,w,∣V∣)∈TSP(\hat G,w,|V|)\in TSP; אז קיים מעגל המילטוני CC ב-G^\hat G עם w(C)≤∣V∣w(C)\le|V|. מכיוון שמשקל כל קשת ב-G^\hat G הוא לפחות 11 ול-CC יש בדיוק ∣V∣|V| קשתות, מתקיים w(C)≥∣V∣w(C)\ge|V|. משתי אי-השוויונות w(C)=∣V∣w(C)=|V| בדיוק. כעת w(C)w(C) הוא סכום של ∣V∣|V| מחוברים שכל אחד מהם ≥1\ge1, וסכומם הוא בדיוק ∣V∣|V|; אילו מחובר אחד היה >1>1 הסכום היה עולה על ∣V∣|V|. לכן משקל כל אחת מ-∣V∣|V| הקשתות הוא בדיוק 11, ולפי הגדרת ww כל אחת מהן ב-EE. לכן CC הוא מעגל המילטוני ב-GG, כלומר G∈UHCG\in UHC. ■\blacksquare

מסקנה. UHC≤pTSPUHC \le_p TSP; מכיוון ש-UHCUHC היא NP-hard (משפט 7), גם TSPTSP היא NP-hard. יחד עם שייכותה ל-NP\mathrm{NP} (certificate: תמורה של הקודקודים, ומחשבים את סכום המשקלים ומשווים ל-KK, [01:23:46]) — TSPTSP היא NP-complete.


דוגמאות ותרגילים מהשיעור

דוגמה 1: מעקב מלא אחרי SUBSET-SUM≤pPARTITION\mathrm{SUBSET\text{-}SUM} \le_p \mathrm{PARTITION}, מקרה S>T/2S>T/2

הקלט: (a1,a2,a3,a4)=(3,4,5,6)(a_1,a_2,a_3,a_4)=(3,4,5,6), S=12S=12.

הרדוקציה. T=3+4+5+6=18T=3+4+5+6=18. בודקים: 2S=24>18=T2S=24>18=T, ולכן מקרה 3 באלגוריתם — מוסיפים

a5  =  2S−T  =  24−18  =  6.a_5 \;=\; 2S-T \;=\; 24-18 \;=\; 6 .

הפלט: (3,4,5,6,6)(3,4,5,6,6). סכום כולל 2424, חצי סכום 12=S12=S.

מעקב קדימה. בקלט המקורי, I={1,2,3}I=\{1,2,3\} נותנת 3+4+5=12=S3+4+5=12=S — הקלט אכן ב-SUBSET-SUM\mathrm{SUBSET\text{-}SUM}. אותה II בדיוק בפלט: ∑i∈Iai=12\sum_{i\in I}a_i=12, והמשלים {4,5}\{4,5\} נותן 6+6=126+6=12. חלוקה שווה — הפלט ב-PARTITION\mathrm{PARTITION}. ✔

מעקב אחורה. נניח שקיבלנו מ"פותר PARTITION\mathrm{PARTITION}" את החלוקה J={4,5}J=\{4,5\} (שני השישים), ∑i∈Jai=12\sum_{i\in J}a_i=12. מכיוון ש-5=n+1∈J5=n+1\in J, עוברים למשלים: J‾={1,2,3}\overline J=\{1,2,3\}, שגם סכומו 1212 ואינו מכיל את n+1n+1. מכאן I={1,2,3}I=\{1,2,3\} ו-a1+a2+a3=12=Sa_1+a_2+a_3=12=S. ✔ שימו לב שבלי מעבר למשלים היינו נתקעים עם קבוצה שמכילה אינדקס שאינו קיים בקלט המקורי.

דוגמה 2: אותה רדוקציה, מקרה S<T/2S<T/2 (המקרה שהושאר לבית)

הקלט: (3,4,5,6)(3,4,5,6), S=5S=5. T=18T=18, 2S=10<182S=10<18, ולכן מקרה 4:

a5  =  T−2S  =  18−10  =  8.a_5 \;=\; T-2S \;=\; 18-10 \;=\; 8 .

הפלט: (3,4,5,6,8)(3,4,5,6,8). סכום כולל 2626, חצי 1313.

קדימה. I={3}I=\{3\} נותנת a3=5=Sa_3=5=S. הפעם הצד ה"טוב" הוא המשלים בתוך {1,…,n}\{1,\dots,n\}: J={1,2,4}J=\{1,2,4\} נותן 3+4+6=133+4+6=13 — בדיוק חצי. ✔

אחורה. נניח שהתקבלה החלוקה J′={3,5}J'=\{3,5\}: 5+8=135+8=13. מכיוון ש-5=n+1∈J′5=n+1\in J', עוברים למשלים {1,2,4}\{1,2,4\} שסכומו 1313. עכשיו I={1,2,3,4}∖{1,2,4}={3}I=\{1,2,3,4\}\setminus\{1,2,4\}=\{3\}, ואכן a3=5=Sa_3=5=S. ✔

דוגמה 3: מקרה שלילי — הרדוקציה חייבת לשמור גם על "לא"

הקלט: (3,4,5,6)(3,4,5,6), S=2S=2. אין תת-קבוצה שסכומה 22 (המספר הקטן ביותר הוא 33), ולכן הקלט אינו ב-SUBSET-SUM\mathrm{SUBSET\text{-}SUM}.

הרדוקציה. 2S=4<182S=4<18, ולכן a5=18−4=14a_5=18-4=14. הפלט: (3,4,5,6,14)(3,4,5,6,14), סכום 3232, חצי 1616.

בדיקה שאין חלוקה. נבדוק את כל האפשרויות לפי מיקום האיבר 1414:

  • 1414 בצד אחד: צריך עוד 22 מתוך {3,4,5,6}\{3,4,5,6\} — בלתי אפשרי (המינימום הוא 33).
  • 1414 בצד השני: הצד הראשון צריך להסתכם ל-1616 מתוך {3,4,5,6}\{3,4,5,6\} שסכומם הכולל 1818; הסכומים האפשריים הם 3,4,5,6,7,8,9,10,11,12,13,14,15,183,4,5,6,7,8,9,10,11,12,13,14,15,18 — הערך 1616 אינו ביניהם (כדי לקבל 1616 צריך להשמיט בדיוק 22).

אין חלוקה, ולכן הפלט אינו ב-PARTITION\mathrm{PARTITION}. ✔ הרדוקציה שמרה על ה"לא".

דוגמה 4: מעקב מלא אחרי PARTITION≤pBIN-PACKING\mathrm{PARTITION} \le_p \mathrm{BIN\text{-}PACKING}

הקלט: (3,4,5,6)(3,4,5,6). T=18T=18, T/2=9T/2=9.

בדיקת שלב 2. האיבר הגדול ביותר הוא 66, ו-2⋅6=12≤182\cdot 6=12\le 18; אין ii עם 2ai>T2a_i>T, אז ממשיכים לשלב 3.

הנרמול. bi=2ai18=ai9b_i=\dfrac{2a_i}{18}=\dfrac{a_i}{9}:

b1=39=13,b2=49,b3=59,b4=69=23.b_1=\tfrac{3}{9}=\tfrac13,\quad b_2=\tfrac49,\quad b_3=\tfrac59,\quad b_4=\tfrac69=\tfrac23 .

הפלט: (13,49,59,23 ; k=2)\left(\tfrac13,\tfrac49,\tfrac59,\tfrac23\,;\,k=2\right). בדיקת שפיות: 3+4+5+69=189=2\tfrac{3+4+5+6}{9}=\tfrac{18}{9}=2. ✔

קדימה. בקלט, I={1,4}I=\{1,4\} נותנת 3+6=9=T/23+6=9=T/2. באריזה: תא 11 מקבל את {b1,b4}\{b_1,b_4\} וסכומו 13+23=1≤1\tfrac13+\tfrac23=1\le1; תא 22 מקבל את {b2,b3}\{b_2,b_3\} וסכומו 49+59=1≤1\tfrac49+\tfrac59=1\le1. ✔

אחורה. נניח שפותר BIN-PACKING\mathrm{BIN\text{-}PACKING} החזיר את האריזה תא 1={b2,b3}1=\{b_2,b_3\}, תא 2={b1,b4}2=\{b_1,b_4\}. אז I={2,3}I=\{2,3\} ו-∑i∈Ibi=1\sum_{i\in I}b_i=1, ולכן ∑i∈Iai=182⋅1=9=T/2\sum_{i\in I}a_i=\tfrac{18}{2}\cdot 1=9=T/2 — ואכן 4+5=94+5=9. ✔

דוגמה 5: מקרה 2 של הרדוקציה — האיבר הדומיננטי

הקלט: (1,1,10)(1,1,10). T=12T=12. עבור i=3i=3: 2a3=20>12=T2a_3=20>12=T, ולכן שלב 2 מופעל והפלט הוא (34,34,34, 2)\left(\tfrac34,\tfrac34,\tfrac34,\,2\right).

בדיקה משני הצדדים. הקלט אינו ב-PARTITION\mathrm{PARTITION} (כל צד שמכיל את 1010 עובר את 66). הפלט אינו ב-BIN-PACKING\mathrm{BIN\text{-}PACKING} (שני תאים, שלושה פריטים של 34\tfrac34; תא כלשהו יקבל שניים וסכומם 32>1\tfrac32>1). ✔ שני הצדדים "לא" — הרדוקציה תקינה.

דוגמה 6: השרשרת המלאה SUBSET-SUM→PARTITION→BIN-PACKING\mathrm{SUBSET\text{-}SUM} \to \mathrm{PARTITION} \to \mathrm{BIN\text{-}PACKING}

קלט מקורי: (1,2,3)(1,2,3) עם S=4S=4.

צעד א. T=6T=6, 2S=8>62S=8>6, ולכן מוסיפים a4=8−6=2a_4=8-6=2. מתקבל מופע PARTITION\mathrm{PARTITION}: (1,2,3,2)(1,2,3,2), סכום 88, חצי 44.

צעד ב. עכשיו T′=8T'=8; האיבר הגדול ביותר הוא 33 ו-2⋅3=6≤82\cdot3=6\le 8, אז שלב 3: bi=2ai8=ai4b_i=\frac{2a_i}{8}=\frac{a_i}{4}, כלומר

(14,  12,  34,  12 ; k=2)\left(\tfrac14,\;\tfrac12,\;\tfrac34,\;\tfrac12\,;\,k=2\right)

סכום כולל 1+2+3+24=2\tfrac{1+2+3+2}{4}=2.

פתרון בקצה השרשרת. תא 1={14,34}1=\{\tfrac14,\tfrac34\} סכומו 11; תא 2={12,12}2=\{\tfrac12,\tfrac12\} סכומו 11. ✔

חזרה עד ההתחלה. תא 11 מתאים ל-I={1,3}I=\{1,3\}. במופע ה-PARTITION\mathrm{PARTITION}: a1+a3=1+3=4a_1+a_3=1+3=4, שהוא בדיוק חצי מ-88. ✔ האיבר החדש a4a_4 נמצא בתא 22, כלומר 4=n+1∉I4=n+1\notin I, ולכן אין צורך לעבור למשלים. במופע ה-SUBSET-SUM\mathrm{SUBSET\text{-}SUM} המקורי: a1+a3=1+3=4=Sa_1+a_3=1+3=4=S. ✔

דוגמה 7: מעקב אחרי UHC≤pTSPUHC \le_p TSP — מופע חיובי

הקלט: GG עם V={1,2,3,4}V=\{1,2,3,4\} ו-E={12,23,34,41}E=\{12,23,34,41\} (מעגל C4C_4).

הרדוקציה. G^=K4\hat G=K_4; הקשתות שנוספו הן 1313 ו-2424. המשקלים:

w(12)=w(23)=w(34)=w(41)=1,w(13)=w(24)=2.w(12)=w(23)=w(34)=w(41)=1,\qquad w(13)=w(24)=2 .

הפלט הוא (G^,w,4)(\hat G, w, 4) שכן ∣V∣=4|V|=4.

קדימה. המעגל 1 ⁣− ⁣2 ⁣− ⁣3 ⁣− ⁣4 ⁣− ⁣11\!-\!2\!-\!3\!-\!4\!-\!1 הוא המילטוני ב-GG, וב-G^\hat G משקלו 1+1+1+1=4≤41+1+1+1=4\le 4. ✔

אחורה. נניח שפותר TSPTSP החזיר "כן" עם מעגל CC במשקל ≤4\le 4. ל-CC יש 44 קשתות, כל אחת במשקל ≥1\ge1, ולכן w(C)≥4w(C)\ge4; מכאן w(C)=4w(C)=4 וכל קשת שוקלת בדיוק 11, כלומר כולן ב-EE. אכן CC הוא מעגל המילטוני ב-GG. ✔

דוגמה 8: מעקב אחרי UHC≤pTSPUHC \le_p TSP — מופע שלילי

הקלט: GG עם V={1,2,3,4}V=\{1,2,3,4\} ו-E={12,23,34}E=\{12,23,34\} (מסלול). לקודקודים 11 ו-44 דרגה 11, ולכן G∉UHCG\notin UHC.

הרדוקציה. G^=K4\hat G=K_4, w(12)=w(23)=w(34)=1w(12)=w(23)=w(34)=1 ו-w(13)=w(14)=w(24)=2w(13)=w(14)=w(24)=2, ו-K=4K=4.

בדיקת כל המעגלים ההמילטוניים של K4K_4 (יש שלושה, עד כדי כיוון ונקודת התחלה):

מעגלקשתותמשקל
1 ⁣− ⁣2 ⁣− ⁣3 ⁣− ⁣4 ⁣− ⁣11\!-\!2\!-\!3\!-\!4\!-\!112,23,34,4112,23,34,411+1+1+2=51+1+1+2=5
1 ⁣− ⁣2 ⁣− ⁣4 ⁣− ⁣3 ⁣− ⁣11\!-\!2\!-\!4\!-\!3\!-\!112,24,43,3112,24,43,311+2+1+2=61+2+1+2=6
1 ⁣− ⁣3 ⁣− ⁣2 ⁣− ⁣4 ⁣− ⁣11\!-\!3\!-\!2\!-\!4\!-\!113,32,24,4113,32,24,412+1+2+2=72+1+2+2=7

כל המשקלים גדולים מ-44, ולכן (G^,w,4)∉TSP(\hat G,w,4)\notin TSP. ✔ שימו לב שהמעגל הזול ביותר משתמש בקשת אחת בדיוק שאינה ב-EE, ולכן משקלו ∣V∣+1=5|V|+1=5 — בדיוק החסם מגרסה א של ההוכחה.

תרגיל 1 (מהכיתה, [01:03:23]): אלגוריתם חמדני ל-BIN-PACKING\mathrm{BIN\text{-}PACKING}

השאלה. למה לא למיין את הפריטים מהגדול לקטן, ולנסות להכניס כל פריט לתא הראשון שבו הוא נכנס?

הפתרון. האלגוריתם שתואר קרוב ל-First-Fit Decreasing: ממיינים בסדר יורד, ומכניסים כל פריט לתא הראשון שבו הוא נכנס. הוא אינו מכריע את הבעיה. הנה דוגמה נגדית מלאה עם k=2k=2. הפריטים:

510,  410,  410,  310,  210,  210\tfrac{5}{10},\; \tfrac{4}{10},\; \tfrac{4}{10},\; \tfrac{3}{10},\; \tfrac{2}{10},\; \tfrac{2}{10}

סכום כולל 2010=2\tfrac{20}{10}=2.

קיימת אריזה בשני תאים: {510,310,210}\left\{\tfrac5{10},\tfrac3{10},\tfrac2{10}\right\} סכומו 11, ו-{410,410,210}\left\{\tfrac4{10},\tfrac4{10},\tfrac2{10}\right\} סכומו 11.

מה עושה החמדן. תא 11 מקבל 510\tfrac5{10}, ואז 410\tfrac4{10} ומגיע ל-910\tfrac9{10}. הפריט 410\tfrac4{10} הבא אינו נכנס (1310>1\tfrac{13}{10}>1), ולכן נפתח תא 22 עם 410\tfrac4{10}. הפריט 310\tfrac3{10} אינו נכנס לתא 11 (1210\tfrac{12}{10}) ונכנס לתא 22 שמגיע ל-710\tfrac7{10}. הפריט 210\tfrac2{10} אינו נכנס לתא 11 (1110\tfrac{11}{10}) ונכנס לתא 22 שמגיע ל-910\tfrac9{10}. הפריט האחרון 210\tfrac2{10} אינו נכנס לאף אחד משני התאים — נדרש תא שלישי. החמדן החזיר "לא" על מופע שהתשובה הנכונה עליו היא "כן".

הנקודה העקרונית שהמרצה ניסח ([01:05:00]) חשובה מכל דוגמה נגדית ספציפית: החלטה מקומית על פריט אחד אינה יכולה להיות מודעת לשאריות שהיא מייצרת בהמשך, ולכן שום וריאציה חמדנית לא תעבוד. אילו היה קיים אלגוריתם חמדני נכון ופולינומי, היה נובע P=NPP=\mathrm{NP}.

המשך ([01:08:11]). המרצה הוסיף שהאלגוריתם שהוצע "כמעט טוב" — והוא כמעט בדיוק אלגוריתם קירוב שיילמד בשיעור הבא. הרעיון: מוותרים על דיוק בתמורה לזמן פולינומי.

תרגיל 2 (מהכיתה, [01:05:00]): למה תכנון דינמי עם kk תאים אינו עובד?

הפתרון. ראו משפט 6: כדי לתאר את kk נדרשים log⁡k\log k ביטים, ולכן טבלה בגודל kk היא מעריכית בגודל הקלט. זו אותה תבנית טיעון בדיוק שהופיעה בשיעור 11 עבור אלגוריתם ה-O(n⋅S)O(n\cdot S) ל-SUBSET-SUM\mathrm{SUBSET\text{-}SUM}: המרחק בין ערך לבין אורך ייצוג הוא מעריכי.

תרגיל 3 (מהכיתה, [01:07:08]): "מצאתי קלט שאינו ב-PARTITION\mathrm{PARTITION} אבל כן עובר"

השאלה. סטודנט הציע את (3,3,2)(3,3,2): סכומו 88, התנאי הראשון של הרדוקציה עובר (אף איבר אינו גדול מ-44), אבל אי אפשר לחלק שווה — הצדדים היחידים האפשריים הם {3,3}\{3,3\} מול {2}\{2\} או {3,2}\{3,2\} מול {3}\{3\}.

הפתרון. אין כאן סתירה. הרדוקציה מייצרת bi=2ai8=ai4b_i=\frac{2a_i}{8}=\frac{a_i}{4}, כלומר (34,34,12 ; 2)\left(\tfrac34,\tfrac34,\tfrac12\,;\,2\right), שסכומם 22. האם זה ב-BIN-PACKING\mathrm{BIN\text{-}PACKING}? חלוקה לשני תאים דורשת סכום 11 בכל תא בדיוק, והסכומים החלקיים האפשריים הם 34,12,32,54\tfrac34,\tfrac12,\tfrac32,\tfrac54 — הערך 11 אינו ביניהם. לכן הפלט אינו ב-BIN-PACKING\mathrm{BIN\text{-}PACKING}, בדיוק כמו שצריך. ✔ הטעות בהצעה הייתה בהנחה ש"התנאי הראשון עובר" משמעו "הפלט חיובי"; התנאי הראשון הוא רק מסנן לקלטים לא-חוקיים, לא הכרעה.

הערה נלווית ([01:07:39]). באותה שיחה עלתה שאלה חשובה: איך יכולים להיות בקלט של BIN-PACKING\mathrm{BIN\text{-}PACKING} מספרים כמו 34\tfrac34 אם המספרים "טבעיים"? התשובה: הם אינם. הגדרנו את קלט BIN-PACKING\mathrm{BIN\text{-}PACKING} כמספרים בקטע החצי-פתוח (0,1](0,1], לא כשלמים. השלמים הם בקלט של PARTITION\mathrm{PARTITION}, וכל תפקידו של הנרמול הוא לגשר בין השניים.

תרגיל 4 (מהכיתה, [01:16:34]): כמה רדוקציות נדרשות לארבע הבעיות ההמילטוניות?

הפתרון. נאיבית: 1212 (בין כל זוג סדור). למעשה: 44, כמעגל DHP≤pDHC≤pUHC≤pUHP≤pDHPDHP \le_p DHC \le_p UHC \le_p UHP \le_p DHP, מפני ש-≤p\le_p טרנזיטיבי. שימו לב שהתשובה הזאת נכונה רק כדי להוכיח שכולן NP-hard; אם רוצים גם NP-completeness צריך בנוסף להוכיח שכל אחת מהן ב-NP\mathrm{NP}, וזה עוד ארבע הוכחות קצרות (משפט 7, טענה ג).


הערות מהשיעור

  • [00:00:32] — מפת הדרכים. המרצה פתח בהצהרה על מבנה השיעור: שתי בעיות "קרובות משפחה" של SUBSET-SUM\mathrm{SUBSET\text{-}SUM} (PARTITION\mathrm{PARTITION} ו-BIN-PACKING\mathrm{BIN\text{-}PACKING}), חזרה לגרפים עם ארבע הווריאציות ההמילטוניות, ו-TSPTSP לסיום. זה בדיוק סדר הסיכום.

  • [00:03:40] — "מגרילים" אסור. ראו ההערה במשפט 1. המרצה הסביר שהוא מעדיף "בוחרים באופן אי-דטרמיניסטי" גם על פני "מנחשים", כי סטודנטים לוקחים את "מנחשים" ועושים איתו עוד צעד אל "מגרילים", ואז מערבבים אי-דטרמיניזם עם אקראיות. שתי המחלקות המתקבלות שונות לגמרי.

  • [00:03:08] — למה "עֲנִיָּה" ולא "קבוצה". הקלט של PARTITION\mathrm{PARTITION} עלול להכיל חזרות, ולכן החלוקה היא של אינדקסים ולא של ערכים. אותה הערה תקפה ל-SUBSET-SUM\mathrm{SUBSET\text{-}SUM} ול-BIN-PACKING\mathrm{BIN\text{-}PACKING}.

  • [00:08:29] ו-[00:10:39] — "בואו נניח רגע שיש". המרצה כתב את הנחות העבודה של הגזירה באדום והדגיש פעמיים שזה אינו חלק מהאלגוריתם אלא רק "איך אני חושב עליו". זו הבחנה שמפילה תשובות במבחן: מותר להניח קיום פתרון בתוך הוכחת הנכונות, אסור להניח אותו בתוך האלגוריתם.

  • [00:13:52] — למה בכלל לפצל למקרים לפי SS? שאלה טובה מהכיתה: הרי הפיצול לא מכריע כלום. התשובה: הוא לא מכריע, אבל הוא נותן מידע על הכיוון — ברגע ש-S>T/2S>T/2 אני יודע שאת הצד השני צריך להגדיל, ואז אני יודע מה לחפש. הפיצול הוא עזר לחשיבה, לא שלב בפתרון.

  • [00:21:39], [00:41:54], [00:42:24] — הרדוקציה אינה מכריעה. המשפט חזר שלוש פעמים בשלושה הקשרים שונים, פעם על an+1a_{n+1}, פעם על BIN-PACKING\mathrm{BIN\text{-}PACKING} ופעם בהתייחסות ל-kCOL\mathrm{kCOL} משיעור 10 ("אני לא מחפש צביעה"). המרצה עצמו סימן את זה כ"מאוד מאוד מאוד מאוד חשוב".

  • [00:24:27] — שני האובייקטים ביד. בכיוון השני של הוכחת נכונות יש בידינו גם את הקלט המקורי וגם את הפלט. אין צורך לשחזר את הקלט. המרצה ציין שזה "תמיד נורא מבלבל סטודנטים".

  • [00:29:19] — עולם מול עולם. הרדוקציה הנוחה היא מבעיה קרובה. "אם לא חוצים אותי עם הגב לקיר, הבחירה הראשונה שלי לא תהיה SAT\mathrm{SAT}." רדוקציות שעוברות בין עולמות יפות יותר, אבל כשבונים — לוקחים את הקרובה.

  • [00:33:41] — למה מוציאים אפסים. פריט בגודל 00 אינו משפיע על שום דבר וניתן להעיף אותו מהקלט. ההגדרה בוחרת בקטע (0,1](0,1] כדי לא לגרור מקרי קצה.

  • [00:34:11] — "לכל היותר" מול "בדיוק". בתאים, בניגוד ל-MAXCUT\mathrm{MAXCUT} למשל, אפשר תמיד לפתוח עוד תא או לסגור תא, ולכן ההבדל אינו מהותי.

  • [00:35:59] — מידול. "היכולת לקחת תיאור מילולי ולהפוך אותו למידול מתמטי מאוד חשובה." המרצה הוביל את הכיתה משאלה מילולית ("ניתן לחלק") לניסוח עם ∃f\exists f, כולל הבחירה שהתחום יהיה {1,…,n}\{1,\dots,n\} ולא הקלט עצמו.

  • [00:48:20]–[00:53:44] — רדוקציה לתת-בעיה. הדיון הארוך והמעניין ביותר בשיעור. ראו משפט 5 והטבלה שם. ההשוואה שהמרצה חזר אליה: בחישוביות, פונקציית המקבע נתנה במחיר אחד רדוקציות מ-HALT\mathrm{HALT} להמון בעיות, בדיוק מפני ששלחה את כל הקלטים לקבוצה קטנה בפנים.

  • [01:05:32] — הערה שתחזור במבחן. "כמה ביטים אני צריך בשביל לתאר את kk? — log⁡k\log k. וגודל הטבלה הוא kk. אז גודל הטבלה מעריכי בגודל הקלט." זו התשובה הסטנדרטית לשאלה "למה תכנון דינמי לא פותר את זה".

  • [01:06:05] — על שאלות. "אלה שאלות מצוינות. אם תשבו עליהן ותלושו אותן, אתם יכולים לענות עליהן בעצמכם." המרצה הדגיש שהוא רוצה שהסטודנטים יפתחו תחושת מסוגלות, לא שיפסיקו לשאול.

  • [01:14:51] — מה כן ומה לא במבחן. את הרדוקציה 3SAT≤pDHP\mathrm{3SAT} \le_p DHP לא מוכיחים בקורס ("חמודה אבל מאוד טרחנית"). את התוצאה צריך לדעת, את ההוכחה לא.

  • [01:19:56] — למה בגרף מלא אין שאלה בלי משקלים. בגרף מלא על יותר משלושה קודקודים תמיד קיים מעגל המילטוני. כל הקושי ב-TSPTSP מגיע מהמשקל.

  • [01:24:19] — "הרדוקציה האחרונה לזמן הקרוב". המרצה סימן במפורש שזו הרדוקציה האחרונה בפרק ה-NP-completeness, ואמר "תתענגו עליה".

  • [01:28:34]–[01:29:06] — למה {1,2}\{1,2\} ולא {0,1}\{0,1\}. הבנייה עם משקלים 00 ו-11 ו-K=0K=0 נכונה לגמרי, והמרצה החליף אותה במכוון: "בהמשך נצטרך תת-בעיה שאני עדיין רוצה שהיא תהיה NP-קשה, וזו רדוקציה לאותה תת-בעיה. תזכרו את הרדוקציה הזאת ותזכרו ששיניתי מ-00 ל-22." ראו ההערה במשפט 8 על אי-שוויון המשולש.

  • [01:29:40]–[01:33:53] — חסימת זמן הריצה בגודל הקלט. הדיון הארוך על "לינארי במה". הכלל: אין להסתפק בחסם במונחי הגרף החדש; יש לתרגם לגודל הקלט. מקובל לעצור ב"ריבועי במספר הקודקודים", אבל צריך לדעת למה זה חוקי.

  • [01:34:56] — שם ארוך. כשסטודנט התלונן על השם UHCUHC, המרצה ענה "מה אפשר לעשות, אנחנו נהנים, אז למה לקצר". בפועל הסיכום כן משתמש בקיצורים; חשוב רק להגדיר אותם.

  • [01:38:38]–[01:39:41] — לכתוב את שני הכיוונים. המרצה הוכיח את הכיוון השני פעמיים — פעם בשלילה ופעם ישירות — כדי להראות שאין כלל מיסטי שמחייב צורה מסוימת. הוא הוסיף המלצה מעשית: לפעמים אין מנוס מלכתוב את שתי הגרסאות ולבחור את היפה; "אל תנסו לנהל את הזמן שלכם בקפידה יתרה — צריך להשקיע."

  • [01:40:43] — סיכום החלק השני של הקורס. בזה נסגר הפרק על NP-completeness. הפרק השלישי, "התמודדות עם NP-קושי", מתחיל מיד אחרי כן ועוסק בבעיות אופטימיזציה, אלגוריתמי קירוב ואלגוריתמים אקראיים — ראו שיעור 13.


פערים בין הסיכום להקלטה

  • מקור: עמוד 1 בסיכום, מקרה 3 של רדוקציית PARTITION\mathrm{PARTITION}. הפער: האיבר המוחזר נקרא בכתב כ-∑i=1nai\sum_{i=1}^n a_i, בעוד שבהקלטה ([00:15:28]) נאמר במפורש "הסכום הכולל פחות 2S2S". ההכרעה: נכתב T−2ST-2S, שהוא הנכון מתמטית — עם TT לבדו הסכום הכולל היה 2T2T, החצי TT, ולא היה שום קשר ל-SS. ייתכן שמדובר בקריאה חלקית שלי ולא בהשמטה בסיכום; נרשם ב-open_questions.

  • מקור: עמוד 2 בסיכום, תנאי 1 של רדוקציית BIN-PACKING\mathrm{BIN\text{-}PACKING}. הפער: התנאי נקרא כ-ai≥12∑aja_i \ge \tfrac12\sum a_j (אי-שוויון חלש), ובהקלטה ([00:44:31]) נאמר "aia_i גדול מהסכום חלקי 22". ההכרעה: נכתב אי-שוויון חד 2ai>T2a_i>T. עם אי-שוויון חלש הרדוקציה שגויה: הקלט (1,1)(1,1) מקיים a1=12Ta_1=\tfrac12 T וכן שייך ל-PARTITION\mathrm{PARTITION}, ואילו הפלט (34,34,34,2)(\tfrac34,\tfrac34,\tfrac34,2) אינו ב-BIN-PACKING\mathrm{BIN\text{-}PACKING}.

  • מקור: ההקלטה. הפער: ההשוואה נעשית בין SS לבין 12∑ai\tfrac12\sum a_i, כלומר בין שלם לבין מספר שעלול להיות חצי-שלם. ההכרעה: בגוף הקובץ ההשוואה נכתבת מחדש כ-2S2S מול TT. זהו אותו תנאי בדיוק, אך הוא נשאר בשלמים גם כאשר TT אי-זוגי, וכך אין צורך להסביר מה פירוש "SS שווה לחצי" כשהחצי אינו שלם.

  • מקור: ההקלטה ([00:18:52]–[00:28:47]). הפער: מתוך שלושת המקרים בהוכחת הנכונות של משפט 2, בהרצאה נעשה רק המקרה S>T/2S>T/2 בשני הכיוונים; המקרים S=T/2S=T/2 ו-S<T/2S<T/2 הושארו כשיעורי בית. ההכרעה: שני המקרים נכתבים כאן במלואם. מקרה S<T/2S<T/2 אינו העתקה סימטרית — בו הצד המסתכם לחצי הוא המשלים של II ולא II עצמה.

  • מקור: ההקלטה ([00:37:33]–[00:39:04]) מול [01:05:32]. הפער: הוכחת השייכות של BIN-PACKING\mathrm{BIN\text{-}PACKING} ל-NP\mathrm{NP} תוארה כמעבר על ℓ=1,…,k\ell=1,\dots,k, בעוד שבהמשך אותו שיעור המרצה עצמו הסביר שלולאה באורך kk היא מעריכית באורך הקלט. ההכרעה: בגוף הקובץ נוסף תיקון מפורש (הערה למשפט 3): לסרוק רק תאים לא ריקים, או להניח בלי הגבלת הכלליות k≤nk\le n כי אחרת הקלט הוא בהכרח כן-קלט. הסתירה בין שני החלקים של ההרצאה היא כנראה קיצור בעל פה ולא טעות מהותית.

  • מקור: ההקלטה ([00:44:31], [00:46:45]) והסיכום. הפער: לא נאמר במפורש מדוע מותר לרדוקציה להחזיר "קלט מומצא" במקרה הראשון. ההכרעה: ההנמקה נכתבה במלואה: התנאי 2ai>T2a_i>T ניתן לבדיקה בזמן פולינומי ומכריע לבדו שהקלט אינו ב-PARTITION\mathrm{PARTITION}, ולכן מותר להחזיר עבורו כל אי-קלט קבוע של בעיית היעד.

  • מקור: ההקלטה ([01:27:31]–[01:29:06]). הפער: המרצה החליף בכוונה משקלים {0,1}\{0,1\} עם K=0K=0 במשקלים {1,2}\{1,2\} עם K=∣V∣K=|V|, ואמר שהסיבה היא תת-בעיה עתידית — בלי לומר מהי. ההכרעה: בגוף הקובץ נוספה ההשלמה שהתת-בעיה היא ככל הנראה TSPTSP המטרי, ושמשקלים ב-{1,2}\{1,2\} מקיימים את אי-שוויון המשולש בעוד ש-{0,1}\{0,1\} שוברים אותו. סומן כהשלמה שלי.

  • מקור: ההקלטה ([01:16:34]–[01:18:11]). הפער: נאמר שדי בארבע רדוקציות במקום 12 בגלל טרנזיטיביות, אך המעגל הקונקרטי לא נרשם. ההכרעה: המעגל DHP≤pDHC≤pUHC≤pUHP≤pDHPDHP \le_p DHC \le_p UHC \le_p UHP \le_p DHP נכתב כאן במפורש; כל מעגל אחר על ארבע הבעיות שווה ערך.

  • מקור: הסיכום, עמוד 4 מול ההקלטה [01:14:51]. הפער: הסיכום כותב 3SAT≤pDHP\mathrm{3SAT} \le_p DHP, ובהקלטה נאמר "רדוקציה מ-SAT\mathrm{SAT} או מ-3SAT\mathrm{3SAT}, זה לא באמת משנה". ההכרעה: נכתב 3SAT≤pDHP\mathrm{3SAT} \le_p DHP לפי הסיכום, עם ציון שההוכחה אינה חלק מהקורס. נרשם ב-open_questions.

  • מקור: הסיכום, עמוד 6. הפער: העמוד עוסק כולו בטבלת ההשוואה בין בעיות הכרעה/חיפוש/אופטימיזציה, בהגדרה הפורמלית של בעיית אופטימיזציה ובהגדרת אלגוריתם קירוב עם יחס α\alpha — כלומר, אינו שייך ל-PARTITION\mathrm{PARTITION}/BIN-PACKING\mathrm{BIN\text{-}PACKING}/TSPTSP כלל. הוא מקביל ל-[01:40:43]–[02:08:24] בהקלטה. ההכרעה: החומר אינו נכתב כאן, למעט הפניה בסוף "הערות מהשיעור", מכיוון שהוא פותח את שיעור 13 (אלגוריתמי קירוב), הנכתב מתמליל 19. אם קובץ שיעור 13 אינו מכסה את הטבלה של עמוד 6 — יש לוודא זאת.

  • מקור: חלוקת החומר בין הסיכומים. הפער: קרוב לשליש מהשיעור ([01:09:20]–[01:40:43]) עוסק בבעיות המילטוניות וב-TSPTSP, ואלה אינם מופיעים בשם הקובץ ובעיקר לא ב-slug. ההכרעה: החומר נכתב כאן במלואו, שכן הוא כן מופיע בעמודים 4–5 של סיכום שיעור 12 — זהו השיעור שבו הוא נלמד. שם הקובץ לא שונה, כנדרש בספציפיקציה; ההיקף האמיתי מופיע ב-title_he.

  • מקור: הקצאת התמלילים במשימה. הפער: תמליל 19 (KZcJEmx19BUKZcJEmx19BU) הוגדר כתמליל הקשר. בפועל אין בו ולו אזכור אחד של PARTITION\mathrm{PARTITION}, BIN-PACKING\mathrm{BIN\text{-}PACKING}, מעגל המילטוני או TSPTSP; הוא נפתח באמצע דיון על גרסאות VC\mathrm{VC} וממשיך לאלגוריתם הקירוב. ההכרעה: סומן coverage: none עם הערה, ולא נעשה בו שימוש.


סיכום ונקודות למבחן

התוצאות שצריך לזכור

  1. PARTITION\mathrm{PARTITION}: בהינתן a1,…,ana_1,\dots,a_n טבעיים, האם קיימת II עם ∑i∈Iai=12∑i=1nai\sum_{i\in I}a_i=\tfrac12\sum_{i=1}^n a_i. NP-complete.
  2. BIN-PACKING\mathrm{BIN\text{-}PACKING}: בהינתן a1,…,an∈(0,1]a_1,\dots,a_n\in(0,1] ו-kk, האם קיימת f:{1,…,n}→{1,…,k}f:\{1,\dots,n\}\to\{1,\dots,k\} עם ∑i:f(i)=ℓai≤1\sum_{i:f(i)=\ell}a_i\le1 לכל ℓ\ell. NP-complete, וגם עבור k=2k=2 קבוע.
  3. הרדוקציה SUBSET-SUM≤pPARTITION\mathrm{SUBSET\text{-}SUM} \le_p \mathrm{PARTITION}: מוסיפים איבר יחיד — 2S−T2S-T אם 2S>T2S>T, ו-T−2ST-2S אם 2S<T2S<T, וכלום אם 2S=T2S=T.
  4. הרדוקציה PARTITION≤pBIN-PACKING\mathrm{PARTITION} \le_p \mathrm{BIN\text{-}PACKING}: אם קיים 2ai>T2a_i>T מחזירים (34,34,34,2)(\tfrac34,\tfrac34,\tfrac34,2); אחרת bi=2aiTb_i=\tfrac{2a_i}{T} ו-k=2k=2. הסכום החדש הוא 22 בדיוק.
  5. DHPDHP, DHCDHC, UHPUHP, UHCUHC: כולן NP-complete, שקולות פולינומית. 3SAT≤pDHP\mathrm{3SAT} \le_p DHP — התוצאה נדרשת, ההוכחה לא.
  6. TSPTSP: גרף מלא, משקלים, KK; האם קיים מעגל המילטוני במשקל ≤K\le K. NP-complete, דרך UHC≤pTSPUHC \le_p TSP עם משקלים 1/21/2 ו-K=∣V∣K=|V|.

המלכודות הסטנדרטיות

  • כיוון החץ. A≤pBA \le_p B פירושו ש-BB קשה יותר. בכל תשובה כתבו את הכיוון גם במילים.
  • "הרדוקציה מוצאת פתרון". לא. הרדוקציה אינה מקבלת ואינה מחפשת תת-קבוצה, אריזה, מעגל או צביעה. כל התייחסות לפתרון שייכת אך ורק להוכחת הנכונות.
  • שכחת המשלים. בכיוון השני של SUBSET-SUM≤pPARTITION\mathrm{SUBSET\text{-}SUM} \le_p \mathrm{PARTITION} חובה לומר "בלי הגבלת הכלליות n+1∉Jn+1\notin J, אחרת נעבור למשלים". בלי זה ההוכחה שגויה, כי JJ עלולה להכיל אינדקס שאינו קיים בקלט המקורי.
  • מקרה S<T/2S<T/2 אינו העתקה של S>T/2S>T/2. בו הצד ה"טוב" הוא המשלים.
  • אי-שוויון חלש במקום חד. בתנאי הראשון של רדוקציית BIN-PACKING\mathrm{BIN\text{-}PACKING} חייבים >> ולא ≥\ge.
  • ערך מול אורך ייצוג. "יש תכנון דינמי" אינה תשובה. טבלה בגודל SS או kk היא מעריכית באורך הקלט. זו הסיבה שהמספרים נתונים בבסיס ≥2\ge2 וזה חשוב.
  • חסימת זמן ריצה במונחי הפלט. ב-UHC≤pTSPUHC \le_p TSP אסור לומר "לינארי ב-∣E^∣|\hat E|" ולעצור; צריך ∣E^∣≤∣V∣2≤∣x∣2|\hat E|\le|V|^2\le|x|^2.
  • קיבוע kk. אינו מוריד קושי אוטומטית. CLIQUE\mathrm{CLIQUE} ו-IS\mathrm{IS} נופלות ל-P; 3COL\mathrm{3COL} ו-BIN-PACKING2\mathrm{BIN\text{-}PACKING}_2 נשארות NP-hard.

רשימת יכולות אחרי השיעור

אחרי השיעור צריך לדעת:

  1. לנסח פורמלית את PARTITION\mathrm{PARTITION}, BIN-PACKING\mathrm{BIN\text{-}PACKING}, ארבע הבעיות ההמילטוניות ו-TSPTSP, כולל הקידודים המדויקים ((0,1](0,1] ולא שלמים; גרף מלא ולא כל גרף).
  2. להוכיח שכל אחת מהן ב-NP\mathrm{NP}, עם certificate מפורש ועם נימוק שאורכו פולינומי.
  3. לגזור את 2S−T2S-T ו-T−2ST-2S מתוך המשוואה ∑i∉Iai+b=S\sum_{i\notin I}a_i+b=S — לא לצטט אותם.
  4. לכתוב את שלושת המקרים של רדוקציית PARTITION\mathrm{PARTITION} ואת שני הכיוונים בכל אחד, כולל טיעון המשלים.
  5. לכתוב את רדוקציית BIN-PACKING\mathrm{BIN\text{-}PACKING} כולל הטיפול במקרה החריג, ולהסביר למה מותר להחזיר קלט שלילי מומצא.
  6. להסביר למה אותה רדוקציה מוכיחה קושי גם עבור k=2k=2 קבוע, ולהשוות ל-CLIQUE\mathrm{CLIQUE} ול-3COL\mathrm{3COL}.
  7. לחסום זמן ריצה של רדוקציה בגודל הקלט — לא בגודל הפלט ולא בערך המספרים.
  8. לכתוב את UHC≤pTSPUHC \le_p TSP בשני הכיוונים, בשתי הגרסאות (ישירה ובשלילה), ולהסביר את בחירת המשקלים.
  9. להסביר במשפט אחד למה תכנון דינמי בגודל SS או kk אינו אלגוריתם פולינומי.

שאלות שנשארו פתוחות

  • עמוד 1 בסיכום, מקרה 3 של הרדוקציה: קראתי את האיבר המוחזר כ-$\sum_{i=1}^n a_i$ בלבד, בלי ה-$-2S$ שנאמר בהקלטה ב-[00:15:28]; ייתכן שזו קריאה חלקית שלי של הכתב ולא השמטה בסיכום.
  • עמוד 2 בסיכום, תנאי 1 של רדוקציית BIN PACKING: הכתב נקרא כ-$a_i \ge \frac{1}{2}\sum a_j$, בעוד שבהקלטה ב-[00:44:31] נאמר במפורש 'גדול מ'. כאן נכתב אי-שוויון חד, שהוא הנכון מתמטית.
  • בהקלטה ב-[01:14:51] נאמר שהרדוקציה הידועה היא מ-$SAT$ או מ-$3SAT$ ל-$DHP$ ובסיכום נכתב $3SAT \le_p DHP$; ההוכחה לא נעשתה בקורס ולכן לא ניתן היה לאמת איזו משתי הגרסאות נלמדת.
  • עמוד 6 בסיכום (בעיות הכרעה/חיפוש/אופטימיזציה והגדרת אלגוריתם קירוב) מקביל ל-[01:40:43]–[02:08:24] בהקלטה, אך מבחינת התוכן הוא פתיחת שיעור 13; כאן ניתנת רק הפניה, והחומר עצמו שייך לקובץ שיעור 13.
  • ה-slug 'partition-bin-packing' מתאר בחסר: כשליש מהשיעור עוסק בבעיות המילטוניות וב-TSP (עמודים 4–5 בסיכום). ההיקף המלא נמצא ב-title_he; שם הקובץ לא שונה, כנדרש.