تحدّد النوافذ الزمنية توقيت الأحداث على مسار معيّن. يمكن أن تشمل هذه الأحداث بداية مسار السائق ونهايته، أو أوقات الاستلام والتسليم المجدولة، أو مدة المسار بأكمله.
يمكن أن تساعد الأطر الزمنية في تحقيق أهداف مثل:
- منح الأولوية لإكمال عمليات الاستلام والتسليم ضمن الأُطر الزمنية المحدّدة
- خطِّط المسارات للعمل ضمن ساعات العمل الإجمالية.
- تأكَّد من أنّ المركبات تبدأ المسارات وتنتهي منها ضمن الأُطر الزمنية المحدّدة.
البنية
كما هو موضّح في المخطّط البياني، يتم تنظيم الفترات الزمنية على النحو التالي:
-
globalStartTimeوglobalEndTimeهما سمتان لـShipmentModel timeWindowsهي خصائص:pickupsداخلShipment.deliveriesداخلShipment.
startTimeWindowsوendTimeWindowsهما سمتان من سماتVehicle.
قائمة التحقّق من الأساسيات
توضّح قائمة التحقّق التالية المعلومات الأساسية التي تمنع حدوث أخطاء محتملة متعلّقة بالفترات الزمنية. يمكن أن تساعدك هذه القائمة في التحقّق من صحة طلبك وتحديد المشاكل في الردّ وحلّها.
الخصائص
يوضّح الجدول التالي سمات النافذة الزمنية العامة.
| الموقع | التنسيق | الوصف |
|---|---|---|
globalStartTime |
Timestamp |
أقرب وقت لأي حدث |
globalEndTime |
Timestamp |
آخر وقت لأي حدث. |
يوضّح الجدول التالي سمات الفترة الزمنية في الشحنات والمركبات.
| أحد الوالدين | الموقع | التنسيق | الوصف |
|---|---|---|---|
Shipment.pickups |
timeWindows |
مصفوفة من أنواع رسائل TimeWindow |
تحدّد هذه السمة الفواصل الزمنية لاستلام الشحنة. |
Shipment.deliveries |
timeWindows |
تحدّد هذه السمة الفواصل الزمنية لتسليم الشحنة. | |
Vehicle |
startTimeWindows |
يحدّد وقت بدء الجدول الزمني لتشغيل المركبة. | |
endTimeWindows |
يحدّد وقت انتهاء الجدول الزمني لتشغيل المركبة. |
يوضّح الجدول التالي سمات نوع الرسالة TimeWindow.
| الموقع | التنسيق | الوصف |
|---|---|---|
startTime |
سلسلة (بتنسيق RFC3339 UTC "Zulu") | تمثّل هذه السمة بداية الفترة الزمنية. |
endTime |
سلسلة (بتنسيق RFC3339 UTC "Zulu") | نهاية الفترة الزمنية |
أمثلة
يتناول هذا القسم ثلاثة أنواع من الأمثلة:
- عيّنات تعليمات برمجية توضّح بنية النوافذ الزمنية
- مثال على سيناريو يوضّح إحدى طرق استخدام النوافذ الزمنية لتحقيق هدف تجاري
- مثال على طلب يتضمّن القيم المحدّدة في سيناريو المثال
عيّنات تعليمات برمجية
تعرض الأقسام التالية عيّنات تعليمات برمجية لأنواع مختلفة من النوافذ الزمنية.
الفترات الزمنية العالمية
تعرض عيّنة التعليمات البرمجية التالية بنية النوافذ الزمنية العامة:
{ "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 |
تحدّد هذه السمة الفترة الزمنية المقبولة لتوصيل الكلب إلى منزل العميل. في هذا المثال، أخبرت كلا العميلين أنه سيتم توصيل كلابهما بين الساعة 5:00 مساءً و6:30 مساءً. |
endTime:2023-01-13T18:30:00Z |
|||
Vehicle |
startTimeWindows |
startTime:2023-01-13T07:00:00ZendTime: 2023-01-13T07:15:00Z |
يحدّد هذا الحقل الفترة الزمنية المقبولة لبدء المركبة (من الساعة 7:00 صباحًا إلى 7:15 صباحًا) وانتهائها (من الساعة 5:00 مساءً إلى 5:15 مساءً). |
endTimeWindows |
startTime:2023-01-13T18:45:00ZendTime: 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. يسمح ذلك لأداة التحسين بالانحراف عن الإطار الزمني المحدّد بتكلفة محدّدة، مع إعطاء الأولوية للتحسين العام على الالتزام الصارم بالأُطر الزمنية عندما يكون ذلك مفيدًا.
تنطبق قيود الاستخدام التالية على النوافذ الزمنية المرنة:
- ولا يمكن تطبيقها على
globalStartTimeوglobalEndTimeلأنّهما لا يستخدمان نوع الرسالةTimeWindow. - ولا تنطبق إلا عندما يكون هناك
TimeWindowواحد في القائمة.
الخصائص
يوضّح الجدول التالي سمات القيود المرنة للنوافذ الزمنية.
| اسم السمة | التنسيق | وصف الموقع |
|---|---|---|
softStartTime |
الطابع الزمني | تحدّد هذه السمة بداية الفترة الزمنية المرنة. إذا حدثت فعالية قبل هذا الوقت، يتم تحصيل تكلفة. |
softEndTime |
الطابع الزمني | تحدّد نهاية الفترة الزمنية المرنة. إذا حدثت فعالية بعد هذا الوقت، يتم تحصيل تكلفة. |
costPerHourBeforeSoftStartTime |
الرقم | التكلفة في الساعة التي يتم تحمّلها عندما يبدأ حدث قبل softStartTime. هذه السمة مطلوبة عند استخدام softStartTime. اطّلِع على المفهوم الرئيسي نموذج التكلفة لمزيد من المعلومات عن كيفية تنفيذ التكاليف. |
costPerHourAfterSoftEndTime |
الرقم | التكلفة في الساعة التي يتم تحمّلها عند انتهاء حدث بعد softEndTime. هذه السمة مطلوبة عند استخدام softEndTime. اطّلِع على المفهوم الرئيسي نموذج التكلفة لمزيد من المعلومات عن كيفية تنفيذ التكاليف. |
عيّنة تعليمات برمجية
يوضّح المثال التالي بنية سمات القيود المرنة لنوع الرسالة TimeWindow:
{ "softStartTime": "SOFT_START_TIME", "softEndTime": "SOFT_END_TIME", "costPerHourBeforeSoftStartTime": COST_BEFORE_START_TIME, "costPerHourAfterSoftEndTime": COST_AFTER_END_TIME }