OptimizeToursResponse

ردّ بعد حلّ مشكلة تحسين الجولة يحتوي على المسارات التي تتّبعها كل مركبة والشحنات التي تم تخطّيها والتكلفة الإجمالية للحلّ

تمثيل JSON
{
  "routes": [
    {
      object (ShipmentRoute)
    }
  ],
  "requestLabel": string,
  "skippedShipments": [
    {
      object (SkippedShipment)
    }
  ],
  "validationErrors": [
    {
      object (OptimizeToursValidationError)
    }
  ],
  "metrics": {
    object (Metrics)
  }
}
الحقول
routes[]

object (ShipmentRoute)

المسارات المحسوبة لكل مركبة، حيث يتطابق المسار i مع المركبة i في النموذج.

requestLabel

string

نسخة من OptimizeToursRequest.label، إذا تم تحديد تصنيف في الطلب

skippedShipments[]

object (SkippedShipment)

تم تخطّي قائمة جميع الشحنات.

validationErrors[]

object (OptimizeToursValidationError)

قائمة بجميع أخطاء التحقّق التي تمكّنا من رصدها بشكل مستقل اطّلِع على شرح "أخطاء متعدّدة" لرسالة OptimizeToursValidationError. بدلاً من الأخطاء، سيتضمّن ذلك تحذيرات في حال كانت قيمة solvingMode هي DEFAULT_SOLVE.

metrics

object (Metrics)

مقاييس المدة والمسافة والاستخدام لهذا الحلّ

OptimizeToursValidationError

يصف هذا الحقل خطأ أو تحذيرًا حدث أثناء التحقّق من صحة OptimizeToursRequest.

تمثيل JSON
{
  "code": integer,
  "displayName": string,
  "fields": [
    {
      object (FieldReference)
    }
  ],
  "errorMessage": string,
  "offendingValues": string
}
الحقول
code

integer

يتم تحديد خطأ التحقّق من الصحة من خلال الزوج (code, displayName) المتوفّر دائمًا.

تقدّم الحقول التي تتبع هذا القسم مزيدًا من السياق حول الخطأ.

أخطاء متعددة: عندما تكون هناك أخطاء متعددة، تحاول عملية التحقّق من الصحة عرض العديد منها. هذه عملية غير كاملة، تمامًا مثل عملية الترجمة. ستكون بعض أخطاء التحقّق "خطيرة"، ما يعني أنّها تؤدي إلى إيقاف عملية التحقّق بالكامل. وينطبق ذلك على أخطاء displayName="UNSPECIFIED"، من بين غيرها. قد تؤدي بعض الأخطاء إلى تخطّي عملية التحقّق من الأخطاء الأخرى.

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

displayName

string

الاسم المعروض للخطأ

fields[]

object (FieldReference)

قد يتضمّن سياق الخطأ 0 أو 1 حقل (في معظم الأحيان) أو أكثر. على سبيل المثال، يمكن الإشارة إلى عملية الاستلام الأولى للمركبة رقم 4 والشحنة رقم 2 على النحو التالي:

fields { name: "vehicles" index: 4}
fields { name: "shipments" index: 2 subField {name: "pickups" index: 0} }

يُرجى العلم أنّ عدد القيم الفريدة للسمة fields يجب ألا يتغيّر لرمز خطأ معيّن.

errorMessage

string

سلسلة تصف الخطأ ويمكن لشخص عادي قراءتها هناك تعيين بنسبة 1:1 بين code وerrorMessage (عندما يكون الرمز != "UNSPECIFIED").

الثبات: غير ثابت: قد تتغيّر رسالة الخطأ المرتبطة بقيمة code معيّنة بمرور الوقت (على أمل توضيحها). يُرجى الاعتماد على displayName وcode بدلاً من ذلك.

offendingValues

string

قد تحتوي على قيم الحقول. ولا يتوفّر هذا الخيار في بعض الأحيان. يجب عدم الاعتماد عليه مطلقًا واستخدامه فقط لتصحيح أخطاء النموذج يدويًا.

FieldReference

تُحدِّد سياقًا لخطأ التحقّق. يشير FieldReference دائمًا إلى حقل معيّن في هذا الملف ويتّبع البنية الهرمية نفسها. على سبيل المثال، يمكننا تحديد العنصر رقم 2 من startTimeWindows للمركبة رقم 5 باستخدام:

name: "vehicles" index: 5 subField { name: "endTimeWindows" index: 2 }

ومع ذلك، نتجاهل الكيانات من المستوى الأعلى، مثل OptimizeToursRequest أو ShipmentModel لتجنُّب تشويش الرسالة.

تمثيل JSON
{
  "name": string,
  "subField": {
    object (FieldReference)
  },

  // Union field index_or_key can be only one of the following:
  "index": integer,
  "key": string
  // End of list of possible types for union field index_or_key.
}
الحقول
name

string

اسم الحقل، على سبيل المثال: "مركبات".

subField

object (FieldReference)

حقل فرعي مُدمَج بشكل تسلسلي، إذا لزم الأمر

حقل الربط index_or_key

يمكن أن يكون index_or_key واحدًا فقط مما يلي:

index

integer

فهرس الحقل في حال تكراره

key

string

مفتاح إذا كان الحقل خريطة

المقاييس

المقاييس العامة المجمّعة على مستوى جميع المسارات

تمثيل JSON
{
  "aggregatedRouteMetrics": {
    object (AggregatedMetrics)
  },
  "skippedMandatoryShipmentCount": integer,
  "usedVehicleCount": integer,
  "earliestVehicleStartTime": string,
  "latestVehicleEndTime": string,
  "costs": {
    string: number,
    ...
  },
  "totalCost": number
}
الحقول
aggregatedRouteMetrics

object (AggregatedMetrics)

يتم احتساب هذه النسبة بشكل مجمع على مدار المسارات. كل مقياس هو مجموع (أو الحد الأقصى للتحميلات) لجميع حقول ShipmentRoute.metrics التي تحمل الاسم نفسه.

skippedMandatoryShipmentCount

integer

عدد الشحنات الإلزامية التي تم تخطّيها

usedVehicleCount

integer

عدد المركبات المستخدَمة ملاحظة: إذا كان مسار المركبة فارغًا وكانت قيمة Vehicle.used_if_route_is_empty صحيحة، تُعتبر المركبة مستعملة.

earliestVehicleStartTime

string (Timestamp format)

أقرب وقت بدء لمركبة مستعملة، ويتم احتسابه على أنّه الحد الأدنى لجميع المركبات المستعمَلة التي تبلغ ShipmentRoute.vehicle_start_time.

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

latestVehicleEndTime

string (Timestamp format)

آخر وقت انتهاء لمركبة مستعملة، ويتم احتسابه على أنّه الحد الأقصى لجميع المركبات المستعمَلة التي تبلغ ShipmentRoute.vehicle_end_time.

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

costs

map (key: string, value: number)

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

totalCost

number

التكلفة الإجمالية للحلّ مجموع جميع القيم في خريطة التكاليف