يمكن تقسيم مسار المركبة على طول محور الوقت على النحو التالي (نفترض أنّ هناك 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 أثناء عملية النقل.
- ولا تتداخل هذه المجموعات.
- يكون DELAY فريدًا ويجب أن يكون فترة زمنية متصلة مباشرةً قبل الزيارة التالية (أو نهاية المركبة). وبالتالي، يكفي معرفة مدة التأخير لمعرفة وقت البدء والانتهاء.
- الفواصل هي فترات زمنية متصلة وغير متداخلة. يحدِّد الردّ وقت بدء كل استراحة ومدتها.
- 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 ( |
الحقول | |
---|---|
vehicle |
المركبة التي تسير في المسار، ويتم تحديدها من خلال فهرسها في المصدر |
vehicle |
تصنيف المركبة التي تسلك هذا المسار، يساوي |
vehicle |
الوقت الذي تبدأ فيه المركبة مسارها يجب أن يكون طابعًا زمنيًا بالتنسيق RFC3339 UTC "Zulu" وبدقة تصل إلى نانوثانية وما يصل إلى تسعة أرقام كسور. أمثلة: |
vehicle |
الوقت الذي تنتهي فيه المركبة من مسارها يجب أن يكون طابعًا زمنيًا بالتنسيق RFC3339 UTC "Zulu" وبدقة تصل إلى نانوثانية وما يصل إلى تسعة أرقام كسور. أمثلة: |
visits[] |
تسلسل منتظم للزيارات يمثّل مسارًا. وvisits[i] هي الزيارة رقم i في المسار. إذا كان هذا الحقل فارغًا، تُعتبر المركبة غير مستخدَمة. |
transitions[] |
قائمة بحالات النقل للمسار مرتبة حسب الترتيب |
has |
عند ضبط
من المرجّح أن يتم الوصول إلى next_visit في وقت متأخر عن الوقت المحدّد حاليًا بسبب الزيادة في تقدير وقت التنقّل |
route |
تمثيل المسار المشفَّر بالخطوط المتعددة لا تتم تعبئة هذا الحقل إلا إذا تم ضبط |
breaks[] |
فترات الراحة المُجدوَلة للمركبة التي تسير في هذا المسار يمثّل تسلسل |
metrics |
مقاييس المدة والمسافة والحمولة لهذا المسار يتم تجميع حقول |
route |
تكلفة المسار، مقسّمة حسب حقول الطلبات ذات الصلة بالتكلفة المفاتيح هي مسارات نموذجية، نسبةً إلى إدخال OptimizeToursRequest، مثل "model.shipments.pickups.cost"، والقيم هي التكلفة الإجمالية التي تم إنشاؤها بواسطة حقل التكلفة المقابل، ويتم تجميعها على مستوى المسار بأكمله. بعبارة أخرى، فإنّ costs["model.shipments.pickups.cost"] هي مجموع جميع تكاليف الاستلام على طول المسار. يتمّ إدراج جميع التكاليف المحدّدة في النموذج بالتفصيل هنا باستثناء التكاليف المرتبطة بعناصر TransitionAttributes التي يتمّ إدراجها بطريقة مجمّعة فقط اعتبارًا من 01/2022. |
route |
التكلفة الإجمالية للمسار مجموع كل التكاليف في خريطة التكلفة. |
انتقال
زيارة تم إجراؤها أثناء مسار ترتبط هذه الزيارة باستلام أو تسليم Shipment
.
تمثيل JSON |
---|
{
"shipmentIndex": integer,
"isPickup": boolean,
"visitRequestIndex": integer,
"startTime": string,
"loadDemands": {
string: {
object ( |
الحقول | |
---|---|
shipment |
فهرس حقل |
is |
إذا كانت القيمة صحيحة، تشير الزيارة إلى استلام |
visit |
فهرس |
start |
الوقت الذي تبدأ فيه الزيارة. يُرجى العِلم أنّه قد تصل المركبة إلى موقع الزيارة قبل هذا الموعد. تتوافق الأوقات مع يجب أن يكون طابعًا زمنيًا بالتنسيق RFC3339 UTC "Zulu" وبدقة تصل إلى نانوثانية وما يصل إلى تسعة أرقام كسور. أمثلة: |
load |
إجمالي طلب تحميل الزيارات كحاصل جمع الشحنة وطلب الزيارة |
detour |
وقت الالتفاف الإضافي بسبب الشحنات التي تمّت زيارتها على المسار قبل الزيارة ووقت الانتظار المحتمَل الناتج عن النوافذ الزمنية إذا كانت الزيارة عبارة عن عملية تسليم، يتم احتساب المسار غير المباشر من زيارة الاستلام المقابلة لها، وهو يساوي:
وبخلاف ذلك، يتم احتسابه من المركبة
المدة بالثواني مع ما يصل إلى تسعة أرقام كسور، وتنتهي بـ " |
shipment |
نسخة من |
visit |
نسخة من |
انتقالات
الانتقال بين حدثَين على المسار اطّلِع على وصف ShipmentRoute
.
إذا لم تكن المركبة مزوّدة بقيمة startLocation
و/أو endLocation
، تكون مقاييس التنقّل المقابلة لها 0.
تمثيل JSON |
---|
{ "travelDuration": string, "travelDistanceMeters": number, "trafficInfoUnavailable": boolean, "delayDuration": string, "breakDuration": string, "waitDuration": string, "totalDuration": string, "startTime": string, "routePolyline": { object ( |
الحقول | |
---|---|
travel |
مدة التنقّل خلال هذه الفترة الانتقالية المدة بالثواني مع ما يصل إلى تسعة أرقام كسور، وتنتهي بـ " |
travel |
المسافة المقطوعة أثناء عملية النقل |
traffic |
عند طلب عدد الزيارات من خلال |
delay |
مجموع مدد التأخير المطبَّقة على هذا الانتقال يبدأ التأخير، إن وجد، قبل المدة بالثواني مع ما يصل إلى تسعة أرقام كسور، وتنتهي بـ " |
break |
مجموع مدّة الفواصل التي تحدث أثناء هذا الانتقال، إن توفّرت يتم تخزين تفاصيل وقت بدء كل استراحة ومدتها في المدة بالثواني مع ما يصل إلى تسعة أرقام كسور، وتنتهي بـ " |
wait |
الوقت الذي تمّ انتظاره خلال هذه الفترة الانتقالية تتوافق مدة الانتظار مع وقت التوقف ولا تشمل وقت الاستراحة. يُرجى العلم أيضًا أنّ وقت الانتظار هذا قد يتم تقسيمه إلى عدة فترات غير متصلة. المدة بالثواني مع ما يصل إلى تسعة أرقام كسور، وتنتهي بـ " |
total |
إجمالي مدة الانتقال، مقدَّمة لتسهيل الاستخدام وهي تساوي:
المدة بالثواني مع ما يصل إلى تسعة أرقام كسور، وتنتهي بـ " |
start |
وقت بدء عملية النقل هذه يجب أن يكون طابعًا زمنيًا بالتنسيق RFC3339 UTC "Zulu" وبدقة تصل إلى نانوثانية وما يصل إلى تسعة أرقام كسور. أمثلة: |
route |
تمثيل الخطوط المتعددة المشفَّرة للمسار الذي تم اتّباعه أثناء عملية النقل لا تتم تعبئة هذا الحقل إلا إذا تم ضبط |
route |
النتائج فقط. رمز تعريف غير شفاف يمكن تمريره إلى حزمة تطوير البرامج (SDK) للتنقّل لإعادة إنشاء المسار أثناء التنقّل، وفي حال إعادة التوجيه، يتم الالتزام بالنية الأصلية عند إنشاء المسار. يجب التعامل مع هذا الرمز المميّز كمجموعة بيانات غير شفافة. لا تقارِن قيمته في جميع الطلبات لأنّ قيمته قد تتغيّر حتى إذا كانت الخدمة تعرض المسار نفسه بالضبط. لا تتم تعبئة هذا الحقل إلا إذا تم ضبط |
vehicle |
أحمال المركبات أثناء عملية النقل هذه، لكل نوع يظهر في الأحمال أثناء عملية النقل الأولى هي الأحمال الأولية لمسار المركبة. بعد ذلك، بعد كل زيارة، تتم إضافة |
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 } |
الحقول | |
---|---|
start |
وقت بدء الفاصل يجب أن يكون طابعًا زمنيًا بالتنسيق RFC3339 UTC "Zulu" وبدقة تصل إلى نانوثانية وما يصل إلى تسعة أرقام كسور. أمثلة: |
duration |
مدة الاستراحة المدة بالثواني مع ما يصل إلى تسعة أرقام كسور، وتنتهي بـ " |