Ưu tiên các lượt truy cập ở gần bằng các thuộc tính chuyển đổi

Ví dụ này cho biết cách sử dụng các thuộc tính chuyển đổi để ưu tiên các tuyến đường mà cùng một phương tiện thực hiện việc nhận và giao hàng ở gần nhau trong một khoảng thời gian. Để tìm hiểu thêm về các thuộc tính chuyển đổi, hãy xem bài viết Mô hình hoá logic kinh doanh bằng các thuộc tính chuyển đổi.

Trong ví dụ này:

  • Các lô hàng A, B và C được giao ở gần nhau trên cùng một con đường.
  • Các lô hàng khác được giao ở xa hơn trên con đường đó.
  • Các lô hàng không có thời gian giao hàng cụ thể.
  • Bất kể lịch trình ghé thăm là gì, phương tiện này cần phải đi trên con đường này hai lần: một lần vào buổi sáng trên đường từ kho và một lần vào buổi tối trên đường về.
  • Tổng khoảng cách và thời lượng di chuyển của tuyến đường luôn giống nhau, bất kể thời điểm giao lô hàng A, B và C.

Ví dụ về việc giao các lô hàng trên cùng một tuyến đường. Có 3 lô hàng A, B và C đang trên đường từ kho đến các lô hàng khác. A cách nhà kho 1.000 m, B cách nhà kho xa hơn 50 m và C cách nhà kho xa hơn 30 m theo cùng một hướng. Có những lô hàng khác cách C 1000 m.

Trong trường hợp này và đối với một yêu cầu chỉ sử dụng chi phí mỗi giờ và chi phí mỗi ki-lô-mét, tuyến đường được tối ưu hoá có thể xử lý lô hàng A và B vào buổi sáng, lô hàng C vào buổi tối và chi phí của giải pháp sẽ giống như khi xử lý cả 3 lô hàng cùng một lúc.

Chi phí mỗi ki-lô-mét có ngưỡng

Để nhóm các lượt ghé thăm ở gần nhau, trước tiên, bạn cần chọn một khoảng cách ngưỡng. Đây là khoảng cách tối đa giữa hai lượt ghé thăm mà bạn cho là ở gần nhau. Ví dụ này sử dụng ngưỡng là 100 mét, tương ứng với khoảng một khu phố ở khu vực đô thị. Bạn có thể tăng hoặc giảm ngưỡng để phù hợp với nhu cầu kinh doanh và ý muốn của tài xế.

Để nhóm các lượt ghé thăm ở gần nhau trong phạm vi 100 mét, bạn hãy đặt chi phí cao cho 100 mét đầu tiên của mỗi lượt chuyển đổi và chi phí thấp hơn cho bất kỳ mét nào khác của lượt chuyển đổi. Vì 100 mét đầu tiên là đắt nhất, nên trình tối ưu hoá sẽ tiết kiệm được nhiều nhất bằng cách sử dụng các lượt chuyển đổi ngắn hơn ngưỡng 100 mét, ngay cả khi điều đó có nghĩa là kéo dài tổng chiều dài của tuyến đường.

Để thiết lập chi phí, bạn hãy thêm một mục mới vào ShipmentModel.transition_attributes với các thuộc tính sau:

{
  "model": {
    "transitionAttributes": [
      {
        "excluded_dst_tag": "UNUSED_TAG",
        "excluded_src_tag": "UNUSED_TAG",
        "distanceLimit": {
          "softMaxMeters": 100,
          "costPerKilometerBelowSoftMax": 50,
          "costPerKilometerAboveSoftMax": 1,
        }
      }
    ]
  }
}

Không được sử dụng thẻ #unused_tag# cho bất kỳ lô hàng hoặc phương tiện nào để khớp với tất cả các lượt chuyển đổi có thể có. Để biết thêm thông tin, hãy xem bài viết Cách khớp với tất cả các yêu cầu ghé thăm.

Cách hoạt động của chi phí cao dưới ngưỡng

Phần này cho biết chi phí dưới và trên ngưỡng ảnh hưởng đến tổng chi phí của các giải pháp khác nhau trong tình huống ví dụ như thế nào.

Giải pháp 1: Giao lô hàng A, B trên đường đi, lô hàng C trên đường về

Trong giải pháp này, các lô hàng được chia thành 2 lần đi trên con đường này. Hai lô hàng được giao trong lần đi đầu tiên và lô hàng còn lại được giao trong lần đi thứ hai. Có 5 lượt chuyển đổi:

