Hướng dẫn này trình bày các cách sử dụng có thể có của thuộc tính chuyển đổi. Hướng dẫn này sẽ dạy bạn cách mô hình hoá các tình huống thực tế dựa trên 2 ví dụ: kết hợp thời gian đỗ xe vào các tuyến đường được tối ưu hoá và đảm bảo rằng mỗi tuyến đường kết thúc bằng một chuyến ghé thăm một vị trí cụ thể.
Trước khi bắt đầu
Bạn sử dụng thuộc tính chuyển đổi để thêm chi phí và độ trễ theo mô hình cụ thể vào một số quá trình chuyển đổi nhất định trong các tuyến được tối ưu hoá. Những chi phí và độ trễ này được thêm vào ngoài thời lượng chuyển đổi và chi phí được tính từ dữ liệu bản đồ dựa trên các thông số của xe được sử dụng.
Chuyến đi là đoạn đường kết nối một vị trí với vị trí tiếp theo.
Vị trí là bất kỳ điểm nào sau đây trong tuyến đường của xe:
- Điểm xuất phát của tuyến đường.
- Một điểm dừng nơi bạn đến lấy hàng hoặc giao hàng.
- Điểm kết thúc của tuyến đường.
Bạn xác định tất cả thuộc tính chuyển đổi cho mô hình bằng cách thêm các thuộc tính đó vào danh sách ShipmentModel.transition_attributes.
Mỗi phần tử trong danh sách xác định một nhóm thuộc tính chuyển đổi và được so khớp với các chuyển đổi trong tuyến đường bằng cách sử dụng thẻ trên vị trí bắt đầu và vị trí kết thúc của quá trình chuyển đổi. Để tìm hiểu thêm về các thuộc tính chuyển đổi, hãy xem tài liệu tham khảo về TransitionAttributes.
Mô hình hoá các tình huống thực tế
Phần này trình bày 2 ví dụ nhỏ về cách triển khai các ràng buộc kinh doanh trong thực tế bằng cách sử dụng các thuộc tính chuyển đổi.
Đặt trước thời gian đỗ xe
Trong trường hợp này, tài xế cần đỗ xe trước khi có thể đến vị trí A. Địa điểm B ở gần đó và tài xế có thể sử dụng cùng một chỗ đỗ xe cho cả hai lượt ghé thăm. Nếu tài xế ghé thăm B ngay sau A, họ sẽ tiết kiệm thời gian vì không cần phải rời khỏi chỗ đỗ xe và đỗ xe lại. Trong Route Optimization API, bạn có thể sử dụng các thuộc tính chuyển đổi để thêm thời gian đỗ xe chỉ khi người lái xe di chuyển từ một chỗ đỗ xe sang chỗ khác.
Khi lập mô hình thời gian đỗ xe tách biệt với thời gian ghé thăm, bạn sẽ tạo ra các tuyến đường trong đó các lượt ghé thăm sử dụng cùng một bãi đỗ xe được nhóm lại để mất ít thời gian hơn. Bạn làm cho mô hình chính xác hơn và cũng khiến trình tối ưu hoá ưu tiên các tuyến đường mà các lượt ghé thăm được nhóm lại.
Hãy làm theo các bước sau để thực hiện việc này trong yêu cầu Route Optimization API:
Chỉ sử dụng
VisitRequest.durationtrong thời gian cần thiết để thực hiện lượt truy cập. Ví dụ: để giao gói hàng và thu thập chữ ký của khách hàng.Đối với mỗi chỗ đỗ xe riêng biệt được sử dụng trong mô hình, hãy sử dụng một thẻ mới không được dùng cho bất kỳ mục đích nào khác trong mô hình, ví dụ:
PARKING_123.Thêm thẻ này vào các mục sau:
VisitRequest.tagstrong tất cả yêu cầu ghé thăm sử dụng chỗ đỗ xe này.Vehicle.start_tagsnếu xe bắt đầu hành trình tại điểm đỗ xe này.Vehicle.end_tagsnếu xe bắt đầu hoặc kết thúc hành trình tại chỗ đỗ xe này.
Đối với mỗi thẻ đỗ xe mới, hãy thêm một mục vào
ShipmentModel.transition_attributesđể thêm độ trễ cho việc đỗ xe khi đến từ một vị trí đỗ xe khác bằng cách làm như sau:Đặt
TransitionAttributes.excluded_src_tagvàTransitionAttributes.dst_tagthànhPARKING_123.Đặt
TransitionAttributes.delaythành thời gian cần thiết để đỗ xe.
Ví dụ: khi thẻ của một vị trí là
PARKING_123và mất 150 giây để đỗ xe, bạn thêm mục sau vàoShipmentModel.transition_attributes:{ "excluded_src_tag": "PARKING_123", "dst_tag": "PARKING_123", "delay": "150s" }
Bắt buộc phải vệ sinh khi kết thúc tuyến đường
Trong trường hợp này, xe cần được vệ sinh vào cuối tuyến đường, với các ràng buộc bổ sung sau:
- Việc vệ sinh được thực hiện tại một cơ sở vệ sinh chuyên dụng trước khi xe quay lại bãi đỗ xe. Tuyến đường được tối ưu hoá sẽ sử dụng cơ sở vệ sinh tốt nhất dựa trên vị trí của cơ sở đó và vị trí của các điểm nhận và giao hàng do xe thực hiện.
- Sau khi vệ sinh, xe không được thực hiện thêm bất kỳ chuyến đón hoặc giao hàng nào.
- Thời gian lái xe đến đó và vệ sinh xe được tính vào giờ làm việc của người lái xe và phải nằm trong khoảng thời gian tối đa của tuyến đường.
Bạn mô hình hoá yêu cầu này bằng cách chỉ cho phép những tuyến đường trống hoặc có lượt ghé thăm cuối cùng là cơ sở vệ sinh. Trong Route Optimization API, bạn thực hiện việc này bằng cách cấm chuyển đổi sang điểm tham chiếu kết thúc của tuyến đường từ bất kỳ vị trí nào, ngoại trừ cơ sở dọn dẹp hoặc điểm xuất phát của tuyến đường:
- Chọn hai thẻ mới không được sử dụng ở bất kỳ đâu trong mô hình, ví dụ:
CLEANEDvàROUTE_END. Trạng thái đầu tiên là dành cho những vị trí mà xe đang hoặc trở nên sạch sẽ, còn trạng thái sau là dành cho điểm cuối của tuyến đường. - Đối với mỗi xe, hãy thêm một lô hàng chỉ giao hàng mới đại diện cho chuyến ghé thăm cơ sở vệ sinh với các thuộc tính sau:
- Mỗi vị trí của cơ sở vệ sinh phải được biểu thị dưới dạng một yêu cầu ghé thăm để giao hàng của lô hàng này.
- Thêm
CLEANEDvàoVisitRequest.tagscủa mỗi yêu cầu ghé thăm của lô hàng cơ sở vệ sinh. Biển báo này cho biết rằng một chiếc xe rời khỏi vị trí này là xe sạch. Các yêu cầu khác về lượt ghé thăm trong mô hình không được sử dụng thẻ này để xe được coi là "không sạch" khi rời khỏi các yêu cầu đó. - Cho phép trình tối ưu hoá bỏ qua lô hàng này khi xe không được sử dụng bằng cách đặt
penalty_costthành một số nhỏ.
Đối với mỗi chiếc xe, hãy thêm
CLEANEDvàoVehicle.start_tags. Trạng thái này được dùng để đánh dấu xe là sạch trước khi xe thực hiện bất kỳ chuyến đón hoặc giao hàng nào, giả sử xe đã được vệ sinh vào cuối ngày làm việc trước đó và cho phép xe đi thẳng từ điểm tham chiếu bắt đầu đến điểm tham chiếu kết thúc. Ngay cả khi các tuyến đường như vậy không xảy ra trong thực tế, việc cho phép kịch bản này sẽ giúp trình tối ưu hoá tìm kiếm các tuyến đường được tối ưu hoá hiệu quả hơn.Đối với mỗi chiếc xe, hãy thêm
ROUTE_ENDvàoVehicle.end_tags.Thêm một mục mới vào
ShipmentModel.transition_attributesđể ngăn xe đến điểm tham chiếu cuối của xe khi xe không sạch, với các thuộc tính sau:Đặt
TransitionAttributes.excluded_src_tagthànhCLEANED.Đặt
TransitionAttributes.dst_tagthànhROUTE_END.Đặt
TransitionAttributes.delaythành một giá trị lớn. Khi bạn đặt độ trễ dài hơn thời lượng tối đa của tuyến đường, bạn sẽ ngăn trình tối ưu hoá sử dụng quá trình chuyển đổi này trong một tuyến đường.
Ví dụ: khi thang thời gian của mô hình là một ngày làm việc, bạn có thể sử dụng độ trễ 24 giờ (86400 giây) để ngăn quá trình chuyển đổi đến cuối tuyến đường từ bất kỳ vị trí nào, ngoại trừ cơ sở vệ sinh và điểm bắt đầu của tuyến đường:
{ "excluded_src_tag": "CLEANED", "dst_tag": "ROUTE_END", "delay": "86400s" }
Cách lựa chọn giữa độ trễ và chi phí
Việc lựa chọn giữa độ trễ và chi phí phụ thuộc vào bản chất của logic nghiệp vụ và các ràng buộc đã triển khai. Cài đặt TransitionAttributes.delay phù hợp nhất để triển khai các ràng buộc cứng hoặc thể hiện sự đánh đổi về thời gian đã sử dụng.
TransitionAttributes.cost phù hợp hơn khi triển khai các lựa chọn ưu tiên mềm hoặc sự đánh đổi được thể hiện dưới dạng chi phí bổ sung. Bạn có thể kết hợp thời gian trễ và chi phí một cách tuỳ ý khi cả thời gian
và chi phí đều quan trọng.
Ví dụ về việc vệ sinh xe sử dụng độ trễ rất dài, vì việc vệ sinh xe ở cuối tuyến đường là một yêu cầu bắt buộc và độ trễ dài sẽ ngăn trình tối ưu hoá bỏ qua yêu cầu này. Nếu bạn chỉ đặt chi phí, thì trình tối ưu hoá có thể chọn bỏ qua việc vệ sinh nếu tìm được cách bù đắp chi phí ở nơi khác, chẳng hạn như bằng cách giao nhiều lô hàng hơn trong thời gian "tiết kiệm được" nhờ không vệ sinh xe.
Ví dụ về việc đỗ xe sử dụng một độ trễ ngắn tương ứng với thời gian cần thêm để đỗ xe. Bạn cũng có thể sử dụng costs kết hợp với độ trễ, nếu người lái xe dừng ở bãi đỗ xe có tính phí.
Cách thêm một thuộc tính chuyển đổi khớp với tất cả các yêu cầu truy cập
Các ví dụ trên sử dụng thuộc tính chuyển đổi khớp với những vị trí có một thẻ nhất định hoặc những vị trí không có thẻ đó. Nhưng nếu bạn cần thêm các thuộc tính chuyển đổi áp dụng cho tất cả các hiệu ứng chuyển đổi thì sao?
Bạn không thể bỏ qua các thẻ vì mỗi thông báo TransitionAttributes phải có một trong các thẻ TransitionAttributes.src_tag và TransitionAttributes.excluded_src_tag, đồng thời phải có một trong các thẻ TransitionAttributes.dst_tag và TransitionAttributes.excluded_dst_tag.
Tuy nhiên, bạn có thể so khớp tất cả các thẻ bằng cách đặt TransitionAttributes.excluded_src_tag hoặc TransitionAttributes.excluded_dst_tag thành một thẻ không được dùng ở bất kỳ vị trí nào trong mô hình. Thao tác này sẽ khớp tất cả vị trí không có thẻ này, nhưng vì bạn cố ý chọn một thẻ không được vị trí nào sử dụng, nên các thuộc tính chuyển đổi này sẽ khớp tất cả vị trí.