ShipmentModel

Mô hình lô hàng chứa một tập hợp các lô hàng phải do một tập hợp xe thực hiện, đồng thời giảm thiểu tổng chi phí, tức là tổng của:

  • chi phí định tuyến xe (tổng chi phí trên tổng thời gian, chi phí trên thời gian di chuyển và chi phí cố định trên tất cả xe).
  • các khoản phạt đối với lô hàng không được thực hiện.
  • chi phí của toàn bộ thời gian vận chuyển
Biểu diễn dưới dạng JSON
{
  "shipments": [
    {
      object (Shipment)
    }
  ],
  "vehicles": [
    {
      object (Vehicle)
    }
  ],
  "globalStartTime": string,
  "globalEndTime": string,
  "globalDurationCostPerHour": number,
  "durationDistanceMatrices": [
    {
      object (DurationDistanceMatrix)
    }
  ],
  "durationDistanceMatrixSrcTags": [
    string
  ],
  "durationDistanceMatrixDstTags": [
    string
  ],
  "transitionAttributes": [
    {
      object (TransitionAttributes)
    }
  ],
  "shipmentTypeIncompatibilities": [
    {
      object (ShipmentTypeIncompatibility)
    }
  ],
  "shipmentTypeRequirements": [
    {
      object (ShipmentTypeRequirement)
    }
  ],
  "precedenceRules": [
    {
      object (PrecedenceRule)
    }
  ],
  "maxActiveVehicles": integer
}
Trường
shipments[]

object (Shipment)

Tập hợp các lô hàng phải được thực hiện trong mô hình.

vehicles[]

object (Vehicle)

Tập hợp các xe có thể dùng để thực hiện lượt ghé thăm.

globalStartTime

string (Timestamp format)

Thời gian bắt đầu và kết thúc chung của mô hình: không có thời gian nào nằm ngoài phạm vi này được coi là hợp lệ.

Khoảng thời gian của mô hình phải dưới một năm, tức là globalEndTimeglobalStartTime phải cách nhau trong vòng 31536000 giây.

Khi sử dụng các trường cost_per_*hour, bạn nên đặt khoảng thời gian này thành một khoảng thời gian nhỏ hơn để tăng hiệu suất (ví dụ: nếu lập mô hình một ngày, bạn nên đặt giới hạn thời gian chung thành ngày đó). Nếu bạn không đặt giá trị, hệ thống sẽ sử dụng giá trị mặc định là 00:00:00 UTC, ngày 1 tháng 1 năm 1970 (tức là giây: 0, nano giây: 0).

Dấu thời gian ở định dạng "Zulu" RFC3339 UTC, có độ phân giải nano giây và tối đa 9 chữ số thập phân. Ví dụ: "2014-10-02T15:01:23Z""2014-10-02T15:01:23.045123456Z".

globalEndTime

string (Timestamp format)

Nếu bạn không đặt giá trị, hệ thống sẽ sử dụng giá trị mặc định là 00:00:00 UTC, ngày 1 tháng 1 năm 1971 (tức là giây: 31536000, nano giây: 0).

Dấu thời gian ở định dạng "Zulu" RFC3339 UTC, có độ phân giải nano giây và tối đa 9 chữ số thập phân. Ví dụ: "2014-10-02T15:01:23Z""2014-10-02T15:01:23.045123456Z".

globalDurationCostPerHour

number

"Thời lượng tổng thể" của kế hoạch tổng thể là chênh lệch giữa thời gian bắt đầu có hiệu lực sớm nhất và thời gian kết thúc có hiệu lực muộn nhất của tất cả xe. Ví dụ: người dùng có thể chỉ định chi phí mỗi giờ cho số lượng đó để cố gắng tối ưu hoá nhằm hoàn thành công việc sớm nhất. Chi phí này phải có cùng đơn vị với Shipment.penalty_cost.

durationDistanceMatrices[]

object (DurationDistanceMatrix)

Chỉ định ma trận thời lượng và khoảng cách được sử dụng trong mô hình. Nếu trường này trống, Google Maps hoặc khoảng cách trắc địa sẽ được sử dụng, tuỳ thuộc vào giá trị của trường useGeodesicDistances. Nếu không để trống, useGeodesicDistances không được là true và durationDistanceMatrixSrcTags cũng như durationDistanceMatrixDstTags không được để trống.

Ví dụ về cách sử dụng:

  • Có hai vị trí: locA và locB.
  • 1 xe bắt đầu tuyến đường tại locA và kết thúc tại locA.
  • 1 yêu cầu đến lấy hàng tại locB.
model {
  vehicles { startTags: "locA"  endTags: "locA" }
  shipments { pickups { tags: "locB" } }
  durationDistanceMatrixSrcTags: "locA"
  durationDistanceMatrixSrcTags: "locB"
  durationDistanceMatrixDstTags: "locA"
  durationDistanceMatrixDstTags: "locB"
  durationDistanceMatrices {
    rows {  # from: locA
      durations { seconds: 0 }   meters: 0    # to: locA
      durations { seconds: 100 } meters: 1000 # to: locB
    }
    rows {  # from: locB
      durations { seconds: 102 } meters: 990 # to: locA
      durations { seconds: 0 }   meters: 0   # to: locB
    }
  }
}
  • Có 3 vị trí: locA, locB và locC.
  • 1 xe bắt đầu tuyến đường tại locA và kết thúc tại locB, sử dụng ma trận "nhanh".
  • 1 xe bắt đầu tuyến đường tại locB và kết thúc tại locB, sử dụng ma trận "chậm".
  • 1 xe bắt đầu tuyến đường tại locB và kết thúc tại locB, sử dụng ma trận "nhanh".
  • 1 yêu cầu đến lấy hàng tại locC.
model {
  vehicles { startTags: "locA" endTags: "locB" startTags: "fast" }
  vehicles { startTags: "locB" endTags: "locB" startTags: "slow" }
  vehicles { startTags: "locB" endTags: "locB" startTags: "fast" }
  shipments { pickups { tags: "locC" } }
  durationDistanceMatrixSrcTags: "locA"
  durationDistanceMatrixSrcTags: "locB"
  durationDistanceMatrixSrcTags: "locC"
  durationDistanceMatrixDstTags: "locB"
  durationDistanceMatrixDstTags: "locC"
  durationDistanceMatrices {
    vehicleStartTag: "fast"
    rows {  # from: locA
      durations { seconds: 1000 } meters: 2000 # to: locB
      durations { seconds: 600 }  meters: 1000 # to: locC
    }
    rows {  # from: locB
      durations { seconds: 0 }   meters: 0    # to: locB
      durations { seconds: 700 } meters: 1200 # to: locC
    }
    rows {  # from: locC
      durations { seconds: 702 } meters: 1190 # to: locB
      durations { seconds: 0 }   meters: 0    # to: locC
    }
  }
  durationDistanceMatrices {
    vehicleStartTag: "slow"
    rows {  # from: locA
      durations { seconds: 1800 } meters: 2001 # to: locB
      durations { seconds: 900 }  meters: 1002 # to: locC
    }
    rows {  # from: locB
      durations { seconds: 0 }    meters: 0    # to: locB
      durations { seconds: 1000 } meters: 1202 # to: locC
    }
    rows {  # from: locC
      durations { seconds: 1001 } meters: 1195 # to: locB
      durations { seconds: 0 }    meters: 0    # to: locC
    }
  }
}
durationDistanceMatrixSrcTags[]

string

Thẻ xác định nguồn của ma trận thời lượng và khoảng cách; durationDistanceMatrices(i).rows(j) xác định thời lượng và khoảng cách từ các lượt truy cập có thẻ durationDistanceMatrixSrcTags(j) đến các lượt truy cập khác trong ma trận i.

Thẻ tương ứng với VisitRequest.tags hoặc Vehicle.start_tags. Một VisitRequest hoặc Vehicle nhất định phải khớp chính xác với một thẻ trong trường này. Xin lưu ý rằng thẻ nguồn, đích và ma trận của Vehicle có thể giống nhau; tương tự, thẻ nguồn và đích của VisitRequest có thể giống nhau. Tất cả thẻ phải khác nhau và không được là chuỗi trống. Nếu trường này không để trống, thì durationDistanceMatrices không được để trống.

durationDistanceMatrixDstTags[]

string

