Method: projects.optimizeTours

Gửi một OptimizeToursRequest chứa ShipmentModel và trả về một OptimizeToursResponse chứa ShipmentRoute. Đây là một tập hợp các tuyến đường sẽ được các phương tiện thực hiện để giảm thiểu tổng chi phí.

Mô hình ShipmentModel chủ yếu bao gồm các Shipment cần được thực hiện và các Vehicle có thể dùng để truyền các Shipment. Các ShipmentRoute chỉ định các Shipment cho Vehicle. Cụ thể hơn, các thẻ này gán một loạt Visit cho mỗi xe, trong đó Visit tương ứng với VisitRequest (là lượt đến lấy hàng hoặc giao hàng) của Shipment.

Mục tiêu là cung cấp việc chỉ định ShipmentRoute cho Vehicle nhằm giảm thiểu tổng chi phí trong đó chi phí có nhiều thành phần được xác định trong ShipmentModel.

Yêu cầu HTTP

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

URL sử dụng cú pháp Chuyển mã gRPC.

Tham số đường dẫn

Thông số
parent

string

Bắt buộc. Nhắm mục tiêu dự án hoặc vị trí để thực hiện cuộc gọi.

Định dạng: * projects/{project-id} * projects/{project-id}/locations/{location-id}

Nếu bạn không chỉ định vị trí, hệ thống sẽ tự động chọn một khu vực.

Nội dung yêu cầu

Nội dung yêu cầu chứa dữ liệu có cấu trúc sau:

Biểu diễn dưới dạng 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
}
Trường
timeout

string (Duration format)

Nếu bạn đặt thời gian chờ này, thì máy chủ sẽ trả về phản hồi trước khi hết khoảng thời gian chờ hoặc đã đến thời hạn của máy chủ đối với các yêu cầu đồng bộ, tuỳ vào thời điểm nào đến trước.

Đối với các yêu cầu không đồng bộ, máy chủ sẽ tạo một giải pháp (nếu có thể) trước khi hết thời gian chờ.

Thời lượng tính bằng giây với tối đa 9 chữ số phân số, kết thúc bằng "s". Ví dụ: "3.5s".

model

object (ShipmentModel)

Mô hình vận chuyển để giải quyết.

solvingMode

enum (SolvingMode)

Theo mặc định, chế độ giải là DEFAULT_SOLVE (0).

searchMode

enum (SearchMode)

Chế độ tìm kiếm được dùng để giải quyết yêu cầu.

injectedFirstSolutionRoutes[]

object (ShipmentRoute)

Hướng dẫn thuật toán tối ưu hoá cách tìm một giải pháp đầu tiên tương tự với giải pháp trước đó.

Mô hình này sẽ bị hạn chế khi xây dựng giải pháp đầu tiên. Bất kỳ lô hàng nào không được thực hiện trên một tuyến sẽ được ngầm bỏ qua trong giải pháp đầu tiên, nhưng chúng có thể được thực hiện trong các giải pháp liên tiếp.

Giải pháp này phải đáp ứng một số giả định cơ bản về tính hợp lệ:

  • cho tất cả tuyến đường, vehicleIndex phải nằm trong phạm vi và không bị trùng lặp.
  • cho tất cả lượt truy cập, shipmentIndexvisitRequestIndex phải nằm trong phạm vi.
  • chỉ có thể tham chiếu một gói hàng trên một tuyến.
  • bạn phải thực hiện việc đến lấy hàng rồi giao hàng trước khi giao hàng.
  • không thể thực hiện nhiều hơn một hình thức giao hàng thay thế hoặc giao hàng thay thế cho một lô hàng.
  • đối với tất cả tuyến đường, thời gian sẽ tăng lên (ví dụ: vehicleStartTime <= visits[0].start_time <= visits[1].start_time ... <= vehicleEndTime).
  • chỉ có thể thực hiện vận chuyển trên một chiếc xe được cho phép. Xe được phép chạy nếu Shipment.allowed_vehicle_indices trống hoặc vehicleIndex của xe có trong Shipment.allowed_vehicle_indices.
  • nếu đặt avoidUTurns thành true, thì bạn phải đặt injectedSolutionLocationToken cho các lượt truy cập có liên quan

Nếu giải pháp đã đưa vào không khả thi, thì không nhất thiết phải trả về lỗi xác thực và thay vào đó, hệ thống có thể trả về lỗi cho biết tính không khả thi.

injectedSolutionConstraint

object (InjectedSolutionConstraint)

Cố định thuật toán tối ưu hoá để tìm ra giải pháp cuối cùng tương tự với giải pháp trước đó. Ví dụ: chức năng này có thể được sử dụng để cố định một phần của tuyến đường đã hoàn thành hoặc đang được hoàn thành nhưng không được sửa đổi.

Nếu giải pháp đã đưa vào không khả thi, thì không nhất thiết phải trả về lỗi xác thực và thay vào đó, hệ thống có thể trả về lỗi cho biết tính không khả thi.

refreshDetailsRoutes[]

object (ShipmentRoute)

Nếu không để trống, các tuyến đã cho sẽ được làm mới mà không sửa đổi trình tự lượt ghé thăm hoặc thời gian đi lại cơ bản của chúng: chỉ các thông tin chi tiết khác mới được cập nhật. Điều này không giải quyết được mô hình.

Kể từ năm 2020/11, thuộc tính này chỉ điền hình nhiều đường của các tuyến không trống và yêu cầu populatePolylines phải là đúng.

