היוריסטיקה קבילה

במדעי המחשב, במיוחד באלגוריתמים הקשורים לחיפוש בעץ או בגרף, פונקציה היוריסטית נקראת פונקציה קבילה אם היא לעולם לא מעריכה יתר על המידה את עלות ההגעה ליעד, כלומר עלות ההגעה למטרה שהיא מעריכה אינה גבוהה מהעלות הנמוכה ביותר האפשרית להגעה מהנקודה הנוכחית ליעד<ref></ref>.

== אלגוריתמים לחיפוש ==
היוריסטיקה קבילה משמשת להערכת עלות ההגעה למצב היעד באלגוריתם חיפוש מיודע. על מנת שפונקציה היוריסטית תהיה קבילה עבור בעיית חיפוש מסוימת, העלות המשוערת חייבת להיות תמיד נמוכה או שווה לעלות בפועל של הגעה למצב היעד. אלגוריתם החיפוש משתמש בהיוריסטיקה כדי למצוא הערכה של הנתיב המיטבי למצב היעד מהצומת הנוכחי. לדוגמה, ב- אלגוריתם החיפוש A*, פונקציית העלות היא:

<math>f(n) = g(n) + h(n)</math>

כאשר

: <math>n</math> = הצומת הנוכחי.
: <math>f(n)</math> = פונקציית העלות.
: <math>g(n)</math> = עלות המסלול מצומת ההתחלתי לצומת הנוכחי.
: <math>h(n)</math> = העלות משוערת מהצומת הנוכחי ליעד.

<math>h(n)</math> היא בעצם הפונקציה ההיוריסטית. אם ההיוריסטיקה בלתי קבילה, אלגוריתם A* לא בהכרח יחזיר את הפתרון המיטבי לבעיית החיפוש, עקב הערכת יתר של <math>f(n)</math> .

== ניסוח פורמלי ==

: <math>n</math> הוא צומת
: <math>h</math> היא פונקציה היוריסטית
: <math>h(n)</math> הוא ההערכה של <math>h</math> בנוגע לעלות הגעה למטרה מ-<math>n</math>
: <math>h^*(n)</math> הוא העלות המיטבית (מינימלית) של הגעה הגעה למטרה מ-<math>n</math>

: <math>h(n)</math> תקרא קבילה אמ"ם, <math>\forall n</math>

:: <math>h(n) \leq h^*(n)</math>
:הפונקציה <math>h^*</math> היא ההיוריסטיקה המיטבית, מאחר שהיא תמיד מעריכה את המחיר של צומת מסוים באופן מדויק, ולכן באלגוריתם A*, שימוש בה יוביל לפיתוח של כמות מינימלית של צמתים<ref name=":0"></ref>. לכן, פונקציות קבילות שקרובות יותר לפונקציה <math>h^*</math> עדיפות. נאמר שפונקציה היוריסטית קבילה <math>h_2</math> יותר מיודעת מפונקציה היוריסטית וקבילה <math>h_1</math> אמ"ם, <math>\forall n</math>
:::<math>h_1(n) \leq h_2(n) \ \left[\ \leq h^*(n) \ \right]</math>

== דוגמאות ==
[[חידת ה-15]]
שתי דוגמאות שונות להיוריסטיקה קבילה עבור בעיית פתירת חידת ה-15:
*מרחק המינג
*מרחק מנהטן

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

מרחק מנהטן של פאזל מסוים במצב <math>n</math> מוגדר להיות:

:<math>h(n)=\sum_\text{all tiles} \mathit{distance}(\text{tile, correct position})</math>
: כאשר הפונקציה <math>\mathit{distance}</math> היא מרחק מנהטן בין שתי הלוחיות.

לדוגמה, הפאזל שמוצג למטה, בו השחקן מעוניין להזיז כל לוחית כך שהמספרים יהיו מסודרים משמאל לימין ומלמעלה למטה. מרחק מנהטן הוא היוריסטיקה קבילה במקרה זה מכיוון שיש להעביר כל לוחית לפחות את מספר המקומות שבינה לבין מיקומה הנכון.
{| class="wikitable" style="text-align:right"
|8<sub>1</sub>
|3<sub>0</sub>
|6<sub>1</sub>
|4<sub>3</sub>
|-
|14<sub>4</sub>
|9<sub>3</sub>
|12<sub>3</sub>
|7<sub>2</sub>
|-
|5<sub>4</sub>
|1<sub>4</sub>
|13<sub>2</sub>
|15<sub>3</sub>
|-
|__
|11<sub>1</sub>
|10<sub>1</sub>
|2<sub>4</sub>
|}
מרחק מנהטן של כל לוח ממקומו הנכון מצוין בכתיב תחתי. מרחק מנהטן הכולל של הפאזל המוצג הוא:

:<math>h(n)=3+1+0+1+2+3+3+4+3+2+4+4+4+1+1=36</math>

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

לדוגמה, עבור חידת ה-15 שראינו מקודם, נוכל להגדיר שלוש בעיות פשוטות יותר: האילוץ המקורי שמגדיר את המשחק הוא "לוחית יכולה לנוע ממיקום א' למיקום ב' אם מיקום א' צמוד למיקום ב', וגם מיקום ב' ריק".

על ידי הפחתה של אחד או שני האילוצים, נגיע לשלוש הבעיות הבאות:

