חלונות זמן

חלונות הזמן מופיעים ב-`ShipmentModel`, ב-`Shipment` באובייקטים של איסופים ומסירות וב-`Vehicle`.

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

חלונות זמן יכולים לתמוך ביעדים כמו:

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

מבנה

כפי שמוצג בדיאגרמה, חלונות הזמן מובנים באופן הבא:

רשימת משימות ב-Essentials

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

מאפיינים

בטבלה הבאה מתוארים המאפיינים של חלון הזמן הגלובלי.

נכס פורמט תיאור
globalStartTime Timestamp השעה המוקדמת ביותר של אירוע כלשהו.
globalEndTime Timestamp השעה המאוחרת ביותר של אירוע כלשהו.

בטבלה הבאה מתוארים מאפייני חלון הזמן במשלוחים ובכלי רכב.

הורה נכס פורמט תיאור
Shipment.pickups timeWindows מערך של סוגי הודעות TimeWindow. מציין את מרווחי הזמן לאיסוף משלוח.
Shipment.deliveries timeWindows מציין את מרווחי הזמן למשלוח.
Vehicle startTimeWindows מציינים את שעת ההתחלה של לוח הזמנים להפעלת הרכב.
endTimeWindows מציין את שעת הסיום של לוח הזמנים להפעלת הרכב.

בטבלה הבאה מתוארים המאפיינים של סוג ההודעה TimeWindow.

נכס פורמט תיאור
startTime מחרוזת (פורמט RFC3339 UTC ‏'זולו') תחילת חלון הזמן.
endTime מחרוזת (פורמט RFC3339 UTC ‏'זולו') סיום חלון הזמן.

דוגמאות

בקטע הזה מופיעות שלוש דוגמאות:

דוגמאות קוד

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

חלונות זמן גלובליים

בדוגמת הקוד הבאה מוצג המבנה של חלונות הזמן הגלובליים:

{
  "model": {
    "globalStartTime": "YYYY-MM-DDTHH:MM:SSZ",
    "globalEndTime": "YYYY-MM-DDTHH:MM:SSZ",
    "shipments": [ ... ],
    "vehicles": [ ... ]
  }
}

חלונות זמן לאיסופים ולמשלוחים

דוגמת הקוד הבאה מציגה את המבנה של חלונות הזמן באיסופים ובמשלוחים של משלוח:

{
  "model": {
    "shipments": [
      {
        "pickups": [
          {
            "timeWindows": [
              {
                "startTime": "YYYY-MM-DDTHH:MM:SSZ",
                "endTime": "YYYY-MM-DDTHH:MM:SSZ"
              }
            ]
          }
        ],
        "deliveries": [
          {
            "timeWindows": [
              {
                "startTime": "YYYY-MM-DDTHH:MM:SSZ",
                "endTime": "YYYY-MM-DDTHH:MM:SSZ"
              }
            ]
          }
        ]
      }
    ],
    "vehicles": [ ... ]
  }
}

חלונות זמן של כלי רכב

בדוגמת הקוד הבאה אפשר לראות את המבנה של חלונות הזמן של כלי רכב:

{
  "model": {
    "shipments": [ ... ],
    "vehicles": [
      {
        "startTimeWindows": [
          {
            "startTime": "YYYY-MM-DDTHH:MM:SSZ",
            "endTime": "YYYY-MM-DDTHH:MM:SSZ"
          }
        ],
        "endTimeWindows": [
          {
            "startTime": "YYYY-MM-DDTHH:MM:SSZ",
            "endTime": "YYYY-MM-DDTHH:MM:SSZ"
          }
        ]
      }
    ]
  }
}

תרחיש לדוגמה

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

בדוגמה הזו, ערכי הנכס בבקשה הם:

