يمكن تقسيم مسار المركبة على طول محور الوقت على النحو التالي (نفترض أنّ هناك n زيارة):
| | | | | T[2], | | |
| Transition | Visit #0 | | | V[2], | | |
| #0 | aka | T[1] | V[1] | ... | V[n-1] | T[n] |
| aka T[0] | V[0] | | | V[n-2],| | |
| | | | | T[n-1] | | |
^ ^ ^ ^ ^ ^ ^ ^
vehicle V[0].start V[0].end V[1]. V[1]. V[n]. V[n]. vehicle
start (arrival) (departure) start end start end end
تجدر الإشارة إلى أننا نصنع فرقًا بين:
- "الأحداث الدقيقة"، مثل بدء تشغيل المركبة وانتهائها وبدء كل زيارة وانتهائها (المعروفة أيضًا باسم الوصول والمغادرة) تحدث في ثانية معينة.
- "الفواصل الزمنية"، مثل الزيارات نفسها، والانتقال بين الزيارات. على الرغم من أنّ الفواصل الزمنية يمكن أن تكون أحيانًا بلا مدة، أي أنّها تبدأ وتنتهي في الثانية نفسها، إلا أنّها غالبًا ما تكون ذات مدة موجبة.
المتغيّرات:
- إذا كانت هناك n زيارة، تكون هناك n+1 انتقال.
- دائمًا ما تكون الزيارة محاطة بانتقال قبلها (الفهرس نفسه) وبانتقال بعدها (الفهرس + 1).
- يتبع بدء تشغيل المركبة دائمًا الانتقال رقم 0.
- يسبق نهاية المركبة دائمًا الانتقال رقم n.
عند التكبير، إليك ما يحدث أثناء Transition
وVisit
:
---+-------------------------------------+-----------------------------+-->
| TRANSITION[i] | VISIT[i] |
| | |
| * TRAVEL: the vehicle moves from | PERFORM the visit: |
| VISIT[i-1].departure_location to | |
| VISIT[i].arrival_location, which | * Spend some time: |
| takes a given travel duration | the "visit duration". |
| and distance | |
| | * Load or unload |
| * BREAKS: the driver may have | some quantities from the |
| breaks (e.g. lunch break). | vehicle: the "demand". |
| | |
| * WAIT: the driver/vehicle does | |
| nothing. This can happen for | |
| many reasons, for example when | |
| the vehicle reaches the next | |
| event's destination before the | |
| start of its time window | |
| | |
| * DELAY: *right before* the next | |
| arrival. E.g. the vehicle and/or | |
| driver spends time unloading. | |
| | |
---+-------------------------------------+-----------------------------+-->
^ ^ ^
V[i-1].end V[i].start V[i].end
أخيرًا، إليك كيفية ترتيب TRAVEL وBREAKS وDELAY وWAIT أثناء عملية النقل.
- لا تتداخل.
- تجدر الإشارة إلى أنّ مدة التأخير فريدة ويجب أن تكون فترة زمنية متجاورة قبل الزيارة التالية (أو نهاية المركبة) مباشرةً. وبالتالي، يكفي معرفة مدة التأخير لمعرفة وقت البدء والانتهاء.
- الفواصل الزمنية هي فترات زمنية متجاورة وغير متداخلة. يحدِّد الردّ وقت بدء كل استراحة ومدتها.
- تُعد TRAVEL وWAIT "متوقعين": يمكن مقاطعتهما عدة مرات أثناء هذه المرحلة الانتقالية. ويمكن للعملاء افتراض أن السفر سيحدث "في أقرب وقت ممكن" وأن "الانتظار" يملأ الوقت المتبقي.
مثال (معقد):
TRANSITION[i]
--++-----+-----------------------------------------------------------++-->
|| | | | | | | ||
|| T | B | T | | B | | D ||
|| r | r | r | W | r | W | e ||
|| a | e | a | a | e | a | l ||
|| v | a | v | i | a | i | a ||
|| e | k | e | t | k | t | y ||
|| l | | l | | | | ||
|| | | | | | | ||
--++-----------------------------------------------------------------++-->
تمثيل JSON |
---|
{ "vehicleIndex": integer, "vehicleLabel": string, "vehicleStartTime": string, "vehicleEndTime": string, "visits": [ { object ( |
الحقول | |
---|---|
vehicleIndex |
المركبة التي تسير في المسار، ويتم تحديدها من خلال فهرسها في المصدر |
vehicleLabel |
تصنيف المركبة التي تسلك هذا المسار، يساوي |
vehicleStartTime |
الوقت الذي تبدأ فيه المركبة مسارها يجب أن يكون طابعًا زمنيًا بالتنسيق RFC3339 UTC "Zulu" وبدقة تصل إلى نانوثانية وما يصل إلى تسعة أرقام كسور. أمثلة: |
vehicleEndTime |
الوقت الذي تنتهي فيه المركبة من مسارها طابع زمني بتنسيق RFC3339 UTC "Zulu"، بدقة نانوثانية وما يصل إلى تسعة أرقام كسرية. أمثلة: |
visits[] |
تسلسل مرتّب من الزيارات الذي يمثل مسارًا. الزيارات[i] هي الزيارة الأولى في المسار. إذا كان هذا الحقل فارغًا، سيُعتبَر المركبة غير مستخدَمة. |
transitions[] |
قائمة بحالات النقل للمسار مرتبة حسب الترتيب |
hasTrafficInfeasibilities |
عند ضبط
من المرجّح أن يتم الوصول إلى next_visit في وقت متأخر عن الوقت المحدّد حاليًا بسبب الزيادة في تقدير وقت التنقّل |
routePolyline |
تمثيل الخطوط المتعددة المشفر للمسار. تتم تعبئة هذا الحقل فقط عند ضبط |
breaks[] |
فترات الراحة المُجدوَلة للمركبة التي تسير في هذا المسار يمثّل تسلسل |
metrics |
مقاييس المدة والمسافة والتحميل لهذا المسار يتم تجميع حقول |
routeCosts |
تكلفة المسار، مقسَّمة حسب حقول الطلب المتعلقة بالتكلفة. المفاتيح هي مسارات نموذجية، نسبةً إلى إدخال OptimizeToursRequest، مثل "model.shipments.pickups.cost"، والقيم هي إجمالي التكلفة التي تم إنشاؤها بواسطة حقل التكلفة المقابل، ويتم تجميعها على مستوى المسار بأكمله. بعبارة أخرى، فإنّ costs["model.shipments.pickups.cost"] هي مجموع جميع تكاليف الاستلام على طول المسار. يتمّ إدراج جميع التكاليف المحدّدة في النموذج بالتفصيل هنا باستثناء التكاليف المرتبطة بعناصر TransitionAttributes التي يتمّ إدراجها فقط بطريقة مجمّعة اعتبارًا من 01/2022. عنصر يحتوي على قائمة بأزواج |
routeTotalCost |
التكلفة الإجمالية للمسار مجموع كل التكاليف في خريطة التكلفة. |
انتقال
زيارة تم إجراؤها أثناء مسار تتطابق هذه الزيارة مع عملية استلام أو تسليم Shipment
.
تمثيل JSON |
---|
{
"shipmentIndex": integer,
"isPickup": boolean,
"visitRequestIndex": integer,
"startTime": string,
"loadDemands": {
string: {
object ( |
الحقول | |
---|---|
shipmentIndex |
فهرس حقل |
isPickup |
إذا كانت القيمة صحيحة، تشير الزيارة إلى استلام |
visitRequestIndex |
فهرس |
startTime |
الوقت الذي تبدأ فيه الزيارة. يُرجى العِلم أنّه قد تصل المركبة إلى موقع الزيارة قبل هذا التاريخ. تتوافق الأوقات مع طابع زمني بتنسيق RFC3339 UTC "Zulu"، بدقة نانوثانية وما يصل إلى تسعة أرقام كسرية. أمثلة: |
loadDemands |
إجمالي الطلب على تحميل الزيارة بصفته مجموع الشحنة وطلب الزيارة عنصر يحتوي على قائمة بأزواج |
detour |
وقت الانحراف الإضافي بسبب الشحنات التي تمت زيارتها على المسار قبل الزيارة وفترة الانتظار المحتملة الناتجة عن الفترات الزمنية. إذا كانت الزيارة عبارة عن عملية تسليم، يتم احتساب المسار غير المباشر من زيارة الاستلام المقابلة لها، وهو يساوي:
وبخلاف ذلك، يتم احتسابه من المركبة
المدة بالثواني مع ما يصل إلى تسعة أرقام كسور، وتنتهي بـ " |
shipmentLabel |
نسخة من |
visitLabel |
نسخة من |
injectedSolutionLocationToken |
يشير ذلك المصطلح إلى رمز مميّز مبهم يمثّل المعلومات المتعلّقة بموقع جغرافي للزيارة. قد تتم تعبئة هذا الحقل في زيارات مسارات النتائج عند ضبط |
انتقالات
الانتقال بين حدثين على المسار. اطّلِع على وصف ShipmentRoute
.
إذا لم تكن المركبة مزوّدة برمز startLocation
و/أو endLocation
، تكون مقاييس التنقّل المقابلة لها 0.
تمثيل JSON |
---|
{ "travelDuration": string, "travelDistanceMeters": number, "trafficInfoUnavailable": boolean, "delayDuration": string, "breakDuration": string, "waitDuration": string, "totalDuration": string, "startTime": string, "routePolyline": { object ( |
الحقول | |
---|---|
travelDuration |
مدة التنقّل خلال هذه الفترة الانتقالية مدة بالثواني تضم تسعة أرقام كسور كحد أقصى وتنتهي بـ " |
travelDistanceMeters |
المسافة التي تم قطعها أثناء عملية النقل. |
trafficInfoUnavailable |
عندما يتم طلب حركة المرور من خلال " |
delayDuration |
مجموع مدد التأخير المطبَّقة على هذا الانتقال يبدأ التأخير، إن وجد، قبل المدة بالثواني مع ما يصل إلى تسعة أرقام كسور، وتنتهي بـ " |
breakDuration |
مجموع مدة الفواصل التي تحدث أثناء هذه الفترة الانتقالية، إن وجدت. يتم تخزين التفاصيل حول وقت بدء كل استراحة ومدتها في مدة بالثواني تضم تسعة أرقام كسور كحد أقصى وتنتهي بـ " |
waitDuration |
الوقت الذي تمّ انتظاره خلال هذه الفترة الانتقالية فمدة الانتظار تتوافق مع وقت عدم النشاط ولا تشمل وقت الاستراحة. يُرجى العلم أيضًا أنّ وقت الانتظار هذا قد يتم تقسيمه إلى عدة فترات غير متصلة. مدة بالثواني تضم تسعة أرقام كسور كحد أقصى وتنتهي بـ " |
totalDuration |
إجمالي مدة النقل، يتم توفيرها للتيسير. تساوي:
مدة بالثواني تضم تسعة أرقام كسور كحد أقصى وتنتهي بـ " |
startTime |
وقت بدء عملية النقل هذه يجب أن يكون طابعًا زمنيًا بالتنسيق RFC3339 UTC "Zulu" وبدقة تصل إلى نانوثانية وما يصل إلى تسعة أرقام كسور. أمثلة: |
routePolyline |
تمثيل الخطوط المتعددة المشفر للمسار الذي تم اتباعه أثناء الانتقال. تتم تعبئة هذا الحقل فقط عند ضبط |
vehicleLoads |
أحمال المركبات أثناء عملية النقل هذه، لكل نوع يظهر في الأحمال التي يتم تشغيلها خلال المرحلة الانتقالية الأولى هي الأحمال الأولية لمسار المركبة. بعد ذلك، بعد كل زيارة، تتم إضافة عنصر يحتوي على قائمة بأزواج |
EncodedPolyline
التمثيل المشفَّر لخط متعدد. يمكنك العثور على مزيد من المعلومات حول ترميز الخطوط المتعددة هنا: https://developers.google.com/maps/documentation/utilities/polylinealgorithm https://developers.google.com/maps/documentation/javascript/reference/geometry#encoding.
تمثيل JSON |
---|
{ "points": string } |
الحقول | |
---|---|
points |
سلسلة تمثّل النقاط المشفّرة للخط المتعدّد |
استراحة
بيانات تمثّل تنفيذ فاصل
تمثيل JSON |
---|
{ "startTime": string, "duration": string } |
الحقول | |
---|---|
startTime |
وقت بدء الاستراحة طابع زمني بتنسيق RFC3339 UTC "Zulu"، بدقة نانوثانية وما يصل إلى تسعة أرقام كسرية. أمثلة: |
duration |
مدة الاستراحة المدة بالثواني مع ما يصل إلى تسعة أرقام كسور، وتنتهي بـ " |