ShipmentRoute

يمكن أن يتحلل مسار المركبة، على طول المحور الزمني، على النحو التالي (نفترض أن هناك عدد ن من الزيارات):

  |            |            |          |       |  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

وأخيرًا، إليك كيفية ترتيب السفر والفواصل والتأخير والانتظار أثناء عملية الانتقال.

  • لا تتداخل.
  • إنّ مدة التأخير فريدة ويجب أن تكون فترة زمنية متجاورة قبل الزيارة التالية (أو انتهاء المركبة). وبالتالي، يكفي معرفة مدة التأخير لمعرفة وقت البدء ووقت الانتهاء.
  • الفواصل الزمنية هي فترات زمنية متجاورة وغير متداخلة. تحدّد الاستجابة وقت البدء ومدّة كل فاصل.
  • يعد السفر والانتظار "واضحين": ويمكن أن تتم مقاطعتهما عدة مرات أثناء عملية الانتقال هذه. قد يفترض العملاء أن السفر يحدث "في أقرب وقت ممكن" وأن "الانتظار" يملأ الوقت المتبقي.

مثال (معقد):

                               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 (Visit)
    }
  ],
  "transitions": [
    {
      object (Transition)
    }
  ],
  "hasTrafficInfeasibilities": boolean,
  "routePolyline": {
    object (EncodedPolyline)
  },
  "breaks": [
    {
      object (Break)
    }
  ],
  "metrics": {
    object (AggregatedMetrics)
  },
  "routeCosts": {
    string: number,
    ...
  },
  "routeTotalCost": number
}
الحقول
vehicleIndex

integer

المركبة التي تسير على الطريق، ويتم تحديدها من خلال الفهرس في المصدر ShipmentModel.

vehicleLabel

string

تصنيف المركبة التي تنفّذ هذا المسار، يساوي ShipmentModel.vehicles(vehicleIndex).label، إذا تم تحديدها

vehicleStartTime

string (Timestamp format)

الوقت الذي تبدأ فيه المركبة مسارها.

طابع زمني بتنسيق RFC3339 UTC "Zulu" ، مع دقة نانوثانية وما يصل إلى تسعة أرقام كسرية. أمثلة: "2014-10-02T15:01:23Z" و"2014-10-02T15:01:23.045123456Z"

vehicleEndTime

string (Timestamp format)

الوقت الذي تنتهي فيه المركبة من مسارها.

طابع زمني بتنسيق RFC3339 UTC "Zulu" ، مع دقة نانوثانية وما يصل إلى تسعة أرقام كسرية. أمثلة: "2014-10-02T15:01:23Z" و"2014-10-02T15:01:23.045123456Z"

visits[]

object (Visit)

تسلسل مرتب من الزيارات يمثل مسارًا. الزيارات[i] هي الزيارة الأولى في المسار. إذا كان هذا الحقل فارغًا، تُعتبر المركبة غير مُستخدَمة.

transitions[]

object (Transition)

قائمة مرتبة من الانتقالات للمسار.

hasTrafficInfeasibilities

boolean

عندما يتم ضبط OptimizeToursRequest.consider_road_traffic على "صحيح"، يشير هذا الحقل إلى أنّه من المتوقّع حدوث تناقضات في توقيتات المسار باستخدام تقديرات مدة السفر المستندة إلى حركة المرور. قد لا يتوفّر وقت كافٍ لإكمال أوقات السفر وحالات التأخير والفاصل الزمني وفقًا لحركة المرور بين الزيارات، قبل الزيارة الأولى أو بعدها الأخيرة، مع الالتزام بالفترات الزمنية للزيارة والاستخدام في المركبة. على سبيل المثال:

  startTime(previous_visit) + duration(previous_visit) +
  travelDuration(previous_visit, next_visit) > startTime(next_visit)

من المحتمل أن يتم الوصول في next_visit بعد الفترة الزمنية الحالية بسبب الزيادة التقديرية لوقت السفر travelDuration(previous_visit, next_visit) بسبب حركة المرور. وقد يضطر أيضًا إلى إجبار استراحة على التداخل مع الزيارة بسبب زيادة تقديرات وقت السفر وقيود الزيارة أو فترات الاستراحة.

routePolyline

object (EncodedPolyline)

تمثيل الخطوط المتعددة المشفّر للمسار. لا تتم تعبئة هذا الحقل إلّا إذا تم ضبط OptimizeToursRequest.populate_polylines على "صحيح".

breaks[]

object (Break)

عدد الفواصل الإعلانية المجدوَلة للمركبة التي تنفّذ هذا المسار. يمثّل تسلسل breaks فواصل زمنية، تبدأ كل منها عند startTime المقابلة وتستمر duration ثانية.

metrics

object (AggregatedMetrics)

مقاييس المدة والمسافة والحمولة لهذا المسار يتم تلخيص حقول AggregatedMetrics خلال كل ShipmentRoute.transitions أو ShipmentRoute.visits بناءً على السياق.

routeCosts

map (key: string, value: number)

