13Approximation Algorithms I: A 2-Approximation for Vertex Cover, a ½-Approximation for Max-Cut, and the Inapproximability of TSP

השיעור הראשון על אלגוריתמי קירוב: אלגוריתם 2-קירוב לכיסוי בקודקודים והוכחת ההידוק שלו, אלגוריתם חיפוש מקומי בעל יחס קירוב ½ ל-MAXCUT, והוכחה שקירוב בכל יחס קבוע לבעיית הסוכן הנוסע הכללית שקול ל-P=NP.

confidence: high2 recording(s)5 summary pagesapproximation-algorithmsvertex-covermax-cuttsplocal-searchinapproximability

Builds on: lesson 10, lesson 11, lesson 12

The handwritten summary pages

Open page 1 full size

סיבוכיות שיעור 13 אלגוריתמי קירוב.pdf

Page 1 of 5 of the handwritten summary

בקצרה

  • לפני הכול, שלוש גרסאות של אותה בעיה: הכרעה (שאלת כן/לא — שפה), חיפוש (מצא עד או דווח שאין) ואופטימיזציה (מצא את הערך/הפתרון הטוב ביותר — פונקציה, לא שפה). NP-קושי מוגדר פורמלית רק לגרסת ההכרעה, ולכן טענות אי-קירוב מנוסחות כתוצאות מותנות.
  • זהו השיעור הראשון שבו אנחנו מוותרים על אופטימליות במקום לוותר על זמן ריצה פולינומי. אלגוריתם קירוב חייב תמיד להחזיר פתרון אפשרי (feasible), רץ בזמן פולינומי, ומבטיח שהערך שלו רחוק מהאופטימום לכל היותר בפקטור α\alpha.
  • הטכניקה המרכזית של כל השיעור: האלגוריתם אינו יודע לחשב את OPT\mathrm{OPT} — הרי זו בדיוק הבעיה הקשה. לכן מוצאים גודל עזר שהאלגוריתם כן שולט בו, מוכיחים שהוא חוסם את OPT\mathrm{OPT} (מלמטה בבעיית מינימום, מלמעלה בבעיית מקסימום), ומשווים אליו את הפלט.
  • 2-קירוב ל-VC\mathrm{VC}: בחר קשת, הכנס את שני קצותיה לכיסוי, מחק את שניהם, חזור. גודל העזר הוא הזיווג FF של הקשתות שנבחרו: ∣F∣≤∣Copt∣|F| \le |C_{\mathrm{opt}}| ו-∣C∣=2∣F∣|C| = 2|F|, ולכן ∣C∣≤2∣Copt∣|C| \le 2|C_{\mathrm{opt}}|.
  • להוסיף קצה אחד במקום שניים נשמע חסכוני יותר — ואינו נותן קירוב ביחס קבוע כלל. הדוגמה הנגדית היא כוכב.
  • הניתוח הדוק ביחס לאלגוריתם: על גרף שהוא זיווג מושלם האלגוריתם מחזיר את כל הקודקודים בעוד שהאופטימום הוא חצי מהם. שאלה אחרת לגמרי, ופתוחה עד היום, היא האם לבעיה יש אלגוריתם קירוב טוב מ-22.
  • ½-קירוב ל-MAXCUT\mathrm{MAXCUT} בחיפוש מקומי: כל עוד יש קודקוד שהעברתו לצד השני מגדילה את החתך — העבר אותו. בסיום מתקיים cut(v)≥other(v)\mathrm{cut}(v)\ge \mathrm{other}(v) לכל vv, וספירה כפולה נותנת ∣F∣≥12∣E∣≥12K|F| \ge \tfrac12|E| \ge \tfrac12 K.
  • תוצאת קושי מותנית: לכל α≥1\alpha \ge 1, אלגוריתם קירוב ביחס α\alpha לבעיית הסוכן הנוסע הכללית גורר P=NP\mathrm{P}=\mathrm{NP} — ולמעשה שקול לכך. זו הדגמה של איך הופכים אלגוריתם קירוב לאלגוריתם הכרעה.
  • שני הכלים החדשים למבחן: הוכחת פיזביליות בנפרד מהוכחת היחס, וחסימת OPT\mathrm{OPT} באמצעות גודל עזר.

רקע ותלויות

מ־שיעור 12 (הסוף שלו) — בעיית אופטימיזציה ואלגוריתם קירוב. הסיכום של שיעור 13 נפתח ישירות באלגוריתם, כי ההגדרות ניתנו בדקות האחרונות של המפגש הקודם ונרשמו בעמוד 6 של סיכום שיעור 12. העמוד ההוא שייך מבחינת התוכן לשיעור הזה, ולכן הוא מטופל כאן במלואו — הטבלה המשולשת שבו בהגדרה 1, ההגדרה הפורמלית של בעיית אופטימיזציה בהגדרה 2, והגדרת אלגוריתם הקירוב בהגדרה 3. להלן תמצית קצרה של מה שנדרש כדי לקרוא את המשפטים; הניסוחים המלאים והדוגמאות נמצאים בפרק ההגדרות.

בעיית אופטימיזציה מורכבת מ־(א) קבוצת קלטים אפשריים I\mathcal{I} — למשל, עבור כיסוי בקודקודים, אוסף כל הגרפים הלא מכוונים; (ב) לכל קלט I∈II \in \mathcal{I}, קבוצת פתרונות אפשריים XIX_I — עבור VC\mathrm{VC}, כל הכיסויים בקודקודים של GG; (ג) פונקציית ערך v:XI→Rv: X_I \to \mathbb{R} — עבור VC\mathrm{VC}, גודל הקבוצה. המטרה: למצוא x∈XIx \in X_I שעבורו v(x)v(x) מינימלי (או מקסימלי, תלוי בבעיה).

הערה על שני צירים [02:01:23 בתמלול 18]: יש כאן שני צירים שאפשר "להתפשר" עליהם — האם הפתרון אפשרי, ומה ערכו. בקורס הזה מתפשרים רק על הערך. אלגוריתם קירוב ל-VC\mathrm{VC} שמקבל גרף חייב להחזיר כיסוי בקודקודים; לא כיסוי "כמעט". יש תחום מחקר שלם שמתפשר גם על זה, ואיננו עוסקים בו.

הגדרת אלגוריתם הקירוב לבעיית מינימיזציה (מילה במילה כפי שניתנה): עבור α≥1\alpha \ge 1, אלגוריתם קירוב לבעיית מינימיזציה עם יחס קירוב α\alpha הוא אלגוריתם שעבור כל קלט II לבעיה — (1) רץ בזמן פולינומי ב-∣I∣|I|; (2) מחזיר פתרון אפשרי x∈XIx \in X_I; (3) מקיים OPT(I)  ≤  v(x)  ≤  α⋅OPT(I),\mathrm{OPT}(I) \;\le\; v(x) \;\le\; \alpha \cdot \mathrm{OPT}(I), כאשר OPT(I)=min⁡y∈XIv(y)\mathrm{OPT}(I) = \min_{y \in X_I} v(y). אי-השוויון השמאלי טריוויאלי — פתרון אפשרי לא יכול להיות זול מהמינימום מבין הפתרונות האפשריים; כל העבודה היא באי-השוויון הימני.

הבעיה שהמרצה השאיר כ־cliffhanger בסוף שיעור 12 [02:07:08]: אם האלגוריתם אינו יודע לחשב את OPT\mathrm{OPT} — הרי חישובו הוא בדיוק הבעיה הקשה — איך בכלל הוא יכול לדעת שמה שהחזיר אינו גדול מפי 22 מ-OPT\mathrm{OPT}? התשובה ניתנת בשיעור הזה, והיא ליבת משפט 1.

מ־שיעור 10 — הבעיות עצמן. U⊆VU \subseteq V היא כיסוי בקודקודים של G=(V,E)G=(V,E) אם לכל קשת xy∈Exy \in E מתקיים x∈Ux \in U או y∈Uy \in U. גרסת האופטימיזציה: בהינתן GG, מצא כיסוי בקודקודים בגודל מינימלי. בעיית MAXCUT\mathrm{MAXCUT}: בהינתן GG, חלק את VV לשתי קבוצות כך שמספר הקשתות ה"חוצות" יהיה מקסימלי. שתיהן NP-קשות בגרסת ההכרעה שלהן.

מ־שיעור 12 — מעגל המילטוני ובעיית הסוכן הנוסע. UHC\mathrm{UHC} (Undirected Hamiltonian Cycle) — האם קיים בגרף לא מכוון מעגל העובר בכל קודקוד בדיוק פעם אחת — היא NP-שלמה. בשיעור 12 נראתה גם הרדוקציה UHC≤pTSP\mathrm{UHC} \le_p \mathrm{TSP}, שבה נתנו לקשתות המקוריות משקל 11 ולשאר משקל 22. נזכיר את כיוון הסימון: A≤pBA \le_p B פירושו ש-AA ניתנת לרדוקציה ל-BB, כלומר BB קשה לפחות כמו AA.

מאלגוריתמים / מתמטיקה בדידה — שני כלים שנשתמש בהם במפורש:

  1. משפט הדרגות (lemma of handshakes): בכל גרף G=(V,E)G=(V,E) מתקיים ∑v∈Vdeg⁡G(v)=2∣E∣\sum_{v \in V} \deg_G(v) = 2|E|, כי כל קשת תורמת 11 לדרגת כל אחד משני קצותיה.
  2. עקרון שובך היונים בניסוח של פונקציות [00:26:19]: אם קיימת פונקציה חד-חד-ערכית f:A→Bf: A \to B אז ∣A∣≤∣B∣|A| \le |B|. בקונטרפוזיציה: אם ב-AA יש יותר איברים מאשר ב-BB, אז אף פונקציה מ-AA ל-BB אינה חד-חד-ערכית — זהו בדיוק שובך היונים.

הגדרות

הגדרה 1: שלוש הגרסאות של בעיה — הכרעה, חיפוש ואופטימיזציה

לבעיות רבות יש שלוש גרסאות שונות, ואת ההבחנה ביניהן צריך לעשות לפני שמדברים על קירוב בכלל. הטבלה הבאה היא הטבלה שבעמוד 6 של סיכום שיעור 12, בדוגמה של VC\mathrm{VC}:

הגרסההקלטמה נדרש
בעיית הכרעהגרף G=(V,E)G=(V,E) ומספר kkשאלה: האם קיים כיסוי בקודקודים בגודל kk?
בעיית חיפושגרף G=(V,E)G=(V,E) ומספר kkמטרה: מצא כיסוי בקודקודים בגודל kk, או דווח שאין כזה
בעיית אופטימיזציהגרף G=(V,E)G=(V,E) בלבדמטרה: החזר את הגודל המינימלי של כיסוי בקודקודים, או מצא כיסוי בקודקודים בגודל מינימלי