Thẻ xác định đích đến của ma trận thời lượng và khoảng cách; durationDistanceMatrices(i).rows(j).durations(k) (tương ứng durationDistanceMatrices(i).rows(j).meters(k)) xác định thời lượng (tương ứng là khoảng cách) của chuyến đi từ các lượt truy cập có thẻ durationDistanceMatrixSrcTags(j) đến các lượt truy cập có thẻ durationDistanceMatrixDstTags(k) trong ma trận i.

Thẻ tương ứng với VisitRequest.tags hoặc Vehicle.start_tags. Một VisitRequest hoặc Vehicle nhất định phải khớp chính xác với một thẻ trong trường này. Xin lưu ý rằng thẻ nguồn, đích và ma trận của Vehicle có thể giống nhau; tương tự, thẻ nguồn và đích của VisitRequest có thể giống nhau. Tất cả thẻ phải khác nhau và không được là chuỗi trống. Nếu trường này không để trống, thì durationDistanceMatrices không được để trống.

transitionAttributes[]

object (TransitionAttributes)

Thêm các thuộc tính chuyển đổi vào mô hình.

shipmentTypeIncompatibilities[]

object (ShipmentTypeIncompatibility)

Các tập hợp shipment_types không tương thích (xem ShipmentTypeIncompatibility).

shipmentTypeRequirements[]

object (ShipmentTypeRequirement)

Các nhóm yêu cầu shipmentType (xem ShipmentTypeRequirement).

precedenceRules[]

object (PrecedenceRule)

Tập hợp các quy tắc ưu tiên phải được thực thi trong mô hình.

maxActiveVehicles

integer

Giới hạn số lượng tối đa của xe đang hoạt động. Xe được coi là đang hoạt động nếu tuyến đường của xe thực hiện ít nhất một chuyến hàng. Bạn có thể dùng thông tin này để giới hạn số lượng tuyến trong trường hợp có ít tài xế hơn số lượng xe và đội xe không đồng nhất. Sau đó, tính năng tối ưu hoá sẽ chọn nhóm xe phù hợp nhất để sử dụng. Phải là số dương.

Lô hàng

Lần vận chuyển một mặt hàng, từ một điểm đến điểm lấy hàng đến một điểm đến điểm giao hàng. Để lô hàng được coi là đã thực hiện, một xe riêng biệt phải ghé thăm một trong các địa điểm lấy hàng (và giảm dung lượng dự phòng tương ứng), sau đó ghé thăm một trong các địa điểm giao hàng sau đó (và do đó tăng lại dung lượng dự phòng tương ứng).

Biểu diễn dưới dạng JSON
{
  "displayName": string,
  "pickups": [
    {
      object (VisitRequest)
    }
  ],
  "deliveries": [
    {
      object (VisitRequest)
    }
  ],
  "loadDemands": {
    string: {
      object (Load)
    },
    ...
  },
  "allowedVehicleIndices": [
    integer
  ],
  "costsPerVehicle": [
    number
  ],
  "costsPerVehicleIndices": [
    integer
  ],
  "pickupToDeliveryAbsoluteDetourLimit": string,
  "pickupToDeliveryTimeLimit": string,
  "shipmentType": string,
  "label": string,
  "ignore": boolean,
  "penaltyCost": number,
  "pickupToDeliveryRelativeDetourLimit": number
}
Trường
displayName

string

Tên hiển thị do người dùng xác định của lô hàng. Tên này có thể dài tối đa 63 ký tự và có thể sử dụng ký tự UTF-8.

pickups[]

object (VisitRequest)

Tập hợp các địa điểm lấy hàng thay thế liên kết với lô hàng. Nếu không được chỉ định, xe chỉ cần đến một vị trí tương ứng với các đơn hàng giao.

deliveries[]

object (VisitRequest)

Tập hợp các phương thức giao hàng thay thế liên kết với lô hàng. Nếu không được chỉ định, xe chỉ cần đến một vị trí tương ứng với điểm đến lấy hàng.

loadDemands

map (key: string, value: object (Load))

Yêu cầu về tải trọng của lô hàng (ví dụ: trọng lượng, thể tích, số lượng pallet, v.v.). Khoá trong bản đồ phải là giá trị nhận dạng mô tả loại tải tương ứng, tốt nhất là cũng bao gồm cả đơn vị. Ví dụ: "weight_kg", "volume_gallons", "pallet_count", v.v. Nếu một khoá nhất định không xuất hiện trong bản đồ, thì tải tương ứng sẽ được coi là rỗng.

allowedVehicleIndices[]

integer

Tập hợp các phương tiện có thể thực hiện lô hàng này. Nếu trống, tất cả xe đều có thể thực hiện thao tác này. Xe được cung cấp theo chỉ mục trong danh sách vehicles của ShipmentModel.

costsPerVehicle[]

number

Chỉ định chi phí phát sinh khi mỗi xe vận chuyển lô hàng này. Nếu được chỉ định, thuộc tính này phải có MỘT trong những thuộc tính sau:

  • có cùng số phần tử với costsPerVehicleIndices. costsPerVehicle[i] tương ứng với xe costsPerVehicleIndices[i] của mô hình.
  • có cùng số phần tử với số lượng xe trong mô hình. Phần tử thứ i tương ứng với xe #i của mô hình.

Các chi phí này phải có cùng đơn vị với penaltyCost và không được âm. Để trống trường này nếu không có chi phí nào như vậy.

costsPerVehicleIndices[]

integer

Chỉ mục của các xe mà costsPerVehicle áp dụng. Nếu không trống, mảng này phải có cùng số phần tử với costsPerVehicle. Bạn không được chỉ định chỉ mục xe nhiều lần. Nếu một xe bị loại trừ khỏi costsPerVehicleIndices, thì chi phí của xe đó sẽ bằng 0.

pickupToDeliveryAbsoluteDetourLimit

string (Duration format)

Chỉ định thời gian đi đường vòng tuyệt đối tối đa so với đường đi ngắn nhất từ điểm đến điểm đến. Nếu được chỉ định, giá trị này phải là số không âm và lô hàng phải chứa ít nhất một lượt lấy hàng và một lượt giao hàng.

Ví dụ: giả sử t là thời gian ngắn nhất để đi từ lựa chọn đến lấy hàng đã chọn đến lựa chọn giao hàng đã chọn. Sau đó, việc thiết lập pickupToDeliveryAbsoluteDetourLimit sẽ thực thi:

startTime(delivery) - startTime(pickup) <=
t + pickupToDeliveryAbsoluteDetourLimit

Nếu cả giới hạn tương đối và giới hạn tuyệt đối đều được chỉ định trên cùng một lô hàng, thì giới hạn hạn chế hơn sẽ được dùng cho mỗi cặp điểm đến lấy hàng/điểm đến giao hàng có thể có. Kể từ tháng 10 năm 2017, chúng tôi chỉ hỗ trợ đường tránh khi thời gian di chuyển không phụ thuộc vào loại xe.

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".

pickupToDeliveryTimeLimit

string (Duration format)

Chỉ định khoảng thời gian tối đa từ khi bắt đầu lấy hàng đến khi bắt đầu giao hàng. Nếu được chỉ định, giá trị này phải là số không âm và lô hàng phải chứa ít nhất một lượt lấy hàng và một lượt giao hàng. Thời gian này không phụ thuộc vào phương án thay thế được chọn để đến lấy hàng và giao hàng, cũng như không phụ thuộc vào tốc độ xe. Bạn có thể chỉ định điều này cùng với các quy tắc ràng buộc về đường tránh tối đa: giải pháp sẽ tuân thủ cả hai thông số kỹ thuật.

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".

shipmentType

string

Chuỗi không trống chỉ định "loại" cho lô hàng này. Bạn có thể dùng tính năng này để xác định các yêu cầu hoặc sự không tương thích giữa shipment_types (xem shipmentTypeIncompatibilitiesshipmentTypeRequirements trong ShipmentModel).

Khác với visitTypes được chỉ định cho một lượt truy cập: Tất cả lượt lấy hàng/giao hàng thuộc cùng một lô hàng đều có cùng một shipmentType.

label

string

Chỉ định nhãn cho lô hàng này. Nhãn này được báo cáo trong phản hồi trong shipmentLabel của ShipmentRoute.Visit tương ứng.

ignore

boolean

Nếu đúng, hãy bỏ qua lô hàng này nhưng không áp dụng penaltyCost.

Việc bỏ qua một lô hàng sẽ dẫn đến lỗi xác thực khi có bất kỳ shipmentTypeRequirements nào trong mô hình.

