Cửa sổ thời gian

Khung thời gian có trong `ShipmentModel`, trong `Shipment` trong các đối tượng nhận hàng và giao hàng, cũng như trong `Vehicle`.

Khung thời gian chỉ định thời gian cho các sự kiện trên một tuyến đường. Những sự kiện này có thể bao gồm thời gian bắt đầu và kết thúc tuyến đường của người lái xe, thời gian nhận và giao hàng theo lịch hoặc thời lượng của toàn bộ tuyến đường.

Khung thời gian có thể hỗ trợ các mục tiêu như:

  • Ưu tiên hoàn tất việc đến lấy và giao hàng trong khung thời gian quy định.
  • Lập kế hoạch tuyến đường để hoạt động trong giờ làm việc chung.
  • Đảm bảo xe bắt đầu và kết thúc tuyến đường trong khung thời gian đã chỉ định.

Cấu trúc

Như minh hoạ trong sơ đồ, các khoảng thời gian có cấu trúc như sau:

  • globalStartTimeglobalEndTime là các thuộc tính của ShipmentModel
  • timeWindows là các thuộc tính của:
    • pickups bên trong Shipment.
    • deliveries bên trong Shipment.
  • startTimeWindowsendTimeWindows là các thuộc tính của Vehicle.

Danh sách kiểm tra Essentials

Thuộc tính

Bảng sau đây mô tả các thuộc tính của khung thời gian chung.

Thuộc tính Định dạng Mô tả
globalStartTime Timestamp Thời gian sớm nhất cho mọi sự kiện.
globalEndTime Timestamp Thời gian muộn nhất cho mọi sự kiện.

Bảng sau đây mô tả các thuộc tính của khung thời gian trong lô hàng và xe.

Cha mẹ Thuộc tính Định dạng Mô tả
Shipment.pickups timeWindows Mảng gồm các loại thông báo TimeWindow. Chỉ định khoảng thời gian đến lấy hàng của lô hàng.
Shipment.deliveries timeWindows Chỉ định khoảng thời gian giao hàng.
Vehicle startTimeWindows Chỉ định thời gian bắt đầu cho lịch hoạt động của xe.
endTimeWindows Chỉ định thời gian kết thúc của lịch hoạt động của xe.

Bảng sau đây mô tả các thuộc tính của loại thông báo TimeWindow.

Thuộc tính Định dạng Mô tả
startTime Chuỗi (định dạng "Zulu" RFC3339 UTC) Thời điểm bắt đầu của một khung thời gian.
endTime Chuỗi (định dạng "Zulu" RFC3339 UTC) Thời điểm kết thúc của một khoảng thời gian.

Ví dụ

Phần này trình bày 3 loại ví dụ:

Mã mẫu

Các phần sau đây cho thấy các mẫu mã của nhiều loại khung thời gian.

Khoảng thời gian toàn cầu

Mã mẫu sau đây cho thấy cấu trúc của các khung thời gian chung:

{
  "model": {
    "globalStartTime": "YYYY-MM-DDTHH:MM:SSZ",
    "globalEndTime": "YYYY-MM-DDTHH:MM:SSZ",
    "shipments": [ ... ],
    "vehicles": [ ... ]
  }
}

Khung giờ đến lấy hàng và giao hàng

Mã mẫu sau đây cho thấy cấu trúc của các khung thời gian trong các lần lấy và giao hàng của một lô hàng:

{
  "model": {
    "shipments": [
      {
        "pickups": [
          {
            "timeWindows": [
              {
                "startTime": "YYYY-MM-DDTHH:MM:SSZ",
                "endTime": "YYYY-MM-DDTHH:MM:SSZ"
              }
            ]
          }
        ],
        "deliveries": [
          {
            "timeWindows": [
              {
                "startTime": "YYYY-MM-DDTHH:MM:SSZ",
                "endTime": "YYYY-MM-DDTHH:MM:SSZ"
              }
            ]
          }
        ]
      }
    ],
    "vehicles": [ ... ]
  }
}

Khung thời gian của xe

Đoạn mã sau đây cho thấy cấu trúc của các khung thời gian của một chiếc xe:

