Method: projects.locations.optimizeTours

تُرسِل OptimizeToursRequest تحتوي على ShipmentModel وتُعرِض OptimizeToursResponse تحتوي على ShipmentRoute، وهي مجموعة من المسارات التي ستقطعها المركبات بأقل تكلفة إجمالية.

يتكوّن نموذج ShipmentModel بشكلٍ أساسي من Shipment التي يجب تنفيذها وVehicles التي يمكن استخدامها لنقل Shipment. تُسنِد ShipmentRoute Shipment إلى Vehicle. على وجه التحديد، يتم تخصيص سلسلة من Visit لكل مركبة، حيث يتوافق Visit مع VisitRequest، وهو عملية استلام أو تسليم Shipment.

والهدف من ذلك هو توفير تخصيص ShipmentRoute إلى Vehicle، ما يقلّل من إجمالي التكلفة حيث تكون التكلفة محددة في ShipmentModel.

طلب HTTP

POST https://routeoptimization.googleapis.com/v1/{parent=projects/*/locations/*}:optimizeTours

يستخدِم عنوان URL بنية تحويل ترميز gRPC.

مَعلمات المسار

المعلمات
parent

string

مطلوب. استهدف المشروع أو الموقع الجغرافي لإجراء مكالمة.

التنسيق: * projects/{project-id} * projects/{project-id}/locations/{location-id}

في حال عدم تحديد أي موقع جغرافي، سيتم اختيار منطقة تلقائيًا.

نص الطلب

يحتوي نص الطلب على بيانات بالبنية التالية:

تمثيل JSON
{
  "timeout": string,
  "model": {
    object (ShipmentModel)
  },
  "solvingMode": enum (SolvingMode),
  "searchMode": enum (SearchMode),
  "injectedFirstSolutionRoutes": [
    {
      object (ShipmentRoute)
    }
  ],
  "injectedSolutionConstraint": {
    object (InjectedSolutionConstraint)
  },
  "refreshDetailsRoutes": [
    {
      object (ShipmentRoute)
    }
  ],
  "interpretInjectedSolutionsUsingLabels": boolean,
  "considerRoadTraffic": boolean,
  "populatePolylines": boolean,
  "populateTransitionPolylines": boolean,
  "allowLargeDeadlineDespiteInterruptionRisk": boolean,
  "useGeodesicDistances": boolean,
  "label": string,
  "geodesicMetersPerSecond": number,
  "maxValidationErrors": integer
}
الحقول
timeout

string (Duration format)

إذا تم ضبط هذه المهلة، يعرض الخادم استجابة قبل انقضاء مدة المهلة أو بلوغ الموعد النهائي للخادم لتنفيذ الطلبات المتزامنة، أيهما أقرب.

بالنسبة إلى الطلبات غير المتزامنة، سينشئ الخادم حلًا (إن أمكن) قبل انتهاء المهلة.

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

model

object (ShipmentModel)

نموذج الشحن لحلّ المشكلة

solvingMode

enum (SolvingMode)

يكون وضع الحل تلقائيًا هو DEFAULT_SOLVE (0).

searchMode

enum (SearchMode)

وضع البحث المُستخدَم لحل الطلب

injectedFirstSolutionRoutes[]

object (ShipmentRoute)

توجيه خوارزمية التحسين للعثور على حل أول مشابه لحل سابق.

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

يجب أن يستوفي الحل بعض افتراضات الصلاحية الأساسية:

  • بالنسبة إلى جميع المسارات، يجب أن تكون vehicleIndex ضمن النطاق وألّا تكون مكرّرة.
  • بالنسبة إلى جميع الزيارات، يجب أن يكون shipmentIndex وvisitRequestIndex ضمن النطاق.
  • فيمكن الإشارة إلى شحنة على مسار واحد فقط.
  • يجب أن يتم استلام شحنة الاستلام قبل التسليم.
  • لا يجوز تنفيذ أكثر من خيار واحد لاستلام الشحنة أو تسليمها.
  • لجميع المسارات، تزداد الأوقات (أي vehicleStartTime <= visits[0].start_time <= visits[1].start_time ... <= vehicleEndTime).
  • لا يجوز تنفيذ الشحن إلا على مركبة مسموح بها. يُسمح بمركبة إذا كان الحقل Shipment.allowed_vehicle_indices فارغًا أو كان الحقل vehicleIndex الخاص بها مضمّنًا في الحقل Shipment.allowed_vehicle_indices.