Bạn có thể bỏ qua một lô hàng được thực hiện trong injectedFirstSolutionRoutes hoặc injectedSolutionConstraint; trình giải sẽ xoá các lượt lấy hàng/giao hàng liên quan khỏi tuyến đường thực hiện. precedenceRules tham chiếu đến các lô hàng bị bỏ qua cũng sẽ bị bỏ qua.

penaltyCost

number

Nếu lô hàng không được hoàn tất, khoản phạt này sẽ được cộng vào tổng chi phí của các tuyến. Một lô hàng được coi là đã hoàn tất nếu người dùng đã đến một trong các địa điểm đến lấy hàng và giao hàng thay thế. Chi phí có thể được thể hiện bằng cùng một đơn vị được dùng cho tất cả các trường khác liên quan đến chi phí trong mô hình và phải là số dương.

LƯU Ý QUAN TRỌNG: Nếu bạn không chỉ định hình phạt này, thì hình phạt này sẽ được coi là vô thời hạn, tức là đơn hàng phải được hoàn tất.

pickupToDeliveryRelativeDetourLimit

number

Chỉ định thời gian đi đường vòng tương đối tối đa so với đường ngắn nhất từ điểm đến điểm lấy hàng đến điểm giao hàng. Nếu được chỉ định, giá trị này phải là số không âm và lô hàng phải chứa ít nhất một lượt lấy hàng và một lượt giao hàng.

Ví dụ: giả sử t là thời gian ngắn nhất để đi từ lựa chọn đến lấy hàng đã chọn đến lựa chọn giao hàng đã chọn. Sau đó, việc thiết lập pickupToDeliveryRelativeDetourLimit sẽ thực thi:

startTime(delivery) - startTime(pickup) <=
std::ceil(t * (1.0 + pickupToDeliveryRelativeDetourLimit))

Nếu cả giới hạn tương đối và giới hạn tuyệt đối đều được chỉ định trên cùng một lô hàng, thì giới hạn hạn chế hơn sẽ được dùng cho mỗi cặp điểm đến lấy hàng/điểm đến giao hàng có thể có. Kể từ tháng 10 năm 2017, chúng tôi chỉ hỗ trợ đường tránh khi thời gian di chuyển không phụ thuộc vào loại xe.

VisitRequest

Yêu cầu về lượt ghé thăm mà một xe có thể thực hiện: yêu cầu này có vị trí địa lý (hoặc hai vị trí, xem bên dưới), thời gian mở cửa và đóng cửa được biểu thị bằng khoảng thời gian và thời lượng phục vụ (thời gian xe dành cho việc đến lấy hàng hoặc trả hàng).

Biểu diễn dưới dạng JSON
{
  "arrivalLocation": {
    object (LatLng)
  },
  "arrivalWaypoint": {
    object (Waypoint)
  },
  "departureLocation": {
    object (LatLng)
  },
  "departureWaypoint": {
    object (Waypoint)
  },
  "tags": [
    string
  ],
  "timeWindows": [
    {
      object (TimeWindow)
    }
  ],
  "duration": string,
  "cost": number,
  "loadDemands": {
    string: {
      object (Load)
    },
    ...
  },
  "visitTypes": [
    string
  ],
  "label": string
}
Trường
arrivalLocation

object (LatLng)

Vị trí địa lý nơi xe đến khi thực hiện VisitRequest này. Nếu mô hình lô hàng có ma trận khoảng cách theo thời gian, bạn không được chỉ định arrivalLocation.

arrivalWaypoint

object (Waypoint)

Điểm trung gian mà xe đến khi thực hiện VisitRequest này. Nếu mô hình lô hàng có ma trận khoảng cách theo thời gian, bạn không được chỉ định arrivalWaypoint.

departureLocation

object (LatLng)

Vị trí địa lý nơi xe khởi hành sau khi hoàn tất VisitRequest này. Có thể bỏ qua nếu giá trị này giống với arrivalLocation. Nếu mô hình lô hàng có ma trận khoảng cách theo thời gian, bạn không được chỉ định departureLocation.

departureWaypoint

object (Waypoint)

Điểm trung gian mà xe khởi hành sau khi hoàn tất VisitRequest này. Có thể bỏ qua nếu giá trị này giống với arrivalWaypoint. Nếu mô hình lô hàng có ma trận khoảng cách theo thời gian, bạn không được chỉ định departureWaypoint.

tags[]

string

Chỉ định các thẻ đính kèm vào yêu cầu truy cập. Không được phép sử dụng chuỗi trống hoặc trùng lặp.

timeWindows[]

object (TimeWindow)

Khung thời gian ràng buộc thời gian đến trong một lượt truy cập. Xin lưu ý rằng một xe có thể khởi hành ngoài khoảng thời gian đến, tức là thời gian đến + thời lượng không cần nằm trong khoảng thời gian. Điều này có thể dẫn đến thời gian chờ nếu xe đến trước TimeWindow.start_time.

Nếu không có TimeWindow, thì xe có thể thực hiện lượt ghé thăm này bất cứ lúc nào.

Các khoảng thời gian phải tách biệt, tức là không có khoảng thời gian nào được chồng chéo hoặc liền kề với khoảng thời gian khác và các khoảng thời gian phải được sắp xếp theo thứ tự tăng dần.

Bạn chỉ có thể đặt costPerHourAfterSoftEndTimesoftEndTime nếu có một khoảng thời gian duy nhất.

duration

string (Duration format)

Thời lượng của lượt truy cập, tức là thời gian xe ở lại từ khi đến đến khi rời đi (sẽ được thêm vào thời gian chờ có thể xảy ra; xem timeWindows).

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".

cost

number

Chi phí để thực hiện yêu cầu về lượt ghé thăm này trên tuyến đường của xe. Bạn có thể dùng phương thức thanh toán này để thanh toán các khoản phí khác nhau cho mỗi lần lấy hàng hoặc giao hàng thay thế. Chi phí này phải có cùng đơn vị với Shipment.penalty_cost và không được âm.

loadDemands

map (key: string, value: object (Load))

Tải các yêu cầu của yêu cầu truy cập này. Trường này cũng giống như trường Shipment.load_demands, ngoại trừ việc trường này chỉ áp dụng cho VisitRequest này thay vì toàn bộ Shipment. Các yêu cầu được liệt kê ở đây được thêm vào các yêu cầu được liệt kê trong Shipment.load_demands.

visitTypes[]

string

Chỉ định các loại lượt truy cập. Bạn có thể sử dụng thông tin này để phân bổ thêm thời gian cần thiết cho một xe hoàn tất lượt ghé thăm này (xem Vehicle.extra_visit_duration_for_visit_type).

Một loại chỉ có thể xuất hiện một lần.

label

string

Chỉ định nhãn cho VisitRequest này. Nhãn này được báo cáo trong phản hồi dưới dạng visitLabel trong ShipmentRoute.Visit tương ứng.

LatLng

Một đối tượng đại diện cho một cặp vĩ độ/kinh độ. Giá trị này được biểu thị dưới dạng một cặp số thực để thể hiện vĩ độ và kinh độ theo độ. Trừ phi có quy định khác, đối tượng này phải tuân thủ tiêu chuẩn WGS84. Giá trị phải nằm trong phạm vi chuẩn hoá.

Biểu diễn dưới dạng JSON
{
  "latitude": number,
  "longitude": number
}
Trường
latitude

number

Vĩ độ tính bằng độ. Giá trị này phải nằm trong khoảng [-90.0, +90.0].

longitude

number

Kinh độ tính bằng độ. Giá trị này phải nằm trong khoảng [-180.0, +180.0].

Waypoint

Đóng gói một điểm tham chiếu. Điểm trung gian đánh dấu vị trí đến và đi của VisitRequests, cũng như vị trí bắt đầu và kết thúc của Xe.

Biểu diễn dưới dạng JSON
{
  "sideOfRoad": boolean,

  // Union field location_type can be only one of the following:
  "location": {
    object (Location)
  },
  "placeId": string
  // End of list of possible types for union field location_type.
}
Trường
sideOfRoad

boolean

Không bắt buộc. Cho biết vị trí của điểm trung gian này là để ưu tiên xe dừng ở một bên đường cụ thể. Khi bạn đặt giá trị này, tuyến đường sẽ đi qua vị trí đó để xe có thể dừng ở bên đường mà vị trí đó nghiêng về phía trung tâm đường. Tuỳ chọn này không hoạt động với chế độ đi bộ.

Trường hợp hợp nhất location_type. Các cách khác nhau để biểu thị một vị trí. location_type chỉ có thể là một trong những loại sau:
location

object (Location)