تكلفة المسار، مقسَّمة حسب حقول الطلب المتعلّقة بالتكلفة. المفاتيح هي مسارات أولية، بالنسبة إلى الإدخال OptimizeToursRequest، مثل "model.shipments.pickups.cost"، والقيم هي إجمالي التكلفة الناتجة عن حقل التكلفة المطابِق، والتي يتم تجميعها على المسار بأكمله. بمعنى آخر، تمثّل التكاليف ["model.shipments.pickups.cost"] مجموع كل تكاليف الاستلام على المسار. يتم هنا الإبلاغ بالتفصيل عن جميع التكاليف المحدّدة في النموذج، باستثناء التكاليف المتعلّقة بسمات TransitionAttributes التي يتم إعداد تقارير عنها بطريقة مجمّعة اعتبارًا من 2022/2021.

عنصر يحتوي على قائمة من أزواج "key": value. مثال: { "name": "wrench", "mass": "1.3kg", "count": "3" }

routeTotalCost

number

التكلفة الإجمالية للمسار. مجموع كل التكاليف في خريطة التكلفة.

انتقال

زيارة تم إجراؤها أثناء المسار. تتوافق هذه الزيارة مع استلام أو تسليم سيارة Shipment.

تمثيل JSON
{
  "shipmentIndex": integer,
  "isPickup": boolean,
  "visitRequestIndex": integer,
  "startTime": string,
  "loadDemands": {
    string: {
      object (Load)
    },
    ...
  },
  "detour": string,
  "shipmentLabel": string,
  "visitLabel": string
}
الحقول
shipmentIndex

integer

فهرس الحقل shipments في المصدر ShipmentModel.

isPickup

boolean

إذا كانت الزيارة صحيحة، تتوافق الزيارة مع عملية استلام Shipment. خلاف ذلك، يتجاوب هذا مع عملية التسليم.

visitRequestIndex

integer

فهرس VisitRequest في حقل الاستلام أو التسليم في Shipment (يُرجى الاطّلاع على isPickup).

startTime

string (Timestamp format)

وقت بدء الزيارة يُرجى العِلم أنّ المركبة قد تصل قبل هذا التاريخ في موقع الزيارة. تتوافق الأوقات مع ShipmentModel.

طابع زمني بتنسيق RFC3339 UTC "Zulu" ، مع دقة نانوثانية وما يصل إلى تسعة أرقام كسرية. أمثلة: "2014-10-02T15:01:23Z" و"2014-10-02T15:01:23.045123456Z"

loadDemands

map (key: string, value: object (Load))

إجمالي طلب تحميل الزيارة كمجموع الشحن وطلب الزيارة loadDemands. وتكون القيم سالبة إذا كانت الزيارة عملية تسليم. يتم تسجيل الطلبات للأنواع نفسها مثل Transition.loads (اطّلِع على هذا الحقل).

عنصر يحتوي على قائمة من أزواج "key": value. مثال: { "name": "wrench", "mass": "1.3kg", "count": "3" }

detour

string (Duration format)

وقت إضافي للطريق بسبب الشحنات التي تمت زيارتها على المسار قبل الزيارة، بالإضافة إلى وقت الانتظار المحتمل الناتج عن الفترات الزمنية. إذا كانت الزيارة إحالة ناجحة، يتمّ احتساب الإحالة الناجحة من زيارة الاستلام المقابلة لها، فتساوى ما يلي:

startTime(delivery) - startTime(pickup)
- (duration(pickup) + travel duration from the pickup location
to the delivery location).

وبخلاف ذلك، يتم احتساب القيمة من المركبة startLocation وتساوي:

startTime - vehicleStartTime - travel duration from
the vehicle's `startLocation` to the visit.

مدة بالثواني يصل عددها إلى تسعة أرقام كسرية وتنتهي بـ "s". مثال: "3.5s".

shipmentLabel

string

نسخة من Shipment.label المقابلة، إذا تم تحديدها في Shipment.

visitLabel

string

نسخة من VisitRequest.label المقابلة، إذا تم تحديدها في VisitRequest.

انتقالات

الانتقال بين حدثين على المسار. يمكنك الاطّلاع على وصف ShipmentRoute.

وإذا لم تكن المركبة تحتوي على startLocation و/أو endLocation، تكون مقاييس التنقّل المقابلة 0.

تمثيل JSON
{
  "travelDuration": string,
  "travelDistanceMeters": number,
  "trafficInfoUnavailable": boolean,
  "delayDuration": string,
  "breakDuration": string,
  "waitDuration": string,
  "totalDuration": string,
  "startTime": string,
  "routePolyline": {
    object (EncodedPolyline)
  },
  "vehicleLoads": {
    string: {
      object (VehicleLoad)
    },
    ...
  }
}
الحقول
travelDuration

string (Duration format)

مدة السفر أثناء عملية النقل هذه.

مدة بالثواني يصل عددها إلى تسعة أرقام كسرية وتنتهي بـ "s". مثال: "3.5s".

travelDistanceMeters

number

المسافة المقطوعة أثناء عملية الانتقال.

trafficInfoUnavailable

boolean