{
  "model": {
    "shipments": [ ... ],
    "vehicles": [
      {
        "startTimeWindows": [
          {
            "startTime": "YYYY-MM-DDTHH:MM:SSZ",
            "endTime": "YYYY-MM-DDTHH:MM:SSZ"
          }
        ],
        "endTimeWindows": [
          {
            "startTime": "YYYY-MM-DDTHH:MM:SSZ",
            "endTime": "YYYY-MM-DDTHH:MM:SSZ"
          }
        ]
      }
    ]
  }
}

Tình huống ví dụ

Phần này sử dụng tình huống kinh doanh dịch vụ trông giữ thú cưng. Ví dụ này tối ưu hoá các tuyến đường để đón và trả chó tại 2 nhà riêng biệt, đồng thời chủ sở hữu có cùng khung giờ đón và trả. Trình tối ưu hoá phải tuân thủ giờ hoạt động của cơ sở chăm sóc ban ngày, khung giờ đón và trả khách cụ thể cho khách hàng cũng như giờ làm việc của người lái xe.

Trong ví dụ này, các giá trị thuộc tính trong yêu cầu là:

Cha mẹ Thuộc tính Giá trị Trường hợp
ShipmentModel globalStartTime 2023-01-13T07:00:00Z Thể hiện giờ mở cửa của dịch vụ trông giữ thú cưng. Không được phép đến lấy hoặc giao hàng trước thời gian này.
ShipmentModel globalEndTime 2023-01-13T19:00:00Z Biểu thị thời gian đóng cửa của dịch vụ trông giữ thú cưng. Tất cả các lượt đến lấy và giao hàng phải hoàn tất trước thời gian này.
Shipment.pickups timeWindows startTime:
2023-01-13T07:30:00Z
Xác định khung thời gian chấp nhận được để đón chú cún tại nhà khách hàng. Trong ví dụ này, bạn đã yêu cầu cả hai khách hàng đến lấy hàng trong khoảng thời gian từ 7:30 đến 9:00.
endTime:
2023-01-13T09:00:00Z
Shipment.deliveries timeWindows startTime:
2023-01-13T17:00:00Z
Xác định khoảng thời gian chấp nhận được để thả chó tại nhà của khách hàng. Trong ví dụ này, bạn đã thông báo cho cả hai khách hàng rằng bạn sẽ trả lại chó cho họ trong khoảng thời gian từ 5 giờ chiều đến 6 giờ 30 phút chiều.
endTime:
2023-01-13T18:30:00Z
Vehicle startTimeWindows startTime:
2023-01-13T07:00:00Z
endTime:
2023-01-13T07:15:00Z
Xác định khung thời gian chấp nhận được để xe bắt đầu (7:00 đến 7:15) và kết thúc (17:00 đến 17:15).
endTimeWindows startTime:
2023-01-13T18:45:00Z
endTime:
2023-01-13T19:00:00Z

Sơ đồ sau đây minh hoạ các khung thời gian ảnh hưởng đến tuyến đường này.

Một số dòng thời gian thể hiện khung giờ toàn cầu, khung giờ nhận và giao hàng, khung giờ bắt đầu và kết thúc của xe, cũng như giờ làm việc của xe.

Trong trường hợp này, như minh hoạ trong sơ đồ, các khoảng thời gian hoạt động như sau:

  • Khung giờ toàn cầu thể hiện giờ hoạt động của doanh nghiệp dịch vụ trông giữ thú cưng và tất cả các khung giờ khác phải nằm trong khung giờ này.
  • Việc đến lấy và giao hàng có timeWindows riêng vào đầu và cuối ngày tương ứng.
  • startTimeWindows của xe cho người vận hành xe biết khoảng thời gian mà họ phải bắt đầu làm việc và endTimeWindows cho họ biết khoảng thời gian khác mà họ phải kết thúc ngày làm việc.
  • Thời gian bắt đầu của startTimeWindow đầu tiên và thời gian kết thúc của endTimeWindow cuối cùng xác định giờ hoạt động của xe. Trong trường hợp này, giờ hoạt động của xe giống với khung thời gian chung.

Ví dụ về yêu cầu

Ví dụ sau đây cho thấy cấu trúc của một yêu cầu optimizeTours kết hợp các giá trị cửa sổ thời gian của tình huống ví dụ.