Một điểm được chỉ định bằng toạ độ địa lý, bao gồm cả tiêu đề không bắt buộc.

placeId

string

Mã địa điểm POI được liên kết với điểm trung gian.

Vị trí

Đóng gói một vị trí (một điểm địa lý và tiêu đề không bắt buộc).

Biểu diễn dưới dạng JSON
{
  "latLng": {
    object (LatLng)
  },
  "heading": integer
}
Trường
latLng

object (LatLng)

Toạ độ địa lý của điểm trung gian.

heading

integer

Hướng la bàn liên quan đến hướng của luồng giao thông. Giá trị này dùng để chỉ định bên đường để sử dụng cho việc đón và trả khách. Giá trị hướng có thể từ 0 đến 360, trong đó 0 chỉ định hướng chính Bắc, 90 chỉ định hướng chính Đông, v.v.

TimeWindow

Cửa sổ thời gian ràng buộc thời gian của một sự kiện, chẳng hạn như thời gian đến của một lượt truy cập hoặc thời gian bắt đầu và kết thúc của một xe.

Giới hạn khung thời gian cứng, startTimeendTime, thực thi thời gian sớm nhất và muộn nhất của sự kiện, chẳng hạn như startTime <= event_time <= endTime. Giới hạn dưới của khoảng thời gian mềm, softStartTime, thể hiện lựa chọn ưu tiên cho sự kiện xảy ra vào hoặc sau softStartTime bằng cách chịu chi phí tương ứng với khoảng thời gian trước khi softStartTime xảy ra. Giới hạn trên của khoảng thời gian mềm, softEndTime, thể hiện mong muốn sự kiện xảy ra vào hoặc trước softEndTime bằng cách chịu chi phí tương ứng với khoảng thời gian sau softEndTime mà sự kiện xảy ra. startTime, endTime, softStartTimesoftEndTime phải nằm trong giới hạn thời gian chung (xem ShipmentModel.global_start_timeShipmentModel.global_end_time) và phải tuân thủ:

  0 <= `startTime` <= `endTime` and
  0 <= `startTime` <= `softStartTime` and
  0 <= `softEndTime` <= `endTime`.
Biểu diễn dưới dạng JSON
{
  "startTime": string,
  "endTime": string,
  "softStartTime": string,
  "softEndTime": string,
  "costPerHourBeforeSoftStartTime": number,
  "costPerHourAfterSoftEndTime": number
}
Trường
startTime

string (Timestamp format)

Thời gian bắt đầu của khung thời gian cố định. Nếu không được chỉ định, giá trị này sẽ được đặt thành ShipmentModel.global_start_time.

Dấu thời gian ở định dạng "Zulu" RFC3339 UTC, có độ phân giải nano giây và tối đa 9 chữ số thập phân. Ví dụ: "2014-10-02T15:01:23Z""2014-10-02T15:01:23.045123456Z".

endTime

string (Timestamp format)

Thời gian kết thúc của khung thời gian bắt buộc. Nếu không được chỉ định, giá trị này sẽ được đặt thành ShipmentModel.global_end_time.

Dấu thời gian ở định dạng "Zulu" RFC3339 UTC, có độ phân giải nano giây và tối đa 9 chữ số thập phân. Ví dụ: "2014-10-02T15:01:23Z""2014-10-02T15:01:23.045123456Z".

softStartTime

string (Timestamp format)

Thời gian bắt đầu mềm của khoảng thời gian.

Dấu thời gian ở định dạng "Zulu" RFC3339 UTC, có độ phân giải nano giây và tối đa 9 chữ số thập phân. Ví dụ: "2014-10-02T15:01:23Z""2014-10-02T15:01:23.045123456Z".

softEndTime

string (Timestamp format)

Thời gian kết thúc mềm của khung thời gian.

Dấu thời gian ở định dạng "Zulu" RFC3339 UTC, có độ phân giải nano giây và tối đa 9 chữ số thập phân. Ví dụ: "2014-10-02T15:01:23Z""2014-10-02T15:01:23.045123456Z".

costPerHourBeforeSoftStartTime

number

Chi phí mỗi giờ được thêm vào các chi phí khác trong mô hình nếu sự kiện xảy ra trước softStartTime, được tính như sau:

   max(0, softStartTime - t.seconds)
                          * costPerHourBeforeSoftStartTime / 3600,
t being the time of the event.

Chi phí này phải là số dương và bạn chỉ có thể đặt trường này nếu đã đặt softStartTime.

costPerHourAfterSoftEndTime

number

Chi phí mỗi giờ được thêm vào các chi phí khác trong mô hình nếu sự kiện xảy ra sau softEndTime, được tính như sau:

   max(0, t.seconds - softEndTime.seconds)
                    * costPerHourAfterSoftEndTime / 3600,
t being the time of the event.

Chi phí này phải là số dương và bạn chỉ có thể đặt trường này nếu đã đặt softEndTime.

Loại xe

Mô hình hoá một chiếc xe trong vấn đề vận chuyển. Việc giải quyết vấn đề vận chuyển sẽ tạo một tuyến đường bắt đầu từ startLocation và kết thúc tại endLocation cho xe này. Tuyến là một chuỗi các lượt truy cập (xem ShipmentRoute).

Biểu diễn dưới dạng JSON
{
  "displayName": string,
  "travelMode": enum (TravelMode),
  "routeModifiers": {
    object (RouteModifiers)
  },
  "startLocation": {
    object (LatLng)
  },
  "startWaypoint": {
    object (Waypoint)
  },
  "endLocation": {
    object (LatLng)
  },
  "endWaypoint": {
    object (Waypoint)
  },
  "startTags": [
    string
  ],
  "endTags": [
    string
  ],
  "startTimeWindows": [
    {
      object (TimeWindow)
    }
  ],
  "endTimeWindows": [
    {
      object (TimeWindow)
    }
  ],
  "unloadingPolicy": enum (UnloadingPolicy),
  "loadLimits": {
    string: {
      object (LoadLimit)
    },
    ...
  },
  "costPerHour": number,
  "costPerTraveledHour": number,
  "costPerKilometer": number,
  "fixedCost": number,
  "usedIfRouteIsEmpty": boolean,
  "routeDurationLimit": {
    object (DurationLimit)
  },
  "travelDurationLimit": {
    object (DurationLimit)
  },
  "routeDistanceLimit": {
    object (DistanceLimit)
  },
  "extraVisitDurationForVisitType": {
    string: string,
    ...
  },
  "breakRule": {
    object (BreakRule)
  },
  "label": string,
  "ignore": boolean,
  "travelDurationMultiple": number
}
Trường
displayName

string

Tên hiển thị do người dùng xác định của xe. Tên này có thể dài tối đa 63 ký tự và có thể sử dụng ký tự UTF-8.

travelMode

enum (TravelMode)

Chế độ di chuyển ảnh hưởng đến những con đường mà xe có thể đi và tốc độ của xe. Xem thêm travelDurationMultiple.

routeModifiers

object (RouteModifiers)

Một nhóm điều kiện cần đáp ứng ảnh hưởng đến cách tính tuyến đường cho một loại xe nhất định.

startLocation

object (LatLng)

Vị trí địa lý nơi xe bắt đầu trước khi nhận bất kỳ lô hàng nào. Nếu không được chỉ định, xe sẽ bắt đầu ở lần lấy hàng đầu tiên. Nếu mô hình lô hàng có ma trận thời lượng và khoảng cách, thì bạn không được chỉ định startLocation.

startWaypoint

object (Waypoint)

Điểm trung gian thể hiện vị trí địa lý nơi xe bắt đầu trước khi nhận bất kỳ lô hàng nào. Nếu bạn không chỉ định startWaypoint hoặc startLocation, thì xe sẽ bắt đầu ở lần lấy hàng đầu tiên. Nếu mô hình lô hàng có ma trận thời lượng và khoảng cách, thì bạn không được chỉ định startWaypoint.

endLocation

object (LatLng)

Vị trí địa lý nơi xe kết thúc sau khi hoàn tất VisitRequest cuối cùng. Nếu bạn không chỉ định, ShipmentRoute của xe sẽ kết thúc ngay khi hoàn tất VisitRequest cuối cùng. Nếu mô hình lô hàng có ma trận thời lượng và khoảng cách, thì bạn không được chỉ định endLocation.

endWaypoint

object (Waypoint)