عند طلب الزيارات من خلال OptimizeToursRequest.consider_road_traffic وتعذّر استرداد معلومات حركة المرور في Transition، يتم ضبط هذه القيمة المنطقية على "صحيح". وقد يكون هذا مؤقتًا (عُطلاً نادر في خوادم حركة المرور في الوقت الفعلي) أو دائم (لا تتوفّر بيانات لهذا الموقع الجغرافي).

delayDuration

string (Duration format)

مجموع مُدد التأخير المطبَّقة على عملية النقل هذه. إذا حدث ذلك، يبدأ التأخير قبل delayDuration ثانية بالضبط من الحدث التالي (الزيارة أو نهاية المركبة). يمكنك الاطّلاع على TransitionAttributes.delay.

مدة بالثواني يصل عددها إلى تسعة أرقام كسرية وتنتهي بـ "s". مثال: "3.5s".

breakDuration

string (Duration format)

مجموع مُدَد الفواصل التي تحدث خلال هذا الانتقال، إن توفّرت. يتم تخزين تفاصيل وقت بدء كل فاصل ومدته في ShipmentRoute.breaks.

مدة بالثواني يصل عددها إلى تسعة أرقام كسرية وتنتهي بـ "s". مثال: "3.5s".

waitDuration

string (Duration format)

الوقت الذي قضيته في الانتظار أثناء عملية النقل هذه. تتطابق مدة الانتظار مع وقت عدم النشاط ولا تشمل وقت الاستراحة. تجدر الإشارة أيضًا إلى إمكانية تقسيم وقت الانتظار هذا إلى عدة فواصل زمنية غير متجاورة.

مدة بالثواني يصل عددها إلى تسعة أرقام كسرية وتنتهي بـ "s". مثال: "3.5s".

totalDuration

string (Duration format)

إجمالي مدة عملية النقل، يتم توفيرها لتيسير الأمر تساوي:

  • الزيارة التالية إلى startTime (أو vehicleEndTime إذا كانت هذه هي عملية النقل الأخيرة) - startTime الخاصة بعملية الانتقال هذه
  • إذا كانت ShipmentRoute.has_traffic_infeasibilities خاطئة، يتم أيضًا تجميد البيانات التالية: `totalDuration = TravelDuration +ahDuration
  • breakDuration + lookDuration.

مدة بالثواني يصل عددها إلى تسعة أرقام كسرية وتنتهي بـ "s". مثال: "3.5s".

startTime

string (Timestamp format)

وقت بدء عملية النقل هذه

طابع زمني بتنسيق RFC3339 UTC "Zulu" ، مع دقة نانوثانية وما يصل إلى تسعة أرقام كسرية. أمثلة: "2014-10-02T15:01:23Z" و"2014-10-02T15:01:23.045123456Z"

routePolyline

object (EncodedPolyline)

تمثيل الخطوط المتعددة المشفر للمسار الذي تم اتباعه أثناء الانتقال. لا تتم تعبئة هذا الحقل إلّا إذا تم ضبط populateTransitionPolylines على "صحيح".

vehicleLoads

map (key: string, value: object (VehicleLoad))

أحمال المركبات خلال عملية النقل هذه، لكل نوع يظهر في Vehicle.load_limits الخاصة بهذه المركبة أو التي تتضمّن قيمة Shipment.load_demands بقيمة غير صفرية في بعض الشحنات التي يتم إجراؤها على هذا المسار

الأحمال أثناء عملية الانتقال الأولى هي أحمال البدء لمسار المركبة. وبعد ذلك، بعد كل زيارة، تتم إضافة أو طرح loadDemands للزيارة للحصول على عمليات النقل التالية، استنادًا إلى ما إذا كانت الزيارة عبارة عن استلام الطلب أو عملية تسليم.

عنصر يحتوي على قائمة من أزواج "key": value. مثال: { "name": "wrench", "mass": "1.3kg", "count": "3" }

EncodedPolyline

تمثّل هذه السمة التمثيل المشفّر لخطوط متعددة. يمكنك الاطّلاع على مزيد من المعلومات حول ترميز الخطوط المتعددة على الرابط التالي: https://developers.google.com/maps/documentation/utilities/polylinealgorithm https://developers.google.com/maps/documentation/javascript/reference/geometry#encoding.

تمثيل JSON
{
  "points": string
}
الحقول
points

string

سلسلة تمثِّل النقاط المرمّزة للخطوط المتعددة

استراحة

يشير ذلك المصطلح إلى البيانات التي تمثّل تنفيذ الفاصل.

تمثيل JSON
{
  "startTime": string,
  "duration": string
}
الحقول
startTime

string (Timestamp format)

وقت بدء الاستراحة

طابع زمني بتنسيق RFC3339 UTC "Zulu" ، مع دقة نانوثانية وما يصل إلى تسعة أرقام كسرية. أمثلة: "2014-10-02T15:01:23Z" و"2014-10-02T15:01:23.045123456Z"

duration

string (Duration format)

تمثّل هذه السمة مدة استراحة.

مدة بالثواني يصل عددها إلى تسعة أرقام كسرية وتنتهي بـ "s". مثال: "3.5s".