Method: projects.locations.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 tuyến đường mà các xe sẽ 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à Vehicle có thể dùng để truyền tải các Shipment. ShipmentRoute gán Shipment cho Vehicle. Cụ thể hơn, chúng gán một loạt Visit cho mỗi xe, trong đó Visit tương ứng với VisitRequest (đây là phương thức đến lấy hàng hoặc giao hàng cho Shipment).

Mục tiêu là cung cấp thông tin chỉ định ShipmentRoute cho Vehicle để 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/*/locations/*}:optimizeTours

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

Tham số đường dẫn

Tham số
parent

string

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

Đị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 thời gian chờ này được đặt, máy chủ sẽ trả về phản hồi trước khi hết khoảng thời gian chờ hoặc đạt đến thời hạn của máy chủ cho các yêu cầu đồng bộ, tuỳ theo thời gian nào đến sớm hơn.

Đố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ố thập phân, kết thúc bằng "s". Ví dụ: "3.5s".

model

object (ShipmentModel)

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

solvingMode

enum (SolvingMode)

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

searchMode

enum (SearchMode)

Chế độ tìm kiếm 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á trong việc tìm giải pháp đầu tiên tương tự với giải pháp trước đó.

Mô hình này bị hạn chế khi giải pháp đầu tiên được xây dựng. Mọi lô hàng không được thực hiện trên một tuyến đường sẽ mặc nhiên bị 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 kế tiếp.

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

  • đối với tất cả các tuyến đường, vehicleIndex phải nằm trong dải ô và không bị trùng lặp.
  • cho tất cả các lượt truy cập, shipmentIndexvisitRequestIndex phải trong phạm vi.
  • một lô hàng chỉ có thể được tham chiếu trên một tuyến.
  • quy trình đến lấy hàng để giao đến lấy hàng phải được thực hiện trước khi giao hàng.
  • không thể thực hiện tối đa một phương án đến lấy hàng hoặc phương thức giao hàng thay thế cho một lô hàng.
  • đối với tất cả các tuyến đường, thời gian sẽ tăng lên (ví dụ: vehicleStartTime <= visits[0].start_time <= visits[1].start_time ... <= vehicleEndTime).
  • bạn chỉ có thể vận chuyển hàng trên phương tiện đượ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 giải pháp đã chèn không khả thi, thì hệ thống sẽ không trả về lỗi xác thực và hệ thống có thể trả về một lỗi cho biết tính không khả thi.

injectedSolutionConstraint

object (InjectedSolutionConstraint)

Ràng buộc thuật toán tối ưu hoá để tìm giải pháp cuối cùng tương tự với giải pháp trước đó. Ví dụ: mục này có thể được dùng để đóng băng các 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 đã chèn không khả thi, thì hệ thống sẽ không trả về lỗi xác thực và hệ thống có thể trả về một lỗi cho biết tính không khả thi.

refreshDetailsRoutes[]

object (ShipmentRoute)

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

Kể từ năm 2020/11, dữ liệu này chỉ điền hình nhiều dòng của các tuyến không trống và yêu cầu populatePolylines phải có giá trị true.

Trường routePolyline của các tuyến đã truyền vào có thể không nhất quán với tuyến 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. Hình nhiều đường vẫn được điền sẵn giữa tất cả lượt ghé thăm trên tất cả các tuyến đường không trống, bất kể các lô 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. Có thể dùng đối tượng này khi chỉ số vận chuyển hoặc chỉ số xe 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 vận chuyển đã bị xoá khỏi hoặc được thêm vào yêu cầu.

Nếu đúng, nhãn thuộc các danh mục sau đây phải xuất hiện tối đa một lần trong danh mục tương ứng:

Nếu vehicleLabel trong giải pháp được chèn không tương ứng với 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 truy cập của nó. Nếu shipmentLabel trong dung dịch đã chèn không tương ứng với một yêu cầu vận chuyển, thì lượt truy cập tương ứng sẽ bị xoá khỏi giải pháp. Nếu SkippedShipment.label trong dung dịch được đưa vào không tương ứng với yêu cầu vận chuyển, thì SkippedShipment sẽ bị xoá khỏi dung dịch.

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 đã chèn có thể ảnh hưởng đến các hạn chế ngụ ý, điều này có thể dẫn đến sự 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 mỗi Vehicle.label (phản hồi. Shipment.label) xác định duy nhất một thực thể xe (giao hàng tương ứng) dùng trong 2 yêu cầu có liên quan: yêu cầu trước đây tạo ra OptimizeToursResponse dùng trong dung dịch được chèn và yêu cầu hiện tại chứa dung dịch được chèn. Các quy trình kiểm tra tính riêng biệt như mô tả ở trên là không đủ để đảm bảo yêu cầu này.

considerRoadTraffic

boolean

Hãy xem xét việc ước tính lưu lượng truy cập trong việc tính toán các trường ShipmentRoute Transition.travel_duration, Visit.start_timevehicleEndTime; khi thiết lập trường ShipmentRoute.has_traffic_infeasibilities và khi tính toán trường OptimizeToursResponse.total_cost.

populatePolylines

boolean

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

populateTransitionPolylines

boolean

Nếu đúng, hệ thống sẽ điền hình nhiều đường vào phản hồi ShipmentRoute.transitions.

allowLargeDeadlineDespiteInterruptionRisk

boolean

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

useGeodesicDistances

boolean

Nếu đúng, quãng đường di chuyển sẽ được tính bằ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 khoảng cách trắc địa với tốc độ do geodesicMetersPerSecond xác định.

label

string

Nhãn có thể dùng để xác định 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 thuộc tính này phải tối thiểu là 1 mét/giây.

maxValidationErrors

integer

Cắt bớt số lượng lỗi xác thực được trả về. Những lỗi này thường được đính kèm với tải trọng lỗi INVALID_ mở lại dưới dạng chi tiết lỗi BadRequest (https://cloud.google.com/apis/design/errors#error_details), trừ khi resolveMode=VALIDATE_ONLY: xem trường OptimizeToursResponse.validation_errors. Giá trị mặc định là 100 và giới hạn ở mức 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