Điểm trung gian thể hiện vị trí địa lý mà xe kết thúc sau khi hoàn thành VisitRequest cuối cùng. Nếu bạn không chỉ định endWaypoint hoặc endLocation, thì ShipmentRoute của xe sẽ kết thúc ngay lập tức khi hoàn tất VisitRequest cuối cùng. Nếu mô hình lô hàng có ma trận thời lượng và khoảng cách, thì bạn không được chỉ định endWaypoint.

startTags[]

string

Chỉ định các thẻ được đính kèm vào điểm bắt đầu của tuyến đường của xe.

Không được phép sử dụng chuỗi trống hoặc trùng lặp.

endTags[]

string

Chỉ định các thẻ được đính kèm vào cuối tuyến đường của xe.

Không được phép sử dụng chuỗi trống hoặc trùng lặp.

startTimeWindows[]

object (TimeWindow)

Khung thời gian mà xe có thể rời khỏi vị trí bắt đầu. Các giá trị này phải nằm trong giới hạn thời gian chung (xem các trường ShipmentModel.global_*). Nếu không được chỉ định, thì sẽ không có giới hạn nào ngoài các giới hạn thời gian chung đó.

Các khoảng thời gian thuộc cùng một trường định kỳ phải tách biệt, tức là không có khoảng thời gian nào được trùng lặp hoặc liền kề với khoảng thời gian khác, đồng thời các khoảng thời gian này phải theo thứ tự thời gian.

Bạn chỉ có thể đặt costPerHourAfterSoftEndTimesoftEndTime nếu có một khoảng thời gian duy nhất.

endTimeWindows[]

object (TimeWindow)

Khoảng thời gian mà xe có thể đến vị trí cuối cùng. Các giá trị này phải nằm trong giới hạn thời gian chung (xem các trường ShipmentModel.global_*). Nếu không được chỉ định, thì sẽ không có giới hạn nào ngoài các giới hạn thời gian chung đó.

Các khoảng thời gian thuộc cùng một trường định kỳ phải tách biệt, tức là không có khoảng thời gian nào được trùng lặp hoặc liền kề với khoảng thời gian khác, đồng thời các khoảng thời gian này phải theo thứ tự thời gian.

Bạn chỉ có thể đặt costPerHourAfterSoftEndTimesoftEndTime nếu có một khoảng thời gian duy nhất.

unloadingPolicy

enum (UnloadingPolicy)

Chính sách về việc dỡ hàng được thực thi trên xe.

loadLimits

map (key: string, value: object (LoadLimit))

Sức chứa của xe (ví dụ: trọng lượng, thể tích, số lượng pallet). Các khoá trong bản đồ là giá trị nhận dạng của loại tải, nhất quán với các khoá của trường Shipment.load_demands. Nếu một khoá nhất định không có trong bản đồ này, thì dung lượng tương ứng được coi là không giới hạn.

costPerHour

number

Chi phí xe: tất cả chi phí cộng lại và phải có cùng đơn vị với Shipment.penalty_cost.

Chi phí mỗi giờ của tuyến xe. Chi phí này được áp dụng cho tổng thời gian của tuyến đường, bao gồm thời gian di chuyển, thời gian chờ và thời gian ghé thăm. Việc sử dụng costPerHour thay vì chỉ costPerTraveledHour có thể làm tăng độ trễ.

costPerTraveledHour

number

Chi phí mỗi giờ di chuyển của tuyến đường xe. Chi phí này chỉ áp dụng cho thời gian di chuyển theo tuyến đường (tức là thời gian được báo cáo trong ShipmentRoute.transitions) và không bao gồm thời gian chờ và thời gian ghé thăm.

costPerKilometer

number

Chi phí mỗi km trên tuyến đường của xe. Chi phí này được áp dụng cho khoảng cách được báo cáo trong ShipmentRoute.transitions và không áp dụng cho bất kỳ khoảng cách nào được di chuyển ngầm từ arrivalLocation đến departureLocation của một VisitRequest.

fixedCost

number

Chi phí cố định được áp dụng nếu xe này được dùng để xử lý một lô hàng.

usedIfRouteIsEmpty

boolean

Trường này chỉ áp dụng cho các xe khi tuyến đường của xe không phục vụ bất kỳ lô hàng nào. Giá trị này cho biết liệu xe có được coi là đã qua sử dụng hay không trong trường hợp này.

Nếu đúng, xe sẽ đi từ vị trí bắt đầu đến vị trí kết thúc ngay cả khi không phục vụ bất kỳ lô hàng nào, đồng thời tính đến thời gian và chi phí khoảng cách phát sinh từ việc di chuyển từ vị trí bắt đầu đến vị trí kết thúc.

Nếu không, xe sẽ không di chuyển từ vị trí bắt đầu đến vị trí kết thúc và không có breakRule hoặc độ trễ (từ TransitionAttributes) nào được lên lịch cho xe này. Trong trường hợp này, ShipmentRoute của xe không chứa bất kỳ thông tin nào ngoại trừ chỉ mục và nhãn xe.

routeDurationLimit

object (DurationLimit)

Giới hạn áp dụng cho tổng thời lượng của tuyến đường của xe. Trong một OptimizeToursResponse nhất định, thời lượng tuyến đường của một xe là chênh lệch giữa vehicleEndTimevehicleStartTime của xe đó.

travelDurationLimit

object (DurationLimit)

Giới hạn áp dụng cho thời gian di chuyển của tuyến đường của xe. Trong một OptimizeToursResponse nhất định, thời gian di chuyển theo tuyến đường là tổng của tất cả transitions.travel_duration.

routeDistanceLimit

object (DistanceLimit)

Giới hạn áp dụng cho tổng quãng đường của tuyến đường của xe. Trong một OptimizeToursResponse nhất định, quãng đường của tuyến đường là tổng của tất cả transitions.travel_distance_meters.

extraVisitDurationForVisitType

map (key: string, value: string (Duration format))

Chỉ định một bản đồ từ các chuỗi visitTypes đến thời lượng. Thời lượng là thời gian cộng với VisitRequest.duration cần được thực hiện trong các lượt truy cập có visitTypes được chỉ định. Thời lượng truy cập bổ sung này sẽ làm tăng chi phí nếu bạn chỉ định costPerHour. Khoá (tức là visitTypes) không được là chuỗi trống.

Nếu một yêu cầu truy cập có nhiều loại, thì thời lượng sẽ được thêm cho từng loại trong bản đồ.

breakRule

object (BreakRule)

Mô tả lịch nghỉ sẽ được thực thi trên xe này. Nếu trống, xe này sẽ không được lên lịch nghỉ.

label

string

Chỉ định nhãn cho xe này. Nhãn này được báo cáo trong phản hồi dưới dạng vehicleLabel của ShipmentRoute tương ứng.

ignore

boolean

Nếu đúng, usedIfRouteIsEmpty phải là sai và xe này sẽ không được sử dụng.

Nếu một lô hàng được thực hiện bằng một xe bị bỏ qua trong injectedFirstSolutionRoutes, thì lô hàng đó sẽ bị bỏ qua trong giải pháp đầu tiên nhưng có thể được thực hiện trong phản hồi.

Nếu một lô hàng được thực hiện bằng một xe bị bỏ qua trong injectedSolutionConstraint và mọi hoạt động lấy hàng/giao hàng có liên quan bị ràng buộc phải vẫn trên xe (tức là không được nới lỏng đến cấp RELAX_ALL_AFTER_THRESHOLD), thì lô hàng đó sẽ bị bỏ qua trong phản hồi. Nếu một lô hàng có trường allowedVehicleIndices không trống và tất cả các phương tiện được phép đều bị bỏ qua, thì lô hàng đó sẽ bị bỏ qua trong phản hồi.

travelDurationMultiple

number

Chỉ định hệ số nhân có thể dùng để tăng hoặc giảm thời gian di chuyển của phương tiện này. Ví dụ: việc đặt giá trị này thành 2.0 có nghĩa là xe này chạy chậm hơn và có thời gian di chuyển gấp đôi so với xe tiêu chuẩn. Hệ số này không ảnh hưởng đến thời lượng truy cập. Giá trị này ảnh hưởng đến chi phí nếu bạn chỉ định costPerHour hoặc costPerTraveledHour. Giá trị này phải nằm trong phạm vi [0,001, 1000]. Nếu bạn không đặt giá trị, thì xe sẽ là xe tiêu chuẩn và hệ số này được coi là 1.0.

CẢNH BÁO: Thời gian di chuyển sẽ được làm tròn đến giây gần nhất sau khi áp dụng bội số này nhưng trước khi thực hiện bất kỳ phép toán số nào. Do đó, một bội số nhỏ có thể làm giảm độ chính xác.

