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.

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:
- Để khớp với tất cả các hiệu ứng chuyển đổi có thể xảy ra, hãy chọn một thẻ không được sử dụng ở bất kỳ đâu trong mô hình, ví dụ:
UNUSED_TAG. ĐặtTransitionAttributes.excluded_src_tagvàTransitionAttributes.excluded_dst_tagcho thẻ này. - Thiết lập
TransitionAttributes.distance_limitvới khoảng cách và chi phí ngưỡng:- Đặt
DistanceLimit.soft_max_metersthành ngưỡng đã chọn. - Đặt
DistanceLimit.cost_per_kilometer_below_soft_maxthành chi phí mỗi km dưới ngưỡng. - Đặt
DistanceLimit.cost_per_kilometer_above_soft_maxthành chi phí mỗi km vượt quá ngưỡng.
- Đặt
{
"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.