x - Algorithms

‫תכנות לינארי‬
‫נכתב ע"י אדם שפר‬
‫הרחבות ועדכונים ע"י רון שמיר‪ ,‬יוני ‪ ,2013‬מאי ‪2014‬‬
‫מקור עיקרי‪ CLRS :‬פרק ‪29‬‬
‫מה עושים היום?‬
‫‪ ‬היום נלמד על‪:‬‬
‫◦ בעיות תכנות לינארי (‪ Linear Programming‬או ‪.)LP‬‬
‫◦ אלגוריתם הסימפלקס‪.‬‬
‫‪2‬‬
‫בעיית תכנות לינארי – נתונים‬
‫‪ ‬בעית תכנות לינארי מורכבת מ‪:‬‬
‫◦ קבוצה של 𝑛 משתנים‪.𝑥1 , … , 𝑥𝑛 :‬‬
‫◦ קבוצה של 𝑚 אי שוויונים )≥ ‪ (≤, =,‬לינאריים‬
‫במשתנים‪ .‬לדוגמא‪:‬‬
‫‪𝑥1 + 𝑥2 + 4𝑥𝑛 ≤ 6‬‬
‫‪𝑥12 + 4𝑥4 − 2𝑥17 + 𝑥1 = 22‬‬
‫…‬
‫‪2𝑥4 + 𝑥𝑛−2 − 12𝑥2 ≥ −20‬‬
‫‪3‬‬
‫◦ פונקציית מטרה – להביא למינימום או למקסימום‬
‫פוקנציה לינארית במשתנים‪ .‬לדוגמא‪:‬‬
‫‪𝑚𝑖𝑛𝑖𝑚𝑖𝑧𝑒 3𝑥1 + 5𝑥2 + ⋯ − 𝑥𝑛 /12‬‬
‫פתרונות אפשריים‬
‫‪max 𝑥1 + 2𝑥2‬‬
‫‪4𝑥1 − 𝑥2 ≤ 3‬‬
‫‪2𝑥1 + 2𝑥2 ≥ −100‬‬
‫‪x2  10‬‬
‫‪4‬‬
‫‪x1  2.5,‬‬
‫פתרון אופטימלי‬
‫‪ ‬פתרון אופטימלי הינו פתרון אפשרי אשר מביא‬
‫את פונקציית המטרה למקסימום‪/‬מינימום‪.‬‬
‫‪ ‬למשל‪ ,‬עבור התוכנית‬
‫‪max 𝑥1 + 2𝑥2‬‬
‫‪4𝑥1 ≤ 3‬‬
‫‪2𝑥1 − 2𝑥2 ≥ 0‬‬
‫הפתרון האופימלי הינו ‪ . 𝑥1 = 𝑥2 = 3/4‬במקרה‬
‫הזה‪ ,‬הערך של פונקציית המטרה הינו ‪ , 9/4‬וכל‬
‫פתרון אפשרי אחר יביא לערך נמוך יותר‪.‬‬
‫‪5‬‬
‫שלוש תוצאות אפשריות לבעיה‬
‫קיים פתרון‬
‫אופטימלי (‪.)13‬‬
‫לא קיים‬
‫אף פתרון‪.‬‬
‫‪6‬‬
‫הבעיה אינה חסומה‬
‫(נוכל לקבל פתרון גדול‬
‫ככל שנרצה)‪.‬‬
‫‪maximize x  y‬‬
‫‪x5‬‬
‫‪yx3‬‬
‫‪maximize x  y‬‬
‫‪yx5‬‬
‫‪yx3‬‬
‫‪maximize x  y‬‬
‫‪x5‬‬
‫‪yx3‬‬
Example in 2D
max
x1 = 46/7
x2 = 59/7
x2
x1 + 8x2
subject to:
(1)
(2)
(3)
(4)
(5)
x1
x2
–3x1 + 4x2
4x1 – 3x2
x1 + x2
optimum
basic
constraints





(3)
3
2
14
25
15
(5)
(1)
Feasible
Region
(4)
(2)
x1
7
Source: Andy Mirzayan, York Univ.
Example in 3D
maximize
z
z
subject to:
x y z  3
y2
x0
y0
z0
Optimum
(x,y,z)=(0,0,3)
y
x
8
Source: Andy Mirzayan, York Univ.
‫שאלה ‪ – 1#‬הלוואות בבנק‬
‫‪‬‬
‫תרגיל‪ :‬הבנק למשכנתאוילר מציע ארבע סוגי הלוואות‪:‬‬
‫משכנתא ראשונה ב‪ 14%-‬ריבית (שנתית)‪ ,‬משכנתא שניה‬
‫ב‪ 20%-‬ריבית‪ ,‬הלוואה לשיפוץ הבית ב‪ 20%-‬ריבית‪,‬‬
‫והלוואה למימון לימודים ב‪ 10%-‬ריבית‪.‬‬
‫הבנק רוצה למקסם את רווחיו מהריבית השנתית‪ ,‬אך‬
‫נתון תחת הגבלות המדיניות הבאות (האחוזים הינם‬
‫ביחס לסכומי ההלוואות ולא למספרן)‪:‬‬
‫◦‬
‫◦‬
‫‪9‬‬
‫◦‬
‫◦‬
‫לבנק מותר להלוות עד ‪ 250‬מיליון שקל בשנה‪.‬‬
‫משכנתאות ראשונות צריכות להיות לפחות ‪ 55%‬מסך‬
‫המשכנתאות ולפחות ‪ 25%‬מסך מכלל ההלוואות‪.‬‬
‫משכנתאות שניות יכולות להיות עד ‪ 25%‬מכלל ההלוואות‪.‬‬
‫הריבית הממוצעת אינה יכולה לעלות מעל ל‪.15%-‬‬
‫פתרון‬
‫משכנתא ראשונה ב‪ 14%-‬ריבית‪,‬‬
‫משכנתא שניה ב‪ 20%-‬ריבית‪,‬‬
‫הלוואה לשיפוץ הבית ב‪ 20%-‬ריבית‪,‬‬
‫הלוואה למימון לימודים ב‪ 10%-‬ריבית‪.‬‬
‫‪ ‬מהם המשתנים שלנו?‬
‫‪  x1‬אחוז הלוואות משכנתא ראשונה‪.‬‬
‫‪  x2‬אחוז הלוואות משכנתא שניה‪.‬‬
‫‪  x3‬אחוז הלוואות לשיפוץ‪.‬‬
‫‪  x4‬אחוז הלוואות ללימודים‪.‬‬
‫‪ ‬מהי פונציית המטרה?‬
‫) ‪maximize 250(0.14  x1  0.2  x2  0.2  x3  0.1 x4‬‬
‫‪10‬‬
‫פתרון‬
‫(המשך)‬
‫לבנק מותר להלוות עד ‪ 250‬מיליון שקל בשנה‪.‬‬
‫משכנתאות ראשונות צריכות להיות לפחות ‪ 55%‬מסך‬
‫המשכנתאות ולפחות ‪ 25%‬מסך מכלל ההלוואות‪.‬‬
‫המשכנתאות השניות יכולות להיות עד ‪ 25%‬מכלל ההלוואות‬
‫הריבית הממוצעת אינה יכולה לעלות מעל ל‪.15%-‬‬
‫‪ ‬מהם האילוצים?‬
‫‪x1  0.55x1  x2   0.45  x1  0.55  x2  0‬‬
‫‪x2  0.25‬‬
‫‪x1  0.25‬‬
‫‪0.14  x1  0.2  x2  0.2  x3  0.1 x4  0.15‬‬
‫‪x1 , x2 , x3 , x4  0‬‬
‫‪11‬‬
‫‪x1  x2  x3  x4  1‬‬
‫סיכום הפתרון‬
‫‪ ‬קיבלנו את התוכנית הבאה‪:‬‬
‫‪max 250 0.14 ⋅ 𝑥1 +0.2 ⋅ 𝑥2 + 0.2 ⋅ 𝑥3 + 0.1 ⋅ 𝑥4‬‬
‫‪0.45 ⋅ 𝑥1 − 0.55 ⋅ 𝑥2 ≥ 0‬‬
‫‪𝑥2 ≤ 0.25‬‬
‫‪𝑥1 ≥ 0.25‬‬
‫‪0.14 ⋅ 𝑥1 +0.2 ⋅ 𝑥2 + 0.2 ⋅ 𝑥3 + 0.1 ⋅ 𝑥4 ≤ 0.15‬‬
‫‪𝑥1 + 𝑥2 + 𝑥3 + 𝑥4 = 1‬‬
‫‪𝑥1 , 𝑥2 , 𝑥3 , 𝑥4 ≥ 0‬‬
‫‪12‬‬
‫עוד שימושים‬
‫‪ ‬בעיות נוספות שנהוג לנסח כתכנות לינארי‪:‬‬
‫◦‬
‫◦‬
‫◦‬
‫◦‬
‫‪13‬‬
‫השמת של עובדים למשמרות תחת אילוצים של הגבלת‬
‫שעות לעובד‪ ,‬שעות שונות ביום דורשות כמות שונה של‬
‫עובדים‪ ,‬כל משמרת צריכה להכיל 𝑥 עובדים ותיקים‪ ,‬וכו'‪.‬‬
‫חברה עם הרבה מפעלים שמספקת סחורה למגוון חנויות‪.‬‬
‫לכל חנות צריך להחליט איזה מפעל מספק לה סחורה‬
‫תחת אילוצי עלות משלוח‪ ,‬כמויות יצור אפשריות‪ ,‬וכו'‪.‬‬
‫תכנון דיאטה שתביא לכמות מספקת של מרכיבי המזון‬
‫השונים במינימום עלות‪.‬‬
‫ועוד הרבה‪...‬‬
‫‪ ‬אלגוריתם שפותר בעיות תכנות לינארי יוכל‬
‫לפתור את כל הבעיות הללו!‬
‫שאלה ‪ - 2#‬זרימה ותכנות לינארי‬
‫‪ ‬תרגיל‪ :‬נתונה רשת זרימה – גרף מכוון‬
‫𝐸 ‪ ,𝐺 = 𝑉,‬פונקציית קיבול ‪ ,𝑐: 𝐸 → ℝ‬מקור‬
‫𝑉 ∈ 𝑠‪ ,‬ויעד 𝑉 ∈ 𝑡 ‪ .‬נסחו את בעיית מציאת‬
‫הזרימה המקסימלית מ‪ 𝑠-‬ל‪ 𝑡-‬כבעיית תכנות‬
‫לינארי‪.‬‬
‫‪14‬‬
‫זרימה – תוכנית לינארית‬
‫‪ ‬מה יהיו המשתנים?‬
‫◦ לכל קשת )𝑣 ‪ 𝑒 = (𝑢,‬נחזיק משתנה 𝑣𝑢𝑥 שיסמן‬
‫כמה זרימה עוברת דרך הקשת‪.‬‬
‫‪ ‬כיצד נדאג שהזרימה שנכנסת לקודקוד שווה‬
‫לזרימה היוצאת ממנו?‬
‫◦ לכל קודקוד 𝑡 ‪ 𝑢 ∈ 𝑉 ∖ 𝑠,‬נוסיף אילוץ‬
‫= 𝑢𝑣𝑥‬
‫𝑣𝑢𝑥‬
‫𝑉∈𝑣‬
‫‪ o‬נדרוש גם ‪ 𝑥𝑢𝑣 ≥ 0‬לכל משתנה‬
‫‪15‬‬
‫𝑉∈𝑣‬
‫זרימה – תוכנית לינארית (המשך)‬
‫‪ ‬מה עדיין חסר בתוכנית?‬
‫◦ פונקציית מטרה שתביא למקסימום את גודל‬
‫הזרימה‪:‬‬
‫} ‪xvs‬‬
‫‪xsv −‬‬
‫𝑉∈𝑣‬
‫‪16‬‬
‫{‪max‬‬
‫𝑉∈𝑣‬
‫זרימה – תוכנית לינארית (עוד המשך)‬
‫‪ ‬מה עוד חסר בתוכנית?‬
‫◦ עדיין לא התייחסנו לקיבולים!‬
‫◦ עבור כל קשת 𝐸 ∈ 𝑣 ‪ 𝑢,‬ניצור אילוץ‬
‫𝑣 ‪𝑥𝑢𝑣 ≤ 𝑐 𝑢,‬‬
‫‪17‬‬
‫זרימה – תוכנית לינארית (הסוף)‬
‫} ‪xvs‬‬
‫‪xsv −‬‬
‫𝑉∈𝑣‬
‫𝑡 ‪𝑢 ∈ 𝑉 ∖ 𝑠,‬‬
‫{‪max‬‬
‫𝑉∈𝑣‬
‫𝑣𝑢𝑥 𝑉∈𝑣‬
‫=‬
‫𝑢𝑣𝑥 𝑉∈𝑣‬
‫𝐸 ∈ 𝑣 ‪𝑥𝑢𝑣 ≤ 𝑐 𝑢, 𝑣  𝑢,‬‬
‫𝐸 ∈ 𝑣 ‪𝑥𝑢𝑣 ≥ 0  𝑢,‬‬
‫‪18‬‬
‫שאלה ‪ 3#‬זרימה במחיר מינימלי‬
‫(‪)Min cost flow‬‬
‫‪ ‬אותם נתונים – בתוספת מחיר ‪ puv‬ליחידת‬
‫זרימה על כל קשת )‪(u,v‬‬
‫‪ ‬מחפשים זרימה מקסימלית שמחירה הכולל‬
‫מינימלי‬
‫‪ ‬נחשב את ערך הזרימה המקס‪T ,‬‬
‫‪Min (u ,v )E puv xuv‬‬
‫‪ ‬נכתוב תוכנית לינארית‪:‬‬
‫‪s.t‬‬
‫‪x ‬‬
‫‪x T‬‬
‫‪vs‬‬
‫‪19‬‬
‫‪vV‬‬
‫‪‬‬
‫‪sv‬‬
‫‪vV‬‬
‫‪‬‬
‫שאלה ‪ - 4#‬מק"בים ותכנות לינארי‬
‫‪ ‬תרגיל‪ :‬תארו את בעיית מציאת מק"ב ממקור‬
‫יחיד ליעד יחיד כבעיית תכנות לינארי‪.‬‬
‫‪ ‬הגדרת הבעיה ‪ -‬תזכורת‪ :‬נתונים גרף מכוון‬
‫)𝐸 ‪ , 𝐺 = (𝑉,‬זוג קודקודים 𝑉 ∈ 𝑡 ‪, 𝑠,‬‬
‫ופונקציית משקל 𝑅 → 𝐸 ‪ . 𝑤:‬בנוסף‪ ,‬ידוע כי‬
‫אין מעגלים שליליים בגרף‪ .‬מצאו‬
‫מק"ב מ‪ 𝑠 −‬אל 𝑡‪.‬‬
‫‪20‬‬
‫פתרון‬
‫‪ ‬תזכורת‪ :‬בסיום אלג ‪ ,Bellman –Ford‬לכל‬
‫קשת )‪ (u,v‬מתקיים‪dv du +w(u,v) :‬‬
‫‪ ‬לכל קדקוד ‪ v‬נגדיר משתנה )‪d(v‬‬
‫‪21‬‬
‫דוגמא‬
‫𝑎‬
‫‪1‬‬
‫𝑡‬
‫‪3‬‬
‫‪1‬‬
‫‪4‬‬
‫‪𝑑 𝑏 ≤1‬‬
‫‪𝑑 𝑎 ≤2‬‬
‫‪𝑑 𝑡 ≤3‬‬
‫‪22‬‬
‫𝑏‬
‫𝑠‬
‫‪1‬‬
‫‪+ 3.‬‬
‫‪+ 1.‬‬
‫‪+ 1.‬‬
‫‪+ 1.‬‬
‫‪+ 4.‬‬
‫‪= 0.‬‬
‫𝑠 𝑑≤‬
‫𝑠 𝑑≤‬
‫𝑏 𝑑≤‬
‫𝑎 𝑑≤‬
‫𝑏 𝑑≤‬
‫𝑠‬
‫𝑎‬
‫𝑏‬
‫𝑎‬
‫𝑡‬
‫𝑡‬
‫𝑑‬
‫𝑑‬
‫𝑑‬
‫𝑑‬
‫𝑑‬
‫𝑑‬
‫זהירות!‬
‫‪ :LP ‬אילוצים לינאריים‪ ,‬פונקצית מטרה‬
‫לינארית‪ ,‬ערכי פתרון ממשיים‬
‫‪ ‬אילוצים לינאריים‪ ,‬פונקצית מטרה לינארית‪,‬‬
‫ערכי פתרון שלמים‪)ILP( Integer LP :‬‬
‫‪ ‬ספוילר‪:‬‬
‫◦ ‪ :LP‬בעיה פולינומיאלית‬
‫◦ ‪ :ILP‬ככל הנראה לא פולינומיאלית (‪-NP‬קשה)‬
‫‪ ‬לא להתבלבל בין ‪ LP‬ל‪!!ILP-‬‬
‫‪23‬‬
‫קצת היסטוריה – ג'ורג' דנציג‬
‫‪‬‬
‫בשנות ה‪ 30-‬וה‪ 40-‬מספר בעיות נוסחו בצורת תוכניות‬
‫לינאריות‪ ,‬אך אף אחד לא הכליל את זה לבעיה כללית‬
‫אחת‪.‬‬
‫ב‪ ,1947-‬כחלק מפרוייקט ‪ SCOOP‬של חייל האוויר‬
‫האמריקני‪ Danzig ,‬הציג את הרעיון של תכנות לינארי‪,‬‬
‫ואת אלגוריתם הסימפלקס לפתרון הבעיה‪.‬‬
‫‪‬‬
‫”‪ "Programming‬בשנות ה‪ –40-‬תכנון‬
‫ולא תכנות‬
‫‪‬‬
‫‪24‬‬
‫אלגוריתם סימפלקס‬
‫‪ ‬אלגוריתם ‪ Simplex‬מקבל בעיות תכנות לינארי‬
‫ומוצא פתרון אופטימלי עבורן (או מודיע‬
‫שהבעיה אינה חסומה ‪ /‬אינה פיזיבילית)‬
‫‪ ‬זמן הריצה של האלגוריתם אקספוננציאלי‬
‫במקרה הגרוע ביותר‪.‬‬
‫‪ ‬במקרה האופייני (על נתונים אמיתיים) זמן‬
‫הריצה טוב מאוד‪ ,‬ולכן זהו אלגוריתם נפוץ‬
‫לבעיה‪.‬‬
‫‪25‬‬
‫קצת היסטוריה – הסגר על ברלין‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪26‬‬
‫לאחר מלחמת העולם השניה‪ ,‬גרמניה‬
‫חולקה לארבעה חלקים‪ .‬ברלין‪ ,‬שהייתה‬
‫בתוך החלק הסובייטי‪ ,‬חולקה גם היא‪.‬‬
‫עם התפתחות המלחמה הקרה‪ ,‬הסובייטים‬
‫החליטו לערוך מצור על ברלין‪.‬‬
‫לצורך העברת אספקה לתושבי העיר‪,‬‬
‫האמריקנים יזמו רכבת אווירית‪.‬‬
‫המשבר נמשך פחות משנה וחצי‪ ,‬אך בזמן‬
‫הזה התבצעו ‪ 276,926‬טיסות לברלין!‬
‫הסגר על ברלין ותכנות לינארי‬
‫‪‬‬
‫‪‬‬
‫‪27‬‬
‫תפעול יעיל של הרכבת האווירית היה מבצע‬
‫מסובך ביותר‪:‬‬
‫◦ נתונים 𝑥 מטוסים ממספר סוגים‪ .‬כל סוג‬
‫יכול להעביר כמות שונה של אספקה‪.‬‬
‫◦ מטוסים שונים זקוקים למספר שונה של‬
‫אנשי צוות‪.‬‬
‫◦ לכל טיסה יש עלות שונה‪ ,‬וישנו תקציב‬
‫שבועי שמותר להשתמש בו‪.‬‬
‫◦ ועוד הרבה פרמטרים נוספים‪...‬‬
‫לצורך פתרון הבעיה השתמשו בשיטות‬
‫התכנות הלינארי של דנציג‪.‬‬
‫צורה סטנדרטית של בעיית ‪LP‬‬
‫‪n‬‬
‫‪j‬‬
‫‪c x‬‬
‫‪j‬‬
‫‪maximize‬‬
‫‪j 1‬‬
‫‪for i  1,2,..., m‬‬
‫‪for i  1,2,..., n‬‬
‫‪x j  bi‬‬
‫‪n‬‬
‫‪a‬‬
‫‪ij‬‬
‫‪j 1‬‬
‫‪xi  0‬‬
‫טענה‪ :‬כל בעיית תכנות לינארי ניתן להמיר לצורה‬
‫סטנדרטית‪.‬‬
‫‪28‬‬
‫המרה לצורה סטנדרטית‪:‬‬
‫פונקציית מטרה‬
‫‪ ‬בעיה‪ :‬פונקציית המטרה היא מינימום‪.‬‬
‫‪ ‬פתרון‪:‬‬
‫‪n‬‬
‫‪xj‬‬
‫‪j‬‬
‫‪d‬‬
‫‪j 1‬‬
‫‪ maximize‬‬
‫‪n‬‬
‫‪j‬‬
‫‪c x‬‬
‫‪j‬‬
‫‪minimize‬‬
‫‪j 1‬‬
‫‪d j  c j for j  1,2,..., n‬‬
‫‪29‬‬
‫המרה לצורה סטנדרטית ‪:‬‬
‫משתנים‬
‫‪ ‬בעיה‪ :‬למשתנה ‪ x‬יכול להיות ערך שלילי‪.‬‬
‫‪ ‬פתרון‪:‬‬
‫' '‪x  x' x‬‬
‫‪x' , x' '  0‬‬
‫‪ ‬לדוגמא‪:‬‬
‫‪30‬‬
‫‪ 2x  4 y  z  8‬‬
‫‪ 2( x' x' ' )  4 y  z  8‬‬
‫‪ 2 x'2 x' '4 y  z  8‬‬
‫שני משתנים‬
‫חדשים יחליפו‬
‫את 𝑥‪.‬‬
‫המרה לצורה סטנדרטית‪:‬‬
‫שוויונים‬
‫‪ ‬בעיה‪ :‬המערכת מכילה שוויון‪.‬‬
‫‪b‬‬
‫‪n‬‬
‫‪j‬‬
‫‪a x‬‬
‫‪j‬‬
‫‪j 1‬‬
‫‪ ‬פתרון‪ :‬נחליף את השוויון בשני אי שוויונים‪.‬‬
‫‪b‬‬
‫‪31‬‬
‫‪n‬‬
‫‪j‬‬
‫‪a x‬‬
‫‪j‬‬
‫‪j 1‬‬
‫‪b‬‬
‫‪n‬‬
‫‪j‬‬
‫‪a x‬‬
‫‪j‬‬
‫‪j 1‬‬
‫המרה לצורה סטנדרטית‪:‬‬
‫אי‪-‬שוויונים‬
‫‪ ‬בעיה‪ :‬כיוון לא נכון של אי שוויון‪.‬‬
‫‪b‬‬
‫‪n‬‬
‫‪j‬‬
‫‪a x‬‬
‫‪j‬‬
‫‪j 1‬‬
‫‪ ‬פתרון‪:‬‬
‫‪xj  b‬‬
‫‪n‬‬
‫‪j‬‬
‫‪a‬‬
‫‪j 1‬‬
‫‪a j  a j for i  1,2,..., n‬‬
‫‪b  b‬‬
‫‪32‬‬
‫דוגמא‪ :‬המרה לצורה סטנדרטית‬
‫(‪)1‬‬
‫(‪)4‬‬
‫(‪)2‬‬
‫(‪)5‬‬
‫‪33‬‬
‫(‪)3‬‬
‫המרה לצורה סטנדרטית – סיכום‬
‫‪ ‬ראינו שכל בעיית תכנות לינארי ניתן להמיר‬
‫לצורה סטנדרטית‪.‬‬
‫‪ ‬אם במקור היו 𝑛 משתנים ו‪ 𝑚 −‬אילוצים‪.‬‬
‫בצורה הסטדנרטית שמתקבלת ישנם לכל היותר‬
‫𝑛‪ 2‬משתנים ו‪ 2𝑛 + 2𝑚 -‬אילוצים‪.‬‬
‫‪34‬‬
‫‪Slack Form‬‬
‫‪ ‬צורת ה‪ slack-‬הינה דרך נוספת ליצג את בעיית‬
‫התכנות לינארי‪.‬‬
‫◦ אילוצי אי שליליות לכל המשתנים ‪.𝑥𝑗 ≥ 0‬‬
‫◦ כל שאר האילוצים הם שוויונות‬
‫◦ דרישות נוספות – בהמשך‪.‬‬
‫‪35‬‬
‫מעבר מצורה סטנדרטית לצורת ‪)1( slack‬‬
‫‪n‬‬
‫‪j‬‬
‫‪c x‬‬
‫‪j‬‬
‫‪maximize‬‬
‫‪j 1‬‬
‫‪n‬‬
‫‪xn i  bi -  aij x j‬‬
‫‪x j  bi‬‬
‫‪j 1‬‬
‫𝑚 משתני עודף )‪(slack‬‬
‫חדשים‪:‬‬
‫𝑚‪𝑥𝑛+1 , … , 𝑥𝑛+‬‬
‫‪36‬‬
‫האילוץ‬
‫ה‪.i-‬‬
‫‪xi  0‬‬
‫‪n‬‬
‫‪a‬‬
‫‪ij‬‬
‫‪j 1‬‬
‫גם לכל‬
‫המשתנים‬
‫החדשים‪.‬‬
‫דוגמא‪ :‬המרה לצורת ‪ slack‬התחלתית‬
‫‪37‬‬
‫מעבר מצורה סטנדרטית לצורת ‪slack‬‬
‫סופית (‪)2‬‬
‫הצגת פונקצית המטרה במונחי המשתנים 𝑛𝑥 ‪𝑥1 , … ,‬‬
‫‪n‬‬
‫‪xn i  bi -  aij x j‬‬
‫‪j 1‬‬
‫‪n‬‬
‫‪maximize v   c j x j‬‬
‫‪j 1‬‬
‫‪x1 ,..., xn  m  0‬‬
‫𝑚 משתני בסיס‪:‬‬
‫𝑚‪𝑥𝑛+1 , … , 𝑥𝑛+‬‬
‫𝑩 קבוצת האינדקסים‬
‫של משתני הבסיס‪: :‬‬
‫‪38‬‬
‫}𝑛 ‪{𝑛 + 1, … , 𝑚 +‬‬
‫𝑛 משתנים לא בסיסיים‪:‬‬
‫𝑛𝑥 ‪𝑥1 , … ,‬‬
‫𝑵 קבוצת האינדקסים של המשתנים‬
‫לא בסיסיים‪{1, … , 𝑛} :‬‬
‫סיכום ‪Slack Form :‬‬
‫‪ n ‬משתנים לא בסיסיים ו‪ m -‬משתנים בסיסיים‪.‬‬
‫◦ פונקציית מטרה ‪max v   jN c j x j‬‬
‫רק משתנים לא בסיסיים‪.‬‬
‫◦ אילוצי אי שליליות לכל המשתנים ‪.𝑥𝑗 ≥ 0‬‬
‫◦ לכל משתנה בסיסי קיים שיוויון מהצורה‬
‫שמכילה‬
‫‪xk  bi -  aij x j‬‬
‫‪jN‬‬
‫משתנים לא בסיסיים‪.‬‬
‫‪39‬‬
‫משתנה בסיסי‪.‬‬
‫ישנן הרבה צורות ‪ slack‬שקולות‬
‫פונקציית‬
‫המטרה‪.‬‬
‫‪40‬‬
‫הפתרון המתאים לצורת ‪slack‬‬
‫‪ ‬לכל צורת ‪ slack‬נתאים פתרון באופן הבא‪:‬‬
‫◦ כל המשתנים הלא בסיסיים יקבלו ערך ‪ ,0‬ואז‬
‫האילוצים יקבעו את הערכים של המשתנים הבסיסיים‪.‬‬
‫‪ ‬מהו הערך של הפתרון? הקבוע בפונקציית המטרה‪.‬‬
‫‪ ‬מתי הפתרון אפשרי?‬
‫‪41‬‬
‫כאשר הקבועים בכל‬
‫האילוצים הינם אי‪-‬שליליים‪.‬‬
‫פיבוט ‪Pivot -‬‬
‫‪ ‬צעד של אלגוריתם סימפלקס נקרא פיבוט‪.‬‬
‫‪ ‬כל מה שעושים בצעד כזה הוא לעבור בין שתי‬
‫צורות ‪ slack‬שקולות‪.‬‬
‫‪ ‬אלגוריתם סימפלקס בקצרה‪:‬‬
‫◦ מצא צורת ‪ slack‬שהפתרון המתאים לה אפשרי‪.‬‬
‫◦ כל עוד לא הגענו לפתרון‪ ,‬עבור לצורת ‪ slack‬אחרת‬
‫שהערך של הפתרון המתאים לה גדול או שווה לערך‬
‫של הפתרון הנוכחי‪.‬‬
‫‪42‬‬
‫ביצוע צעד פיבוט‬
‫‪9 /(1 / 2)  18‬‬
‫‪21 /(5 / 2)  8.4‬‬
‫‪6 / 4  1.5‬‬
‫‪ ‬צריך לבחור את זוג המשתנים שמחליפים ביניהם‪.‬‬
‫‪43‬‬
‫◦ בוחרים משתנה לא בסיסי עם מקדם חיובי בפונקציית‬
‫המטרה‪.‬‬
‫◦ בוחרים אילוץ שמביא למינימום את היחס בין הקבוע‬
‫שבאילוץ לבין מינוס המקדם של המשתנה הלא בסיסי ‪.‬‬
‫ביצוע צעד פיבוט (המשך)‬
‫‪ ‬אנו רוצים להחליף את ‪ x3‬עם ‪.x5‬‬
‫‪x6 ‬‬
‫‪3x2‬‬
‫‪‬‬
‫‪x3   6 ‬‬
‫‪ x5   / 4‬‬
‫‪2‬‬
‫‪2‬‬
‫‪‬‬
‫‪44‬‬
‫‪ ‬נשתמש במשוואה הזו על מנת להחליף בין‬
‫המשתנים בפונקציית המטרה ובשאר האילוצים‪.‬‬
‫ביצוע צעד פיבוט (עוד המשך)‬
‫‪ ‬כיוון שלקחנו את המשוואה עם היחס הקטן‬
‫ביותר‪ ,‬כל הקבועים ישארו אי שליליים‪.‬‬
‫‪45‬‬
‫דרך אחרת להסתכל על הצעד‬
‫לפני הצעד‪:‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪46‬‬
‫אחרי הצעד‪:‬‬
‫רצינו להעלות את הערך של ‪ .x3‬העלינו אותו ב‪ ,1.5-‬כיוון‬
‫שערך גדול יותר היה מפר את האילוץ ‪.x5  0‬‬
‫הפתרון גדל ב‪.1.5/2 = 0.75 -‬‬
‫בעצם עברנו לצורת ה‪ slack-‬שמתאימה לפתרון החדש‪.‬‬
‫בפתרון החדש ‪.x5  0 x3  1.5‬‬
‫עוד שאלה‬
‫‪ ‬שאלה‪ .‬מה הקשר בין ג'ורג' דנציג לבין מאט‬
‫דיימון?‬
‫‪ ‬פתרון‪ .‬בסרט ‪ good will hunting‬בכיכובו של‬
‫מאט דיימון (שגם נכתב על ידיו) יש אירוע‬
‫שמבוסס על דנציג (ההסבר המלא בשיעור)‪.‬‬
‫‪47‬‬
‫פיבוט – הגדרה פורמלית‬
‫‪𝐵 – basic variables.‬‬
‫‪𝑁 – non-basic‬‬
‫‪variables.‬‬
‫𝑗𝑥 𝑗𝑐 𝑁∈𝑗‬
‫𝐵∈𝑖‬
‫𝑗𝑥 𝑗𝑖𝑎 𝑁∈𝑗‬
‫‪𝑧 =𝑣 +‬‬
‫‪𝑥𝑖 = 𝑏𝑖 −‬‬
‫𝑁 ∪ 𝐵 ∈ 𝑗 ‪𝑥𝑗 ≥ 0‬‬
‫‪‬‬
‫נבחר משתנה לא בסיסי 𝑙𝑥 כך ש‪.𝑐𝑙 > 0 −‬‬
‫נבחר משתנה בסיסי 𝑘𝑥 כך שמתקיים‬
‫) 𝑙𝑖𝑎‪. 𝑏𝑘 /𝑎𝑘𝑙 = min(𝑏𝑖 /‬‬
‫‪‬‬
‫נחלק את שני צידי המשוואה של 𝑘𝑥 ב‪ , 𝑎𝑘𝑙 −‬נעביר‬
‫את 𝑙𝑥 לצד שמאל‪ ,‬ואת 𝑘𝑥 לצד ימין‪.‬‬
‫נשתמש במשוואה שהתקבלה כדי להעלים את 𝑙𝑥‬
‫משאר האילוצים ומפונקציית המטרה‪.‬‬
‫‪‬‬
‫𝑖‬
‫‪‬‬
‫‪48‬‬
‫𝑗𝑥 𝑗𝑐 𝑁∈𝑗‬
‫𝐵∈𝑖‬
‫𝑘𝑥 יוצא מהבסיס‪,‬‬
‫𝑙𝑥 נכנס‬
‫) 𝑙𝑥𝑙𝑘𝑎 ‪−‬‬
‫𝑗𝑥 𝑗𝑖𝑎 𝑁∈𝑗‬
‫‪𝑧 =𝑣 +‬‬
‫‪𝑥𝑖 = 𝑏𝑖 −‬‬
‫𝑁 ∪ 𝐵 ∈ 𝑗 ‪𝑥𝑗 ≥ 0‬‬
‫𝑗𝑥 𝑗𝑘𝑎 }𝑙{‪𝑗∈𝑁−‬‬
‫‪1‬‬
‫𝑘𝑥‬
‫𝑙𝑘𝑎‬
‫‪𝑥𝑗 −‬‬
‫‪−‬‬
‫‪1‬‬
‫𝑘𝑏(‬
‫𝑙𝑘𝑎‬
‫𝑗𝑘𝑎‬
‫𝑎 }𝑙{‪𝑗∈𝑁−‬‬
‫𝑙𝑘‬
‫= 𝑙𝑥𝑙𝑐 ‪𝑐𝑗 𝑥𝑗 +‬‬
‫‪−‬‬
‫=‬
‫‪1‬‬
‫𝑘𝑥‬
‫𝑙𝑘𝑎‬
‫𝑘𝑏‬
‫𝑙𝑘𝑎‬
‫= 𝑙𝑥‬
‫‪𝑧 =𝑣 +‬‬
‫}𝑙{‪𝑗∈𝑁−‬‬
‫‪49‬‬
‫𝑙𝐶‬
‫𝑘𝑥‬
‫𝑙𝑘𝑎‬
‫‪)𝑥𝑗 −‬‬
‫𝑗𝑘𝑎‬
‫𝑙𝑘𝑎‬
‫𝑙𝑐‪−‬‬
‫𝑗𝑐(}𝑙{‪𝑗∈𝑁−‬‬
‫‪+‬‬
‫𝑘𝑏‬
‫𝑙𝑐 ‪+‬‬
‫𝑙𝑘𝑎‬
‫𝑣‬
‫𝑗𝑥 𝑗𝑐 𝑁∈𝑗‬
‫𝑘𝑥 יוצא מהבסיס‪,‬‬
‫𝑙𝑥 נכנס‬
‫𝐵∈𝑖‬
‫‪𝑥𝑗 −‬‬
‫𝑗𝑘𝑎‬
‫𝑎 }𝑙{‪𝑗∈𝑁−‬‬
‫𝑙𝑘‬
‫= 𝑙𝑥𝑙𝑖𝑎 ‪𝑎𝑖𝑗 𝑥𝑗 −‬‬
‫𝑗𝑘𝑎‬
‫‪1‬‬
‫‪𝑥𝑗 −‬‬
‫𝑘𝑥‬
‫𝑙𝑘𝑎‬
‫𝑙𝑘𝑎‬
‫𝑙 ‪𝑗∈𝑁−‬‬
‫𝑗𝑘𝑎‬
‫𝑙𝑖𝑎‬
‫𝑙𝑖𝑎‪(𝑎𝑖𝑗 −‬‬
‫‪)𝑥𝑗 −‬‬
‫𝑘𝑥‬
‫𝑙𝑘𝑎‬
‫𝑙𝑘𝑎‬
‫𝑘𝑏‬
‫‪−‬‬
‫𝑙𝑘𝑎‬
‫‪50‬‬
‫‪𝑥𝑖 = 𝑏𝑖 −‬‬
‫𝑁 ∪ 𝐵 ∈ 𝑗 ‪𝑥𝑗 ≥ 0‬‬
‫‪1‬‬
‫𝑘𝑥‬
‫𝑙𝑘𝑎‬
‫}𝑙{– 𝐵 ∈ 𝑖‬
‫𝑗𝑥 𝑗𝑖𝑎 𝑁∈𝑗‬
‫‪𝑧 =𝑣 +‬‬
‫‪−‬‬
‫𝑙 ‪𝑗∈𝑁−‬‬
‫𝑘𝑏‬
‫𝑙𝑘𝑎‬
‫= 𝑙𝑥‬
‫‪𝑥𝑖 = 𝑏𝑘 −‬‬
‫𝑙𝑖𝑎 ‪𝑎𝑖𝑗 𝑥𝑗 −‬‬
‫𝑙 ‪𝑗∈𝑁−‬‬
‫‪= 𝑏𝑘 −‬‬
‫𝑙 ‪𝑗∈𝑁−‬‬
‫𝑘𝑏‬
‫𝑙𝑖𝑎 ‪= 𝑏𝑘 −‬‬
‫‪−‬‬
‫𝑙𝑘𝑎‬
‫פתרונות אפשריים‬
‫‪ ‬טענה‪ .‬נניח שביצענו צעד פיבוט על צורת ‪slack‬‬
‫המתאימה לפתרון אפשרי‪ .‬צורת ה‪slack-‬‬
‫שתתקבל תתאים גם היא לפתרון אפשרי‪.‬‬
‫‪ ‬הוכחה‪.‬‬
‫◦ נסמן ב‪ 𝑏𝑖′ -‬את הקבועים באילוצים החדשים‪.‬‬
‫◦ מספיק להראות שמתקיים ‪.∀𝑖: 𝑏𝑖′ ≥ 0‬‬
‫◦‪≥0‬‬
‫𝑙𝑖𝑎‬
‫𝑘𝑏 ‪𝑏𝑖 −‬‬
‫𝑙𝑘𝑎‬
‫𝑙𝑖𝑎‪𝑏𝑘 /𝑎𝑘𝑙 ≤ 𝑏𝑖 /‬‬
‫‪51‬‬
‫𝑙𝑘𝑎‪/‬‬
‫= ‪. 𝑏𝑖′‬‬
‫‪‬‬
‫𝑗𝑥 𝑗𝑘𝑎 𝑁∈𝑗‬
‫) 𝑙𝑖𝑎‪𝑏𝑘 /𝑎𝑘𝑙 = min(𝑏𝑖 /‬‬
‫𝑖‬
‫‪𝑥𝑙 = 𝑏𝑘 − 𝑥𝑘 +‬‬
‫ערך הפתרון החדש‬
‫‪ ‬טענה‪ .‬נניח שהרצנו צעד פיבוט על צורת ‪slack‬‬
‫המתאימה לפתרון שערכו 𝜈‪ .‬צורת ה‪slack-‬‬
‫שתתקבל תתאים לפתרון שערכו לפחות 𝜈 ‪.‬‬
‫‪ ‬הוכחה‪.‬‬
‫◦‬
‫◦‬
‫◦‬
‫◦‬
‫‪52‬‬
‫נסמן ב‪ 𝜈 ′ -‬את הקבוע בצורת ה‪ slack-‬החדשה‪.‬‬
‫נרצה להראות שמתקיים ‪.𝜈 ≤ 𝜈 ′‬‬
‫𝑙𝑘𝑎‪𝜈 ′ = 𝜈 + 𝑐𝑙 𝑏𝑘 /‬‬
‫הטענה מתקיימת כיוון ש‪.𝑎𝑘𝑙 , 𝑏𝑘 , 𝑐𝑙 ≥ 0 -‬‬
‫𝑙𝑘𝑎‪/‬‬
‫𝑗𝑥 𝑗𝑘𝑎 𝑁∈𝑗‬
‫‪𝑥𝑙 = 𝑏𝑘 − 𝑥𝑘 +‬‬
‫מתי האלגוריתם מסתיים?‬
‫‪ ‬מתי נפסיק לבצע צעדי פיבוט ונעצור את‬
‫האלגוריתם?‬
‫◦ כאשר כל המקדמים בפונקציית המטרה שליליים או‬
‫‪ ,0‬ולכן לא ניתן לבצע צעד שיגדיל את ערך הפתרון‪.‬‬
‫◦ עוד לא הראינו‪:‬בתנאי העצירה – הפתרון אופטימלי‬
‫‪53‬‬
‫שאלה‬
‫‪ ‬מה קורה אם כל המקדמים 𝑙𝑖𝑎 חיוביים?‬
‫◦ הבעיה אינה חסומה‪.‬‬
‫◦ נוכל להגדיל את 𝑙𝑥 ככל שנרצה בלי להפר אף אילוץ‪.‬‬
‫‪54‬‬
‫האם האלגוריתם יכול להתקע?‬
‫‪ ‬ראינו שהעדכון בערך של הפתרון המתאים‬
‫לצורת ה‪ slack-‬הינו 𝑗𝑘𝑎‪. 𝑣 ′ = 𝑣 + 𝑐𝑗 𝑏𝑘 /‬‬
‫‪ ‬אם ‪ ,𝑏𝑘 = 0‬הצעד לא יגדיל את ערך הפתרון‪.‬‬
‫‪ ‬לכן‪ ,‬ייתכן שנכנס ללולאה בה האלג' מתקדם‬
‫במעגל בין מספר פתרונות בעלי אותו הערך‪.‬‬
‫‪55‬‬
‫האם האלגוריתם יכול להתקע? (המשך)‬
‫‪ ‬טענה‪ :‬אם בכל צעד נבחר את המשתנה הלא‬
‫בסיסי בעל האינדקס הנמוך ביותר שניתן‪,‬‬
‫האלג' לא יחזור על אותו פתרון פעמיים‪.‬‬
‫◦ כלומר‪ ,‬בכל צעד נבחר את המשתנה הראשון‬
‫בפונקציית המטרה שהמקדם שלו חיובי‪.‬‬
‫‪ ‬לא נוכיח את הטענה‪.‬‬
‫‪56‬‬
‫סיכום האלגוריתם‬
‫‪ ‬אלגוריתם סימפלקס‪:‬‬
‫◦ מתחיל במציאת צורת ‪ slack‬המתאימה לפתרון‬
‫אפשרי‪.‬‬
‫◦ מבצע סדרת צעדי פיבוט המשנים את הפתרון‪ .‬כל‬
‫צעד מוביל לפתרון שערכו גדול או שווה לערך‬
‫הפתרון הקודם‪.‬‬
‫◦ ניתן לבצע את האלגוריתם כך שלא יחזור על פתרון‬
‫שכבר היינו בו‪.‬‬
‫‪57‬‬
‫זמן ריצה – פיבוט‬
‫‪ ‬במהלך צעד פיבוט‪ ,‬אנו מבצעים‪:‬‬
‫◦‬
‫◦‬
‫◦‬
‫◦‬
‫𝑛 𝑂‬
‫בחירת משתנה לא בסיסי 𝑙𝑥‪.‬‬
‫מציאת המשתנה הבסיסי המתאים 𝑘𝑥‪𝑂 𝑚 .‬‬
‫החלפה בין 𝑘𝑥 ‪ 𝑥𝑙 ,‬באילוץ המתאים ל‪𝑂 𝑛 .𝑥𝑘 -‬‬
‫החלפת 𝑙𝑥 בשאר האילוצים ובפונקציית המטרה‪.‬‬
‫𝑚𝑛 𝑂‬
‫‪ ‬סה"כ‪ ,‬זמן הריצה של צעד הינו‬
‫𝑚𝑛 𝑂‬
‫‪58‬‬
‫כמה צעדי פיבוט האלגוריתם יבצע?‬
‫‪ ‬כמה צורות ‪ slack‬שקולות יכולות להיות לבעיה?‬
‫◦ כל צורת ‪ slack‬מכילה 𝑛 משתנים לא בסיסיים ו‪𝑚-‬‬
‫משתנים בסיסיים‪.‬‬
‫◦ חסם עליון טריוויאלי הוא‬
‫𝑛‪𝑚+‬‬
‫𝑛‪< 2𝑚+‬‬
‫𝑚‬
‫‪59‬‬
‫מספר הדרכים לבחור את‬
‫קבוצת המשתנים הבסיסיים‬
‫של צורת ה‪.slack-‬‬
‫זמן ריצה – סימפלקס‬
‫‪ ‬זמן ריצה‪:‬‬
‫𝑚𝑛 𝑂‬
‫◦ סיבוכיות צעד פיבוט‪:‬‬
‫◦ מספר הצעדים שהאלג' מבצע הינו‬
‫◦ סה"כ‪𝑚+𝑛 :‬‬
‫‪𝑂 𝑛𝑚 ⋅ 2‬‬
‫‪60‬‬
‫𝑛‪𝑂 2𝑚+‬‬
‫זהו חסם עליון‪ .‬האם יש מקרים בהם מספר הצעדים‬
‫מעריכי?‬
‫התשובה תלויה בכלל בחירת המשתנה הנכנס לבסיס ‪-‬‬
‫כלל הפיבוט‪.‬‬
‫לכללים רבים הראו זמן מעריכי‬
‫הסיבוכיות של בעיית ‪LP‬‬
‫‪ ‬שיטת הסימפלקס לפתרון בעיית ‪LP‬‬
‫◦ מעריכית עבור כללי פיבוט רבים‬
‫◦ לא הוכחה כפולינומיאלית לשום כלל‬
‫◦ יעילה מאוד באופן מעשי‬
‫‪ ‬האם קיים אלגוריתם פולינומיאלי כלשהו‬
‫לבעיית ‪ ( ?LP‬כלומר‪ :‬האם ‪ LP‬היא ‪-NP‬שלמה?)‬
‫‪ ‬בעייה פתוחה מרכזית ‪ -‬עד "הספוטניק של‬
‫‪"1979‬‬
‫‪61‬‬
The New York Times, November 7, 1979
Continued on next slide.
Source: Andy Mirzayan, York Univ.
‫עוד קצת היסטוריה‬
‫‪ ‬שיטת האליפסואיד‪:‬‬
‫◦ התגלתה ב‪ 1979-‬על ידי ‪Leonid Khachiyan‬‬
‫◦ פולינומיאלית‪ ,‬אך בפועל מאוד לא יעילה‪.‬‬
‫‪ ‬שיטת ‪Interior point‬‬
‫◦ הוצעה ב‪ 1984-‬ע"י ‪Narendra Karmarkar‬‬
‫◦ פולינומיאלית ויעילה‬
‫‪ ‬עדיין תחום מחקר תוסס‬
‫‪64‬‬
‫עדיין לא סיימנו עם סימפלקס‪...‬‬
‫‪ ‬נראה בשיעור הבא‪:‬‬
‫◦ כיצד למצוא צורת ‪ slack‬אפשרית התחלתית‪.‬‬
‫◦ כיצד להוכיח את נכונות האלגוריתם‪.‬‬
‫‪65‬‬