Xem thêm extraVisitDurationForVisitType bên dưới.

TravelMode

Các phương thức di chuyển mà xe có thể sử dụng.

Đây phải là một tập hợp con của các phương thức di chuyển trong API Routes Preferred của Nền tảng Google Maps, xem: https://developers.google.com/maps/documentation/routes_preferred/reference/rest/Shared.Types/RouteTravelMode.

Enum
TRAVEL_MODE_UNSPECIFIED Chế độ đi lại không được chỉ định, tương đương với DRIVING.
DRIVING Chế độ đi lại tương ứng với đường đi (ô tô, ...).
WALKING Chế độ đi lại tương ứng với đường đi bộ.

RouteModifiers

Đóng gói một tập hợp các điều kiện không bắt buộc để đáp ứng khi tính toán tuyến xe. Điều này tương tự như RouteModifiers trong API Routes Preferred của Nền tảng Google Maps; xem: https://developers.google.com/maps/documentation/routes/reference/rest/v2/RouteModifiers.

Biểu diễn dưới dạng JSON
{
  "avoidTolls": boolean,
  "avoidHighways": boolean,
  "avoidFerries": boolean,
  "avoidIndoor": boolean
}
Trường
avoidTolls

boolean

Chỉ định xem có tránh đường thu phí hay không (nếu hợp lý). Chúng tôi sẽ ưu tiên các tuyến đường không có đường thu phí. Chỉ áp dụng cho các phương tiện di chuyển bằng động cơ.

avoidHighways

boolean

Chỉ định xem có nên tránh đường cao tốc hay không (nếu hợp lý). Chúng tôi sẽ ưu tiên các tuyến đường không có đường cao tốc. Chỉ áp dụng cho các phương tiện di chuyển bằng động cơ.

avoidFerries

boolean

Chỉ định xem có tránh phà hay không khi hợp lý. Ưu tiên các tuyến không có phương tiện đi lại bằng phà. Chỉ áp dụng cho các phương tiện di chuyển bằng động cơ.

avoidIndoor

boolean

Không bắt buộc. Chỉ định xem có nên tránh điều hướng trong nhà khi hợp lý hay không. Các tuyến không chứa thông tin chỉ đường trong nhà sẽ được ưu tiên. Chỉ áp dụng cho chế độ đi lại WALKING.

UnloadingPolicy

Chính sách về cách dỡ hàng khỏi xe. Chỉ áp dụng cho các đơn hàng có cả phương thức đến lấy hàng và giao hàng.

Các lô hàng khác có thể diễn ra ở bất kỳ đâu trên tuyến đường, độc lập với unloadingPolicy.

Enum
UNLOADING_POLICY_UNSPECIFIED Chính sách dỡ hàng không được chỉ định; việc giao hàng chỉ được thực hiện sau khi nhận hàng tương ứng.
LAST_IN_FIRST_OUT Các lần giao hàng phải diễn ra theo thứ tự ngược lại với các lần đến lấy hàng
FIRST_IN_FIRST_OUT Các đơn hàng giao hàng phải được thực hiện theo thứ tự giống như các đơn hàng đến lấy hàng

LoadLimit

Xác định giới hạn tải trọng áp dụng cho một xe, ví dụ: "xe tải này chỉ có thể chở tối đa 3500 kg". Vui lòng xem loadLimits.

Biểu diễn dưới dạng JSON
{
  "softMaxLoad": string,
  "costPerUnitAboveSoftMax": number,
  "startLoadInterval": {
    object (Interval)
  },
  "endLoadInterval": {
    object (Interval)
  },
  "maxLoad": string
}
Trường
softMaxLoad

string (int64 format)

Giới hạn linh hoạt của tải. Vui lòng xem costPerUnitAboveSoftMax.

costPerUnitAboveSoftMax

number

Nếu tải vượt quá softMaxLoad dọc theo tuyến đường của xe này, thì mức phạt chi phí sau đây sẽ được áp dụng (chỉ một lần cho mỗi xe): (tải – softMaxLoad) * costPerUnitAboveSoftMax. Tất cả các chi phí đều được cộng lại và phải có cùng đơn vị với Shipment.penalty_cost.

startLoadInterval

object (Interval)

Khoảng thời gian tải chấp nhận được của xe ở đầu tuyến.

endLoadInterval

object (Interval)

Khoảng thời gian tải chấp nhận được của xe ở cuối tuyến.

maxLoad

string (int64 format)

Mức tải tối đa được chấp nhận.

Khoảng thời gian

Khoảng thời gian tải được chấp nhận.

Biểu diễn dưới dạng JSON
{
  "min": string,
  "max": string
}
Trường
min

string (int64 format)

Mức tải tối thiểu chấp nhận được. Phải ≥ 0. Nếu cả hai đều được chỉ định, min phải ≤ max.

max

string (int64 format)

Mức tải tối đa chấp nhận được. Phải ≥ 0. Nếu không được chỉ định, tải tối đa sẽ không bị hạn chế bởi thông báo này. Nếu cả hai đều được chỉ định, min phải ≤ max.

DurationLimit

Giới hạn xác định thời lượng tối đa của tuyến đường của một xe. Lớp phủ này có thể cứng hoặc mềm.

Khi xác định trường giới hạn mềm, bạn phải xác định cả ngưỡng tối đa mềm và chi phí liên quan.

Biểu diễn dưới dạng JSON
{
  "maxDuration": string,
  "softMaxDuration": string,
  "quadraticSoftMaxDuration": string,
  "costPerHourAfterSoftMax": number,
  "costPerSquareHourAfterQuadraticSoftMax": number
}
Trường
maxDuration

string (Duration format)

Giới hạn cứng ràng buộc thời lượng tối đa là maxDuration.

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".

softMaxDuration

string (Duration format)

Giới hạn mềm không thực thi giới hạn thời lượng tối đa, nhưng khi bị vi phạm sẽ khiến tuyến phải chịu chi phí. Chi phí này cộng với các chi phí khác được xác định trong mô hình, với cùng một đơn vị.

Nếu được xác định, softMaxDuration phải là số không âm. Nếu maxDuration cũng được xác định, thì softMaxDuration phải nhỏ hơn maxDuration.

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".

quadraticSoftMaxDuration

string (Duration format)

Giới hạn mềm không thực thi giới hạn thời lượng tối đa, nhưng khi bị vi phạm, tuyến đường sẽ phải chịu một chi phí, theo hàm bậc hai trong thời lượng. Chi phí này cộng với các chi phí khác được xác định trong mô hình, với cùng một đơn vị.

Nếu được xác định, quadraticSoftMaxDuration phải là số không âm. Nếu maxDuration cũng được xác định, thì quadraticSoftMaxDuration phải nhỏ hơn maxDuration và chênh lệch không được lớn hơn một ngày:

maxDuration - quadraticSoftMaxDuration <= 86400 seconds

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".

costPerHourAfterSoftMax

number

Chi phí mỗi giờ phát sinh nếu vi phạm ngưỡng softMaxDuration. Chi phí bổ sung là 0 nếu thời lượng dưới ngưỡng, nếu không, chi phí sẽ phụ thuộc vào thời lượng như sau:

  costPerHourAfterSoftMax * (duration - softMaxDuration)

Chi phí phải là số không âm.

costPerSquareHourAfterQuadraticSoftMax

number

Chi phí mỗi giờ vuông phát sinh nếu vi phạm ngưỡng quadraticSoftMaxDuration.

Chi phí bổ sung là 0 nếu thời lượng dưới ngưỡng, nếu không, chi phí sẽ phụ thuộc vào thời lượng như sau:

  costPerSquareHourAfterQuadraticSoftMax *
  (duration - quadraticSoftMaxDuration)^2

Chi phí phải là số không âm.

DistanceLimit

Giới hạn xác định khoảng cách tối đa có thể di chuyển. Lớp phủ này có thể cứng hoặc mềm.

Nếu bạn xác định giới hạn mềm, thì cả softMaxMeterscostPerKilometerAboveSoftMax đều phải được xác định và không được âm.

Biểu diễn dưới dạng JSON
{
  "maxMeters": string,
  "softMaxMeters": string,
  "costPerKilometerBelowSoftMax": number,
  "costPerKilometerAboveSoftMax": number
}
Trường
maxMeters

string (int64 format)

Giới hạn cứng ràng buộc khoảng cách ở mức tối đa là maxMeters. Giới hạn phải là số không âm.