הבחנה טכנית שהמרצה הדגיש [01:52:35]–[01:53:07]. רק לבעיית ההכרעה יש "שאלה"; לשתי האחרות יש "מטרה". ההבדל אינו סמנטי בלבד: בעיית הכרעה היא שפה (קבוצה), כי היא שאלת כן/לא, ולכן אפשר לדבר עליה במונחים של P\mathrm{P}, NP\mathrm{NP} ורדוקציות. בעיית אופטימיזציה אינה שפה אלא פונקציה — מקבלים גרף וצריך להחזיר מספר (או פתרון). זו הסיבה שאמרנו בשיעור 12 [01:55:13] ש-NP-קושי מוגדר פורמלית לבעיות הכרעה בלבד, כי הוא מוגדר באמצעות רדוקציות בין שפות; ובכל זאת גרסת האופטימיזציה של בעיה NP-קשה היא "קשה" במובן המעשי, ולכן משפט 4 בקובץ הזה מנוסח כתוצאת קושי מותנית ולא כטענת NP-קושי.

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

הקשר בין הגרסאות. הסדר הוא מהקל לכבד:

  1. בעיית החיפוש היא הקשחה של בעיית ההכרעה [01:50:54]: לא מספיק לומר "כן", צריך גם להציג עד.
  2. פותר יעיל לגרסת האופטימיזציה נותן פותר יעיל לגרסת ההכרעה [01:54:42]. ההוכחה, שהמרצה נתן במפורש: בהינתן ⟨G,k⟩\langle G,k \rangle, הרץ את פותר האופטימיזציה על GG, קבל את הגודל המינימלי mm, והחזר "כן" אם ורק אם m≤km \le k. זו קריאה אחת ובדיקה אחת, ולכן פולינומית. במילותיו: "אם אני יודע לפתור את זה, אני יודע לפתור את זה."
  3. מכאן נובעת המסקנה שמעניינת אותנו: אם את גרסת ההכרעה איננו יודעים לפתור ביעילות, אז בוודאי לא את גרסת האופטימיזציה. זו הסיבה שבשיעור הזה מוותרים על אופטימליות.

הערה על הכיוון ההפוך. המרצה לא טען בשיעור את הכיוון ההפוך (בנייה של פותר אופטימיזציה מפותר הכרעה, למשל בחיפוש בינארי על kk ואז self-reducibility), ולכן הוא אינו נטען כאן כתוצאה של השיעור. הוא כן משתמש בגרסה חלשה שלו במסקנת השקילות של משפט 4 [01:25:28], שם די בכך שאם P=NP\mathrm{P}=\mathrm{NP} אפשר לפתור במדויק.

אינטואיציה כללית — למה בכלל התחלנו בזה [01:43:50]–[01:47:27]. זהו הפרק השלישי בקורס, "התמודדות עם NP-קושי". עד היום כל האלגוריתמים שראיתם (דייקסטרה, קרוסקל) החזירו תשובה מדויקת. כאן, לראשונה, מוותרים על משהו כדי לקבל זמן ריצה פולינומי: אלגוריתמי קירוב מוותרים על אופטימליות, ואלגוריתמים אקראיים (השיעורים הבאים) מוותרים על ודאות. בשני המקרים מתעקשים על גרנטי כמותי — "טועה, אבל לא יותר מדי" / "לא אופטימלי, אבל לא רחוק מדי". והמרצה הוסיף אזהרה: זה לא אומר שהבעיה באמת קשה; ייתכן ש-VC\mathrm{VC} בכלל ב-P\mathrm{P} — פשוט איננו יודעים לפתור אותה [01:45:24].

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

הגדרה 2: בעיית אופטימיזציה (הגדרה פורמלית)

בעיית אופטימיזציה מורכבת מארבעה רכיבים (עמוד 6 בסיכום שיעור 12; [01:57:00]–[02:00:51] בתמלול 18):

  1. קבוצה I\mathcal{I} של קלטים אפשריים;
  2. לכל קלט I∈II \in \mathcal{I}, אוסף XIX_I של פתרונות אפשריים (feasible);
  3. פונקציית ערך v:XI→Rv : X_I \to \mathbb{R};
  4. המטרה: מבין הפתרונות האפשריים, למצוא פתרון אפשרי x∈XIx \in X_I שעבורו v(x)v(x) אופטימלי — מינימלי או מקסימלי, לפי הבעיה.

המופע של VC\mathrm{VC} (העמודה הכחולה בעמוד 6):

  1. I\mathcal{I} היא אוסף כל הגרפים הלא מכוונים;
  2. לכל גרף G=(V,E)G=(V,E), כל כיסוי בקודקודים ב-GG נקרא פתרון אפשרי;
  3. הערך של פתרון אפשרי הוא גודלו;
  4. מבין כל הכיסויים בקודקודים מחפשים מינימלי.

אינטואיציה — שני צירים, מתפשרים רק על אחד [02:01:23]. הרכיב (2) והרכיב (3) הם שני צירים נפרדים: האם הפתרון אפשרי, ומה ערכו. אלגוריתם קירוב ל-VC\mathrm{VC} חייב להחזיר כיסוי; על הערך הוא רשאי להתפשר. יש קו מחקר שלם שמתפשר גם על הפיזביליות — לא בקורס הזה.

אי-מופע: למה דווקא מינימום ב-VC\mathrm{VC} ולא מקסימום [02:02:24]? כי כיסוי מקסימלי הוא טריוויאלי — כל קבוצת הקודקודים היא תמיד כיסוי. באופן סימטרי, ב-CLIQUE\mathrm{CLIQUE} ו-Independent Set מחפשים מקסימום כי כל קודקוד בודד הוא קליק, וב-MAXCUT\mathrm{MAXCUT} מחפשים מקסימום כי U=∅U=\emptyset נותן תמיד חתך בגודל 00. "יש היגיון בטירוף": מגדירים תמיד את הכיוון המעניין, כי בכיוון השני התשובה ידועה מראש.

הגדרה 3: אלגוריתם קירוב ביחס α\alpha

(א) בעיית מינימיזציה (הניסוח שבעמוד 6 בסיכום שיעור 12, [02:05:02] בתמלול 18). עבור α≥1\alpha \ge 1, אלגוריתם קירוב לבעיית מינימיזציה עם יחס קירוב α\alpha הוא אלגוריתם שעבור כל קלט II לבעיה: רץ בזמן פולינומי ב-∣I∣|I|, מחזיר פתרון אפשרי x∈XIx \in X_I, ומקיים OPT(I)  ≤  v(x)  ≤  α⋅OPT(I),OPT(I)=min⁡y∈XIv(y).\mathrm{OPT}(I) \;\le\; v(x) \;\le\; \alpha \cdot \mathrm{OPT}(I), \qquad \mathrm{OPT}(I) = \min_{y \in X_I} v(y).

(ב) בעיית מקסימיזציה (לא בעמוד 6; נאמר בעל פה בשיעור הזה [00:36:24]). עבור 0<α≤10 < \alpha \le 1, אלגוריתם קירוב לבעיית מקסימיזציה עם יחס קירוב α\alpha הוא אלגוריתם שעבור כל קלט II: רץ בזמן פולינומי ב-∣I∣|I|, מחזיר פתרון אפשרי x∈XIx \in X_I, ומקיים α⋅OPT(I)  ≤  v(x)  ≤  OPT(I),OPT(I)=max⁡y∈XIv(y).\alpha \cdot \mathrm{OPT}(I) \;\le\; v(x) \;\le\; \mathrm{OPT}(I), \qquad \mathrm{OPT}(I) = \max_{y \in X_I} v(y).

אינטואיציה. בשני המקרים שלושה דברים צריך לוודא [02:06:37]: זמן פולינומי, פיזביליות, וחסם על הערך. אחד משני אי-השוויונות הוא תמיד טריוויאלי — במינימיזציה זה OPT≤v(x)\mathrm{OPT} \le v(x) (פתרון אפשרי לא יכול להיות זול מהמינימום), ובמקסימיזציה זה v(x)≤OPTv(x) \le \mathrm{OPT} (אי אפשר להחזיר פתרון טוב מהמקסימלי). כל העבודה היא באי-השוויון השני.

מופע: אלגוריתם שמחזיר חתך בגודל לפחות חצי מהחתך המקסימלי הוא אלגוריתם קירוב ביחס 12\tfrac12 (משפט 3); האלגוריתם של משפט 1 הוא אלגוריתם קירוב ביחס 22.

אי-מופע חשוב [00:36:24]: אלגוריתם ל-Independent Set שמחזיר תמיד קודקוד בודד הוא אמנם פולינומי ואמנם מחזיר פתרון אפשרי — אבל אין שום α>0\alpha>0 קבוע שעבורו הוא אלגוריתם קירוב ביחס α\alpha, כי OPT\mathrm{OPT} יכול לגדול עם הגרף בעוד הפלט נשאר 11. פתרון אפשרי כשלעצמו אינו מספיק; היחס חייב להיות קבוע שאינו תלוי בקלט.

שימו לב לקונבנציה של הקורס. כאן α≥1\alpha \ge 1 לבעיות מינימום ו-α≤1\alpha \le 1 לבעיות מקסימום — כלומר α\alpha הוא תמיד היחס ALG/OPT\mathrm{ALG}/\mathrm{OPT} בכיוון שבו הוא נמדד. הסיכום כותב בהתאם "אלגוריתם קירוב פי 22" ל-VC\mathrm{VC} ו"אלגוריתם קירוב פי 12\tfrac12" ל-MAXCUT\mathrm{MAXCUT}. ספרים אחרים מנרמלים גם בעיות מקסימום ל-α≥1\alpha \ge 1 וכותבים OPT/ALG≤α\mathrm{OPT}/\mathrm{ALG} \le \alpha; בקובץ הזה נשמרת הקונבנציה של הקורס.

הקושי שהמרצה השאיר כשאלה פתוחה בסוף שיעור 12 [02:07:08]: האלגוריתם אינו יודע את OPT(I)\mathrm{OPT}(I) — חישובו הוא בדיוק הבעיה הקשה. אז איך הוא בכלל יכול להתחייב ש-v(x)≤α⋅OPT(I)v(x) \le \alpha \cdot \mathrm{OPT}(I)? "זה הקסם, אבל זה כמו הקסם של רדוקציה." התשובה נמצאת במשפט 1: גודל עזר שחוסם את OPT\mathrm{OPT}.

הגדרה 4: זיווג (קשתות זרות בזוגות)

קבוצת קשתות F⊆EF \subseteq E נקראת זרה בזוגות (זיווג, matching) אם לכל e,e^∈Fe, \hat e \in F עם e≠e^e \ne \hat e מתקיים e∩e^=∅e \cap \hat e = \emptyset, כלומר אין להן קודקוד משותף.

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

מופע: בגרף המעגל C6C_6 עם קודקודים 1,…,61,\dots,6, הקבוצה {12,34,56}\{12, 34, 56\} היא זיווג. אי-מופע: {12,23}\{12, 23\} אינה זיווג, כי 12∩23={2}12 \cap 23 = \{2\}.

הגדרה 5: החתך המושרה, ו-cut(v)\mathrm{cut}(v) מול other(v)\mathrm{other}(v)

