ShipmentRoute

يمكن أن يتحلل مسار المركبة، على طول المحور الزمني، على النحو التالي (نفترض أن هناك عدد 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 (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)

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

transitions[]

object (Transition)

قائمة بحالات النقل للمسار مرتبة حسب الترتيب

hasTrafficInfeasibilities

boolean

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

  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 التي يتمّ إدراجها فقط بطريقة مجمّعة اعتبارًا من 01/2022.

عنصر يحتوي على قائمة بأزواج "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

في حال كانت القيمة true، تتجاوب الزيارة مع طلب استلام 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 + delayDuration
  • ‫breakDuration + waitDuration`.

مدة بالثواني تضم تسعة أرقام كسور كحد أقصى وتنتهي بـ "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".