Ư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 các tuyến đường mà các điểm đến lấy hàng và giao hàng gần đó được thực hiện bằng cùng một phương tiệ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 bài viết Mô hình hoá logic nghiệp vụ 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 tuyến đường.
  • Các đợt giao hàng bổ sung sẽ được thực hiện trong tương lai.
  • Các gói phân phố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 phải lái xe trên đườ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 quãng đường và thời gian di chuyển của tuyến đường luôn giống nhau, 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 kho hàng 1.000 m, B cách kho hàng thêm 50 m và C cách kho hàng thêm 30 m theo cùng một hướng. Có các lô hàng khác cách C 1000m.

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 km, tuyến đường được tối ưu hoá có thể xử lý A và B vào buổi sáng và C vào buổi tối, đồng thời chi phí của giải pháp sẽ giống như khi cả ba đượ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 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 100 mét, tương ứng với một khối trong khu vực đô thị. Bạn có thể tăng hoặc giảm ngưỡng này cho phù hợp với nhu cầu kinh doanh và lựa chọn ưu tiê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 đặ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à tốn kém nhất, nên trình tối ưu hoá sẽ tiết kiệm nhiều nhất bằng cách sử dụng các đoạn chuyển tiếp 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 có 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 lô hàng hoặc xe nào được sử dụng thẻ #unused_tag# để khớp với tất cả các quá trình chuyển đổi có thể xảy ra. Để biết thêm thông tin, hãy xem bài viết Cách so khớp tất cả yêu cầu truy cập.

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

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

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

Trong giải pháp này, các lô hàng được chia thành hai lượt đi qua đường này. Hai trong số đó được phân phối trong lần duyệt đầu tiên và quảng cáo còn lại được phân phối trong lần duyệt thứ hai. Có 5 hiệu ứng 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 m 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í trên mỗi km 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 km vượt ngưỡng (1) nhân với tổng quãng đường đã đi vượt 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: 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ả ba lô hàng đều được giao "theo nhóm" trong một lần đi qua đường. Trong lần di chuyển còn lại, xe không dừng lại. Một lần nữa, có 5 hiệu ứng chuyển đổi, 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 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
other→depot 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 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à việc 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 các lượt truy cập đó 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 hơn ngưỡng trên mỗi km không hoạt động

Vì 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í cao cho mỗi km đối với các lượt chuyển đổi dài và giữ chi phí thấp cho mỗi km đối với các lượt chuyển đổi ngắn. Nhưng trên thực tế, điều này lại có tác dụng ngược: 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 để đạt hiệu quả cao nhất bằng cách ưu tiên các quá trình chuyển đổi có khoảng cách gần 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 mẫu. Nếu bạn hoán đổi chi phí cho mỗi km dưới và trên ngưỡng, thì chi phí tuyến đường sẽ thay đổi:

Chi phí cao vượt 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 vượt ngưỡng 3,71 3,78 3,71 3,78
Chi phí cho mỗi km vượt 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 hai giải pháp sẽ được 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 ghé thăm được nhóm lại, điều này trái ngược với những gì bạn muốn đạt được.