Các trường routePolyline của các tuyến đường đã nhập có thể không nhất quán với tuyến đường transitions.

Bạn không được sử dụng trường này cùng với injectedFirstSolutionRoutes hoặc injectedSolutionConstraint.

Shipment.ignoreVehicle.ignore không ảnh hưởng đến hành vi này. Nhiều tuyến đường vẫn được điền sẵn giữa tất cả các lượt ghé thăm trong tất cả những tuyến đường không trống, bất kể các kiện hàng hoặc phương tiện liên quan có bị bỏ qua hay không.

interpretInjectedSolutionsUsingLabels

boolean

Nếu đúng:

Cách diễn giải này áp dụng cho các trường injectedFirstSolutionRoutes, injectedSolutionConstraintrefreshDetailsRoutes. Thông tin này có thể được dùng khi thông tin vận chuyển hoặc chỉ số phương tiện trong yêu cầu đã thay đổi kể từ khi giải pháp được tạo, có thể là do lô hàng hoặc phương tiện đã bị xoá khỏi yêu cầu hoặc được thêm vào yêu cầu.

Nếu đúng, các nhãn trong các danh mục sau phải xuất hiện nhiều nhất một lần trong danh mục:

Nếu một vehicleLabel trong giải pháp được đưa vào không tương ứng với một xe yêu cầu, thì tuyến đường tương ứng sẽ bị xoá khỏi giải pháp cùng với các lượt ghé thăm tương ứng. Nếu một shipmentLabel trong dung dịch được đưa vào không tương ứng với một yêu cầu vận chuyển, lượt truy cập tương ứng sẽ bị xoá khỏi giải pháp. Nếu một SkippedShipment.label trong dung dịch đã tiêm không tương ứng với một yêu cầu vận chuyển, thì SkippedShipment sẽ bị xoá khỏi giải pháp.

Việc xoá các lượt ghé thăm tuyến đường hoặc toàn bộ tuyến đường khỏi một giải pháp được đưa vào có thể ảnh hưởng đến các hạn chế ngầm ẩn, có thể dẫn đến thay đổi trong giải pháp, lỗi xác thực hoặc tính không khả thi.

LƯU Ý: Phương thức gọi phải đảm bảo rằng từng Vehicle.label (resp. Shipment.label) xác định riêng một thực thể xe (vận chuyển phản hồi) được dùng trong hai yêu cầu có liên quan: yêu cầu trước đây tạo ra OptimizeToursResponse được dùng trong dung dịch được đưa vào và yêu cầu hiện tại có chứa dung dịch được đưa vào. Các bước kiểm tra tính duy nhất được mô tả ở trên là không đủ để đảm bảo yêu cầu này.

considerRoadTraffic

boolean

Xem xét thông tin ước tính lưu lượng truy cập khi tính các trường ShipmentRoute Transition.travel_duration, Visit.start_timevehicleEndTime; khi đặt trường ShipmentRoute.has_traffic_infeasibilities và khi tính toán trường OptimizeToursResponse.total_cost.

populatePolylines

boolean

Nếu đúng, hình nhiều đường sẽ được điền trong các ShipmentRoute phản hồi.

populateTransitionPolylines

boolean

Nếu đúng, hình nhiều đường sẽ được điền sẵn trong phản hồi ShipmentRoute.transitions.

allowLargeDeadlineDespiteInterruptionRisk

boolean

Nếu bạn đặt chế độ này, thì yêu cầu có thể có thời hạn tối đa là 60 phút (xem https://grpc.io/blog/deadlines). Nếu không, thời hạn tối đa chỉ là 30 phút. Xin lưu ý rằng các yêu cầu dài hạn có nguy cơ bị gián đoạn lớn hơn đáng kể (nhưng vẫn nhỏ).

useGeodesicDistances

boolean

Nếu đúng, khoảng cách đi lại sẽ được tính bằng cách sử dụng khoảng cách trắc địa thay vì khoảng cách trên Google Maps, và thời gian di chuyển sẽ được tính bằng cách sử dụng khoảng cách trắc địa với tốc độ được xác định bằng geodesicMetersPerSecond.

label

string

Nhãn có thể dùng để nhận dạng yêu cầu này, được báo cáo lại trong OptimizeToursResponse.request_label.

geodesicMetersPerSecond

number

Khi useGeodesicDistances là true, bạn phải đặt trường này và xác định tốc độ áp dụng để tính toán thời gian di chuyển. Giá trị của biến này phải ít nhất là 1 mét/giây.

maxValidationErrors

integer

Cắt bớt số lượng lỗi xác thực được trả về. Các lỗi này thường đi kèm với tải trọng lỗi INVALID_ARGUMENT dưới dạng chi tiết lỗi BadRequest (https://cloud.google.com/apis/design/errors#error_details), trừ khi giải resolveMode=VALIDATE_ONLY: xem trường OptimizeToursResponse.validation_errors. Giá trị mặc định là 100 và tối đa là 10.000.

Nội dung phản hồi

Nếu thành công, nội dung phản hồi sẽ chứa một phiên bản của OptimizeToursResponse.

Phạm vi uỷ quyền

Yêu cầu phạm vi OAuth sau:

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

Quyền quản lý danh tính và quyền truy cập (IAM)

Cần có quyền IAM sau đây đối với tài nguyên parent:

  • routeoptimization.locations.use

Để biết thêm thông tin, hãy xem tài liệu về IAM.