יהי G=(V,E)G=(V,E) ותהי U⊆VU \subseteq V, ונסמן Uˉ=V∖U\bar U = V \setminus U. החתך המושרה על ידי UU הוא קבוצת הקשתות F  =  { xy∈E  ∣  ∣{x,y}∩U∣=1 },F \;=\; \{\, xy \in E \;\mid\; |\{x,y\} \cap U| = 1 \,\}, כלומר כל הקשתות שיש להן בדיוק קצה אחד ב-UU. לכל v∈Vv \in V נסמן:

  • cut(v)\mathrm{cut}(v) — מספר הקשתות הסמוכות ל-vv ששייכות לחתך (הקצה השני שלהן בצד הנגדי);
  • other(v)\mathrm{other}(v) — מספר הקשתות הסמוכות ל-vv שאינן בחתך (הקצה השני שלהן באותו צד).

קשת נקראת סמוכה ל-vv אם vv הוא אחד מקצותיה.

אינטואיציה. כל קשת הנוגעת ב-vv היא או "חוצה" או "פנימית", ולכן באופן מיידי cut(v)+other(v)  =  deg⁡G(v)for all v∈V.\mathrm{cut}(v) + \mathrm{other}(v) \;=\; \deg_G(v) \qquad \text{for all } v \in V .

מופע: בגרף המשולש {a,b,c}\{a,b,c\} עם U={a}U=\{a\}: החתך הוא {ab,ac}\{ab, ac\}, ומתקיים cut(a)=2,other(a)=0\mathrm{cut}(a)=2, \mathrm{other}(a)=0; cut(b)=1,other(b)=1\mathrm{cut}(b)=1, \mathrm{other}(b)=1 (הקשת bcbc פנימית). אי-מופע: עבור U=∅U=\emptyset החתך ריק ו-cut(v)=0\mathrm{cut}(v)=0 לכל vv — קבוצה ריקה היא פתרון אפשרי לגמרי, פשוט גרוע.

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

קלט: גרף שלם G^=(V,E^)\hat G=(V,\hat E) ופונקציית משקלים w:E^→Q≥0w:\hat E \to \mathbb{Q}_{\ge 0}. פתרונות אפשריים: כל המעגלים ההמילטוניים ב-G^\hat G (מעגל שעובר בכל קודקוד בדיוק פעם אחת). שימו לב שבגרף שלם תמיד קיים כזה. ערך: w(C)=∑e∈Cw(e)w(C)=\sum_{e \in C} w(e). מטרה: מינימיזציה.

אינטואיציה [01:21:14]. נקודת בלבול נפוצה מהכיתה: המשקל שמעניין אותנו הוא של המעגל, לא של הגרף. במעגל המילטוני יש בדיוק ∣V∣|V| קשתות, לא משנה כמה קשתות יש בגרף השלם עצמו.

מופע: על K4K_4 עם משקל 11 לקשתות 12,23,34,4112,23,34,41 ומשקל 99 לאלכסונים, המעגל 1 ⁣− ⁣2 ⁣− ⁣3 ⁣− ⁣4 ⁣− ⁣11\!-\!2\!-\!3\!-\!4\!-\!1 הוא פתרון אפשרי בערך 44, וזהו האופטימום.


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

משפט 1: קיים אלגוריתם קירוב ביחס 22 לבעיית הכיסוי בקודקודים

האלגוריתם (עמוד 1 בסיכום). על קלט G=(V,E)G=(V,E):

  1. אתחל C←∅C \leftarrow \emptyset, וכן F←∅F \leftarrow \emptyset.
  2. כל עוד יש בגרף קשת e=xye = xy:
    1. הוסף את xx ואת yy ל-CC; הוסף את ee ל-FF.
    2. מחק מהגרף את xx ואת yy ואת כל הקשתות המחוברות ל-xx או ל-yy.
  3. החזר את CC.

הערה [00:03:12]–[00:03:43]: בגרסה הראשונה שנכתבה על הלוח שלב 2.2 היה "מחק את הקשת ee ואת כל הקשתות המחוברות ל-xx ול-yy". סטודנט העיר שמחיקת הקשת ee מיותרת — ברגע שמוחקים את הקודקודים x,yx,y, כל הקשתות הנוגעות בהם, ובכללן ee עצמה, נעלמות. המרצה קיבל את התיקון ("אתה צודק ב-100%"), וזו הגרסה שנרשמה. הקובץ הזה משתמש בגרסה המתוקנת.

הערה: השורה F←∅F \leftarrow \emptyset ותוספת ee ל-FF אינן חלק אמיתי מהאלגוריתם [00:30:04]. האלגוריתם אינו צריך את FF כדי לרוץ, והיא לא משפיעה על הפלט. היא קיימת אך ורק לצורך הניתוח, ולכן נכתבה בסיכום בצבע אחר. זהו דפוס שחוזר בכל השיעור: מוסיפים לאלגוריתם "משתנה רפאים" שנותן לנו נקודת ייחוס להשוואה מול האופטימום.

טענה א (זמן ריצה). האלגוריתם רץ בזמן O(∣E∣2)O(|E|^2), ובפרט בזמן פולינומי בגודל הקלט.

הוכחה. נבחן מה "מתקדם" בכל איטרציה. בכל איטרציה של הלולאה נבחרת קשת ee ונמחקים שני קצותיה, ולכן נמחקת לפחות קשת אחת (הקשת ee עצמה). מספר הקשתות אינו גדל אף פעם, ולכן מספר האיטרציות קטן או שווה ל-∣E∣|E|. בכל איטרציה, מציאת קשת ומחיקת הקודקודים והקשתות הסמוכות עולה לכל היותר מעבר על כל הגרף, כלומר O(∣V∣+∣E∣)O(|V|+|E|), ובחסם גס לכל היותר ∣E∣|E| מחיקות. סך הכל O(∣E∣2)O(|E|^2) — פולינומי בגודל הקלט. ■\blacksquare

הערה מתודית [00:06:53]–[00:10:53]: סטודנט נתן ניתוח הדוק בהרבה — כל קשת "נוגעים" בה לכל היותר פעם אחת (או שעוברים עליה ואז מוחקים אותה, או שהיא נמחקת כתוצאה ממחיקת שכן), ולכן זמן הריצה הוא O(∣E∣)O(|E|). המרצה אישר שהניתוח נכון ומעולה, אך העדיף בכוונה את הניתוח הגס: "כל מה שמעניין אותי זה שזה פולינומי; אם אני לא חייב, אני לא עושה עבודות יזומות". במבחן — החסם הגס מספיק, ובלבד שהוא נכון.

טענה ב (פיזביליות). יהי G=(V,E)G=(V,E) ותהי CC הקבוצה המוחזרת על ידי האלגוריתם. אז CC היא כיסוי בקודקודים של GG.

הוכחה. ראשית נבחין באינוריאנטה: קודקוד נמחק מהגרף אם ורק אם הוא הוכנס ל-CC. אכן, המחיקה היחידה מתבצעת בשלב 2.2 ומתייחסת בדיוק לשני הקודקודים שהוכנסו ל-CC בשלב 2.1.

תהי e=xy∈Ee = xy \in E קשת שרירותית של הגרף המקורי. האלגוריתם עוצר רק כשאין קשתות בגרף, ולכן בסיום הריצה ee אינה בגרף — כלומר ee נמחקה במהלך הריצה (אחרת האלגוריתם לא היה עוצר). קשת נמחקת רק בשלב 2.2, וזה קורה באחד משלושה מקרים:

  • מקרה 1: ee הייתה הקשת שהאלגוריתם בחר באיטרציה. אז לפי שלב 2.1 מתקיים x∈Cx \in C וגם y∈Cy \in C, ובפרט x∈Cx \in C או y∈Cy \in C.
  • מקרה 2: ee נמחקה כתוצאה ממחיקת xx (כלומר xx היה קצה של קשת אחרת שנבחרה). לפי האינוריאנטה x∈Cx \in C, ולכן x∈Cx \in C או y∈Cy \in C.
  • מקרה 3: ee נמחקה כתוצאה ממחיקת yy. באופן סימטרי y∈Cy \in C, ולכן x∈Cx \in C או y∈Cy \in C.

בכל המקרים לפחות אחד מקצות ee שייך ל-CC. מכיוון ש-ee הייתה שרירותית, CC מכסה את כל קשתות GG. ■\blacksquare

הערה: מקרה 1 הוא למעשה מקרה פרטי של מקרים 2–3 בגרסה המתוקנת של האלגוריתם (הקשת הנבחרת נמחקת בדיוק בגלל מחיקת קצותיה). הסיכום מונה את שלושתם בנפרד, וכך גם נשמר כאן, כי בגרסה שעל הלוח בתחילת השיעור המחיקה של ee הייתה מפורשת ולכן המקרה היה נפרד באמת.

שימו לב לניסוח [00:14:01]: גם כשמקבלים "x∈Cx \in C וגם y∈Cy \in C", המרצה התעקש לסיים את המשפט ב"ובפרט x∈Cx\in C או y∈Cy\in C" — כי זה בדיוק מה שההגדרה של כיסוי דורשת. "זה הקורד שאני חייב לסיים איתו את הדבר הזה."

טענה ג (יחס הקירוב). יהי CoptC_{\mathrm{opt}} פתרון אופטימלי (כיסוי בקודקודים בגודל מינימלי) עבור GG. אז ∣Copt∣  ≤  ∣C∣  ≤  2 ∣Copt∣.|C_{\mathrm{opt}}| \;\le\; |C| \;\le\; 2\,|C_{\mathrm{opt}}| .

הוכחה. אי-השוויון השמאלי מיידי: לפי טענה ב, CC הוא כיסוי בקודקודים, ואין כיסוי בקודקודים קטן מהמינימלי.

לאי-השוויון הימני נשתמש ב-FF. תהי e∈Fe \in F קשת כלשהי שהאלגוריתם בחר. מכיוון ש-CoptC_{\mathrm{opt}} הוא כיסוי בקודקודים של GG, ומכיוון ש-e∈Ee \in E, חייב להיות לפחות אחד מקצותיה של ee ב-CoptC_{\mathrm{opt}}. נגדיר פונקציה φ:F→Copt,φ(e)=one endpoint of e that lies in Copt\varphi: F \to C_{\mathrm{opt}}, \qquad \varphi(e) = \text{one endpoint of } e \text{ that lies in } C_{\mathrm{opt}} (אם שני הקצוות ב-CoptC_{\mathrm{opt}} נבחר אחד מהם באופן שרירותי — לא משנה איזה). הפונקציה מוגדרת היטב בדיוק בזכות היות CoptC_{\mathrm{opt}} כיסוי.

φ\varphi חד-חד-ערכית. יהיו e,e^∈Fe, \hat e \in F עם e≠e^e \ne \hat e. לפי מבנה האלגוריתם, ברגע שקשת נכנסת ל-FF שני קצותיה נמחקים מהגרף יחד עם כל הקשתות הנוגעות בהם; לכן שום קשת שתיבחר אחר כך לא תיגע בהם. נובע ש-e∩e^=∅e \cap \hat e = \emptyset, כלומר FF היא קבוצת קשתות זרות בזוגות (זיווג). ומכיוון ש-φ(e)\varphi(e) הוא קצה של ee ו-φ(e^)\varphi(\hat e) הוא קצה של e^\hat e, ושתי הקשתות זרות, בהכרח φ(e)≠φ(e^)\varphi(e) \ne \varphi(\hat e).

