בניית מודל של לוגיקה עסקית באמצעות מאפייני מעבר

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

לפני שמתחילים

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

מעבר הוא קטע המסלול שמקשר בין מיקום אחד למיקום הבא.

מיקום מתייחס לאחת מהנקודות הבאות במסלול של רכב:

  • נקודת ההתחלה של המסלול.
  • עצירה שבה מתבצע איסוף או משלוח.
  • נקודת הסיום של המסלול.

כדי להגדיר את כל מאפייני המעבר של המודל, מוסיפים אותם לרשימה ShipmentModel.transition_attributes. כל רכיב ברשימה מגדיר קבוצה אחת של מאפייני מעבר, והוא מותאם למעברים במסלולים באמצעות תגים במיקום ההתחלה ובמיקום הסיום של המעבר. מידע נוסף על מאפייני מעבר מופיע במאמרי העזרה של TransitionAttributes.

הדגימו תרחישים מהעולם האמיתי

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

שיריון זמן לחנייה

במקרה כזה, הנהג צריך לחנות את הרכב לפני שהוא יכול להגיע למיקום א'. מיקום ב' נמצא בקרבת מקום, והנהג יכול להשתמש באותו מקום חנייה בשני הביקורים. אם הנהג מגיע לנקודה B מיד אחרי נקודה A, הוא חוסך זמן כי הוא לא צריך לצאת ממקום החנייה ולהחנות את הרכב שוב. ב-Route Optimization API, אתם יכולים להשתמש במאפייני מעבר כדי להוסיף זמן לחניית הרכב רק כשהנהג עובר ממקום חנייה אחד למקום חנייה אחר.

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

כדי לעשות את זה בבקשה ל-Route Optimization API, פועלים לפי השלבים הבאים:

  1. השתמשו ב-VisitRequest.duration רק למשך הזמן שנדרש לביקור. לדוגמה, כדי למסור את החבילה ולהחתים את הלקוח.

  2. לכל מקום חנייה שונה שמשמש במודל, צריך להשתמש בתג חדש שלא משמש לשום דבר אחר במודל, לדוגמה PARKING_123.

  3. מוסיפים את התג הזה למקומות הבאים:

    1. VisitRequest.tags בכל בקשות הביקור שבהן משתמשים במקום החנייה הזה.

    2. ‫Vehicle.start_tags אם הרכב מתחיל את המסלול שלו במקום החנייה הזה.

    3. ‫Vehicle.end_tags אם הרכב מתחיל את המסלול ומסיים אותו במקום החנייה הזה.

  4. לכל תג חנייה חדש, מוסיפים רשומה אל ShipmentModel.transition_attributes שמוסיפה עיכוב לחנייה כשמגיעים ממקום חנייה אחר. כדי לעשות את זה:

    1. מגדירים את TransitionAttributes.excluded_src_tag ואת TransitionAttributes.dst_tag לערך PARKING_123.

    2. מגדירים את TransitionAttributes.delay לזמן שנדרש כדי להחנות את הרכב.

    לדוגמה, אם התג של מיקום הוא PARKING_123 ולוקח 150 שניות להחנות את הרכב, מוסיפים את הרשומה הבאה ל-ShipmentModel.transition_attributes:

    {
      "excluded_src_tag": "PARKING_123",
      "dst_tag": "PARKING_123",
      "delay": "150s"
    }
    

ניקוי חובה בסוף המסלול

בתרחיש הזה, צריך לנקות את הרכב בסוף המסלול, עם האילוצים הנוספים הבאים:

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

כדי למדל את הדרישה הזו, מאפשרים רק מסלולים ריקים או מסלולים שהביקור האחרון בהם הוא במתקן ניקוי. ב-Route Optimization API, אפשר לעשות את זה על ידי איסור מעברים לציון הדרך האחרון במסלול מכל מיקום, למעט ממתק הניקוי או מנקודת ההתחלה של המסלול:

  1. בוחרים שני תגים חדשים שלא נעשה בהם שימוש בשום מקום במודל, למשל CLEANED ו-ROUTE_END. האפשרות הראשונה היא למקומות שבהם הרכב נקי או הופך לנקי, והאפשרות השנייה היא לסוף המסלול.
  2. לכל רכב, מוסיפים משלוח חדש שכולל רק מסירה ומייצג את הביקור במתקן הניקוי, עם המאפיינים הבאים:
    1. כל מיקום של מתקן ניקוי צריך להיות מיוצג כבקשה לביקור לצורך מסירת המשלוח.
    2. מוסיפים את CLEANED לשדה VisitRequest.tags בכל בקשת ביקור של משלוח למתקן הניקוי. הוא מציין שכלי רכב שיוצא מהמיקום הזה הוא נקי. בקשות אחרות לביקור במודל לא צריכות להשתמש בתג הזה, כדי שהרכב ייחשב כ"לא נקי" כשהוא עוזב אותן.
    3. כדי לאפשר לאופטימיזציה לדלג על המשלוח הזה כשהרכב לא בשימוש, מגדירים את הערך של penalty_cost למספר קטן.
  3. לכל רכב, מוסיפים את CLEANED אל Vehicle.start_tags. המאפיין הזה משמש כדי לסמן את הרכב כנקי לפני שהוא מבצע איסופים או משלוחים, בהנחה שהוא נוקה בסוף יום העבודה הקודם, ולאפשר לו לעבור מנקודת הציון ההתחלתית ישירות לנקודת הציון הסופית. גם אם מסלולים כאלה לא קורים בפועל, ההגדרה הזו עוזרת לכלי האופטימיזציה לחפש מסלולים אופטימליים בצורה יעילה יותר.

  4. לכל רכב, מוסיפים ROUTE_END ל-Vehicle.end_tags.

  5. מוסיפים רשומה חדשה ל-ShipmentModel.transition_attributes שאוסרת על כלי רכב להגיע לנקודת הציון הסופית כשהם לא נקיים, עם המאפיינים הבאים:

    1. מגדירים את TransitionAttributes.excluded_src_tag לערך CLEANED.

    2. מגדירים את TransitionAttributes.dst_tag לערך ROUTE_END.

    3. מגדירים ערך גדול ל-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 לתג שלא נמצא בשימוש במודל. הפעולה הזו תתאים לכל המיקומים שלא כוללים את התג הזה, אבל מכיוון שבחרתם בכוונה תג שלא נמצא בשימוש באף מיקום, מאפייני המעבר האלה יתאימו לכל המיקומים.

קריאה נוספת