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، REMOVE، 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 (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) "زولو" بدقة نانوثانية وما يصل إلى تسعة أرقام كسرية. أمثلة: "2014-10-02T15:01:23Z" و"2014-10-02T15:01:23.045123456Z".

vehicleEndTime

string (Timestamp format)

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

طابع زمني بتنسيق RFC3339 حسب التوقيت العالمي المنسَّق (UTC) "زولو" بدقة نانوثانية وما يصل إلى تسعة أرقام كسرية. أمثلة: "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/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) "زولو" بدقة نانوثانية وما يصل إلى تسعة أرقام كسرية. أمثلة: "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 + longDuration`.

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

startTime

string (Timestamp format)

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

طابع زمني بتنسيق RFC3339 حسب التوقيت العالمي المنسَّق (UTC) "زولو" بدقة نانوثانية وما يصل إلى تسعة أرقام كسرية. أمثلة: "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) "زولو" بدقة نانوثانية وما يصل إلى تسعة أرقام كسرية. أمثلة: "2014-10-02T15:01:23Z" و"2014-10-02T15:01:23.045123456Z".

duration

string (Duration format)

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

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