במדריך הזה מוצגים שימושים אפשריים במאפייני מעבר. הוא ילמד אתכם איך ליצור מודלים של תרחישים מהעולם האמיתי בשתי דוגמאות: שילוב זמן לחניית הרכב במסלולים שעברו אופטימיזציה, והבטחה שכל מסלול יסתיים בביקור במיקום ספציפי.
לפני שמתחילים
מאפייני מעבר משמשים להוספת עלויות ועיכובים ספציפיים למודל למעברים מסוימים במסלולים שעברו אופטימיזציה. העלויות והעיכובים האלה מתווספים למשך המעבר ולעלויות שמחושבות מנתוני המפה על סמך הפרמטרים של הרכב שבו משתמשים.
מעבר הוא קטע במסלול שמחבר בין מיקום אחד למיקום הבא.
מיקום מתייחס לכל אחת מהנקודות הבאות במסלול של הרכב:
- נקודת ההתחלה של המסלול.
- תחנה שבה מתבצע איסוף או משלוח.
- נקודת הסיום של המסלול.
כדי להגדיר את כל מאפייני המעבר של המודל, מוסיפים אותם לרשימה ShipmentModel.transition_attributes.
כל רכיב ברשימה מגדיר קבוצה אחת של מאפייני מעבר, והוא מותאם למעברים במסלולים באמצעות תגים במיקום ההתחלה ובמיקום הסיום של המעבר. מידע נוסף על מאפייני מעבר מופיע במאמרי העזרה של TransitionAttributes.
הדגימו תרחישים מהעולם האמיתי
בקטע הזה מוצגות שתי דוגמאות קטנות להטמעה של אילוצים עסקיים בעולם האמיתי באמצעות מאפייני מעבר.
הזמנת מקום חנייה
בתרחיש הזה, הנהג צריך לחנות את הרכב לפני שהוא יכול להגיע למיקום א'. מיקום ב' נמצא בקרבת מקום, והנהג יכול להשתמש באותו מקום חנייה בשני הביקורים. אם הנהג מבקר ב-B מיד אחרי A, הוא חוסך זמן כי הוא לא צריך לצאת ממקום החנייה ולחנות את הרכב שוב. ב-Route Optimization API, אתם יכולים להשתמש במאפייני מעבר כדי להוסיף זמן לחניית הרכב רק כשהנהג עובר ממקום חנייה אחד למקום חנייה אחר.
כשיוצרים מודל של זמן החנייה בנפרד ממשך הביקורים, אפשר לקצר את המסלולים שבהם הביקורים שמשתמשים באותו חניון מקובצים יחד. כך המודל יהיה מדויק יותר, וגם תגרמו לכלי האופטימיזציה להעדיף מסלולים שבהם הביקורים מקובצים.
כדי לעשות את זה בבקשה ל-Route Optimization API, פועלים לפי השלבים הבאים:
משתמשים ב-
VisitRequest.durationרק למשך הזמן שנדרש לביקור. לדוגמה, כדי למסור את החבילה ולהחתים את הלקוח.לכל מקום חנייה נפרד שמופיע במודל, צריך להשתמש בתג חדש שלא משמש לשום דבר אחר במודל, לדוגמה
PARKING_123.צריך להוסיף את התג הזה אל:
VisitRequest.tagsבכל בקשות הביקור שבהן משתמשים במקום החנייה הזה.Vehicle.start_tagsאם הרכב מתחיל את המסלול שלו במקום החנייה הזה.Vehicle.end_tagsאם הרכב מתחיל או מסיים את המסלול שלו במקום החנייה הזה.
לכל תג חנייה חדש, מוסיפים רשומה ל-
ShipmentModel.transition_attributesשמוסיפה עיכוב לחנייה כשמגיעים ממקום חנייה אחר. כדי לעשות את זה:מגדירים את
TransitionAttributes.excluded_src_tagואתTransitionAttributes.dst_tagלערךPARKING_123.מגדירים את
TransitionAttributes.delayלזמן שנדרש כדי להחנות את הרכב.
לדוגמה, אם התג של המיקום הוא
PARKING_123ולוקח 150 שניות להחנות את הרכב, מוסיפים את הרשומה הבאה ל-ShipmentModel.transition_attributes:{ "excluded_src_tag": "PARKING_123", "dst_tag": "PARKING_123", "delay": "150s" }
ניקוי חובה בסוף המסלול
בתרחיש הזה, צריך לנקות את הרכב בסוף המסלול, עם האילוצים הנוספים הבאים:
- הניקוי מתבצע במתקן ניקוי מיוחד לפני שהרכב חוזר למחסן הרכבים. המסלול שעבר אופטימיזציה משתמש במתקן הניקוי הטוב ביותר על סמך המיקום שלו ומיקומי האיסוף והמשלוח של הרכב.
- אחרי הניקוי, אסור לבצע איסופים או משלוחים נוספים ברכב.
- הזמן שלוקח לנסוע לשם ולנקות את הרכב נחשב כחלק משעות העבודה של הנהג, והוא חייב להתאים למשך הזמן המקסימלי של המסלול.
כדי למדל את הדרישה הזו, מאפשרים רק מסלולים ריקים או מסלולים שהביקור האחרון בהם הוא במתקן ניקוי. ב-Route Optimization API, עושים את זה על ידי איסור על מעברים לציון הדרך הסופי של המסלול מכל מיקום, חוץ ממתקן הניקוי או מנקודת ההתחלה של המסלול:
- בוחרים שני תגים חדשים שלא נמצאים בשימוש במודל, לדוגמה
CLEANEDו-ROUTE_END. הראשון מיועד למיקומים שבהם הרכב נקי או הופך לנקי, והשני מיועד לסוף המסלול. - לכל רכב, מוסיפים משלוח חדש למסירה בלבד שמייצג את הביקור במתקן הניקוי, עם המאפיינים הבאים:
- כל מיקום של מתקן ניקוי צריך להיות מיוצג כבקשת ביקור למסירה של המשלוח הזה.
- מוסיפים את
CLEANEDאלVisitRequest.tagsשל כל בקשת ביקור של משלוח מתקן הניקוי. הוא מציין שרכב שיוצא מהמיקום הזה נקי. כדי שהרכב ייחשב כ"לא נקי" כשהוא עוזב את המיקומים האחרים, אסור להשתמש בתג הזה בבקשות הביקור האחרות במודל. - כדי לאפשר לאופטימיזציה לדלג על המשלוח הזה כשהרכב לא בשימוש, מגדירים את הערך של
penalty_costלמספר קטן.
לכל רכב, מוסיפים את
CLEANEDאלVehicle.start_tags. המאפיין הזה משמש לסימון הרכב כנקי לפני שהוא מבצע איסופים או משלוחים, בהנחה שהוא נוקה בסוף יום העסקים הקודם, ומאפשר לו לעבור מנקודת ציון הדרך ההתחלתית ישירות לנקודת ציון הדרך הסופית. גם אם מסלולים כאלה לא קורים בפועל, האפשרות הזו עוזרת לאופטימיזציה לחפש מסלולים אופטימליים בצורה יעילה יותר.לכל רכב, מוסיפים את
ROUTE_ENDאלVehicle.end_tags.מוסיפים רשומה חדשה ל-
ShipmentModel.transition_attributesשאוסרת על כלי רכב להגיע לנקודת הציון הסופית אם הם לא נקיים, עם המאפיינים הבאים:מגדירים את
TransitionAttributes.excluded_src_tagלערךCLEANED.מגדירים את
TransitionAttributes.dst_tagלערךROUTE_END.מגדירים ערך גדול ל-
TransitionAttributes.delay. אם מגדירים עיכוב ארוך יותר ממשך המסלול המקסימלי, למעשה אוסרים על הכלי לאופטימיזציה להשתמש במעבר הזה במסלול.
לדוגמה, אם קנה המידה של הזמן במודל הוא יום עבודה אחד, אפשר להשתמש בעיכוב של 24 שעות (86,400 שניות) כדי לאסור על המעבר לסוף המסלול מכל מקום חוץ ממתקן הניקוי ומתחילת המסלול:
{ "excluded_src_tag": "CLEANED", "dst_tag": "ROUTE_END", "delay": "86400s" }
איך לבחור בין עיכובים ועלויות
הבחירה בין עיכובים לעלויות תלויה באופי של הלוגיקה העסקית והאילוצים שהוטמעו. ההגדרה
TransitionAttributes.delay
היא הכי טובה להטמעת אילוצים קשיחים או כדי לבטא פשרה מבחינת
הזמן שהושקע.
TransitionAttributes.cost
מתאים יותר כשמיישמים העדפות גמישות או פשרות שמתבטאות בעלות נוספת. אפשר לשלב עיכובים ועלויות באופן שרירותי כשמדובר גם בזמן וגם בעלות.
בדוגמה של ניקוי הרכב, משתמשים בעיכוב ארוך מאוד כי ניקוי הרכב בסוף המסלול הוא דרישה קשיחה, והעיכוב הארוך מונע מהכלי לאופטימיזציה להתעלם מהדרישה. אם מגדירים רק עלות, האופטימיזציה יכולה לבחור לדלג על הניקוי אם היא מוצאת דרך לפצות על העלות במקום אחר, למשל על ידי מסירת יותר משלוחים בזמן שנחסך כי לא ניקו את הרכב.
בדוגמה של החנייה, משתמשים בעיכוב קצר שמתאים לזמן הנוסף שנדרש כדי להחנות את הרכב. אפשר גם להשתמש בעלויות בשילוב עם עיכובים, אם הנהג עוצר בחניון בתשלום.
איך מוסיפים מאפיין מעבר שתואם לכל בקשות הביקור
בדוגמאות שלמעלה נעשה שימוש במאפייני מעבר שתואמים למיקומים שיש להם תג מסוים, או למיקומים שאין להם את התג. אבל מה אם אתם צריכים להוסיף מאפייני מעבר שחלים על כל המעברים?
אי אפשר פשוט להשמיט את התגים, כי כל הודעת TransitionAttributes חייבת לכלול את אחד מהתגים TransitionAttributes.src_tag ו-TransitionAttributes.excluded_src_tag ואת אחד מהתגים TransitionAttributes.dst_tag ו-TransitionAttributes.excluded_dst_tag.
עם זאת, אפשר להתאים את כל התגים על ידי הגדרת TransitionAttributes.excluded_src_tag או TransitionAttributes.excluded_dst_tag לתג שלא נמצא בשימוש במודל. הפעולה הזו תתאים לכל המיקומים שאין להם את התג הזה, אבל מכיוון שבחרתם בכוונה תג שלא נמצא בשימוש באף מיקום, מאפייני המעבר האלה יתאימו לכל המיקומים.