# לוחית יכולה לנוע ממיקום א' למיקום ב' אם מיקום א' צמוד למיקום ב'.
# לוחית יכולה לנוע ממיקום א' למיקום ב' אם מיקום ב' ריק.
# לוחית יכולה לנוע ממיקום א' למיקום ב'.

מבעיה אחת נובע השימוש בפונקציה ההיוריסטית מרחק מנהטן, שמתעלמת מלוחיות בדרך. מבעיה שתיים נובע השימוש בפונקציה ההיוריסטית של גשניג<ref name=":0" />. מבעיה שלוש נובע השימוש בפונקציה ההיוריסטית מרחק המינג. הפונקציות ההיוריסטיות שנובעות משיטה זו הן לא בהכרח פונקציות קבילות: יש להוכיח זאת.

חישוב ואכסון פתרונות מדויקים לבעיות משנה גם יכול לשמש כדרך לבנות פונקציה היוריסטית: הרעיון הוא לחשב מראש את הפתרונות עבור כל התבניות ההתחלתיות. לדוגמה, עבור חידת ה-15, נוכל לחשב את כמות המהלכים המיטבית לפתרון הבעיה עבור כל המיקומים ההתחלתיים האפשריים של הלוחיות 1,2,3,4,5,9,13 ושל המקום הריק (אנחנו לא מניחים שהתאים האחרים ריקים - עדיין צריך לפעול על פי הכללים של לוח מלא, אנחנו פשוט לא מעוניינים בסידור של הלוחיות האחרות)
{| class="wikitable" style="text-align:right"
|4
|3
|2
|1
|-
|
|
|
|5
|-
|
|
|
|9
|-
|__
|
|
|13
|}
כדי לחשב את ערך הפונקציה ההיוריסטית של מצב מסוים, נשתמש בכמות המהלכים הדרושה להביא התבנית המתאימה של הלוחיות שבחרנו למיקומן הנכון (שחישבנו מראש). זוהי פונקציה קבילה, מאחר שאנחנו מחשבים את כמות המהלכים המינימלית שמביאה את קבוצת הלוחיות שבחרנו לאחד מהמצבים מתוך קבוצת המצבים שבהן הלוחיות שבחרנו נמצאות במקום הנכון. מאחר שהסידור המלא של כל הלוחיות בלוח גם נמצא בקבוצה זו, אנחנו יודעים שכמות ההזזות שנדרש באמת לבצע, גדולה-שווה לכמות שחישבנו.

ניתן לבנות פונקציה קבילה מיודעת יותר על ידי לקיחת מקסימום של ערך הפונקציה מבין מספר מאגרי תבניות שונים.

ניתן גם לבנות פונקציה קבילה מיודעת עוד יותר בעזרת לקיחת סכום של ערכי הפונקציה ממספר מאגרי תבניות "זרים"<ref></ref>.

== שימוש למציאת פתרון מיטבי ==
אלגוריתמי חיפוש (למשל אלגוריתם A*) יכולים להשתמש בהיוריסטיקה קבילה על מנת למצוא פתרון מיטבי. דוגמה ידועה וקלה להבנה היא אלגוריתם חיפוש לרוחב. במקרה זה, פונקציית ההערכה ההיוריסטית <math>h(n)</math> שווה ל-<math>0</math> עבור כל צומת <math>n</math>. ברור שהפונקציה ההיוריסטית נמוכה מהעלות בפועל. ההיוריסטיקה הזו תגרום לאלגוריתם לבחון את כל הנתיבים האפשריים ובסופו של דבר למצוא את הפתרון המיטבי (כלומר, הדרך הקצרה ביותר ליעד).

עבור אלגוריתם A*, נציג דוגמה<ref></ref> שתדגים מדוע קבילות יכולה להבטיח מציאת פתרון מיטבי במהלך החיפוש:

נניח שיש לנו עלויות כפי שמופיעים בתמונה, הערכים בתוך הצמתים הם ערכי הפונקציה ההיוריסטית, והערכים על יד הקשתות הם המחיר של מעבר בקשת.

440x440 פיקסלים

ברור שנתחיל לבקר בצומת האמצעי העליון, שכן העלות הכוללת הצפויה, כלומר <math>f(n)</math>, הוא <math>10 + 0 = 10</math>. ואז הצמתים המועמדים הם צומת היעד, עם <math>f(n)</math> ששווה ל-<math>10+100+0=110</math>, והצומת התחתונה. אנחנו נבחר את הצמתים התחתונים בזה אחר זה, ורק לבסוף ביעד, עם העלות המעודכנת, שכן לכולם יש <math>f(n)</math> נמוך מה-<math>f(n)</math> של היעד, בהתחשב בדרך הנוכחית (העליונה). כלומר מאחר שה-<math>f(n)</math> שלהם הוא <math>100, 101, 102, 102</math>, אז אף על פי שצומת היעד היה מועמד, לא בחרנו בו כי עדיין היו דרכים טובות יותר. בדרך זו, היוריסטיקה קבילה יכולה להבטיח מיטביות.

עם זאת, אף על פי שהיוריסיטקה קבילה יכולה להבטיח מיטביות, השימוש בה לא בהכרח יעיל.

== הערות שוליים ==

קטגוריה:בינה מלאכותית
קטגוריה:היוריסטיקה