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

نشانی وب از نحو تراتبدیل 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)

اگر این زمان استراحت تنظیم شده باشد، سرور قبل‌از سپری شدن دوره زمان استراحت یا رسیدن به مهلت سرور برای درخواست‌های همگام (هرکدام که زودتر باشد) پاسخ را برمی‌گرداند.

برای درخواست‌های ناهمگام، سرور قبل‌از اتمام زمان وقفه، راه‌حلی (درصورت امکان) تولید خواهد کرد.

model

object (ShipmentModel)

مدل ارسال برای حل کردن.

solvingMode

enum (SolvingMode)

به‌طور پیش‌فرض، حالت حل کردن DEFAULT_SOLVE (۰) است.

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)

اگر خالی نباشد، مسیرهای داده‌شده بدون تغییر دادن توالی بازدیدها یا زمان‌های سفر مربوطه بازآوری خواهند شد: فقط جزئیات دیگر به‌روزرسانی خواهند شد. این کار مدل را حل نمی‌کند.

از نوامبر ۲۰۲۰، این فقط چندخطی‌های مسیرهای غیرخالی را پر می‌کند و مستلزم این است که populatePolylines درست باشد.

فیلدهای routePolyline مسیرهای واردشده ممکن است با مسیر transitions ناسازگار باشد.

این فیلد نباید همراه با injectedFirstSolutionRoutes یا injectedSolutionConstraint استفاده شود.

Shipment.ignore و Vehicle.ignore تأثیری بر رفتار ندارند. چندخطی‌ها همچنان بین همه بازدیدها در همه مسیرهای غیرخالی پر می‌شوند، صرف‌نظر از اینکه محموله‌ها یا وسایل نقلیه مربوطه نادیده گرفته شوند یا نه.

interpretInjectedSolutionsUsingLabels

boolean

اگر درست باشد:

این تفسیر برای فیلدهای 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

اگر درست باشد، چندخطی‌ها در پاسخ ShipmentRoutes پر خواهند شد.

populateTransitionPolylines

boolean

اگر درست باشد، چندخطی‌ها و توکن‌های مسیر در پاسخ ShipmentRoute.transitions پر می‌شوند.

allowLargeDeadlineDespiteInterruptionRisk

boolean

اگر این مورد تنظیم شده باشد، درخواست می‌تواند مهلتی (به https://grpc.io/blog/deadlines مراجعه کنید) تا ۶۰ دقیقه داشته باشد. درغیراین‌صورت، حداکثر مهلت فقط ۳۰ دقیقه است. توجه داشته باشید که درخواست‌های طولانی‌مدت با خطر وقفه بسیار بزرگ‌تر (اما همچنان کوچک) مواجه هستند.

useGeodesicDistances

boolean

اگر درست باشد، مسافت‌های سفر بااستفاده از مسافت‌های ژئودزیک به‌جای مسافت‌های Google Maps محاسبه می‌شود و زمان‌های سفر بااستفاده از مسافت‌های ژئودزیک با سرعت تعریف‌شده توسط geodesicMetersPerSecond محاسبه می‌شود.

label

string

برچسبی که ممکن است برای شناسایی این درخواست استفاده شود، در OptimizeToursResponse.request_label گزارش شده است.

geodesicMetersPerSecond

number

وقتی useGeodesicDistances درست باشد، این فیلد باید تنظیم شود و سرعت اعمال‌شده برای محاسبه مدت سفر را تعریف می‌کند. مقدار آن باید حداقل ۱٫۰ متر بر ثانیه باشد.

maxValidationErrors

integer

تعداد خطاهای اعتبارسنجی برگردانده‌شده را کوتاه می‌کند. این خطاها معمولاً به‌عنوان جزئیات خطای BadRequest به بار داده خطای INVALID_ARGUMENT پیوست می‌شوند (https://cloud.google.com/apis/design/errors#error_details)، مگراینکه solvingMode=VALIDATE_ONLY باشد: فیلد OptimizeToursResponse.validation_errors را ببینید. این مقدار به‌طور پیش‌فرض ۱۰۰ است و حداکثر آن ۱۰٬۰۰۰ است.

بدنه پاسخ

اگر موفقیت‌آمیز باشد، بدنه پاسخ حاوی نمونه‌ای از OptimizeToursResponse است.

دامنه‌های مجوز

به محدوده OAuth زیر نیاز دارد:

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

اجازه‌های IAM

به اجازه IAM زیر در منبع parent نیاز دارد:

  • routeoptimization.locations.use

برای اطلاعات بیشتر، به اسناد IAM مراجعه کنید.