לפי עקרון שובך היונים בניסוח של פונקציות, קיום פונקציה חד-חד-ערכית מ-FF ל-CoptC_{\mathrm{opt}} נותן ∣F∣  ≤  ∣Copt∣.|F| \;\le\; |C_{\mathrm{opt}}| .

מצד שני, בכל איטרציה הכנסנו קשת אחת ל-FF ושני קודקודים חדשים ל-CC (חדשים, כי אחרי המחיקה הם לא יופיעו שוב), ולכן ∣C∣  =  2 ∣F∣.|C| \;=\; 2\,|F| .

בשילוב: ∣C∣=2∣F∣≤2∣Copt∣|C| = 2|F| \le 2|C_{\mathrm{opt}}|. ■\blacksquare

הערה: זו ליבת השיעור [00:18:45]. האלגוריתם אינו יודע לחשב את ∣Copt∣|C_{\mathrm{opt}}|, ואפילו לא לדבר עליו. הפתרון הוא לקחת גודל אחר, ∣F∣|F|, שנוח לעבוד איתו, להראות שהוא חוסם מלמטה את האופטימום, ולהראות שהפלט אינו גדול מפי 22 ממנו. זהו התבנית הכללית לכל בעיית מינימיזציה: מצא חסם תחתון על OPT\mathrm{OPT} שהאלגוריתם שולט בו.

הערה: כאן מתברר למה מוחקים את שני הקודקודים [00:24:10]. אילו היינו מוחקים רק קודקוד אחד, שתי קשתות ב-FF היו יכולות לחלוק קודקוד, φ\varphi לא הייתה בהכרח חד-חד-ערכית, וכל ההוכחה קורסת. ראו תרגיל 3 בהמשך לדוגמה נגדית מפורשת.

משפט 2: הניתוח של משפט 1 הדוק ביחס לאלגוריתם

ניסוח. קיימת משפחה אינסופית של גרפים שעליהם האלגוריתם של משפט 1 מחזיר כיסוי בגודל בדיוק 2∣Copt∣2|C_{\mathrm{opt}}|. לכן לא ניתן לשפר את הקבוע 22 בטענה ג עבור האלגוריתם הזה.

הוכחה. לכל n≥1n \ge 1 נגדיר את MnM_n: גרף על 2n2n קודקודים x1,y1,…,xn,ynx_1,y_1,\dots,x_n,y_n שקשתותיו הן xiyix_iy_i לכל ii — כלומר nn קשתות זרות בזוגות (זיווג מושלם, ולא גרף רדוקיבילי במובן כלשהו; המרצה הדגיש שזה בדיוק "זיווג" [00:34:16]).

התנהגות האלגוריתם: בכל איטרציה נבחרת אחת מהקשתות xiyix_iy_i; שני קצותיה נכנסים ל-CC ונמחקים; אף קשת אחרת אינה נוגעת בהם, ולכן כל שאר הקשתות נשארות. לאחר nn איטרציות C={x1,y1,…,xn,yn}C = \{x_1,y_1,\dots,x_n,y_n\}, כלומר ∣C∣=2n=∣V∣|C| = 2n = |V| — כל הגרף.

האופטימום: הקשתות זרות בזוגות, ולכן כל כיסוי חייב להכיל לפחות קודקוד אחד מכל קשת, ומכאן ∣Copt∣≥n|C_{\mathrm{opt}}| \ge n. מצד שני, בחירת קצה אחד מכל קשת נותנת כיסוי בגודל nn. לכן ∣Copt∣=n|C_{\mathrm{opt}}| = n, ומספר הפתרונות האופטימליים הוא 2n=2∣V∣/22^{n} = 2^{|V|/2} (שתי בחירות לכל קשת) [00:35:19].

מכאן ∣C∣=2n=2∣Copt∣|C| = 2n = 2|C_{\mathrm{opt}}|. ■\blacksquare

למה צריך משפחה אינסופית ולא גרף בודד [00:34:16]: אם מציגים דוגמה נגדית קטנה אחת, אפשר לטעון "על גרף כזה אני פשוט פותר ידנית". כדי לומר משהו על האלגוריתם צריך אינסטנס גדול כרצוננו — לכן MnM_n לכל nn.

שתי שאלות שונות לחלוטין [00:31:09]–[00:33:12]. (א) האם ההוכחה הדוקה ביחס לאלגוריתם? כן — זה משפט 2. (ב) האם האלגוריתם הדוק ביחס לבעיה, כלומר האם קיים אלגוריתם קירוב טוב מ-22 ל-VC\mathrm{VC}? זו בעיה פתוחה ותחום מחקר חי. שאלה (א) היא שאלה על הניתוח שלנו; שאלה (ב) היא שאלה על טבע הבעיה, ואיננו עונים עליה בקורס. שימו לב גם: כל אלגוריתם 22-קירוב הוא בפרט אלגוריתם 44-קירוב — אי-השוויון רק נחלש [00:35:19].

משפט 3: קיים אלגוריתם קירוב ביחס 12\tfrac12 לבעיית MAXCUT

האלגוריתם (עמוד 3 בסיכום) — חיפוש מקומי. על קלט G=(V,E)G=(V,E):

  1. אתחל U←∅U \leftarrow \emptyset (ולכן Uˉ←V\bar U \leftarrow V).
  2. כל עוד יש קודקוד vv שהעברתו מ-UU ל-Uˉ\bar U, או מ-Uˉ\bar U ל-UU, מגדילה את גודל החתך המושרה:
    1. העבר את הקודקוד.
  3. החזר את UU.

טענה א (פיזביליות). האלגוריתם מחזיר קבוצת קודקודים U⊆VU \subseteq V, וכל קבוצת קודקודים היא פתרון אפשרי ל-MAXCUT\mathrm{MAXCUT}. לכן הפלט אפשרי, תמיד. ■\blacksquare

הערה [00:38:30]: כאן, בניגוד ל-VC\mathrm{VC}, אין שום תנאי על הקבוצה המוחזרת — "מקסימלי" הוא חלק מפונקציית המטרה, לא מהגדרת הפתרון האפשרי. לכן כל ההתעקבות תהיה על יחס הקירוב.

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

הוכחה. החשש האמיתי כאן אינו הזמן אלא העצירה [00:41:59]: לכאורה קודקוד יכול לעבור לצד אחד ואז לחזור, ולהיתקע בלולאה אינסופית. ואכן, קודקוד יכול לחזור (ראו דוגמה 4 בהמשך) — אבל זה לא משנה, כי יש לנו "חוש התקדמות" מונוטוני:

בכל איטרציה שבה מבוצעת העברה, גודל החתך המושרה על ידי UU גדל בלפחות 11 — זה בדיוק תנאי הלולאה, ולכן החתך לעולם אינו קטן. גודל החתך מתחיל ב-00 (כי U=∅U=\emptyset), ובאף חתך אין יותר מ-∣E∣|E| קשתות. לכן מספר ההעברות הוא לכל היותר ∣E∣|E|, ומספר הסריקות (כולל הסריקה האחרונה שבה לא נמצא קודקוד משפר ולכן האלגוריתם עוצר) הוא לכל היותר ∣E∣+1|E|+1.

עלות סריקה אחת: עוברים על כל קודקוד vv, ולכל אחד על כל שכניו, וסופרים כמה מהם בצד שלו וכמה בצד הנגדי; אם בצד שלו יש יותר — מעבירים אותו. בייצוג ברשימת שכנויות זהו מעבר על כל הגרף, כלומר O(∣V∣+∣E∣)O(|V|+|E|). סך הכל O(∣E∣⋅(∣V∣+∣E∣))=O(∣G∣2)O(|E| \cdot (|V|+|E|)) = O(|G|^2), פולינומי בגודל הקלט. ■\blacksquare

טענה ג (יחס הקירוב). נסמן ב-KK את גודלו של חתך מקסימלי ב-GG, וב-FF את קבוצת הקשתות בחתך המושרה על ידי ה-UU שהאלגוריתם החזיר. אז ∣F∣  ≥  12∣E∣  ≥  12K.|F| \;\ge\; \tfrac12 |E| \;\ge\; \tfrac12 K .

הוכחה. נתחיל מהחסם העליון הפשוט על האופטימום: כל חתך הוא תת-קבוצה של EE, ולכן K≤∣E∣K \le |E|. זהו גודל העזר בבעיית מקסימיזציה — בדיוק המראה של ∣F∣≤∣Copt∣|F| \le |C_{\mathrm{opt}}| ממשפט 1, רק שכאן צריך חסם מלמעלה על OPT\mathrm{OPT} [00:50:01].

כעת שלושה מרכיבים:

(1) פירוק הדרגה. לכל v∈Vv \in V, כל קשת סמוכה ל-vv היא או בחתך או לא, ולכן cut(v)+other(v)=deg⁡G(v).\mathrm{cut}(v) + \mathrm{other}(v) = \deg_G(v). סכימה על כל הקודקודים ושימוש במשפט הדרגות: ∑v∈V(cut(v)+other(v))  =  ∑v∈Vdeg⁡G(v)  =  2∣E∣.\sum_{v\in V}\bigl(\mathrm{cut}(v)+\mathrm{other}(v)\bigr) \;=\; \sum_{v \in V}\deg_G(v) \;=\; 2|E| .

(2) תנאי האופטימליות המקומית. האלגוריתם עצר. נסמן ב-cut(v),other(v)\mathrm{cut}(v), \mathrm{other}(v) את הערכים ברגע העצירה [01:00:37]. אילו היה קיים vv עם cut(v)<other(v)\mathrm{cut}(v) < \mathrm{other}(v), אז העברת vv לצד הנגדי הייתה הופכת את כל הקשתות הפנימיות שלו לקשתות חתך ולהפך, ומשנה את גודל החתך ב-other(v)−cut(v)>0\mathrm{other}(v) - \mathrm{cut}(v) > 0 — כלומר מגדילה אותו, והאלגוריתם לא היה עוצר. סתירה. לכן cut(v)  ≥  other(v)for all v∈V.\mathrm{cut}(v) \;\ge\; \mathrm{other}(v) \qquad \text{for all } v \in V .

(3) ספירה כפולה של קשתות החתך. כל קשת בחתך היא בעלת קצה אחד בדיוק ב-UU וקצה אחד בדיוק ב-Uˉ\bar U. לכן בסכימה על צד אחד בלבד, כל קשת חתך נספרת בדיוק פעם אחת: ∑v∈Ucut(v)  =  ∣F∣,∑v∈Uˉcut(v)  =  ∣F∣.\sum_{v \in U}\mathrm{cut}(v) \;=\; |F|, \qquad \sum_{v \in \bar U}\mathrm{cut}(v) \;=\; |F| . מכיוון ש-V=U ∪˙ UˉV = U \,\dot\cup\, \bar U, חיבור שתי המשוואות נותן ∑v∈Vcut(v)  =  2∣F∣.\sum_{v \in V}\mathrm{cut}(v) \;=\; 2|F| .