Lượt chuyển đổi Khoảng cách Dưới ngưỡng Trên ngưỡng
Khoảng cách Chi phí Khoảng cách Chi phí
kho →A 1000 m 100 m 5 900 m 0,9
A→B 50 m 50 m 2,5 0 m 0
B→khác 1030 m 100 m 5 930 m 0,93
khác→C 1000 m 100 m 5 900 m 0,9
C→kho 1080 m 100 m 5 980 m 0,98
Tổng 450 m 22,5 3710 m 3,71

Tổng chi phí được tính bằng tổng của 2 chi phí mỗi ki-lô-mét:

  • chi phí mỗi ki-lô-mét dưới ngưỡng (50) nhân với tổng khoảng cách đã đi dưới ngưỡng (450 m = 0,45 km),
  • chi phí mỗi ki-lô-mét trên ngưỡng (1) nhân với tổng khoảng cách đã đi trên ngưỡng (3710 m = 3,71 km).

Do đó, tổng chi phí là 0,45 * 50 + 3,71 * 1 = 22,5 + 3,71 = 26,21.

Giải pháp 2: Giao lô hàng A, B, C trên đường đi, không giao lô hàng nào trên đường về

Trong giải pháp này, không giống như giải pháp 1, cả 3 lô hàng đều được giao "theo nhóm" trong một lần đi trên con đường này. Trong lần đi khác, phương tiện không dừng lại. Một lần nữa, có 5 lượt chuyển đổi, nhưng độ dài và thành phần của chúng khác nhau:

Lượt chuyển đổi Khoảng cách Dưới ngưỡng Trên ngưỡng
Khoảng cách Chi phí Khoảng cách Chi phí
kho →A 1000 m 100 m 5 900 m 0,9
A→B 50 m 50 m 2,5 0 m 0
B→C 30 m 30 m 1,5 0 m 0
C→khác 1000 m 100 m 5 900 m 0,9
khác→kho 2080 m 100 m 5 1980 m 1,98
Tổng 380 m 19 3780 m 3,78

Sử dụng cùng một cách tính như trong giải pháp 1, tổng chi phí là 0,38 * 50 + 3,78 * 1 = 19 + 3,78 = 22,78 và việc thực hiện tất cả các lượt ghé thăm trong một khoảng thời gian có chi phí thấp hơn so với việc thực hiện các lượt ghé thăm theo 2 nhóm. Bạn có thể tăng cường hiệu ứng này bằng cách tăng DistanceLimit.cost_per_kilometer_below_soft_max.

Lý do chi phí mỗi ki-lô-mét thấp dưới ngưỡng không hiệu quả

Vì bạn muốn ưu tiên các lượt chuyển đổi ngắn hơn các lượt chuyển đổi dài, nên bạn có thể muốn đặt chi phí mỗi ki-lô-mét cao cho các lượt chuyển đổi dài và giữ chi phí mỗi ki-lô-mét thấp cho các lượt chuyển đổi ngắn. Nhưng điều này thực sự có tác dụng ngược lại: vì 100 mét đầu tiên của lượt chuyển đổi là rẻ nhất, nên trình tối ưu hoá sẽ sử dụng các mét "rẻ" này một cách hiệu quả nhất bằng cách ưu tiên các lượt chuyển đổi có gần hoặc trên 100 mét.

Bạn có thể thấy hiệu ứng này trên 2 giải pháp ví dụ. Nếu bạn hoán đổi chi phí mỗi ki-lô-mét dưới và trên ngưỡng, chi phí tuyến đường sẽ thay đổi:

Chi phí cao trên ngưỡng Chi phí cao dưới ngưỡng
Giải pháp 1 Giải pháp 2 Giải pháp 1 Giải pháp 2
Số ki-lô-mét dưới ngưỡng 0,45 0,38 0,45 0,38
Chi phí mỗi ki-lô-mét dưới ngưỡng 1 1 50 50
Số ki-lô-mét trên ngưỡng 3,71 3,78 3,71 3,78
Chi phí mỗi ki-lô-mét trên ngưỡng 50 50 1 1
Tổng chi phí 185,95 189,38 26,21 22,78

Đối với mỗi phiên bản, chi phí thấp hơn trong tổng chi phí của 2 giải pháp sẽ được đánh dấu bằng chữ in đậm. Bạn có thể thấy rằng khi bạn sử dụng chi phí cao trên ngưỡng, tổng chi phí của tuyến đường hiện cao hơn đối với tuyến đường mà các lượt ghé thăm được nhóm lại, điều này ngược lại với những gì bạn muốn đạt được.