{
  "model": {
    "globalStartTime": "2023-01-13T07:00:00Z",
    "globalEndTime": "2023-01-13T19:00:00Z",
    "shipments": [
      {
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.8024,
              "longitude": -122.4058
            },
            "timeWindows": [
              {
                "startTime": "2023-01-13T07:30:00Z",
                "endTime": "2023-01-13T09:00:00Z"
              }
            ]
          }
        ],
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.759773,
              "longitude": -122.427063
            },
            "timeWindows": [
              {
                "startTime": "2023-01-13T17:00:00Z",
                "endTime": "2023-01-13T18:30:00Z"
              }
            ]
          }
        ]
      },
      {
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.7359,
              "longitude": -122.5011
            },
            "timeWindows": [
              {
                "startTime": "2023-01-13T07:30:00Z",
                "endTime": "2023-01-13T09:00:00Z"
              }
            ]
          }
        ],
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.759773,
              "longitude": -122.427063
            },
            "timeWindows": [
              {
                "startTime": "2023-01-13T17:00:00Z",
                "endTime": "2023-01-13T18:30:00Z"
              }
            ]
          }
        ]
      }
    ],
    "vehicles": [
      {
        "startLocation": {
          "latitude": 37.759773,
          "longitude": -122.427063
        },
        "endLocation": {
          "latitude": 37.759773,
          "longitude": -122.427063
        },
        "costPerHour": 27,
        "startTimeWindows": [
          {
            "startTime": "2023-01-13T07:00:00Z",
            "endTime": "2023-01-13T07:15:00Z"
          }
        ],
        "endTimeWindows": [
          {
            "startTime": "2023-01-13T18:45:00Z",
            "endTime": "2023-01-13T19:00:00Z"
          }
        ]
      }
    ]
  }
}

Khoảng thời gian linh hoạt

Bạn có thể dùng khoảng thời gian làm các ràng buộc mềm bằng cách xác định softStartTimesoftEndTime trong một loại thông báo TimeWindow. Điều này cho phép trình tối ưu hoá đi lệch khỏi khung thời gian đã chỉ định ở một mức chi phí cụ thể, ưu tiên việc tối ưu hoá tổng thể hơn là tuân thủ nghiêm ngặt khung thời gian khi có lợi.

Khung thời gian linh hoạt có các giới hạn sử dụng sau:

  • Bạn không thể áp dụng các quy tắc này cho globalStartTimeglobalEndTime vì các quy tắc này không sử dụng loại thông báo TimeWindow.
  • Các quy tắc này chỉ áp dụng khi có một TimeWindow duy nhất trong danh sách.

Thuộc tính

Bảng sau đây mô tả các thuộc tính ràng buộc linh hoạt cho các khung thời gian.

Tên tài sản Định dạng Nội dung mô tả về cơ sở lưu trú
softStartTime Dấu thời gian Chỉ định thời điểm bắt đầu của khung thời gian linh hoạt. Nếu một sự kiện xảy ra trước thời gian này, thì bạn sẽ phải trả phí.
softEndTime Dấu thời gian Chỉ định thời điểm kết thúc khung thời gian linh hoạt. Nếu một sự kiện xảy ra sau thời gian này, bạn sẽ phải trả phí.
costPerHourBeforeSoftStartTime số Chi phí mỗi giờ phát sinh khi một sự kiện bắt đầu trước softStartTime. Bạn phải cung cấp thuộc tính này khi sử dụng softStartTime. Xem khái niệm chính về Mô hình chi phí để tìm hiểu thêm về cách triển khai chi phí.
costPerHourAfterSoftEndTime số Chi phí mỗi giờ phát sinh khi một sự kiện kết thúc sau softEndTime. Bạn phải cung cấp thuộc tính này khi sử dụng softEndTime. Xem khái niệm chính về Mô hình chi phí để tìm hiểu thêm về cách triển khai chi phí.

Mã mẫu

Ví dụ sau đây cho thấy cấu trúc của các thuộc tính ràng buộc linh hoạt của loại thông báo TimeWindow:

    {
      "softStartTime": "SOFT_START_TIME",
      "softEndTime": "SOFT_END_TIME",
      "costPerHourBeforeSoftStartTime": COST_BEFORE_START_TIME,
      "costPerHourAfterSoftEndTime": COST_AFTER_END_TIME
    }