Method: projects.optimizeTours

Gửi một OptimizeToursRequest chứa ShipmentModel và trả về một OptimizeToursResponse chứa các ShipmentRoute. Đây là một tập hợp các tuyến đường mà 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à các Vehicle có thể dùng để vận chuyển các Shipment. Các ShipmentRoute sẽ chỉ định Shipment cho Vehicle. Cụ thể hơn, họ chỉ định một loạt Visit cho mỗi chiếc xe, trong đó Visit tương ứng với VisitRequest, là một chuyến nhận hàng hoặc giao hàng cho Shipment.

Mục tiêu là 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/*}: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. Nhắm đến dự án hoặc vị trí cần 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 với 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, máy chủ sẽ trả về một phản hồi trước khi hết 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 đ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 ra 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, có 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 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á tìm giải pháp đầu tiên tương tự như một giải pháp trước đó.

Mô hình 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ẽ bị bỏ qua một cách ngầm định trong giải pháp đầu tiên, nhưng có thể được thực hiện trong các giải pháp tiếp theo.

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

Nếu giải pháp được chèn không khả thi, thì không nhất thiết phải trả về lỗi xác thực mà thay vào đó, có thể trả về lỗi cho biết giải pháp không khả thi.

injectedSolutionConstraint

object (InjectedSolutionConstraint)

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

Nếu giải pháp được chèn không khả thi, thì không nhất thiết phải trả về lỗi xác thực mà thay vào đó, có thể trả về lỗi cho biết giải pháp không khả thi.

refreshDetailsRoutes[]

object (ShipmentRoute)

Nếu không trống, các 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 truy cập hoặc thời gian di chuyển: chỉ các thông tin khác sẽ được cập nhật. Thao tác này không giải quyết được mô hình.

Kể từ ngày 11/2020, phương thức này chỉ điền sẵn các đường nhiều đoạn của những tuyến đường không trống và yêu cầu populatePolylines là true.

Các trường routePolyline của các tuyến đường được truyền vào có thể không nhất quán với transitions của tuyến đường.

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. Đường nhiều đoạn vẫn được điền sẵn giữa tất cả các lượt ghé thăm trong mọi tuyến đường không trống, bất kể các lô hàng hoặc xe có 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. Bạn có thể sử dụng tham số này khi chỉ mục lô hàng hoặc 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 xe đã bị xoá hoặc thêm vào yêu cầu.

Nếu là true, nhãn trong các danh mục sau đây chỉ được xuất hiện tối đa một lần trong danh mục của nhãn:

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

considerRoadTraffic

boolean

Hãy cân nhắc việc ước tính lưu lượng truy cập khi tính toán 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, các đường nhiều đoạn sẽ được điền sẵn trong các phản hồi ShipmentRoute.

populateTransitionPolylines

boolean

Nếu là true, các mã thông báo đường đa tuyến và tuyến đường sẽ được điền sẵn trong phản hồi ShipmentRoute.transitions.

allowLargeDeadlineDespiteInterruptionRisk

boolean

Nếu được đặt, thì yêu cầu có thể có thời hạn (xem https://grpc.io/blog/deadlines) tối đa là 60 phút. 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 tồn tại lâu dài có nguy cơ bị gián đoạn cao hơn đáng kể (nhưng vẫn nhỏ).

useGeodesicDistances

boolean

Nếu đúng, khoảng cách 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, còn 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 độ được áp dụng để tính thời gian di chuyển. Giá trị của thông số này ít nhất phải là 1,0 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ào 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ừ phi solvingMode=VALIDATE_ONLY: xem trường OptimizeToursResponse.validation_errors. Giá trị mặc định là 100 và giới hạn 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 thực thể 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 IAM

Yêu cầu quyền IAM sau đây trên tài nguyên parent:

  • routeoptimization.locations.use

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