Ư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 thấy cách sử dụng các thuộc tính chuyển đổi để ưu tiên những tuyến đường mà cùng một xe thực hiện việc nhận và giao hàng ở gần 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 Model Business Logic with Transition Attributes (Mô hình logic nghiệp vụ với các thuộc tính chuyển đổi).

Trong ví dụ này:

  • Các chuyến giao hàng A, B và C gần nhau trên cùng một con đường.
  • Các đợt phân phối khác sẽ diễn ra trong thời gian tới.
  • Không có thời gian giao hàng cụ thể.
  • Bất kể lịch trình ghé thăm, xe cần lái trên đường này hai lần: một lần vào buổi sáng trên đường từ nhà kho và một lần vào buổi tối trên đường về.
  • Tổng quãng đường và thời gian di chuyển của tuyến đường luôn không đổi, bất kể thời điểm thực hiện 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ét.

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

Chi phí trên mỗi km có ngưỡng

Để nhóm các lượt ghé thăm gần đó, 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 truy cập mà bạn cho là gần nhau. Ví dụ này sử dụng ngưỡng 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 của doanh nghiệp và lựa chọn ưu tiên của người lái xe.

Để nhóm các lượt ghé thăm gần nhau trong phạm vi 100 mét, bạn đặ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 mọi mét bổ sung của lượt chuyển đổi. Vì 100 mét đầu tiên là đoạn đường tốn kém 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 đoạn đường 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 thêm một mục mới vào ShipmentModel.transition_attributes bằng 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 xe nào để khớp với tất cả các trạng thái chuyển đổi có thể có. Để biết thêm thông tin, hãy xem bài viết Cách so khớp tất cả các yêu cầu truy cập.

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

Giải pháp 1: Thực hiện A, B trên đường đến đó, C trên đường về

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

Hiệu ứng chuyển cảnh Khoảng cách Dưới ngưỡng Trên ngưỡng
Khoảng cách Chi phí Khoảng cách Chi phí
depot →A 1000 m 100 m 5 900 m 0,9
A→B 50 m 50 m 2.5 0 phút 0
B→other 1030 m 100 m 5 930 m 0,93
other→C 1000 m 100 m 5 900 m 0,9
C→depot 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 hai chi phí trên mỗi km:

  • chi phí cho mỗi ki-lô-mét dưới ngưỡng (50) nhân với tổng quãng đường đã đi dưới ngưỡng (450 m = 0,45 km),
  • chi phí trên mỗi ki-lô-mét vượt quá ngưỡng (1) nhân với tổng quãng đường đã đi vượt quá ngưỡng (3.710 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: Thực hiện A, B, C trên đường đi, không thực hiện gì 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 di chuyển trên đường. Trong lần di chuyển khác, xe không dừng lại. Một lần nữa, có 5 hiệu ứng chuyển cảnh, nhưng độ dài và thành phần của chúng khác nhau:

Hiệu ứng chuyển cảnh Khoảng cách Dưới ngưỡng Trên ngưỡng
Khoảng cách Chi phí Khoảng cách Chi phí
depot →A 1000 m 100 m 5 900 m 0,9
A→B 50 m 50 m 2.5 0 phút 0
B→C 30 phút 30 phút 1,5 0 phút 0
C→other 1000 m 100 m 5 900 m 0,9
other→depot 2080 m 100 m 5 1980 m 1,98
Tổng 380 m 19 3.780 m 3,78

Sử dụng cùng một phép 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à thực hiện tất cả các lượt truy cập trong một khối thời gian có chi phí thấp hơn so với việc thực hiện chúng trong hai 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 khiến chi phí thấp cho mỗi km dưới ngưỡng không hoạt động

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

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

Chi phí cao hơ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ố KM dưới ngưỡng 0,45 0,38 0,45 0,38
Chi phí cho mỗi KM dưới ngưỡng 1 1 50.00 50.00
Số KM trên ngưỡng 3,71 3,78 3,71 3,78
Chi phí cho mỗi KM vượt quá ngưỡng 50.00 50.00 1 1
Tổng chi phí 185,95 189,38 26,21 22,78

Đối với mỗi phiên bản, tổng chi phí thấp hơn 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 hơ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 truy cập được nhóm lại, điều này trái ngược với những gì bạn muốn đạt được.