softMaxMeters

string (int64 format)

Giới hạn mềm không thực thi giới hạn khoảng cách tối đa, nhưng khi bị vi phạm sẽ dẫn đến một chi phí cộng với các chi phí khác được xác định trong mô hình, với cùng một đơn vị.

Nếu được xác định, softMaxMeters phải nhỏ hơn maxMeters và phải là số không âm.

costPerKilometerBelowSoftMax

number

Chi phí mỗi km đã phát sinh, tăng lên đến softMaxMeters, theo công thức:

  min(distanceMeters, softMaxMeters) / 1000.0 *
  costPerKilometerBelowSoftMax.

Chi phí này không được hỗ trợ trong routeDistanceLimit.

costPerKilometerAboveSoftMax

number

Chi phí mỗi km phát sinh nếu khoảng cách vượt quá hạn mức softMaxMeters. Chi phí bổ sung là 0 nếu khoảng cách dưới hạn mức, nếu không, công thức dùng để tính chi phí sẽ như sau:

  (distanceMeters - softMaxMeters) / 1000.0 *
  costPerKilometerAboveSoftMax.

Chi phí phải là số không âm.

BreakRule

Quy tắc tạo thời gian nghỉ cho một xe (ví dụ: thời gian nghỉ trưa). Khoảng nghỉ là một khoảng thời gian liên tục mà trong đó xe vẫn ở trạng thái rảnh tại vị trí hiện tại và không thể thực hiện bất kỳ lượt truy cập nào. Điểm chèn quảng cáo có thể xảy ra:

  • trong quá trình di chuyển giữa hai lượt truy cập (bao gồm cả thời gian ngay trước hoặc ngay sau một lượt truy cập, nhưng không phải giữa một lượt truy cập), trong trường hợp này, thời gian di chuyển tương ứng giữa các lượt truy cập sẽ được kéo dài,
  • hoặc trước khi xe khởi động (xe có thể không khởi động giữa giờ nghỉ), trong trường hợp này, thời gian sạc không ảnh hưởng đến thời gian khởi động xe.
  • hoặc sau khi kết thúc chuyến xe (tương tự như thời gian kết thúc chuyến xe).
Biểu diễn dưới dạng JSON
{
  "breakRequests": [
    {
      object (BreakRequest)
    }
  ],
  "frequencyConstraints": [
    {
      object (FrequencyConstraint)
    }
  ]
}
Trường
breakRequests[]

object (BreakRequest)

Trình tự các điểm chèn quảng cáo. Xem thông báo BreakRequest.

frequencyConstraints[]

object (FrequencyConstraint)

Có thể áp dụng một số FrequencyConstraint. Tất cả các điều kiện này phải được BreakRequest của BreakRule này đáp ứng. Xem FrequencyConstraint.

BreakRequest

Bạn phải biết trước trình tự nghỉ (tức là số lượng và thứ tự) áp dụng cho từng xe. Các BreakRequest lặp lại xác định trình tự đó theo thứ tự mà các BreakRequest đó phải xảy ra. Các khoảng thời gian của chúng (earliestStartTime / latestStartTime) có thể trùng lặp nhưng phải tương thích với thứ tự (điều này được kiểm tra).

Biểu diễn dưới dạng JSON
{
  "earliestStartTime": string,
  "latestStartTime": string,
  "minDuration": string
}
Trường
earliestStartTime

string (Timestamp format)

Bắt buộc. Giới hạn dưới (bao gồm cả giá trị này) tại thời điểm bắt đầu khoảng nghỉ.

Dấu thời gian ở định dạng "Zulu" RFC3339 UTC, có độ phân giải nano giây và tối đa 9 chữ số thập phân. Ví dụ: "2014-10-02T15:01:23Z""2014-10-02T15:01:23.045123456Z".

latestStartTime

string (Timestamp format)

Bắt buộc. Giới hạn trên (bao gồm cả giá trị này) tại thời điểm bắt đầu khoảng nghỉ.

Dấu thời gian ở định dạng "Zulu" RFC3339 UTC, có độ phân giải nano giây và tối đa 9 chữ số thập phân. Ví dụ: "2014-10-02T15:01:23Z""2014-10-02T15:01:23.045123456Z".

minDuration

string (Duration format)

Bắt buộc. Thời lượng tối thiểu của điểm chèn quảng cáo. Phải dương.

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".

FrequencyConstraint

Bạn có thể hạn chế thêm tần suất và thời lượng của các khoảng nghỉ được chỉ định ở trên bằng cách thực thi tần suất nghỉ tối thiểu, chẳng hạn như "Phải có khoảng nghỉ ít nhất 1 giờ mỗi 12 giờ". Giả sử bạn có thể diễn giải điều này là "Trong bất kỳ khoảng thời gian trượt nào là 12 giờ, phải có ít nhất một khoảng nghỉ ít nhất là một giờ", ví dụ đó sẽ được dịch thành FrequencyConstraint sau:

{
   minBreakDuration { seconds: 3600 }         # 1 hour.
   maxInterBreakDuration { seconds: 39600 }  # 11 hours (12 - 1 = 11).
}

Thời gian và thời lượng của các điểm chèn quảng cáo trong giải pháp sẽ tuân thủ tất cả các quy tắc ràng buộc như vậy, ngoài khoảng thời gian và thời lượng tối thiểu đã chỉ định trong BreakRequest.

Trong thực tế, FrequencyConstraint có thể áp dụng cho các khoảng nghỉ không liên tiếp. Ví dụ: lịch biểu sau đây tuân theo ví dụ "1 giờ mỗi 12 giờ":

  04:00 vehicle start
   .. performing travel and visits ..
  09:00 1 hour break
  10:00 end of the break
   .. performing travel and visits ..
  12:00 20-min lunch break
  12:20 end of the break
   .. performing travel and visits ..
  21:00 1 hour break
  22:00 end of the break
   .. performing travel and visits ..
  23:59 vehicle end
Biểu diễn dưới dạng JSON
{
  "minBreakDuration": string,
  "maxInterBreakDuration": string
}
Trường
minBreakDuration

string (Duration format)

Bắt buộc. Thời lượng tối thiểu của điểm chèn quảng cáo cho quy tắc ràng buộc này. Không âm. Xem nội dung mô tả về FrequencyConstraint.

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".

maxInterBreakDuration

string (Duration format)

Bắt buộc. Khoảng thời gian tối đa được phép của bất kỳ khoảng thời gian nào trong tuyến đường không bao gồm ít nhất một phần thời gian nghỉ của duration >= minBreakDuration. Phải dương.

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".

DurationDistanceMatrix

Chỉ định một ma trận thời lượng và khoảng cách từ vị trí bắt đầu chuyến thăm và vị trí bắt đầu của xe đến vị trí kết thúc chuyến thăm và vị trí kết thúc của xe.

Biểu diễn dưới dạng JSON
{
  "rows": [
    {
      object (Row)
    }
  ],
  "vehicleStartTag": string
}
Trường
rows[]

object (Row)

Chỉ định các hàng của ma trận thời lượng và khoảng cách. Mảng này phải có số phần tử bằng ShipmentModel.duration_distance_matrix_src_tags.

vehicleStartTag

string

Thẻ xác định những loại xe áp dụng cho ma trận thời lượng và quãng đường này. Nếu trống, giá trị này sẽ áp dụng cho tất cả xe và chỉ có thể có một ma trận.

Mỗi lần khởi động xe phải khớp chính xác với một ma trận, tức là đúng một trường startTags của chúng phải khớp với vehicleStartTag của một ma trận (và chỉ của ma trận đó).

Tất cả các ma trận phải có vehicleStartTag khác nhau.

Hàng

Chỉ định một hàng của ma trận thời lượng và khoảng cách.

Biểu diễn dưới dạng JSON
{
  "durations": [
    string
  ],
  "meters": [
    number
  ]
}
Trường
durations[]

string (Duration format)

Giá trị thời lượng cho một hàng nhất định. Mảng này phải có số phần tử bằng ShipmentModel.duration_distance_matrix_dst_tags.

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".

meters[]

number

Giá trị khoảng cách cho một hàng nhất định. Nếu không có chi phí hoặc quy tắc ràng buộc nào tham chiếu đến khoảng cách trong mô hình, thì bạn có thể để trống phần tử này; nếu không, phần tử này phải có số phần tử bằng durations.

TransitionAttributes