إذا لم يكن الحلّ المُدرَج قابلاً للتطبيق، لا يعني ذلك بالضرورة ظهور خطأ في عملية التحقّق، بل قد يظهر خطأ يشير إلى عدم قابلية الحلّ للتطبيق.

injectedSolutionConstraint

object (InjectedSolutionConstraint)

فرض قيود على خوارزمية التحسين للعثور على حل نهائي مشابه لحلّ سابق مثلاً، يمكن استخدام ذلك لتجميد أجزاء من المسارات التي تم إكمالها من قبل أو التي سيتم إكمالها ولكن يجب عدم تعديلها.

إذا لم يكن الحلّ المُدرَج قابلاً للتطبيق، لا يعني ذلك بالضرورة ظهور خطأ في عملية التحقّق، بل قد يظهر خطأ يشير إلى عدم قابلية الحلّ للتطبيق.

refreshDetailsRoutes[]

object (ShipmentRoute)

وإذا لم يكن الحقل فارغًا، سيتم تحديث المسارات بدون تعديل التسلسل الأساسي للزيارات أو مُدد السفر: سيتم تعديل التفاصيل الأخرى فقط. وهذا لا يؤدي إلى حل النموذج.

اعتبارًا من تشرين الثاني (نوفمبر) 2020، لا يتمّ ملء خطوط البوليلين إلا للمسارات غير الفارغة، ويتطلّب ذلك ضبط populatePolylines على "صحيح".

قد تكون حقول routePolyline في المسارات التي تم تمريرها غير متّسقة مع المسار transitions.

يجب عدم استخدام هذا الحقل مع injectedFirstSolutionRoutes أو injectedSolutionConstraint.

لا يؤثّر الخياران Shipment.ignore وVehicle.ignore في السلوك. تظل الخطوط المتعددة مملوءة بين جميع الزيارات في جميع المسارات غير الفارغة بغض النظر عما إذا تم تجاهل الشحنات أو المركبات ذات الصلة أم لا.

interpretInjectedSolutionsUsingLabels

boolean

إذا كان صحيحًا:

  • يستخدم ShipmentRoute.vehicle_label بدلاً من vehicleIndex لمطابقة المسارات في الحلّ المُدرَج مع المركبات في الطلب، ويعيد استخدام عملية الربط الخاصة بالقيمة الأصلية ShipmentRoute.vehicle_index بالقيمة الجديدة ShipmentRoute.vehicle_index لتعديل ConstraintRelaxation.vehicle_indices إذا لم تكن فارغة، ولكن يجب أن تكون عملية الربط واضحة (أي يجب ألا تتشارك قيم ShipmentRoute متعددة القيمة الأصلية نفسها vehicleIndex).
  • استخدام ShipmentRoute.Visit.shipment_label بدلاً من shipmentIndex لمطابقة الزيارات في الحل الذي تم حقنه مع الشحنات الواردة في الطلب
  • يستخدم SkippedShipment.label بدلاً من SkippedShipment.index لمطابقة الشحنات التي تم تخطّيها في الحلّ الذي تمّ إدراجه مع الشحنات المطلوبة.

ينطبق هذا التفسير على الحقول injectedFirstSolutionRoutes وinjectedSolutionConstraint وrefreshDetailsRoutes. ويمكن استخدامه عند تغيير فهارس الشحنة أو المركبات في الطلب منذ إنشاء الحلّ، ربما بسبب إزالة الشحنات أو المركبات من الطلب أو إضافتها إليه.

إذا كانت القيمة هي true، يجب أن تظهر التصنيفات في الفئات التالية مرة واحدة فقط في فئتها:

