530 likes | 672 Views
בעיות פער Gap Problems. בעיות פער Gap Problems. אנחנו לא יודעים להכריע (בזמן פולינומיאלי) האם קיים פתרון מדויק לבעית אופטימיזציה (למשל - בבעית הקליקה, האם קיימת קליקה בגודל α ? ) אנחנו כן יודעים להפריד בין המקרים בהם קיים פתרון מדויק, לבין המקרים בהם לא קיים אפילו פתרון מקורב
E N D
בעיות פערGap Problems אנחנו לא יודעים להכריע (בזמן פולינומיאלי) האם קיים פתרון מדויק לבעית אופטימיזציה (למשל - בבעית הקליקה, האם קיימת קליקה בגודל α?) אנחנו כן יודעים להפריד בין המקרים בהם קיים פתרון מדויק, לבין המקרים בהם לא קיים אפילו פתרון מקורב (למשל, להפריד בין: א. קיימת קליקה בגודל α ב. לא קיימת קליקה בגודל α(1-ε)...)
בעיות פערGap Problems מכונה שפותרת בעיית Gap[a,b]: • תחזיר 'כן' אם הפתרון המקסימלי ≥ b • תחזיר 'לא' אם הפתרון המקסימלי < a • ומה אם הפתרון המקסימלי בין a ל-b?
בעיות פערGap Problems מכונה שפותרת בעיית Gap[a,b]: • תחזיר 'כן' אם הפתרון המקסימלי ≥ b • תחזיר 'לא' אם הפתרון המקסימלי < a • ומה אם הפתרון המקסימלי בין a ל-b... כל פלט של המכונה הוא חוקי עבור פתרון מקסימלי בין a ל-b M(x) = ? f(x) M(x) = Reject M(x) = Accept a b
חתך מקסימליMaximum Cut • קלט: גרף G=(V,E) • פלט: חתך מקסימום בגרף G α = 11/13
G חתך מקסימליMaximum Cut בעית MAXCUT היא NP-שלמה... נראה אלגוריתם לפתרון של gap-MAXCUT[α/2,α]: מפריד בין: א. קיים חתך בגודל α ב. לא קיים חתך בגודל α/2 α = 11/13
gap-MAXCUT[α/2,α] G ניתוח: אם היינו מגרילים 2-צביעה של הגרף... לכל קשת e=(u,v)ϵE: Pr[eϵCUT] = Pr[Color(u)≠Color(v)] = 1/2 לכן אנחנו מצפים לקבל לפחות חצי מהקשתות בגרף...
gap-MAXCUT[α/2,α] G ניתוח: אם היינו מגרילים 2-צביעה של הגרף... לכל קשת e=(u,v)ϵE: Pr[eϵCUT] = Pr[Color(u)≠Color(v)] = 1/2 ז"א: E[|CUT|] = eE Pr[eϵCUT] / |E| = 1/2 ולכן: |MAXCUT| ≥ E[|CUT|] = 1/2
gap-MAXCUT[α/2,α] G אלגוריתם להכרעת gap-MAXCUT[α/2,α]: קבל אמ"ם α ≤ 1 נאותות – אם קבלנו, אז: α/2 ≤ 1/2 ≤ |MAXCUT| שלמות – אם דחינו, אז: |MAXCUT| ≤ 1 < α
צביעת צמתיםVertex Coloring (Chromatic Number) קלט: גרף בלתי מכוון G פלט: צביעה של V עם k מינימליכך שאין צמתים שכנים עם אותו צבע G k=2
קירוב לצביעת צמתיםgap-kCOL בעיית צביעת הצמתים היא NP-קשה, ולכן היינו רוצים לקרב אותה... נתבונן בבעית הפער: gap-kCOL[3,4]
קירוב לצביעת צמתיםgap-kCOL נתבונן בבעית הפער: gap-kCOL[3,4] כל הגרפים: k ≥ 4 k ≤ 3 k = π?
k ≥ 4 k ≤ 3 k = π? קירוב לצביעת צמתיםgap-kCOL מסקנה: gap-kCOL[3,4] = 3COL
k ≥ 4 k ≤ 3 k = π? קירוב לצביעת צמתיםgap-kCOL מסקנה: gap-kCOL[3,4] = 3COL אבל... 3COL היא NP-שלמה
קירוב לצביעת צמתיםgap-kCOL בעיית צביעת הצמתים היא NP-שלמה, ולכן היינו רוצים לקרב אותה, אבל... מסקנה: חישוב (3/4)-קירוב לבעיית צביעת צמתים היא בעיה NP-שלמה (למעשה, גם קירובים הרבה יותר חלשים הם NP-קשים...)
קירוב לצביעת צמתיםgap-kCOL[3,3√|V|] המטרה: לפתור את gap-kCOL[3,3√|V|] בזמן פולינומיאלי.
קירוב לצביעת צמתיםgap-kCOL[3,3√|V|] המטרה: לפתור את gap-kCOL[3,3√|V|] בזמן פולינומיאלי. האמצעי: נראה אלגוריתם לצביעה של גרף 3-צביע בעזרת 3√|V| צבעים. שלמות: אם הגרף 3-צביע, האלגוריתם יצליח לצבוע אותו ב-3√|V| צבעים, ולכן נקבל. נאותות: אם הגרף אינו 3√|V|-צביע, לא נצליח לצבוע אותו ב-3√|V| צבעים, ולכן נדחה. הערה: קיים אלגוריתם הצובע ב-O(|V|0.2111)...
קירוב לצביעת צמתיםgap-kCOL[3,3√|V|] אלגוריתם עזר 1: אם d היא דרגת המקסימום של גרף G נצבע את G ב-d+1 צבעים בזמן פולינומיאלי: נעבור על כל הצמתים ובכל פעם שנגיע לצמת נצבע אותו בצבע ששונה מהשכנים הצבועים שלו. תמיד קיים צבע כזה כי יש d+1 צבעים, ולכל היותר d שכנים.
קירוב לצביעת צמתיםgap-kCOL[3,3√|V|] אלגוריתם עזר 2: עבור צמת v בגרף 3-צביע נצבע את כל השכנים של v ב-2 צבעים בזמן פולינומיאלי: נתבונן בגרף המושרה ע"י קבוצת השכנים של v. זהו גרף 2-צביע (כי אף אחד מהם לא צבוע בצבע של v). בכל רכיב קשירות נבצע BFS מאחד הצמתים u. נצבע את השכבות הזוגיות בכחול, ואת האי-זוגיות בירוק.
קירוב לצביעת צמתיםgap-kCOL[3,3√|V|] בכל רכיב קשירות נבצע BFS מאחד הצמתים u. נצבע את השכבות הזוגיות בכחול, ואת האי-זוגיות בירוק. u u v
קירוב לצביעת צמתיםgap-kCOL[3,3√|V|] אלגוריתם לצביעת גרף 3-צביע G בעזרת 3√|V| צבעים: לולאה: • אם degmax(G)<√|V| צבע את G בעזרת אלג' עזר 1. • אחרת, קיים צמת v המקיים: deg(v)≥√|V|. נצבע את כל שכניו ב-2 צבעים (חדשים) בעזרת אלג' עזר 2 ונסיר אותם מהגרף.
קירוב לצביעת צמתיםgap-kCOL[3,3√|V|] לולאה: • אם degmax(G)<√|V| צבע את G בעזרת אלג' עזר 1. • אחרת, קיים צמת v המקיים: deg(v)≥√|V|. נצבע את כל שכניו ב-2 צבעים (חדשים) בעזרת אלג' עזר 2 ונסיר אותם מהגרף. ניתוח: שלב 1 – מתבצע לכל היותר פעם אחת - √|V| צבעים שלב 2 – מתבצע לכל היותר √|V| פעמים - 2√|V| צבעים סה"כ - 3√|V| צבעים
SUBSET-SUM Instance: A multi-set of numbers denoted S and a target number t. Problem: To decide if there exists a subset YS, s.t yYy=t. 13 16 8 21 11 6 3 1
SUBSET-SUM • דוגמא: S = {3,4,8,8,11}, t = 19:
SUBSET-SUM • דוגמא: S = {3,4,8,8,11}, t = 19: Y = {3,8,8}… 3+8+8 = 19
SUBSET-SUM • דוגמא: S = {3,4,8,8,11}, t = 19: Y = {3,8,8}… 3+8+8 = 19 • דוגמא 2: S = {3,4,8,8,11}, t = 13:
SUBSET-SUM • דוגמא: S = {3,4,8,8,11}, t = 19: Y = {3,8,8}… 3+8+8 = 19 • דוגמא 2: S = {3,4,8,8,11}, t = 13: אין פתרון (<S,t> לא בשפה)
gap-Subset Sum[(1-ε),1] • בעיית ה-Subset Sum היא NP-שלמה...
gap-Subset Sum[(1-ε),1] • בעיית ה-Subset Sum היא NP-שלמה • נרצה למצוא פתרון מקורב...
gap-Subset Sum[(1-ε),1] • בעיית ה-Subset Sum היא NP-שלמה • נרצה למצוא פתרון מקורב • במקום: yYy = t • נדרוש: (1-ε)t ≤yYy ≤ t
gap-Subset Sum[(1-ε),1] • במקום: yYy = t • נדרוש: (1-ε)t ≤yYy ≤ t דוגמא 1: S = {3,4,8,8,11}, t = 19, ε = 0.1 (0.9)19 ≤ (11+3+4) ≤ 19
gap-Subset Sum[(1-ε),1] • במקום: yYy = t • נדרוש: (1-ε)t ≤yYy ≤ t דוגמא 1: S = {3,4,8,8,11}, t = 19, ε = 0.1 (0.9)19 ≤ (11+3+4) ≤ 19 דוגמא 2: S = {3,4,8,8,11}, t = 13, ε = 0.1 (0.9)13 ≤ (8+4) ≤ 13
gap-Subset Sum[(1-ε),1] • במקום: yYy = t • נדרוש: (1-ε)t ≤yYy ≤ t דוגמא 1: S = {3,4,8,8,11}, t = 19, ε = 0.1 (0.9)19 ≤ (11+3+4) ≤ 19 דוגמא 2: S = {3,4,8,8,11}, t = 13, ε = 0.1 (0.9)13 ≤ (8+4) ≤ 13 דוגמא 3: S = {3,4,8,8,11}, t = 10, ε = 0.1 אין פתרון...
gap-Subset Sum[(1-ε),1] • במקום: yYy = t • נדרוש: (1-ε)t ≤yYy ≤ t רעיון: במקום להסתכל על כל תתי-הסכומים, נתעלם מתתי סכומים שהם εt/|S|-קרובים...
gap-Subset Sum[(1-ε),1] אתחול: {0}→R לולאה - לכל x ב-S: • x+R union R→R • מיין את R • min(R)→y • לולאה - לכל z ב-R: • אם y+εt/|S| < z ≤ t: z→y אחרת: R\{z} → R החזר את max(R) רעיון: במקום להסתכל על כל תתי-הסכומים, נתעלם מתתי סכומים שהם εt/|S|-קרובים... R – קבוצת תתי סכומים של S לולאה חיצונית – בכל איטרציה נאפשר הוספת משתנה אחד לכל תת-סכום לולאה פנימית – ננפה את תתי-סכומים קרובים מדי כדי לשמור על מספר קטן של אפשרויות
gap-Subset Sum[(1-ε),1] דוגמת הרצה: S = {3,4,8,8,11}, t = 19, ε = 0.3 εt/|S| = (0.3)*(19)/5 = 1.14 > 1 אתחול: {0}→R לולאה - לכל x ב-S: • x+R union R→R • מיין את R • min(R)→y • לולאה - לכל z ב-R: • אם y+εt/|S| < z ≤ t: z→y אחרת: R\{z} → R החזר את max(R)
gap-Subset Sum[(1-ε),1] דוגמת הרצה: S = {3,4,8,8,11}, t = 19, ε = 0.3 R = {0} אתחול: {0}→R לולאה - לכל x ב-S: • x+R union R→R • מיין את R • min(R)→y • לולאה - לכל z ב-R: • אם y+εt/|S| < z ≤ t: z→y אחרת: R\{z} → R החזר את max(R)
gap-Subset Sum[(1-ε),1] דוגמת הרצה: S = {3,4,8,8,11}, t = 19, ε = 0.3 R = {0} R = {0,3} אתחול: {0}→R לולאה - לכל x ב-S: • x+R union R→R • מיין את R • min(R)→y • לולאה - לכל z ב-R: • אם y+εt/|S| < z ≤ t: z→y אחרת: R\{z} → R החזר את max(R)
gap-Subset Sum[(1-ε),1] דוגמת הרצה: S = {3,4,8,8,11}, t = 19, ε = 0.3 R = {0} R = {0,3} R = {0,3,4,7} אתחול: {0}→R לולאה - לכל x ב-S: • x+R union R→R • מיין את R • min(R)→y • לולאה - לכל z ב-R: • אם y+εt/|S| < z ≤ t: z→y אחרת: R\{z} → R החזר את max(R)
gap-Subset Sum[(1-ε),1] דוגמת הרצה: S = {3,4,8,8,11}, t = 19, ε = 0.3 R = {0} R = {0,3} R = {0,3,4,7} R = {0,3,7,8,11,15} אתחול: {0}→R לולאה - לכל x ב-S: • x+R union R→R • מיין את R • min(R)→y • לולאה - לכל z ב-R: • אם y+εt/|S| < z ≤ t: z→y אחרת: R\{z} → R החזר את max(R)
gap-Subset Sum[(1-ε),1] דוגמת הרצה: S = {3,4,8,8,11}, t = 19, ε = 0.3 R = {0} R = {0,3} R = {0,3,4,7} R = {0,3,7,8,11,15} R = {0,3,7,8,11,11,15,15,19,23} אתחול: {0}→R לולאה - לכל x ב-S: • x+R union R→R • מיין את R • min(R)→y • לולאה - לכל z ב-R: • אם y+εt/|S| < z ≤ t: z→y אחרת: R\{z} → R החזר את max(R)
gap-Subset Sum[(1-ε),1] דוגמת הרצה: S = {3,4,8,8,11}, t = 19, ε = 0.3 R = {0} R = {0,3} R = {0,3,4,7} R = {0,3,7,8,11,15} R = {0,3,7,8,11,11,15,15,19,23} R = {0,3,7,11,11,14,15,18,19,22,… 26,30} (0.7)19 ≤ 18 = 3 + 4 + 11 ≤ 19 אתחול: {0}→R לולאה - לכל x ב-S: • x+R union R→R • מיין את R • min(R)→y • לולאה - לכל z ב-R: • אם y+εt/|S| < z ≤ t: z→y אחרת: R\{z} → R החזר את max(R)
gap-Subset Sum[(1-ε),1] סיבוכיות: אתחול: {0}→R לולאה - לכל x ב-S: • x+R union R→R • מיין את R • min(R)→y • לולאה - לכל z ב-R: • אם y+εt/|S| < z ≤ t: z→y אחרת: R\{z} → R החזר את max(R)
gap-Subset Sum[(1-ε),1] סיבוכיות: מיון של R – O(|R|) (מיזוג...) לולאה פנימית – O(|R|) גודל מקסימלי של R – O(|S|/ε) אתחול: {0}→R לולאה - לכל x ב-S: • x+R union R→R • מיין את R • min(R)→y • לולאה - לכל z ב-R: • אם y+εt/|S| < z ≤ t: z→y אחרת: R\{z} → R החזר את max(R)
gap-Subset Sum[(1-ε),1] סיבוכיות: מיון של R – O(|R|) (מיזוג...) לולאה פנימית – O(|R|) גודל מקסימלי של R – O(|S|/ε) לולאה חיצונית – |S| איטרציות סה"כ – O(|S|2/ε) אתחול: {0}→R לולאה - לכל x ב-S: • x+R union R→R • מיין את R • min(R)→y • לולאה - לכל z ב-R: • אם y+εt/|S| < z ≤ t: z→y אחרת: R\{z} → R החזר את max(R)
gap-Subset Sum[(1-ε),1] נכונות?
gap-Subset Sum[(1-ε),1] שלמות: (אם קיימת קבוצה Y המקיימת yYy = t) נוכיח באינדוקציה...
gap-Subset Sum[(1-ε),1] שלמות: (אם קיימת קבוצה Y המקיימת yYy = t) נסמן ב-Y(i) את קבוצת האיברים מ-Y עליהם עברנו ב-i האיטרציות הראשונות של הלולאה החיצונית טענת האינדוקציה – באיטרציה ה-i קיים z ב-R המקיים: yY(i)y-iεt/|S| ≤ z ≤ yY(i)y
gap-Subset Sum[(1-ε),1] שלמות: (אם קיימת קבוצה Y המקיימת yYy = t) טענת האינדוקציה – באיטרציה ה-i קיים z ב-R המקיים: yY(i)y-iεt/|S| ≤ z ≤ yY(i)y בסיס – טריוויאלי
gap-Subset Sum[(1-ε),1] שלמות: (אם קיימת קבוצה Y המקיימת yYy = t) טענת האינדוקציה – באיטרציה ה-i קיים z ב-R המקיים: yY(i)y-iεt/|S| ≤ z ≤ yY(i)y צעד – א. אם המשתנה הנוכחי x שייך ל-Y, לפני הניפוי z=zi-1+x נמצא ב-R ומאינדוקציה מתקיים ש- yY(i)y-(i-1)εt/|S| ≤ z ≤ yY(i)y אם z הוצא בניפוי בגלל קרבה ל-z’, אז מתקיים: yY(i)y-(i-1)εt/|S| ≤ z ≤ z’+εt/|S| ≤ yY(i)y+εt/|S| yY(i)y-iεt/|S| ≤ z-εt/|S| ≤ z’ ≤ yY(i)y