Method: projects.locations.optimizeTours

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

يتكوّن نموذج ShipmentModel بشكل أساسي من Shipment التي يجب تنفيذها وVehicle يمكن استخدامها لنقل 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/2011، ستؤدي هذه السياسة إلى تعبئة الخطوط المتعددة للمسارات غير الفارغة فقط وتتطلب أن تكون قيمة populatePolylines true.

قد تكون حقول 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. يمكن استخدامه عندما تتغير مؤشرات الشحن أو المركبات في الطلب منذ إنشاء الحل، ربما بسبب إزالة الشحنات أو المركبات من الطلب أو إضافتها إليه.

إذا كان الأمر صحيحًا، يجب أن تظهر التصنيفات في الفئات التالية مرة واحدة في فئتها مرة واحدة على الأكثر:

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

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

ملاحظة: يجب أن يتأكد المتصل من أن كل Vehicle.label (تردّ. 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

إذا كانت القيمة "true"، ستتم تعبئة الخطوط المتعددة في الرد 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

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

نص الاستجابة

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

نطاقات التفويض

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

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