إذا كانت vehicleLabel في الحلّ الذي تم إدخاله لا تتوافق مع مركبة الطلب، تتم إزالة المسار المقابل من الحلّ مع زياراته. إذا كانت shipmentLabel في الحل الذي تم إدخاله لا تتوافق مع عملية شحن الطلب، تتم إزالة الزيارة المقابلة من الحلّ. إذا كانت السمة SkippedShipment.label الموجودة في الحل الذي تم إدخاله لا تتوافق مع عملية شحن الطلب، تتم إزالة SkippedShipment من الحلّ.

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

ملاحظة: على المتصل التأكّد من أنّ كل Vehicle.label (resp. Shipment.label) لتحديد مركبة (أو شحنة) بشكل فريد تم استخدامها في الطلبَين المعنيّين: الطلب السابق الذي أدى إلى إنشاء OptimizeToursResponse المستخدَم في الحلّ المُحقَّق والطلب الحالي الذي يتضمّن الحلّ المُحقَّق. إنّ عمليات التحقّق من التفرد الموضّحة أعلاه ليست كافية لضمان استيفاء هذا الشرط.

considerRoadTraffic

boolean

ننصحك باستخدام تقدير عدد الزيارات عند احتساب الحقول ShipmentRoute Transition.travel_duration وVisit.start_time وvehicleEndTime. وعند ضبط الحقل ShipmentRoute.has_traffic_infeasibilities، وفي حساب الحقل OptimizeToursResponse.total_cost.

populatePolylines

boolean

في حال كانت القيمة "صحيح"، ستتم تعبئة الخطوط المتعددة في الردود ShipmentRoute.

populateTransitionPolylines

boolean

في حال اختيار القيمة "صحيح"، ستتم تعبئة الخطوط المتعددة والرموز المميزة للمسار وفقًا للاستجابة ShipmentRoute.transitions.

allowLargeDeadlineDespiteInterruptionRisk

boolean

وفي حال ضبط هذه السياسة، يمكن أن يتم تحديد موعد نهائي للطلب (راجِع https://grpc.io/blog/deadlines) يصل إلى 60 دقيقة. وبخلاف ذلك، يبلغ الحد الأقصى للموعد النهائي 30 دقيقة فقط. وتجدر الإشارة إلى أنّ الطلبات طويلة الأجل تنطوي على خطر أكبر بكثير (ولكنّه لا يزال بسيطًا).

useGeodesicDistances

boolean

إذا كان صحيحًا، سيتم احتساب مسافات التنقّل باستخدام المسافات الجيوديسية بدلاً من مسافات "خرائط Google"، وسيتم احتساب أوقات التنقّل باستخدام المسافات الجيوديسية بسرعة محدّدة بواسطة geodesicMetersPerSecond.

label

string

التصنيف الذي يمكن استخدامه لتحديد هذا الطلب، والذي تم الإبلاغ عنه في OptimizeToursResponse.request_label

geodesicMetersPerSecond

number

عند ضبط useGeodesicDistances على "صحيح"، يجب ضبط هذا الحقل وتحديد السرعة المطبّقة لاحتساب مدّة الرحلة. يجب أن تكون قيمته 1.0 متر/ثانية على الأقل.

maxValidationErrors

integer

تقتطع عدد أخطاء التحقّق التي يتم عرضها. يتم عادةً إرفاق هذه الأخطاء بحمولة خطأ INVALID_ARGUMENT كتفاصيل خطأ BadRequest (https://cloud.google.com/apis/design/errors#error_details)، ما لم يكن solvingMode=VALIDATE_ONLY: راجِع الحقل OptimizeToursResponse.validation_errors. يكون هذا العدد التلقائي 100، والحد الأقصى له هو 10,000.

نص الاستجابة

إذا كانت الاستجابة ناجحة، يحتوي نص الاستجابة على مثال OptimizeToursResponse.

نطاقات الأذونات

يجب توفير نطاق OAuth التالي:

  • https://www.googleapis.com/auth/cloud-platform

أذونات "إدارة الهوية وإمكانية الوصول"

يجب الحصول على إذن IAM التالي في مورد "parent":

  • routeoptimization.locations.use

ولمزيد من المعلومات، اطّلِع على مستندات إدارة الهوية وإمكانية الوصول.