ממציא |
הרולד קון ![]() |
---|---|
![]() ![]() |
האלגוריתם ההונגרי הוא אלגוריתם אופטימיזציה שפותר את בעיית ההשמה בזמן פולינומי. הוא פותח ופורסם ב-1955 על ידי הרולד קון(אנ'), שנתן לאלגוריתם את השם "השיטה ההונגרית" משום שהוא התבסס במידה רבה על עבודה קודמת של שני מתמטיקאים הונגריים: דנס קוניג (אנ') ויאנו איגרווארי(אנ').[1][2]
המתמטיקאי ג'יימס מאנקרס (אנ') שבחן את האלגוריתם בשנת 1957, מצא שרמת הסיבוכיות שלו היא פולינומית.[3] האלגוריתם ידוע מאז גם בשם אלגוריתם קון-מאנקרס או אלגוריתם ההשמה של מאנקרס. בשנת 2006 התגלה כי קרל גוסטב יעקובי פתר את בעיית ההשמה כבר במאה ה-19, והפתרון פורסם לאחר מותו ב-1890 בלטינית.[4]
בדוגמה פשוטה זו ישנם שלושה אחים: אפרים, מאיר וישראל. אחד מהם צריך לנקות את חדר השינה, שני לטאטא את החצר ושלישי לשטוף את החלונות. כל אחד מהם דורש תשלום שונה עבור כל משימה. המטרה היא למצוא את השיבוץ שייתן את העלות הנמוכה ביותר לביצוע שלוש המשימות. את הבעיה ניתן לייצג במטריצה של עלויות העובדים לביצוע המשימות:
לנקות חדר | לטאטא חצר | לשטוף חלונות | |
---|---|---|---|
אפרים | 2 | 3 | 3 |
מאיר | 3 | 2 | 3 |
ישראל | 3 | 3 | 2 |
יישום האלגוריתם ההונגרי על המטריצה ייתן את העלות המינימלית שהיא 6, עלות זו מושגת על ידי שיבוצו של אפרים לניקוי החדר, של מאיר לטאטוא החצר ושל ישראל לשטיפת החלונות.
ישנן שתי דרכים לנסח את הבעיה: כמטריצה וכגרף דו-צדדי (bipartite graph).
בניסוח כמטריצה אנו מקבלים מטריצת לא שלילית, כאשר האלמנט בשורה ועמודה מייצג את עלות הקצאת משימה לעובד . המטרה היא לשבץ את העובדים למשימות כשלכל משימה משובץ עובד אחד וכל עובד משובץ למשימה אחת, כך שהעלות הכוללת של ביצוע כלל המשימות היא מינימלית. אם המטרה היא למצוא את המשימה שמניבה את העלות המקסימלית, ניתן לעדכן את המטריצה כדי להתאים אותה להגדרה זו על ידי החלפת כל עלות בכל תא עם העלות המקסימלית מכלל התאים פחות העלות בתא.
קל לתאר את האלגוריתם גם באמצעות ניסוח הבעיה כגרף. נגדיר גרף דו-צדדי שלם בו כל קודקוד בקבוצה הראשונה מחובר לקודקוד בקבוצה השנייה עם קודקודי עובדים ו- קודקודי עבודות . לכל קשת בקבוצת הקשתות ישנה עלות לא שלילית של . אנחנו רוצים למצוא שידוך עם עלות כוללת מינימלית.
נתונה מטריצה של עובדים ומשימות המכילה את העלויות לשיבוץ עובד למשימה. שלבי האלגוריתם הם:
נתונה מטריצת עלויות שיבוץ של 4 עובדים (j1, j2, j3, j4) ל-4 משימות (m1, m2, m3, m4).
m1 | m2 | m3 | m4 | |
---|---|---|---|---|
j1 | 82 | 83 | 69 | 92 |
j2 | 77 | 37 | 49 | 92 |
j3 | 11 | 69 | 5 | 86 |
j4 | 8 | 9 | 98 | 23 |
מצאו את השיבוץ שיביא את סך העלויות למינימום.
m1 | m2 | m3 | m4 | |
---|---|---|---|---|
j1 | 13 | 14 | 0 | 23 |
j2 | 40 | 0 | 12 | 55 |
j3 | 6 | 64 | 0 | 81 |
j4 | 0 | 1 | 90 | 15 |
אין שיבוץ חד-חד ערכי (למשימה 3 משובצים שני עובדים ואין שיבוץ למשימה 4)
m1 | m2 | m3 | m4 | |
---|---|---|---|---|
j1 | 13 | 14 | 0 | 8 |
j2 | 40 | 0 | 12 | 40 |
j3 | 6 | 64 | 0 | 66 |
j4 | 0 | 1 | 90 | 0 |
אין שיבוץ חד-חד ערכי (עובדים 1 ו-3 משובצים לאותה משימה ללא אפשרות אחרת)
m1 | m2 | m3 | m4 | |
---|---|---|---|---|
j1 | 13 | 14 | 0 | 8 |
j2 | 40 | 0 | 12 | 40 |
*j3 | 6 | 64 | 0 | 66 |
j4 | 0 | 1 | 90 | 0 |
m1 | m2 | *m3 | m4 | |
---|---|---|---|---|
j1 | 13 | 14 | 0 | 8 |
j2 | 40 | 0 | 12 | 40 |
*j3 | 6 | 64 | 0 | 66 |
j4 | 0 | 1 | 90 | 0 |
m1 | m2 | *m3 | m4 | |
---|---|---|---|---|
*j1 | 13 | 14 | 0 | 8 |
j2 | 40 | 0 | 12 | 40 |
*j3 | 6 | 64 | 0 | 66 |
j4 | 0 | 1 | 90 | 0 |
אין יותר עמודות שלהן אפסים בשורות מסומנות.
נסמן את המחיקות בצהוב.
m1 | m2 | *m3 | m4 | |
---|---|---|---|---|
*j1 | 13 | 14 | 0 | 8 |
j2 | 40 | 0 | 12 | 40 |
*j3 | 6 | 64 | 0 | 66 |
j4 | 0 | 1 | 90 | 0 |
את האלמנט המינימלי שלא מכוסה (6), מוסיפים לצמתים ומחסירים מהלא מכוסים:
m1 | m2 | m3 | m4 | |
---|---|---|---|---|
j1 | 7 | 8 | 0 | 2 |
j2 | 40 | 0 | 18 | 40 |
j3 | 0 | 58 | 0 | 60 |
j4 | 0 | 1 | 96 | 0 |
כעת ישנו שיבוץ חד-חד ערכי ולכן אין צורך לחזור על שלב 3. השיבוץ והעלויות (מהמטריצה ההתחלתית):
סך העלות: 140