החיבור (ה"גרנד פינלה" [00:57:07]). נשתמש ב-(1), ואז ב-(2) איבר-איבר, ואז ב-(3): 2∣E∣  =  ∑v∈V(cut(v)+other(v))  ≤  ∑v∈V2 cut(v)  =  2∑v∈Vcut(v)  =  4∣F∣.2|E| \;=\; \sum_{v\in V}\bigl(\mathrm{cut}(v)+\mathrm{other}(v)\bigr) \;\le\; \sum_{v\in V} 2\,\mathrm{cut}(v) \;=\; 2\sum_{v\in V}\mathrm{cut}(v) \;=\; 4|F| . מכאן ∣F∣≥12∣E∣|F| \ge \tfrac12 |E|, ומכיוון ש-K≤∣E∣K \le |E| מתקיים גם ∣F∣≥12K|F| \ge \tfrac12 K. יחד עם טענה א וטענה ב, זהו אלגוריתם קירוב ביחס 12\tfrac12 ל-MAXCUT\mathrm{MAXCUT}. ■\blacksquare

הערה [00:57:53]: בהרצאה נאמר לרגע "גדול שווה" ומיד תוקן ל"קטן שווה". הכיוון הנכון הוא זה שכתוב כאן: מחליפים other(v)\mathrm{other}(v) ב-cut(v)\mathrm{cut}(v) שהוא גדול ממנו, ולכן הסכום רק גדל.

הערה: היכן ההפסד בניתוח. החסם K≤∣E∣K \le |E| הוא גס. על גרף המשולש למשל ∣E∣=3|E|=3 ו-K=2K=2, כך שהניתוח מבטיח רק ∣F∣≥1.5|F| \ge 1.5 בעוד שהאלגוריתם למעשה מוצא חתך בגודל 22, כלומר אופטימלי. שאלת ההידוק של 12\tfrac12 לא נדונה בהרצאה ואינה בסיכום.

משפט 4: לכל α≥1\alpha \ge 1 — אם ניתן לקרב את בעיית הסוכן הנוסע הכללית ביחס α\alpha, אז P=NP\mathrm{P}=\mathrm{NP}

רקע לניסוח [01:03:27]: אין באמת "קושי" מוכח בעולם ה-NP. לא הוכחנו שאי אפשר לפתור בעיה NP-קשה ביעילות; הוכחנו רק שהיא קשה ביחס לשאר בעיות NP\mathrm{NP}. לכן, ובפרט לבעיות אופטימיזציה שעבורן NP-קושי לא מוגדר פורמלית (הוא מוגדר דרך רדוקציות בין שפות, כלומר בעיות הכרעה), התוצאות שאנחנו יכולים לנסח הן תוצאות קושי מותנות: "אם אפשר לעשות X, אז P=NP\mathrm{P}=\mathrm{NP}" — ומכיוון שאיננו מצפים ל-P=NP\mathrm{P}=\mathrm{NP}, איננו מצפים ש-X אפשרי.

