Method: projects.optimizeToursLongRunning

هذا هو أحد أشكال طريقة projects.optimizeTours المصمّمة للتحسينات التي تستخدم قيم مهلة كبيرة. ويجب تفضيلها على طريقة projects.optimizeTours للتحسينات التي تستغرق أكثر من بضع دقائق.

سيكون للعنصر long-running operation (LRO) الذي يتم إرجاعه اسم بالتنسيق <parent>/operations/<operation_id> ويمكن استخدامه لتتبُّع مستوى تقدّم عملية الحساب. نوع الحقل metadata هو OptimizeToursLongRunningMetadata. نوع الحقل response هو OptimizeToursResponse، في حال نجاح العملية.

ميزة تجريبية: يُرجى الاطّلاع على https://developers.google.com/maps/tt/route-optimization/experimental/otlr/make-request للحصول على مزيد من التفاصيل.

طلب HTTP

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

يستخدِم عنوان 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

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

ينطبق هذا التفسير على الحقول 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

إذا كان صحيحًا، ستتم تعبئة الخطوط المتعددة في ShipmentRoutes الاستجابة.

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 متر/ثانية على الأقل.

maxValidationErrors

integer

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

نص الاستجابة

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

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

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

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

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

يتطلب إذن إدارة الهوية وإمكانية الوصول التالي على مورد parent:

  • routeoptimization.operations.create

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