הורה נכס ערך תרחיש
ShipmentModel globalStartTime 2023-01-13T07:00:00Z שעת הפתיחה של הפנסיון לכלבים. אי אפשר לבצע איסופים או משלוחים לפני השעה הזו.
ShipmentModel globalEndTime 2023-01-13T19:00:00Z מייצג את שעת הסגירה של הפנסיון לכלבים. כל האיסופים והמשלוחים צריכים להסתיים עד התאריך הזה.
Shipment.pickups timeWindows startTime:
2023-01-13T07:30:00Z
המאפיין מגדיר את חלון הזמן שבו אפשר לאסוף כלב מבית הלקוח. בדוגמה הזו, אמרתם לשני הלקוחות להיות זמינים לאיסוף בין 7:30 ל-9:00.
endTime:
2023-01-13T09:00:00Z
Shipment.deliveries timeWindows startTime:
2023-01-13T17:00:00Z
החלון המקובל להורדת כלב בבית הלקוח. בדוגמה הזו, אמרתם לשני הלקוחות שהכלבים שלהם יוחזרו בין השעות 17:00 ל-18:30.
endTime:
2023-01-13T18:30:00Z
Vehicle startTimeWindows startTime:
2023-01-13T07:00:00Z
endTime:
2023-01-13T07:15:00Z
הגדרת החלון המקובל להפעלת הרכב (משעה 7:00 עד 7:15) ולסיום הנסיעה (משעה 17:00 עד 17:15).
endTimeWindows startTime:
2023-01-13T18:45:00Z
endTime:
2023-01-13T19:00:00Z

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

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

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

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

דוגמה לבקשה

בדוגמה הבאה מוצג המבנה של בקשת optimizeTours שכוללת את ערכי חלונות הזמן של התרחיש לדוגמה.

{
  "model": {
    "globalStartTime": "2023-01-13T07:00:00Z",
    "globalEndTime": "2023-01-13T19:00:00Z",
    "shipments": [
      {
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.8024,
              "longitude": -122.4058
            },
            "timeWindows": [
              {
                "startTime": "2023-01-13T07:30:00Z",
                "endTime": "2023-01-13T09:00:00Z"
              }
            ]
          }
        ],
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.759773,
              "longitude": -122.427063
            },
            "timeWindows": [
              {
                "startTime": "2023-01-13T17:00:00Z",
                "endTime": "2023-01-13T18:30:00Z"
              }
            ]
          }
        ]
      },
      {
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.7359,
              "longitude": -122.5011
            },
            "timeWindows": [
              {
                "startTime": "2023-01-13T07:30:00Z",
                "endTime": "2023-01-13T09:00:00Z"
              }
            ]
          }
        ],
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.759773,
              "longitude": -122.427063
            },
            "timeWindows": [
              {
                "startTime": "2023-01-13T17:00:00Z",
                "endTime": "2023-01-13T18:30:00Z"
              }
            ]
          }
        ]
      }
    ],
    "vehicles": [
      {
        "startLocation": {
          "latitude": 37.759773,
          "longitude": -122.427063
        },
        "endLocation": {
          "latitude": 37.759773,
          "longitude": -122.427063
        },
        "costPerHour": 27,
        "startTimeWindows": [
          {
            "startTime": "2023-01-13T07:00:00Z",
            "endTime": "2023-01-13T07:15:00Z"
          }
        ],
        "endTimeWindows": [
          {
            "startTime": "2023-01-13T18:45:00Z",
            "endTime": "2023-01-13T19:00:00Z"
          }
        ]
      }
    ]
  }
}

חלונות זמן גמישים

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

ההגבלות הבאות חלות על שימוש בחלונות זמן גמישים:

מאפיינים

בטבלה הבאה מתוארים מאפייני האילוצים הגמישים של חלונות הזמן.

שם הנכס פורמט תיאור הנכס
softStartTime חותמת זמן מציין את תחילת חלון הזמן הרך. אם אירוע מתרחש לפני השעה הזו, תהיה עלות.
softEndTime חותמת זמן מציין את סוף חלון הזמן הרך. אם אירוע מתרחש אחרי השעה הזו, תהיה עלות.
costPerHourBeforeSoftStartTime number העלות לשעה שנוצרת כשאירוע מתחיל לפני softStartTime. כשמשתמשים ב-softStartTime, צריך להגדיר את המאפיין הזה. במאמר בנושא מודל עלויות מוסבר איך להטמיע עלויות.
costPerHourAfterSoftEndTime number העלות לשעה שנוספת כשאירוע מסתיים אחרי softEndTime. כשמשתמשים ב-softEndTime, צריך להגדיר את המאפיין הזה. במאמר בנושא מודל עלויות מוסבר איך להטמיע עלויות.

דוגמת קוד

בדוגמה הבאה מוצג המבנה של מאפייני האילוץ הרך של סוג ההודעה TimeWindow:

    {
      "softStartTime": "SOFT_START_TIME",
      "softEndTime": "SOFT_END_TIME",
      "costPerHourBeforeSoftStartTime": COST_BEFORE_START_TIME,
      "costPerHourAfterSoftEndTime": COST_AFTER_END_TIME
    }