הוכחה. יהי α≥1\alpha \ge 1, ונניח בשלילה שקיים אלגוריתם קירוב AA ביחס α\alpha לגרסת האופטימיזציה של בעיית הסוכן הנוסע. נבנה את האלגוריתם הבא, שמקבל גרף לא מכוון G=(V,E)G=(V,E):

  1. בנה גרף שלם G^=(V,E^)\hat G = (V, \hat E) על אותה קבוצת קודקודים, ולכל e∈E^e \in \hat E הגדר w(e)={1e∈Eα∣V∣+1e∉Ew(e) = \begin{cases} 1 & e \in E \\ \alpha|V|+1 & e \notin E \end{cases}
  2. הרץ את אלגוריתם הקירוב AA על (G^,w)(\hat G, w).
  3. אם ערך הפתרון שחזר קטן או שווה α∣V∣\alpha|V| — קבל; אחרת — דחה.

הערה [01:11:40]: זו כמעט אותה בנייה כמו הרדוקציה UHC≤pTSP\mathrm{UHC} \le_p \mathrm{TSP} משיעור 12, אבל שם המשקלים היו 11 ו-22 וכאן המשקל של "קשת שלא הייתה" הוא ענק. הענק הזה הוא מה שקונה לנו את הפער מול α\alpha.

הערה [01:16:56]: האובייקט שבנינו אינו רדוקציית מיפוי. זה אלגוריתם שקורא לאלגוריתם אחר כתת-שגרה ואז מפרש את התשובה — בדיוק סוג ה"רדוקציה" שמכירים מקורסי אלגוריתמים ומבני נתונים. לכן הניסוח הוא "האלגוריתם מכריע את UHC\mathrm{UHC}", ולא "יש רדוקציה".

ניתוח זמן ריצה. יהי G=(V,E)G=(V,E).

  • שלב 1 דורש O(∣V∣2)O(|V|^2) צעדים: יש (∣V∣2)\binom{|V|}{2} קשתות בגרף השלם, ולכל אחת בדיקה אם היא ב-EE וכתיבת משקל. המשקל α∣V∣+1\alpha|V|+1 ניתן לכתיבה ב-O(log⁡(α∣V∣))O(\log(\alpha|V|)) ביטים — זה מספר גדול, אבל קצר [01:12:10]; זה בדיוק ההבדל בין "מספר גדול" ל"מספר שאי אפשר לכתוב".
  • שלב 2 דורש זמן פולינומי ב-∣(G^,w)∣|(\hat G,w)|, כי אלגוריתם קירוב הוא מעצם ההגדרה אלגוריתם פולינומי [01:14:18]. מכיוון ש-∣(G^,w)∣≤O(∣G∣2)|(\hat G, w)| \le O(|G|^2), ומכיוון שפולינום בפולינום הוא פולינום, שלב 2 פולינומי ב-∣G∣|G|.
  • שלב 3 דורש זמן קבוע: השוואת שני מספרים.

סך הכל: זמן ריצה פולינומי ב-∣G∣|G|.

ניתוח נכונות. יהי G=(V,E)G=(V,E) ונסמן n=∣V∣n = |V|.

כיוון ראשון: G∈UHCG \in \mathrm{UHC}. אז קיים ב-GG מעגל המילטוני C0C_0. אותו מעגל קיים גם ב-G^\hat G (כי E⊆E^E \subseteq \hat E), וכל קשתותיו הן קשתות של EE ולכן במשקל 11 כל אחת. במעגל המילטוני יש בדיוק nn קשתות, ולכן w(C0)=nw(C_0) = n. יתרה מזו, כל מעגל המילטוני מורכב מ-nn קשתות שמשקל כל אחת הוא לפחות 11, ולכן OPT(G^,w)≥n\mathrm{OPT}(\hat G,w) \ge n; יחד, OPT(G^,w)=n\mathrm{OPT}(\hat G,w) = n בדיוק. מכיוון ש-AA הוא אלגוריתם קירוב ביחס α\alpha לבעיית מינימיזציה, הפתרון שהוא מחזיר מקיים w(A(G^,w))  ≤  α⋅OPT(G^,w)  =  αn.w(A(\hat G,w)) \;\le\; \alpha \cdot \mathrm{OPT}(\hat G,w) \;=\; \alpha n . לכן שלב 3 מקבל את GG — כנדרש.

כיוון שני: G∉UHCG \notin \mathrm{UHC}. אז אין ב-GG מעגל המילטוני. יהי CC מעגל המילטוני כלשהו ב-G^\hat G (קיים כזה, כי G^\hat G שלם). מכיוון ש-CC אינו מעגל המילטוני של GG, בהכרח יש בו קשת e∗∉Ee^* \notin E, ולכן w(e∗)=αn+1w(e^*) = \alpha n + 1. שאר n−1n-1 הקשתות של CC תורמות לפחות 11 כל אחת, ולכן w(C)  ≥  (αn+1)+(n−1)  =  αn+n  >  αn.w(C) \;\ge\; (\alpha n + 1) + (n-1) \;=\; \alpha n + n \;>\; \alpha n . זה נכון לכל מעגל המילטוני ב-G^\hat G, ובפרט למעגל המינימלי, ולכן OPT(G^,w)>αn\mathrm{OPT}(\hat G,w) > \alpha n. אלגוריתם הקירוב מחזיר פתרון אפשרי, ופתרון אפשרי אינו יכול להיות זול מהאופטימום, ולכן גם w(A(G^,w))≥OPT(G^,w)>αnw(A(\hat G,w)) \ge \mathrm{OPT}(\hat G,w) > \alpha n. לכן שלב 3 דוחה את GG — כנדרש.

הערה [01:23:52]: שימו לב שהשתמשנו בשני צדדיו של אי-השוויון שבהגדרת אלגוריתם הקירוב. בכיוון הראשון השתמשנו בצד ה"מעניין" (ALG≤α OPT\mathrm{ALG} \le \alpha\,\mathrm{OPT}), ובכיוון השני דווקא בצד הטריוויאלי (ALG≥OPT\mathrm{ALG} \ge \mathrm{OPT}), שנובע מכך שהפלט הוא פתרון אפשרי. בלי הדרישה שהפלט יהיה פיזבילי, הכיוון השני היה נופל.

סיום. האלגוריתם שבנינו מכריע את UHC\mathrm{UHC} בזמן פולינומי, ולכן UHC∈P\mathrm{UHC} \in \mathrm{P}. אך UHC\mathrm{UHC} היא NP-קשה (שיעור 12), ולכן לכל L∈NPL \in \mathrm{NP} מתקיים L≤pUHC∈PL \le_p \mathrm{UHC} \in \mathrm{P}, כלומר NP⊆P\mathrm{NP} \subseteq \mathrm{P}. יחד עם ההכלה הטריוויאלית P⊆NP\mathrm{P} \subseteq \mathrm{NP} נקבל P=NP\mathrm{P} = \mathrm{NP}. ■\blacksquare

הערה טכנית (לא נאמרה בהרצאה): אם α\alpha אינו שלם, αn+1\alpha n + 1 אינו מספר שלם. אפשר לעבוד עם משקלים רציונליים (ואז α\alpha חייב להיות רציונלי כדי שנוכל בכלל לכתוב אותו בזמן פולינומי), או להשתמש במשקל ⌈αn⌉+1\lceil \alpha n\rceil + 1; אז w(C)≥⌈αn⌉+1+(n−1)>αnw(C) \ge \lceil\alpha n\rceil + 1 + (n-1) > \alpha n וההוכחה עוברת מילה במילה.

הערה (לא נאמרה בהרצאה): המשקלים שבנינו מפרים בגסות את אי-שוויון המשולש — קשת "יקרה" בין שני קודקודים שיש ביניהם מסלול זול. לכן המשפט אומר דבר על TSP הכללי בלבד, ואינו סותר את קיומם של אלגוריתמי קירוב לגרסה המטרית.

מסקנה: שקילות [01:25:28]. למעשה מתקיים: ∃ α≥1 approximation for general TSP  ⟺  P=NP.\exists\,\alpha \ge 1 \text{ approximation for general } \mathrm{TSP} \iff \mathrm{P}=\mathrm{NP} . הכיוון שהוכחנו הוא (⇒\Rightarrow). הכיוון (⇐\Leftarrow) מיידי: אם P=NP\mathrm{P}=\mathrm{NP} אז אפשר להכריע את גרסת ההכרעה של TSP בזמן פולינומי, ובאמצעות חיפוש בינארי על ערך המטרה גם לפתור את גרסת האופטימיזציה במדויק — כלומר לקרב אותה בפקטור 11; ואם אפשר לקרב בפקטור 11, אז בפרט אפשר בפקטור 33 או בכל α≥1\alpha \ge 1 אחר.


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

דוגמה 1: הרצת אלגוריתם ה-VC על מסלול באורך 3 — הסדר קובע

יהי GG המסלול a−b−c−da - b - c - d, כלומר E={ab,bc,cd}E = \{ab, bc, cd\}. הכיסוי המינימלי הוא {b,c}\{b,c\} בגודל 22.

סדר א' (הקשת הנבחרת ראשונה היא bcbc): C={b,c}C=\{b,c\}, F={bc}F=\{bc\}; מוחקים את b,cb,c ואיתם את ab,bc,cdab, bc, cd. לא נשארו קשתות. הפלט: C={b,c}C=\{b,c\}, גודל 22. יחס: 2/2=12/2 = 1.

סדר ב' (הקשת הנבחרת ראשונה היא abab): C={a,b}C=\{a,b\}, F={ab}F=\{ab\}; מוחקים את a,ba,b ואיתם את ab,bcab,bc. נשארה cdcd. איטרציה שנייה: C={a,b,c,d}C=\{a,b,c,d\}, F={ab,cd}F=\{ab,cd\}. הפלט בגודל 44. יחס: 4/2=24/2 = 2.

מה למדנו: האלגוריתם אינו קובע איזו קשת לבחור, והפלט תלוי בבחירה — אבל בשני המקרים מתקיים ∣F∣≤∣Copt∣|F| \le |C_{\mathrm{opt}}| ו-∣C∣=2∣F∣|C|=2|F|, ולכן החסם ∣C∣≤2∣Copt∣|C| \le 2|C_{\mathrm{opt}}| נשמר תמיד.

דוגמה 2: הרצה על המעגל C6C_6

V={1,…,6}V=\{1,\dots,6\}, E={12,23,34,45,56,16}E=\{12,23,34,45,56,16\}. הכיסוי המינימלי הוא {1,3,5}\{1,3,5\} בגודל 33.

  • איטרציה 1: בוחרים 1212. C={1,2}C=\{1,2\}, F={12}F=\{12\}. מוחקים 1,21,2 ואיתם 12,23,1612,23,16. נשאר E′={34,45,56}E'=\{34,45,56\}.
  • איטרציה 2: בוחרים 3434. C={1,2,3,4}C=\{1,2,3,4\}, F={12,34}F=\{12,34\}. מוחקים 3,43,4 ואיתם 34,4534,45. נשאר E′={56}E'=\{56\}.
  • איטרציה 3: בוחרים 5656. C={1,…,6}C=\{1,\dots,6\}, F={12,34,56}F=\{12,34,56\}. אין קשתות.

פלט: כל ששת הקודקודים. בדיקה: ∣F∣=3≤∣Copt∣=3|F|=3 \le |C_{\mathrm{opt}}|=3 ✓, ∣C∣=6=2∣F∣|C|=6=2|F| ✓, 6≤2⋅36 \le 2\cdot 3 ✓ — היחס כאן הדוק בדיוק.

תרגיל 3 (שאלת סטודנט, [00:16:38]–[00:18:13]): למה לא להוסיף רק קצה אחד?

השאלה. האלגוריתם "מבזבז": הוא מכניס שני קודקודים לכל קשת. למה לא לבחור קשת e=xye=xy, להוסיף רק את xx ל-CC, ולמחוק רק את xx (ואיתו את הקשתות הנוגעות בו)?

התשובה המלאה. קודם כל, הווריאנט הזה כן מחזיר כיסוי בקודקודים: כל קשת נמחקת רק כשאחד מקצותיה נכנס ל-CC. הבעיה היא ביחס הקירוב — והוא לא רק גרוע מ-22, הוא אינו קבוע כלל.

נתבונן בכוכב K1,nK_{1,n}: קודקוד מרכזי cc ו-nn עלים x1,…,xnx_1,\dots,x_n, כאשר E={cxi}E=\{cx_i\}. הכיסוי המינימלי הוא {c}\{c\}, כלומר ∣Copt∣=1|C_{\mathrm{opt}}|=1.

מכיוון שהאלגוריתם דטרמיניסטי אך אינו מגדיר את סדר בחירת הקשתות, אפשר לבנות קלט (או מימוש) שבו הבחירה תמיד "רעה": בכל איטרציה נבחרת קשת cxicx_i ומוסיפים דווקא את העלה xix_i. מחיקת xix_i מסלקת רק את הקשת cxicx_i, ושאר הקשתות נשארות. לאחר nn איטרציות C={x1,…,xn}C=\{x_1,\dots,x_n\}, כלומר ∣C∣=n=∣V∣−1while∣Copt∣=1.|C| = n = |V|-1 \quad\text{while}\quad |C_{\mathrm{opt}}| = 1 . היחס הוא ∣V∣−1|V|-1, שגדל עם הקלט — כלומר אין α\alpha קבוע שהאלגוריתם הזה מקיים.

המסקנה המבנית. מחיקת שני הקצוות אינה בזבוז; היא בדיוק מה שהופך את FF לזיווג, ובלעדיה הפונקציה φ\varphi שבהוכחת משפט 1 מפסיקה להיות חד-חד-ערכית. המרצה הוסיף שאותה תופעה מופיעה גם על מסלול ארוך [00:17:09].

תרגיל 4 (מהשיעור, [00:33:12]): הראו שהאלגוריתם ל-VC אינו יכול להשיג יחס טוב מ-22

זהו בדיוק משפט 2 לעיל: משפחת הזיווגים המושלמים MnM_n. פתרון מלא ניתן שם.

דוגמה 5: הרצת אלגוריתם ה-MAXCUT — קודקוד שעובר וחוזר

החשש שהמרצה העלה [00:41:59] הוא שקודקוד יעבור הלוך ושוב לנצח. הנה גרף שבו קודקוד באמת חוזר, ובכל זאת האלגוריתם עוצר:

V={v,a,b,p1,p2,q1,q2}V = \{v,a,b,p_1,p_2,q_1,q_2\}, E={va,  vb,  ap1,  ap2,  bq1,  bq2}E = \{va,\;vb,\;ap_1,\;ap_2,\;bq_1,\;bq_2\} — עץ עם ∣E∣=6|E|=6.

התחלה: U=∅U=\emptyset, גודל החתך 00.

איטרציההקודקוד המועברcut\mathrm{cut} / other\mathrm{other} שלו לפני ההעברהUU אחריגודל החתך
1vv0/20 / 2{v}\{v\}22
2aa1/21 / 2{v,a}\{v,a\}33
3bb1/21 / 2{v,a,b}\{v,a,b\}44
4vv0/20 / 2{a,b}\{a,b\}66

באיטרציה 4 הקודקוד vv חוזר ל-Uˉ\bar U: אחרי ש-aa ו-bb עברו, שתי הקשתות va,vbva,vb הפכו לפנימיות, ולכן משתלם להחזיר את vv. בסיום: U={a,b}U=\{a,b\}, כל שש הקשתות חוצות, ואין קודקוד משפר (cut(a)=3,other(a)=0\mathrm{cut}(a)=3, \mathrm{other}(a)=0; cut(p1)=1,other(p1)=0\mathrm{cut}(p_1)=1,\mathrm{other}(p_1)=0 וכו').

מה למדנו: אי אפשר לטעון "קודקוד לא יחזור"; אפשר לטעון שגודל החתך 0→2→3→4→60 \to 2 \to 3 \to 4 \to 6 עולה ממש בכל צעד, וזה לבדו מבטיח עצירה תוך ≤∣E∣\le |E| העברות. סדרת החתכים היא ה"חוש התקדמות" של האלגוריתם.

בדיקת ההבטחה: ∣F∣=6≥12∣E∣=3|F| = 6 \ge \tfrac12|E| = 3 ✓ (וכאן אפילו נמצא האופטימום, K=6K=6, כי העץ דו-צדדי).

דוגמה 6: ספירת החתך משני צדדיו [01:01:41]

הדוגמה שהמרצה צייר כדי להסביר את שלב (3) בהוכחת משפט 3: חתך שבו קשתותיו נספרות מצד UU כ-1+1+1+1+1=51+1+1+1+1 = 5, ומצד Uˉ\bar U כ-2+2+1=52+2+1 = 5. אותו חתך, שתי ספירות שונות, אותו מספר — כי כל קשת חוצה נספרת בדיוק פעם אחת בכל אחד מהסכומים, לפי הגדרת החתך. זהו גם ההסבר לכך ש-∑v∈Vcut(v)=2∣F∣\sum_{v\in V}\mathrm{cut}(v) = 2|F| ולא ∣F∣|F|.

דוגמה 7: הרצת אלגוריתם ההכרעה של משפט 4 עם α=2\alpha=2

מופע חיובי. GG = המעגל 1−2−3−4−11-2-3-4-1, כלומר V={1,2,3,4}V=\{1,2,3,4\}, E={12,23,34,41}E=\{12,23,34,41\}. בונים G^=K4\hat G = K_4; המשקלים: w(12)=w(23)=w(34)=w(41)=1w(12)=w(23)=w(34)=w(41)=1, ולאלכסונים w(13)=w(24)=α∣V∣+1=2⋅4+1=9w(13)=w(24)=\alpha|V|+1 = 2\cdot4+1 = 9. המעגל 1−2−3−4−11-2-3-4-1 במשקל 44, וזהו OPT\mathrm{OPT}. אלגוריתם קירוב ביחס 22 חייב להחזיר מעגל במשקל ≤8\le 8. סף ההכרעה הוא α∣V∣=8\alpha|V| = 8, ולכן האלגוריתם מקבל — נכון, כי G∈UHCG \in \mathrm{UHC}.

מופע שלילי. GG = המסלול 1−2−3−41-2-3-4, כלומר E={12,23,34}E=\{12,23,34\}; אין בו מעגל המילטוני. שוב 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)=9w(13)=w(14)=w(24)=9. שלושת המעגלים ההמילטוניים ב-K4K_4:

  • 1 ⁣− ⁣2 ⁣− ⁣3 ⁣− ⁣4 ⁣− ⁣11\!-\!2\!-\!3\!-\!4\!-\!1: 1+1+1+9=121+1+1+9 = 12;
  • 1 ⁣− ⁣2 ⁣− ⁣4 ⁣− ⁣3 ⁣− ⁣11\!-\!2\!-\!4\!-\!3\!-\!1: 1+9+1+9=201+9+1+9 = 20;
  • 1 ⁣− ⁣3 ⁣− ⁣2 ⁣− ⁣4 ⁣− ⁣11\!-\!3\!-\!2\!-\!4\!-\!1: 9+1+9+9=289+1+9+9 = 28.

OPT=12>8\mathrm{OPT} = 12 > 8, וכל פתרון שיוחזר יהיה לפחות 1212. לכן האלגוריתם דוחה — נכון, כי G∉UHCG \notin \mathrm{UHC}.

שימו לב לפער: בכיוון החיובי הערך המקסימלי האפשרי הוא 88, ובכיוון השלילי הערך המינימלי האפשרי הוא 1212. הפער הזה הוא כל תפקידו של המשקל הענק α∣V∣+1\alpha|V|+1 — הוא נבנה כך שאפילו אלגוריתם קירוב גרוע ככל האפשר לא יוכל "לחצות" את הסף.


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

  • [00:03:43]–[00:05:49] — "למה דווקא זה?" היא לא השאלה הנכונה עכשיו. המרצה הקדיש כמה דקות לנקודה מתודית: כשרואים אלגוריתם או רדוקציה, סדר הפעולות הוא (1) להבין איך הוא עובד — הרצה יבשה על גרף; (2) להוכיח למה הוא מקיים את מה שדרוש; ורק אחר כך, אם בכלל, לשאול איך מישהו חשב עליו. "זה יכול לקחת חודשים של מחקר. אם אין לכם את החודשים לשבת על זה, לא תגיעו לזה — ואתם גם לא צריכים לצורך הקורס."
  • [00:09:33] — ניתוח גס מכוון. "אני קצת הורס את כל מה שלימדו אתכם באלגוריתמים ומבני נתונים": כאן לא מחפשים את זמן הריצה הטוב ביותר אלא רק פולינומיות, ולכן ניתוח גס עדיף כי הוא קצר ובטוח יותר. הניתוח ההדוק (O(∣E∣)O(|E|) ל-VC) נכון ואף "מעולה", פשוט מיותר.
  • [00:20:56]–[00:21:59] — "פתרון אופטימלי", לא "הפתרון האופטימלי". יש גודל אופטימלי אחד (מינימום קיים תמיד בקבוצה לא ריקה של טבעיים), אבל פתרונות אופטימליים יכולים להיות רבים. לכן הסימון הוא "CoptC_{\mathrm{opt}} פתרון אופטימלי", ובניתוח לא מסתמכים על יחידות. משפט 2 מדגים זאת: שם יש 2∣V∣/22^{|V|/2} פתרונות אופטימליים.
  • [00:26:19]–[00:28:25] — שובך היונים. סטודנטים ביקשו לחזור על המעבר ∣F∣≤∣Copt∣|F| \le |C_{\mathrm{opt}}|. הניסוח שהוסכם: אם ב-AA יש יותר איברים מב-BB, אז אף פונקציה מ-AA ל-BB אינה חד-חד-ערכית (שובך היונים); בקונטרפוזיציה — אם קיימת פונקציה חד-חד-ערכית מ-AA ל-BB אז ∣A∣≤∣B∣|A| \le |B|. "אתם צריכים לדעת את זה."
  • [00:29:31]–[00:30:04] — ∣C∣=2∣F∣|C|=2|F| אינו "כמו קודם". סטודנט שאל מתי אמרנו ש-∣C∣=2∣F∣|C|=2|F|. התשובה: זו טענה חדשה, ולא משהו שנאמר קודם; היא כמעט מיידית מהבנייה (כל קשת שנכנסה ל-FF הכניסה שני קודקודים ל-CC), אבל היא עדיין טענה שצריך לומר.
  • [00:30:36]–[00:31:09] — האם 22 הוא הקירוב הטוב ביותר ל-VC? שאלה שנשאלה בשיעור הקודם. התשובה: להוכיח שקירוב מסוים הוא הטוב ביותר האפשרי הוא נושא קשה מלא בבעיות פתוחות, ועבור VC\mathrm{VC} זו בעיה פתוחה לגמרי. תיאורטית ייתכן שקיים אלגוריתם עם יחס 1+ε1+\varepsilon. "התחום עדיין חי — עדיין מוצאים אלגוריתמי קירוב טובים יותר לכל מיני בעיות."
  • [00:35:19] — יחס קירוב הוא חסם, לא ערך. אלגוריתם 22-קירוב הוא בפרט 44-קירוב; אי-השוויון פשוט נחלש. לכן ההצהרה "יחס הקירוב הוא 22" משמעה "לכל היותר 22".
  • [00:36:24] — מקסימיזציה: היחס בין 00 ל-11. אזהרה מפורשת: להחזיר פתרון חוקי אבל זעיר (למשל קודקוד בודד ל-Independent Set) אינו קירוב.
  • [00:41:59]–[00:44:32] — החשש הראשון בחיפוש מקומי הוא תמיד עצירה. "בדרך כלל כשרואים את האלגוריתם הזה, הדבר הראשון שעולה זה: איך אני יודע שזה עוצר?" והתשובה תמיד: מהו ה-sense of progress, והאם ההתקדמות הזו גוררת חסם על מספר האיטרציות.
  • [00:47:19]–[00:48:20] — מה בדיוק עושים בסריקה. לכל קודקוד עוברים על כל שכניו וסופרים כמה מהם בצד שלו וכמה בצד הנגדי; אם בצד שלו יש יותר — מעבירים. בייצוג ברשימת שכנויות זה מעבר על כל הגרף. המרצה ציין שאפשר גם ניתוח מדויק יותר (∣V∣⋅∣E∣|V|\cdot|E| או ∣G∣3|G|^3) — לא משנה, כל אלה פולינומיים.
  • [01:03:27]–[01:04:33] — למה בכלל "תוצאות קושי מותנות". "אנחנו קוראים לבעיה NP-קשה, אבל לא באמת הוכחתי שהיא קשה — הוכחתי שהיא קשה ביחס לבעיות ב-NP\mathrm{NP}." לכן כל טענת אי-קירוב בקורס היא מהצורה "אם ניתן לקרב, אז P=NP\mathrm{P}=\mathrm{NP}".
  • [01:08:26]–[01:09:32] — איך מוכיחים P=NP\mathrm{P}=\mathrm{NP} תחת הנחה. אפשרות א': לקחת A∈NPA \in \mathrm{NP} שרירותית ולהראות A∈PA \in \mathrm{P} — קשה. אפשרות ב', והדרך שנבחרה: לקחת בעיה אחת שידועה כ-NP-קשה ולהראות שהיא ב-P\mathrm{P}; מהגדרת NP-קושי נובע מיד ש-NP⊆P\mathrm{NP} \subseteq \mathrm{P}. "עכשיו העניין הוא רק לבחור נכון את הבעיה ה-NP-קשה שנוח לעבוד איתה" — וכאן בחרנו את UHC\mathrm{UHC}, כי גרסת האופטימיזציה של TSP נבנתה עליה מלכתחילה.
  • [01:12:10] — מספר גדול אינו מספר ארוך. המשקל α∣V∣+1\alpha|V|+1 הוא ענק, אבל אורכו O(log⁡(α∣V∣))O(\log(\alpha|V|)) ביטים. זו נקודה שחוזרת בכל הקורס (ראו גם SUBSET-SUM בשיעור 11): מה שמגביל אותנו הוא אורך הייצוג, לא הערך.
  • [01:19:36]–[01:21:45] — בלבול נפוץ שהמרצה פתר בכיתה. ב-G^\hat G תמיד קיים מעגל המילטוני (הוא גרף שלם) — זה לא מה שמעניין; מה שמעניין הוא המשקל שלו. ובנוסף: משקל המעגל הוא סכום על ∣V∣|V| קשתות בלבד, ולא על כל קשתות הגרף השלם.
  • [01:25:28] — למה חשוב לומר "שקול". התוצאה אינה רק "קירוב ⟸ P=NP\mathrm{P}=\mathrm{NP}" אלא שקילות, כי אם P=NP\mathrm{P}=\mathrm{NP} אפשר לפתור את הבעיה במדויק ובפרט לקרב אותה בכל פקטור. הכיוון הזה מיידי, ובכל זאת צריך לומר אותו כדי לטעון שקילות.

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

  • מקור: סיכום שיעור 12, עמוד 6 (מול סיכום שיעור 13, עמוד 1). הפער: עמוד 6 של סיכום השיעור הקודם אינו שייך לתוכן שיעור 12 (המילטוני/TSP) אלא הוא פתיחת נושא הקירוב: טבלת ההשוואה הכרעה/חיפוש/אופטימיזציה, ההגדרה הפורמלית של בעיית אופטימיזציה עם המופע של VC\mathrm{VC}, והגדרת אלגוריתם קירוב ביחס α\alpha לבעיית מינימיזציה. סיכום שיעור 13 מתחיל ישירות באלגוריתם ומניח את כל זה כידוע. ההכרעה: העמוד נכתב כאן במלואו — הגדרות 1, 2 ו-3 — כולל הטבלה, ארבעת רכיבי בעיית האופטימיזציה, המופע של VC\mathrm{VC} בארבעה סעיפים, וההגדרה לבעיית מינימיזציה. קובץ שיעור 12 מחזיק לגבי העמוד מצביע בלבד; הבעלות על התוכן היא של הקובץ הזה, וכך נרשם גם ב-sources.pdf.note.
  • מקור: עמוד 6 בסיכום שיעור 12 מול ההקלטה של שיעור 13. הפער: עמוד 6 מגדיר אלגוריתם קירוב לבעיית מינימיזציה בלבד (α≥1\alpha \ge 1); הגרסה למקסימיזציה (0<α≤10<\alpha\le1) נאמרה רק בעל פה בשיעור 13 [00:36:24] ואינה בשום סיכום. ההכרעה: הגדרה 3 מנוסחת בשני סעיפים — (א) מינימיזציה לפי עמוד 6, (ב) מקסימיזציה לפי ההקלטה — ומקורו של כל סעיף מצוין בגוף ההגדרה.
  • מקור: תמלול 18, [01:40:43]–[02:08:24]. הפער: קטע זה — פתיחת הפרק "התמודדות עם NP-קושי", ההבחנה בין שאלה (שפה) לבין מטרה (פונקציה), ההסבר ש-NP-קושי מוגדר לבעיות הכרעה בלבד, והטיעון שפותר אופטימיזציה יעיל נותן פותר הכרעה יעיל — אינו מכוסה בשום סיכום. ההכרעה: נכתב בהגדרה 1, והתמלול נוסף ל-sources.transcripts עם coverage: partial וטווח מפורש, במקום להיות מצוטט בלי להופיע ב-frontmatter.
  • מקור: ההקלטה [00:03:12]–[00:03:43]. הפער: הגרסה הראשונה של שלב 2.2 כללה "מחק את הקשת ee", מה שמיותר; סטודנט תיקן והמרצה קיבל. הסיכום מכיל כבר את הגרסה המתוקנת. ההכרעה: נכתבה הגרסה המתוקנת, והאפיזודה תועדה כהערה כי היא מסבירה למה בסיכום מופיעים שלושה מקרים בהוכחת הפיזביליות ולא שניים.
  • מקור: הסיכום (עמוד 3), שורת פתיחת ניתוח זמן הריצה. הפער: כתוב "יהי G=(E,V)G=(E,V) גרף" — היפוך סדר הרכיבים בזוג. ההכרעה: תוקן ל-G=(V,E)G=(V,E), כמו בכל שאר העמודים; פליטת קולמוס ברורה.
  • מקור: הסיכום (עמוד 4). הפער: נכתב ∣F∣≥12∣K∣|F| \ge \tfrac12|K| למרות ש-KK הוגדר כמספר (גודל חתך מקסימלי), כך שסימני הערך המוחלט מיותרים. ההכרעה: נכתב ∣F∣≥12K|F| \ge \tfrac12 K.
  • מקור: הסיכום (עמוד 4), הפרמטר ∣E∣+1|E|+1 למספר האיטרציות ב-MAXCUT\mathrm{MAXCUT}. הפער: מספר ההעברות בפועל חסום ב-∣E∣|E|; ה-+1+1 נובע מהסריקה האחרונה שבה לא נמצא קודקוד משפר. הסיכום אינו מסביר זאת. ההכרעה: נשמר החסם ∣E∣+1|E|+1 של הסיכום, עם ההסבר המפורש שהתוספת היא סריקת העצירה.
  • מקור: ההקלטה [00:57:53]. הפער: המרצה אמר "גדול שווה" ותיקן מיד ל"קטן שווה" בשרשרת אי-השוויונות 2∣E∣≤∑2 cut(v)2|E| \le \sum 2\,\mathrm{cut}(v). ההכרעה: נכתב הכיוון הנכון (החלפת other(v)\mathrm{other}(v) ב-cut(v)\mathrm{cut}(v) הגדול ממנו מגדילה את הסכום).
  • מקור: ההקלטה בלבד. הפער: חומר מהותי שאינו בסיכום כלל — (א) הדוגמה הנגדית של הכוכב לווריאנט שמוסיף קצה אחד [00:16:38]; (ב) ההבחנה בין "ההוכחה הדוקה ביחס לאלגוריתם" לבין "האלגוריתם הדוק ביחס לבעיה", והיות השאלה השנייה פתוחה עבור VC\mathrm{VC} [00:31:09]; (ג) הדיון בעצירת החיפוש המקומי וההדגמה שקודקוד יכול לחזור [00:41:59]; (ד) ההבחנה שזו אינה רדוקציית מיפוי אלא אלגוריתם שקורא לאלגוריתם [01:16:56]; (ה) השקילות ל-P=NP\mathrm{P}=\mathrm{NP} ולא רק הגרירה [01:25:28]. ההכרעה: כל אלה נכללו — (א) כתרגיל 3, (ב) כמשפט 2 והערותיו, (ג) כטענה ב של משפט 3 ודוגמה 5, (ד)–(ה) כהערות במשפט 4.
  • מקור: הסיכום בלבד. הפער: משפט 2 (הידוק הניתוח) מופיע בהקלטה בלבד ולא בסיכום; לעומת זאת, הסיכום מנסח את שלושת המקרים בהוכחת הפיזביליות של VC\mathrm{VC} בצורה מסודרת יותר משנאמר בעל פה. ההכרעה: שני המקורות מוזגו; הניסוח והסימונים (CC, FF, CoptC_{\mathrm{opt}}, cut\mathrm{cut}, other\mathrm{other}, KK) נלקחו מהסיכום.
  • מקור: קונבנציות. הפער: הסיכום כותב "Max-Cut" ו-"VC"/"TSP"/"UHC" כטקסט; המסמך המנחה דורש עטיפת שמות בעיות ב-\mathrm{} בצורה MAXCUT\mathrm{MAXCUT}. ההכרעה: אומצה הקונבנציה של המסמך המנחה לשמות בעיות ומחלקות (VC,MAXCUT,TSP,UHC,P,NP\mathrm{VC}, \mathrm{MAXCUT}, \mathrm{TSP}, \mathrm{UHC}, \mathrm{P}, \mathrm{NP}), ונשמרו שמות המשתנים והאינדקסים של הסיכום (G,V,E,C,F,Copt,U,Uˉ,K,α,w,G^,E^G,V,E,C,F,C_{\mathrm{opt}},U,\bar U,K,\alpha,w,\hat G,\hat E).
  • מקור: תמלול 20. הפער: התמלול הוקצה כהקשר אך עוסק כולו באלגוריתמים אקראיים (בעיית המזכיר, אימות כפל מטריצות) ואינו נוגע בחומר של שיעור זה. ההכרעה: נרשם ב-frontmatter עם coverage: none והערה. חשוב לציין: אין בקורפוס הקלטה נוספת של חומר קירוב — תמלול 19 מסתיים ב-[01:26:00] בדיוק בסוף עמוד 5, ואינו חורג לחומר של שיעור 14.

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

שלושת הדברים שצריך להוכיח על כל אלגוריתם קירוב — ותמיד בנפרד ובסדר הזה:

  1. זמן ריצה פולינומי. ניתוח גס מספיק: כמה איטרציות (מה ה-sense of progress?) כפול כמה עבודה באיטרציה.
  2. פיזביליות. הפלט חייב להיות פתרון אפשרי לבעיה — כיסוי, ולא "כמעט כיסוי". על זה לא מתפשרים.
  3. יחס הקירוב. דרך גודל עזר: בבעיית מינימיזציה — חסם תחתון על OPT\mathrm{OPT} (∣F∣≤∣Copt∣|F| \le |C_{\mathrm{opt}}|); בבעיית מקסימיזציה — חסם עליון על OPT\mathrm{OPT} (K≤∣E∣K \le |E|).

התוצאות שכדאי לזכור בעל פה:

∣Copt∣≤∣C∣=2∣F∣≤2∣Copt∣(VC),|C_{\mathrm{opt}}| \le |C| = 2|F| \le 2|C_{\mathrm{opt}}| \qquad (\mathrm{VC}), ∣F∣≥12∣E∣≥12K(MAXCUT),|F| \ge \tfrac12|E| \ge \tfrac12 K \qquad (\mathrm{MAXCUT}), approximating general TSP within any α≥1  ⟺  P=NP.\text{approximating general } \mathrm{TSP} \text{ within any } \alpha \ge 1 \iff \mathrm{P}=\mathrm{NP}.

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

  • לבלבל בין "ההוכחה הדוקה" ל"האלגוריתם אופטימלי". הצגת משפחת MnM_n מוכיחה רק שהניתוח שלנו לא ניתן לשיפור עבור האלגוריתם הזה. השאלה אם ל-VC\mathrm{VC} יש קירוב טוב מ-22 פתוחה.
  • לשכוח שדוגמה נגדית בודדת אינה מספיקה. צריך משפחה אינסופית.
  • לכתוב יחס קירוב לבעיית מקסימום כגדול מ-11. בקונבנציה של הקורס: מינימיזציה α≥1\alpha \ge 1, מקסימיזציה 0<α≤10<\alpha\le1.
  • לוותר על צד ה"טריוויאלי" של אי-השוויון. בהוכחת משפט 4, הכיוון השלילי נשען דווקא על ALG≥OPT\mathrm{ALG} \ge \mathrm{OPT}, שנובע מהפיזביליות.
  • לחשוב שמשקל גדול הוא בעיה. α∣V∣+1\alpha|V|+1 נכתב ב-O(log⁡(α∣V∣))O(\log(\alpha|V|)) ביטים.
  • להתבלבל בין משקל הגרף למשקל המעגל. במעגל המילטוני יש בדיוק ∣V∣|V| קשתות.

צ׳ק־ליסט: אחרי השיעור סטודנט צריך לדעת

  • לנסח את שלוש הגרסאות של בעיה נתונה (הכרעה / חיפוש / אופטימיזציה), ולהסביר למה רק הראשונה היא שפה ולמה פותר אופטימיזציה יעיל גורר פותר הכרעה יעיל.
  • לכתוב את ארבעת רכיביה של בעיית אופטימיזציה ואת שלוש הדרישות מאלגוריתם קירוב, ולדעת איזה משני אי-השוויונות טריוויאלי בכל אחד משני סוגי הבעיות.
  • לכתוב את אלגוריתם ה-22-קירוב ל-VC\mathrm{VC} מהזיכרון, ולהוכיח את שלוש טענותיו במלואן.
  • להסביר בדיוק היכן ההוכחה נשברת אם מוחקים רק קצה אחד, ולתת את הכוכב כדוגמה נגדית.
  • להראות שהניתוח הדוק באמצעות זיווג מושלם.
  • לכתוב את אלגוריתם החיפוש המקומי ל-MAXCUT\mathrm{MAXCUT}, להוכיח שהוא עוצר, ולהריץ את שרשרת הספירה הכפולה 2∣E∣≤∑2 cut(v)=4∣F∣2|E| \le \sum 2\,\mathrm{cut}(v) = 4|F| עד הסוף.
  • לבנות מתוך אלגוריתם קירוב ל-TSP אלגוריתם הכרעה ל-UHC\mathrm{UHC}, כולל בחירת המשקל הענק וניתוח שני הכיוונים.
  • להסביר במילים למה כל תוצאות אי-הקירוב בקורס הן מותנות.

Questions left open

  • הסיכום של שיעור 13 נפתח באמצע הנושא: הגדרות הפתיחה נמצאות בעמוד 6 של סיכום שיעור 12 ובתמלול 18 ([01:40:43]–[02:08:24]); העמוד ההוא נכתב כאן ולא בקובץ שיעור 12, ויש לוודא בסקירה שאין כפילות בין שני הקבצים.
  • עמוד 6 בסיכום שיעור 12, שורת בעיית ההכרעה בטבלה: נקרא "כיסוי בקודקודים בגודל k" בלי סימן אי-שוויון; בהקלטה [01:49:49] נאמר אותו נוסח. ייתכן שהכוונה "בגודל לכל היותר k" כמקובל, ובגוף הקובץ נשמר נוסח המקור.
  • עמוד 4 בסיכום: הסוגריים אחרי TSP נקראו כ-"הסוכן הנוסע"; ייתכן שכתוב שם "המקרה הכללי". שתי הקריאות אינן משנות את הטענה.
  • עמוד 4 בסיכום: כתוב |F| ≥ ½|K| למרות ש-K כבר מסמן מספר; סימני הערך המוחלט מיותרים ונכתב כאן K.
  • המשקל α|V|+1 מניח בשתיקה ש-α רציונלי (אחרת אי אפשר לכתוב אותו); בהקלטה זה לא נאמר, וכאן צוינה החלופה ⌈α|V|⌉+1.
  • הידוק יחס הקירוב ½ עבור MAXCUT לא נדון בהרצאה ואינו בסיכום; נכתבה כאן רק ההערה מהיכן ההפסד בניתוח.