ShipmentModel

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

  • chi phí định tuyến phương tiện (tổng chi phí trên tổng thời gian, chi phí mỗi thời gian di chuyển và chi phí cố định cho tất cả các phương tiện).
  • các hình phạt giao hàng không thực hiện.
  • chi phí vận chuyển trên toàn cầu
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 phương tiện có thể dùng để tham quan.

globalStartTime

string (Timestamp format)

Thời gian bắt đầu và kết thúc chung của mô hình: không thời điểm nào nằm ngoài phạm vi này có thể đượ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 không quá 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 cho ngày đó). Nếu bạn không đặt chính sách này, thì hệ thống sẽ dùng 00:00:00 giờ UTC, ngày 1 tháng 1 năm 1970 (tức là giây: 0, nanos: 0) làm mặc định.

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

globalEndTime

string (Timestamp format)

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

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

globalDurationCostPerHour

number

"Thời lượng trên toàn cầu" 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 gần đây nhất của tất cả các phương tiện. Chẳng hạn, người dùng có thể gán chi phí mỗi giờ cho số lượng đó để cố gắng và 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ù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 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 thể là đúng và cả durationDistanceMatrixSrcTags hay durationDistanceMatrixDstTags đều không thể trống.

Ví dụ về cách 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 ghé thăm để đế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 "fast" (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 "fast" (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 thời lượng và ma trận 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.

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

durationDistanceMatrixDstTags[]

string

Các thẻ xác định đích đến của thời lượng và ma trận 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 (khoảng cách tương ứng) của hành trình từ lượt truy cập có thẻ durationDistanceMatrixSrcTags(j) đến lượt truy cập có thẻ durationDistanceMatrixDstTags(k) trong ma trận i.

Các thẻ tương ứng với VisitRequest.tags hoặc Vehicle.start_tags. VisitRequest hoặc Vehicle đã cho phải khớp chính xác với một thẻ trong trường này. Hãy lưu ý rằng thẻ nguồn, thẻ đích và thẻ ma trận của Vehicle có thể giống nhau; tương tự như thẻ nguồn và thẻ đích của VisitRequest có thể giống nhau. Tất cả các thẻ phải khác nhau và không được là chuỗi trống. Nếu không trống trường này thì durationDistanceMatrices cũng 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)

Tập hợp các loại lô hàng không tương thích (xem ShipmentTypeIncompatibility).

shipmentTypeRequirements[]

object (ShipmentTypeRequirement)

Nhóm yêu cầu về shipmentType (xem ShipmentTypeRequirement).

precedenceRules[]

object (PrecedenceRule)

Tập hợp các quy tắc về mứ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 xe đang hoạt động. Một chiếc xe đang hoạt động nếu tuyến đường của xe đó thực hiện ít nhất một lần vận chuyển. Bạn có thể dùng tính năng này để giới hạn số tuyến đường trong trường hợp có ít người lái xe hơn phương tiện và nhóm phương tiện không đồng nhất. Sau đó, tính năng tối ưu hoá sẽ chọn ra nhóm xe tốt nhất để sử dụng. Phải hoàn toàn tích cực.

Lô hàng

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

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. Mã này có thể dài tối đa 63 ký tự và có thể sử dụng các ký tự UTF-8.

pickups[]

object (VisitRequest)

Tập hợp các phương án đến lấy hàng 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 chuyến giao hàng.

deliveries[]

object (VisitRequest)

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

loadDemands

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

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

Đối tượng chứa danh sách các cặp "key": value. Ví dụ: { "name": "wrench", "mass": "1.3kg", "count": "3" }.

allowedVehicleIndices[]

integer

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

costsPerVehicle[]

number

Cho biết chi phí phát sinh khi từng xe giao hàng này. Nếu được chỉ định, thì lớp này phải có KHÔNG:

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

Những chi phí này phải có cùng đơn vị với penaltyCost và không được là số âm. Hãy để trống trường này nếu không có những chi phí như vậy.

costsPerVehicleIndices[]

integer

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

pickupToDeliveryAbsoluteDetourLimit

string (Duration format)

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

Ví dụ: Hãy là thời gian ngắn nhất cần thiết để chuyển thẳng từ phương thức đến lấy hàng đã chọn đến phương thức giao hàng khác đã chọn. Sau đó, chế độ cài đặt 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 trong cùng một lô hàng, thì giới hạn ràng buộc hơn sẽ được dùng cho mỗi cặp tính năng đến lấy hàng/giao hàng. Kể từ năm 2017/10, đường vòng chỉ được hỗ trợ khi thời gian di chuyển không phụ thuộc vào phương tiện.

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

pickupToDeliveryTimeLimit

string (Duration format)

Chỉ định khoảng thời gian tối đa từ khi bắt đầu đến lấy hàng cho đến khi bắt đầu giao một lô hàng. Nếu được chỉ định, thì giá trị này không được là số âm, đồng thời lô hàng tối thiểu phải chứa một hàng đến lấy hàng và một mặt hàng giao tận nơi. Điều này không phụ thuộc vào việc lựa chọn phương án thay thế nào cho tính năng đến lấy hàng và giao hàng, cũng như tốc độ của xe. Điều này có thể được chỉ định cùng với các hạn chế đường vòng 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 với 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. Có thể dùng tính năng này để xác định tình trạng không tương thích hoặc các yêu cầu giữa shipment_types (xem shipmentTypeIncompatibilitiesshipmentTypeRequirements trong ShipmentModel).

Các điểm khác biệt so với visitTypes được chỉ định cho một lượt truy cập: Tất cả các hình thức đến lấy hàng/giao hàng thuộc cùng một lô hàng đều có cùng shipmentType.

label

string

Chỉ định một 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 đừng áp dụng penaltyCost.

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

Cho phép bỏ qua một lô hàng được thực hiện trong injectedFirstSolutionRoutes hoặc injectedSolutionConstraint; trình giải quyết sẽ xóa các lượt truy cập đến lấy hàng/giao hàng liên quan khỏi tuyến đường đang 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 không hoàn thành quá trình vận chuyển, hình phạt này sẽ được cộng vào tổng chi phí của các tuyến đường. Một lô hàng được coi là đã hoàn tất nếu khách hàng truy cập một trong các lựa chọn thay thế đến lấy hàng và giao hàng. Chi phí có thể được biểu thị bằng cùng một đơn vị dùng cho tất cả các trường liên quan đến chi phí khác 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ô hạn, tức là bạn phải hoàn tất quá trình vận chuyển.

pickupToDeliveryRelativeDetourLimit

number

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

Ví dụ: Hãy là thời gian ngắn nhất cần thiết để chuyển thẳng từ phương thức đến lấy hàng đã chọn đến phương thức giao hàng khác đã chọn. Sau đó, chế độ cài đặt 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 trong cùng một lô hàng, thì giới hạn ràng buộc hơn sẽ được dùng cho mỗi cặp tính năng đến lấy hàng/giao hàng. Kể từ năm 2017/10, đường vòng chỉ được hỗ trợ khi thời gian di chuyển không phụ thuộc vào phương tiện.

VisitRequest

Yêu cầu ghé thăm mà có thể thực hiện bằng phương tiện di chuyển: xe 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 thể hiện bằng cửa sổ thời gian và thời gian sử dụng dịch vụ (thời gian mà phương tiện đã sử dụng để đế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ý mà xe đến khi thực hiện VisitRequest này. Nếu mô hình vận chuyển có ma trận khoảng cách thời gian, bạn không được chỉ định arrivalLocation.

arrivalWaypoint

object (Waypoint)

Điểm tham chiếu nơi xe đến khi thực hiện VisitRequest này. Nếu mô hình vận chuyển có ma trận khoảng cách 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 thành VisitRequest này. Có thể bỏ qua nếu giống với arrivalLocation. Nếu mô hình vận chuyển có ma trận khoảng cách thời gian, bạn không được chỉ định departureLocation.

departureWaypoint

object (Waypoint)

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

tags[]

string

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

timeWindows[]

object (TimeWindow)

Khoảng thời gian ràng buộc thời gian đến tại lượt ghé thăm. Xin lưu ý rằng xe có thể khởi hành ngoài khung thời gian đến, tức là thời gian đến + thời gian không cần nằm trong khung thời gian đó. Việc này có thể khiến xe phải chờ nếu đến nơi trước TimeWindow.start_time.

Việc không có TimeWindow có nghĩa là xe có thể thực hiện lượt ghé thăm này bất cứ lúc nào.

Các cửa sổ thời gian phải rời rạc, tức là không có khoảng thời gian nào phải chồng chéo hoặc liền kề với một khoảng thời gian khác và chúng phải 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 gian ghé thăm, tức là thời gian mà phương tiện đã đi từ lúc đến nơi đến lúc khởi hành (để cộng vào thời gian chờ có thể áp dụng, vui lòng xem phần timeWindows).

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

cost

number

Chi phí phục vụ yêu cầu ghé thăm này trên một tuyến xe. Phương thức này có thể dùng để thanh toán các chi phí khác nhau cho mỗi lần đến lấy hàng hoặc giao hàng thay thế. Chi phí này phải cùng đơn vị với Shipment.penalty_cost và không được là số âm.

loadDemands

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

Tải các nhu 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 nhu cầu được liệt kê ở đây sẽ được thêm vào các nhu cầu được liệt kê trong Shipment.load_demands.

Đối tượng chứa danh sách các cặp "key": value. Ví dụ: { "name": "wrench", "mass": "1.3kg", "count": "3" }.

visitTypes[]

string

Xác định loại lượt truy cập. Việc này có thể dùng để phân bổ thêm thời gian cần thiết cho việc đi xe để hoàn thành lượt tham quan 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 một nhãn cho VisitRequest này. Nhãn này được báo cáo trong phản hồi là visitLabel trong ShipmentRoute.Visit tương ứng.

LatLng

Một đối tượng đại diện cho cặp vĩ độ/kinh độ. Thuộc tính này được biểu thị dưới dạng một cặp đôi đại diện cho độ vĩ độ và kinh độ. 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 theo độ. Giá trị phải nằm trong phạm vi [-90.0, +90.0].

longitude

number

Kinh độ tính theo độ. Giá trị phải nằm trong phạm vi [-180.0, +180.0].

Waypoint

Đóng gói một điểm tham chiếu. Điểm tham chiếu đá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 Phương tiện vận chuyển.

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 tham chiếu này nhằm tuỳ chọn cho 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í bị lệch so với giữa đường. Tùy chọn này không hoạt động cho chế độ đi lại "WALKING".

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

object (Location)

Điểm được chỉ định bằng toạ độ địa lý, bao gồm cả tiêu đề tuỳ chọn.

placeId

string

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

Vị trí

Đóng gói vị trí (đ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 tham chiếu.

heading

integer

Hướng la bàn được liên kết với hướng của luồng giao thông. Giá trị này được sử dụng để chỉ định lề đường dùng để đón và trả xe. Giá trị tiêu đề có thể từ 0 đến 360, trong đó 0 chỉ định tiêu đề của phía Bắc, 90 chỉ định tiêu đề của phía Đông, v.v.

TimeWindow

Khung 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 khi ghé thăm, hoặc thời gian bắt đầu và kết thúc của xe.

Các giới hạn về khung thời gian cố định, startTimeendTime, thực thi thời gian sớm nhất và muộn nhất của sự kiện, sao cho startTime <= event_time <= endTime. Giới hạn dưới của khung thời gian mềm (softStartTime) thể hiện lựa chọn ưu tiên cho sự kiện này xảy ra vào lúc hoặc sau softStartTime bằng cách phát sinh chi phí tỷ lệ với thời gian trước khi sự kiện bắt đầu xảy ra trong thời gian mềm. Giới hạn trên của khung thời gian mềm (softEndTime) thể hiện lựa chọn ưu tiên để sự kiện xảy ra vào lúc hoặc trước softEndTime bằng cách phát sinh chi phí tỷ lệ với khoảng thời gian sau khi sự kiện xảy ra softEndTime. 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` <= `softStartTime` <= `endTime` and
  0 <= `startTime` <= `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 khung thời gian khó. Nếu bạn không chỉ định, thuộc tính này sẽ được đặt thành ShipmentModel.global_start_time.

Dấu thời gian ở định dạng "Zulu" RFC3339 UTC, với độ phân giải nano giây và tối đa 9 chữ số phân số. 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 khó khăn. Nếu bạn không chỉ định, thuộc tính này sẽ được đặt thành ShipmentModel.global_end_time.

Dấu thời gian ở định dạng "Zulu" RFC3339 UTC, với độ phân giải nano giây và tối đa 9 chữ số phân số. 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 khung thời gian.

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

softEndTime

string (Timestamp format)

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

Dấu thời gian ở định dạng "Zulu" RFC3339 UTC, với độ phân giải nano giây và tối đa 9 chữ số phân số. 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 phần mềm 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ếu đã đặt softEndTime.

Loại xe

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

Biểu diễn dưới dạng JSON
{
  "displayName": string,
  "travelMode": enum (TravelMode),
  "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ị của chiếc xe do người dùng xác định. Mã này có thể dài tối đa 63 ký tự và có thể sử dụng các ký tự UTF-8.

travelMode

enum (TravelMode)

Chế độ di chuyển ảnh hưởng đến đường mà xe có thể sử dụng cũng như tốc độ của xe. Xem thêm travelDurationMultiple.

startLocation

object (LatLng)

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

startWaypoint

object (Waypoint)

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

endLocation

object (LatLng)

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

endWaypoint

object (Waypoint)

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

startTags[]

string

Chỉ định các thẻ được gắn vào đầu tuyến đường của xe.

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

endTags[]

string

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

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

startTimeWindows[]

object (TimeWindow)

Khoảng thời gian mà xe có thể khởi hành từ vị trí bắt đầu. Các hạn mức này phải nằm trong giới hạn thời gian trên toàn cầu (xem các trường ShipmentModel.global_*). Nếu bạn không chỉ định thì sẽ không có giới hạn nào khác ngoài những giới hạn về thời gian trên toàn cầu.

Các khoảng thời gian thuộc cùng một trường lặp lại phải rời rạc, tức là không có khoảng thời gian nào có thể trùng lặp hoặc liền kề với một trường khác và phải theo trình 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 điểm cuối. Các hạn mức này phải nằm trong giới hạn thời gian trên toàn cầu (xem các trường ShipmentModel.global_*). Nếu bạn không chỉ định thì sẽ không có giới hạn nào khác ngoài những giới hạn về thời gian trên toàn cầu.

Các khoảng thời gian thuộc cùng một trường lặp lại phải rời rạc, tức là không có khoảng thời gian nào có thể trùng lặp hoặc liền kề với một trường khác và phải theo trình 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 huỷ tải được thực thi trên xe.

loadLimits

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

Tải trọng của xe (ví dụ: trọng lượng, thể tích, số kệ). 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, dung lượng tương ứng được coi là không giới hạn.

Đối tượng chứa danh sách các cặp "key": value. Ví dụ: { "name": "wrench", "mass": "1.3kg", "count": "3" }.

costPerHour

number

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

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

costPerTraveledHour

number

Chi phí mỗi giờ đi lại của tuyến đường xe. Chi phí này chỉ được áp dụng cho thời gian đi lại trong tuyến đường (tức là được báo cáo vào 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 của tuyến đường xe. Chi phí này được áp dụng cho quãng đường được báo cáo trong ShipmentRoute.transitions và không áp dụng cho bất kỳ quãng đường nào được ngầm định đi từ arrivalLocation đến departureLocation của một VisitRequest.

fixedCost

number

Áp dụng chi phí cố định nếu xe này được dùng để bốc hàng.

usedIfRouteIsEmpty

boolean

Trường này chỉ áp dụng cho các xe khi tuyến đường của những phương tiện đó không phục vụ bất kỳ chuyến hàng nào. Cột này cho biết trong trường hợp này, xe có được coi là đã qua sử dụng hay không.

Nếu đúng, chiếc xe sẽ đi từ điểm xuất phát đến điểm cuối ngay cả khi không phục vụ bất kỳ chuyến hàng nào. Ngoài ra, chi phí thời gian và quãng đường tính từ lúc bắt đầu đến điểm cuối sẽ được tính đến.

Nếu không, xe sẽ không di chuyển từ điểm bắt đầu đến vị trí kết thúc, và không có breakRule hoặc trì hoãn (từ TransitionAttributes) đượ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ỉ số và nhãn của xe.

routeDurationLimit

object (DurationLimit)

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

travelDurationLimit

object (DurationLimit)

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

routeDistanceLimit

object (DistanceLimit)

Giới hạn được áp dụng cho tổng quãng đường theo tuyến đường của xe. Trong một OptimizeToursResponse nhất định, khoảng cách 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 bản đồ từ các chuỗi visitTypes đến thời lượng. Đây là thời gian (ngoài VisitRequest.duration) được thực hiện tại các lượt truy cập bằng visitTypes đã 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 ghé thăm có nhiều loại, thì một khoảng thời gian sẽ được thêm cho mỗi loại trên bản đồ.

Đối tượng chứa danh sách các cặp "key": value. Ví dụ: { "name": "wrench", "mass": "1.3kg", "count": "3" }.

breakRule

object (BreakRule)

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

label

string

Chỉ định một 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à chiếc xe này sẽ vẫn không được sử dụng.

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

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

travelDurationMultiple

number

Chỉ định một hệ số nhân có thể dùng để tăng hoặc giảm thời gian di chuyển của xe này. Ví dụ: Nếu bạn đặt giá trị này thành 2.0, thì phương tiện này chậm hơn và có thời gian di chuyển gấp đôi so với xe tiêu chuẩn. Bội số này không ảnh hưởng đến thời lượng truy cập. Giá trị này có ả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,0]. Nếu bạn không đặt thì xe 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 số nào, do đó, việc tăng một bội số nhỏ có thể làm mất độ chính xác.

Xem thêm extraVisitDurationForVisitType dưới đây.

TravelMode

Những phương tiện đi lại mà xe có thể sử dụng.

Các chế độ này sẽ nằm trong các chế độ đi lại ưu tiên của API Tuyến đường Google Maps trên nền tảng Google Maps. Hãy xem bài viết: https://developers.google.com/maps/documentation/routes_preferred/reference/rest/Shared.Types/RouteTravelMode.

Enum
TRAVEL_MODE_UNSPECIFIED Phương tiện đi lại chưa được chỉ định, tương đương với DRIVING.
DRIVING Chế độ đi lại tương ứng với chỉ đường lái xe (ô tô, ...).
WALKING Chế độ đi lại tương ứng với chỉ đường đi bộ.

UnloadingPolicy

Chính sách về cách dỡ xe. Chỉ áp dụng cho những lô hàng có cả hình thức đến lấy hàng và giao hàng.

Các quá trình vận chuyển khác có thể diễn ra ở bất kỳ đâu trên tuyến đường mà không phụ thuộc vào unloadingPolicy.

Enum
UNLOADING_POLICY_UNSPECIFIED Chính sách dỡ hàng chưa được chỉ định; quá trình giao hàng chỉ được diễn ra sau thời điểm đến lấy hàng tương ứng.
LAST_IN_FIRST_OUT Quá trình giao hàng phải diễn ra theo thứ tự đến lấy hàng đảo ngược
FIRST_IN_FIRST_OUT Giao hàng phải diễn ra theo cùng thứ tự với đơn đặt hàng tự đến lấy

LoadLimit

Xác định giới hạn tải trọng áp dụng cho xe, ví dụ: "xe tải này chỉ có thể chở tối đa 3.500 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 tạm thời của tải. Vui lòng xem costPerUnitAboveSoftMax.

costPerUnitAboveSoftMax

number

Nếu tải trọng vượt quá softMaxLoad dọc theo tuyến đường của xe này, mức phạt chi phí sau đây sẽ áp dụng (chỉ một lần cho mỗi xe): (tải trọng – softMaxLoad) * costPerUnitAboveSoftMax. Tất cả chi phí cộng lại và phải 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 khi bắt đầu tuyến đường.

endLoadInterval

object (Interval)

Khoảng thời gian cho phép của xe khi kết thúc tuyến đường.

maxLoad

string (int64 format)

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

Khoảng thời gian

Khoảng thời gian của các mức tải chấp nhận được.

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

string (int64 format)

Tải trọng tối thiểu chấp nhận được. Phải ≥ 0. Nếu bạn chỉ định cả hai giá trị, thì min phải ≤ max.

max

string (int64 format)

Tải trọng tối đa chấp nhận được. Phải ≥ 0. Nếu bạn chưa chỉ định, thông báo này sẽ không hạn chế tải tối đa. Nếu bạn chỉ định cả hai giá trị, thì 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 xe. Nó có thể cứng hoặc mềm.

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

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)

Một giới hạn cố định để ràng buộc thời lượng tối đa là maxDuration.

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

softMaxDuration

string (Duration format)

Giới hạn tạm thời không áp dụng giới hạn thời lượng tối đa, nhưng khi vi phạm sẽ làm phát sinh chi phí cho tuyến đườ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 đơn vị.

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

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

quadraticSoftMaxDuration

string (Duration format)

Giới hạn tạm thời không áp dụng giới hạn thời lượng tối đa, nhưng khi bạn vi phạm, tuyến đường sẽ phát sinh chi phí theo bậc hai trong thời lượng này. 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 đơ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à mức 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 với 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 bạn vi phạm ngưỡng softMaxDuration. Chi phí bổ sung bằng 0 nếu thời lượng nằm dưới ngưỡng, nếu không, chi phí phụ thuộc vào khoảng thời gian như sau:

  costPerHourAfterSoftMax * (duration - softMaxDuration)

Chi phí không được là số âm.

costPerSquareHourAfterQuadraticSoftMax

number

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

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

  costPerSquareHourAfterQuadraticSoftMax *
  (duration - quadraticSoftMaxDuration)^2

Chi phí không được là số âm.

DistanceLimit

Giới hạn xác định quãng đường tối đa mà bạn có thể đi được. Nó có thể cứng hoặc mềm.

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

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

string (int64 format)

Một giới hạn cố định ràng buộc khoảng cách ở mức tối đa là maxMeters. Giới hạn này không được là số âm.

softMaxMeters

string (int64 format)

Giới hạn tạm thời không áp dụng giới hạn khoảng cách tối đa, nhưng khi vi phạm sẽ dẫn đến chi phí cộng với các chi phí khá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à không được là số âm.

costPerKilometerAboveSoftMax

number

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

  (distanceMeters - softMaxMeters) / 1000.0 *
  costPerKilometerAboveSoftMax.

Chi phí không được là số âm.

BreakRule

Quy tắc tạo thời gian nghỉ trên xe (ví dụ: giờ nghỉ ăn trưa). Nghỉ giải lao là một khoảng thời gian liền nhau, trong đó xe không hoạt động ở vị trí hiện tại và không thể ghé thăm. Có thể xảy ra ngắt:

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

object (BreakRequest)

Thứ tự ngắt quảng cáo. Xem thông báo BreakRequest.

frequencyConstraints[]

object (FrequencyConstraint)

Một số FrequencyConstraint có thể áp dụng. Tất cả họ phải được BreakRequest của BreakRule này đáp ứng. Vui lòng xem FrequencyConstraint.

BreakRequest

Bạn phải biết trước trình tự các điểm nghỉ (tức là số lượng và thứ tự của các điểm nghỉ) áp dụng cho từng xe. BreakRequest lặp lại xác định trình tự đó theo thứ tự xuất hiện. Khung thời gian của những đơn đặt hàng này (earliestStartTime / latestStartTime) có thể trùng nhau, nhưng chúng phải tương thích với thứ tự (đã đánh dấu vào ô này).

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) khi bắt đầu điểm chèn.

Dấu thời gian ở định dạng "Zulu" RFC3339 UTC, với độ phân giải nano giây và tối đa 9 chữ số phân số. 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) ở đầu điểm chèn.

Dấu thời gian ở định dạng "Zulu" RFC3339 UTC, với độ phân giải nano giây và tối đa 9 chữ số phân số. 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 chèn tối thiểu. Phải dương.

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

FrequencyConstraint

Người ta có thể ràng buộc hơn nữa tần suất và thời lượng ngắt quãng được quy định ở trên, bằng cách áp dụng tần suất ngắt tối thiểu, chẳng hạn như "Phải nghỉ ít nhất 1 giờ mỗi 12 giờ". Giả sử điều này có thể được hiểu là "Trong khoảng thời gian trượt bất kỳ là 12 giờ, phải có ít nhất một điểm ngắt ít nhất một giờ", ví dụ đó sẽ chuyển 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 trong giải pháp sẽ tuân theo tất cả các điều kiện ràng buộc đó, ngoài khoảng thời gian và thời lượng tối thiểu đã được chỉ định trong BreakRequest.

Trong thực tế, FrequencyConstraint có thể áp dụng cho các điểm chèn 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 chèn tối thiểu 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 với 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 trên tuyến đường không bao gồm điểm ngắt một phần là duration >= minBreakDuration. Phải dương.

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

DurationDistanceMatrix

Nêu rõ ma trận thời lượng và khoảng cách từ vị trí ghé thăm và vị trí bắt đầu phương tiện để đến và điểm cuối phương tiện.

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 thời lượng và ma trận khoảng cách. Tham số này phải có nhiều phần tử nhất là ShipmentModel.duration_distance_matrix_src_tags.

vehicleStartTag

string

Thẻ xác định phương tiện sẽ áp dụng thời lượng và ma trận khoảng cách này. Nếu trống, thuộc tính này sẽ áp dụng cho tất cả xe và chỉ có thể có một ma trận duy nhất.

Mỗi lần khởi động xe phải khớp với đúng một ma trận, tức là một trong các trường startTags của xe 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ó một vehicleStartTag khác nhau.

Hàng

Chỉ định một hàng gồm 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. Tham số này phải có nhiều phần tử nhất là ShipmentModel.duration_distance_matrix_dst_tags.

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

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 điều kiện 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 trường này; nếu không thì giá trị này phải có nhiều phần tử nhất là durations.

TransitionAttributes

Chỉ định các thuộc tính chuyển đổi giữa hai lượt truy cập liên tiếp trên một tuyến. Nhiều TransitionAttributes có thể áp dụng cho cùng một lượt chuyển đổi: trong trường hợp đó, mọi chi phí phát sinh sẽ tăng thêm và áp dụng ràng buộc hoặc giới hạn nghiêm ngặt nhất (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

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

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

excludedSrcTag

string

Vui lòng xem srcTag. Không được để trống chính xác một trong hai thuộc tính srcTagexcludedSrcTag.

dstTag

string

Lượt ghé thăm điểm đến hoặc điểm cuối của phương tiện khớp với VisitRequest.tags hoặc Vehicle.end_tags của nó chứa dstTag hoặc không chứa excludedDstTag (tuỳ thuộc vào trường nào trong hai trường này không được để trống).

excludedDstTag

string

Vui lòng xem dstTag. Không được để trống chính xác một trong hai thuộc tính dstTagexcludedDstTag.

cost

number

Chỉ định chi phí để thực hiện quá trình chuyển đổi này. Chi phí này bằng với đơn vị của tất cả các chi phí khác trong mô hình và không được là số âm. Chi phí này được áp dụng trên tất cả các chi phí hiện có khác.

costPerKilometer

number

Chỉ định chi phí mỗi km được áp dụng cho khoảng cách đã đi trong khi thực hiện chuyển đổi này. Giá trị này cộng lại tối đa là Vehicle.cost_per_kilometer được chỉ định trên xe.

distanceLimit

object (DistanceLimit)

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

Kể từ năm 2021/06, chỉ hỗ trợ giới hạn tạm thời.

delay

string (Duration format)

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

Sự chậm 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 điểm đến.

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

ShipmentTypeIncompatibility

Chỉ định việc không tương thích giữa các lô hàng tuỳ thuộc vào loại lô hàng của chú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 dữ liệu không tương thích. Hai lô hàng có shipment_types khác nhau trong số các gói hàng được liệt kê là "không tương thích".

incompatibilityMode

enum (IncompatibilityMode)

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

IncompatibilityMode

Chế độ xác định cách hạn chế việc xuất hiện của 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 chỉ định. Tuyệt đối không 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 sẽ không bao giờ được 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ỉ sử dụng dịch vụ đến lấy hàng (không có dịch vụ giao hàng) hoặc chỉ có dịch vụ giao hàng (không có phương thức đến lấy hàng), thì cả hai đều không thể dùng chung một phương tiện.
  • Nếu một trong hai lô hàng có dịch vụ giao hàng và lô hàng còn lại có thể đến lấy hàng, thì hai lô hàng đó có thể sử dụng chung một phương tiện, nếu lô hàng cũ được giao trước khi lô hàng thứ hai được đến lấy hàng.

ShipmentTypeRequirement

Nêu các yêu cầu giữa các lô hàng dựa trêndeliveryType. Các chi tiết cụ thể của yêu cầu được xác định bằng 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 vận chuyển thay thế theo yêu cầu của dependentShipmentTypes.

dependentShipmentTypes[]

string

Tất cả các lô hàng có loại trong trường dependentShipmentTypes đều cần phải truy cập ít nhất một lô hàng loại requiredShipmentTypeAlternatives trên cùng một tuyến đường.

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

requirementMode

enum (RequirementMode)

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

RequirementMode

Phương thức xác định sự xuất hiện của các lô hàng phụ thuộc trên một tuyến đường.

Enum
REQUIREMENT_MODE_UNSPECIFIED Chế độ yêu cầu chưa được chỉ định. Tuyệt đối không 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" đều phải sử dụng chung một phương tiện với ít nhất một trong số các 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" đều cần có ít nhất một lô hàng "bắt buộc" trên xe tại thời điểm đến lấy hàng.

Do đó, dịch vụ đến lấy hàng "phụ thuộc" phải có:

  • Một lô hàng "bắt buộc" chỉ có thể giao hàng và được giao trên tuyến đường sau đó, hoặc
  • Lô hàng "bắt buộc" được đến lấy trên tuyến đường trước đó. Nếu lô hàng "bắt buộc" có hàng được giao, thì lô hàng này phải được thực hiện sau lần đến lấy hàng "phụ thuộc".
IN_SAME_VEHICLE_AT_DELIVERY_TIME Giống như trước đây, 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 của họ 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à đợt đến lấy hàng hoặc giao một lô hàng): sự kiện "thứ hai" phải bắt đầu ít nhất offsetDuration sau khi "đầu tiên" bắt đầu.

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

Hơn nữa, các mức độ ưu tiên chỉ áp dụng khi thực hiện cả hai quá trình vận chuyển và bỏ qua các trường hợp khác.

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ần phân phối hay không.

secondIsDelivery

boolean

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

offsetDuration

string (Duration format)

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

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

firstIndex

integer

Chỉ số vận chuyển của sự kiện "đầu tiên". Trường này phải được chỉ định.

secondIndex

integer

Chỉ số vận chuyển của sự kiện "thứ hai". Trường này phải được chỉ định.