Chỉ định các thuộc tính của lượt chuyển đổi giữa hai lượt truy cập liên tiếp trên một tuyến đường. Có thể áp dụng nhiều TransitionAttributes cho cùng một quá trình chuyển đổi: trong trường hợp đó, tất cả chi phí bổ sung sẽ được cộng lại và áp dụng quy tắc ràng buộc hoặc giới hạn nghiêm ngặt nhất (tuân theo ngữ nghĩa "AND" tự nhiên).

Biểu diễn dưới dạng JSON
{
  "srcTag": string,
  "excludedSrcTag": string,
  "dstTag": string,
  "excludedDstTag": string,
  "cost": number,
  "costPerKilometer": number,
  "distanceLimit": {
    object (DistanceLimit)
  },
  "delay": string
}
Trường
srcTag

string

Thẻ xác định tập hợp các chuyển đổi (src->dst) mà các thuộc tính này áp dụng.

Một lượt truy cập nguồn hoặc lượt khởi động xe sẽ khớp nếu VisitRequest.tags hoặc Vehicle.start_tags của lượt truy cập đó chứa srcTag hoặc không chứa excludedSrcTag (tuỳ thuộc vào việc hai trường này có trống hay không).

excludedSrcTag

string

Vui lòng xem srcTag. Phải có đúng một trong srcTagexcludedSrcTag không được để trống.

dstTag

string

Lượt truy cập đích hoặc điểm kết thúc của xe sẽ khớp nếu VisitRequest.tags hoặc Vehicle.end_tags chứa dstTag hoặc không chứa excludedDstTag (tuỳ thuộc vào việc hai trường này có trống hay không).

excludedDstTag

string

Vui lòng xem dstTag. Phải có đúng một trong dstTagexcludedDstTag không được để trống.

cost

number

Chỉ định chi phí để thực hiện quá trình chuyển đổi này. Giá trị này có cùng đơn vị với tất cả các chi phí khác trong mô hình và không được âm. Khoản phí này được áp dụng ngoài tất cả các chi phí hiện có khác.

costPerKilometer

number

Chỉ định chi phí trên mỗi km áp dụng cho quãng đường đã đi trong khi thực hiện quá trình chuyển đổi này. Giá trị này cộng với mọi Vehicle.cost_per_kilometer được chỉ định trên xe.

distanceLimit

object (DistanceLimit)

Chỉ định giới hạn về quãng đường đã đi trong khi thực hiện quá trình chuyển đổi này.

Kể từ tháng 6 năm 2021, chúng tôi chỉ hỗ trợ các giới hạn mềm.

delay

string (Duration format)

Chỉ định độ trễ phát sinh khi thực hiện quá trình chuyển đổi này.

Độ trễ này luôn xảy ra sau khi kết thúc lượt truy cập nguồn và trước khi bắt đầu lượt truy cập đí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".

ShipmentTypeIncompatibility

Chỉ định các trường hợp không tương thích giữa các lô hàng tuỳ thuộc vào shipmentType của lô hàng. Việc xuất hiện các lô hàng không tương thích trên cùng một tuyến đường sẽ bị hạn chế dựa trên chế độ không tương thích.

Biểu diễn dưới dạng JSON
{
  "types": [
    string
  ],
  "incompatibilityMode": enum (IncompatibilityMode)
}
Trường
types[]

string

Danh sách các loại không tương thích. Hai lô hàng có shipment_types khác nhau trong số các lô hàng được liệt kê là "không tương thích".

incompatibilityMode

enum (IncompatibilityMode)

Chế độ áp dụng cho trường hợp không tương thích.

IncompatibilityMode

Các chế độ xác định cách hạn chế việc xuất hiện các lô hàng không tương thích trên cùng một tuyến đường.

Enum
INCOMPATIBILITY_MODE_UNSPECIFIED Chế độ không tương thích chưa được chỉ định. Không được sử dụng giá trị này.
NOT_PERFORMED_BY_SAME_VEHICLE Ở chế độ này, hai lô hàng có loại không tương thích không bao giờ có thể dùng chung một xe.
NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY

Đối với hai lô hàng có loại không tương thích với chế độ không tương thích NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY:

  • Nếu cả hai đều chỉ là dịch vụ đến lấy hàng (không giao hàng) hoặc chỉ là dịch vụ giao hàng (không đến lấy hàng), thì chúng hoàn toàn không thể dùng chung một xe.
  • Nếu một trong hai lô hàng được giao và lô còn lại được đến lấy hàng, thì hai lô hàng này có thể dùng chung một xe nếu lô hàng trước được giao trước khi lô hàng sau được đến lấy.

ShipmentTypeRequirement

Chỉ định các yêu cầu giữa các lô hàng dựa trên shipmentType của lô hàng. Thông tin cụ thể của yêu cầu được xác định theo chế độ yêu cầu.

Biểu diễn dưới dạng JSON
{
  "requiredShipmentTypeAlternatives": [
    string
  ],
  "dependentShipmentTypes": [
    string
  ],
  "requirementMode": enum (RequirementMode)
}
Trường
requiredShipmentTypeAlternatives[]

string

Danh sách các loại phương thức vận chuyển thay thế mà dependentShipmentTypes yêu cầu.

dependentShipmentTypes[]

string

Tất cả các lô hàng có loại trong trường dependentShipmentTypes đều yêu cầu ít nhất một lô hàng thuộc loại requiredShipmentTypeAlternatives được ghé thăm trên cùng một tuyến đường.

LƯU Ý: Không được phép tạo chuỗi yêu cầu như shipmentType phụ thuộc vào chính nó.

requirementMode

enum (RequirementMode)

Chế độ áp dụng cho yêu cầu.

RequirementMode

Các chế độ xác định giao diện của các lô hàng phụ thuộc trên một tuyến.

Enum
REQUIREMENT_MODE_UNSPECIFIED Chế độ yêu cầu không xác định. Không được sử dụng giá trị này.
PERFORMED_BY_SAME_VEHICLE Ở chế độ này, tất cả các lô hàng "phụ thuộc" phải dùng chung một xe với ít nhất một lô hàng "bắt buộc".
IN_SAME_VEHICLE_AT_PICKUP_TIME

Với chế độ IN_SAME_VEHICLE_AT_PICKUP_TIME, tất cả các lô hàng "phụ thuộc" cần có ít nhất một lô hàng "bắt buộc" trên xe tại thời điểm lấy hàng.

Do đó, một đơn hàng đến lấy hàng "phụ thuộc" phải có:

  • Một lô hàng "bắt buộc" chỉ giao hàng được giao trên tuyến sau, hoặc
  • Lô hàng "bắt buộc" được lấy trên tuyến trước đó và nếu lô hàng "bắt buộc" có giao hàng, thì lô hàng này phải được giao sau khi lấy lô hàng "phụ thuộc".
IN_SAME_VEHICLE_AT_DELIVERY_TIME Tương tự như trước, ngoại trừ các lô hàng "phụ thuộc" cần có một lô hàng "bắt buộc" trên xe tại thời điểm giao hàng.

PrecedenceRule

Quy tắc ưu tiên giữa hai sự kiện (mỗi sự kiện là một lần lấy hàng hoặc giao hàng): sự kiện "thứ hai" phải bắt đầu ít nhất offsetDuration sau khi sự kiện "thứ nhất" bắt đầu.

Một số mức độ ưu tiên có thể tham chiếu đến cùng một sự kiện (hoặc sự kiện có liên quan), ví dụ: "lấy hàng B sau khi giao hàng A" và "lấy hàng C sau khi lấy hàng B".

Hơn nữa, thứ tự ưu tiên chỉ áp dụng khi cả hai lô hàng đều được thực hiện, nếu không thì sẽ bị bỏ qua.

Biểu diễn dưới dạng JSON
{
  "firstIsDelivery": boolean,
  "secondIsDelivery": boolean,
  "offsetDuration": string,
  "firstIndex": integer,
  "secondIndex": integer
}
Trường
firstIsDelivery

boolean

Cho biết liệu sự kiện "đầu tiên" có phải là một lượt phân phối hay không.

secondIsDelivery

boolean

Cho biết liệu sự kiện "thứ hai" có phải là một lượt phân phối hay không.

offsetDuration

string (Duration format)

Độ lệch giữa sự kiện "đầu tiên" và sự kiện "thứ hai". Giá trị này có thể là âm.

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".

firstIndex

integer

Chỉ mục lô hàng của sự kiện "đầu tiên". Bạn phải chỉ định trường này.

secondIndex

integer

Chỉ mục lô hàng của sự kiện "thứ hai". Bạn phải chỉ định trường này.