Mô hình hoá logic nghiệp vụ bằng các thuộc tính chuyển đổi

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ẽ chỉ cho bạn cách lập mô hình các tình huống thực tế dựa trên hai 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 đều kết thúc bằng một lượt ghé thăm một địa điểm 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 thời lượng và chi phí chuyển đổi được tính từ dữ liệu bản đồ dựa trên các tham số của xe được sử dụng.

Chuyển đổi là đoạn đường 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.
  • Điểm dừng nơi thực hiện việc 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ử của danh sách xác định một tập hợp các thuộc tính chuyển đổi và được so khớp với các hiệu ứng chuyển đổi trong tuyến bằng cách sử dụng thẻ trên vị trí bắt đầu và vị trí kết thúc của hiệu ứng 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ô phỏng các tình huống thực tế

Phần này trình bày hai ví dụ nhỏ về cách triển khai các quy tắc ràng buộc trong hoạt động kinh doanh 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, người lái xe 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ần 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 tài xế di chuyển từ một điểm đỗ xe này sang điểm đỗ xe 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 mà trong đó, những lượt ghé thăm sử dụng cùng một bãi đỗ xe được nhóm lại sẽ mất ít thời gian hơn. Bạn làm cho mô hình chính xác hơn, đồng thời 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 một yêu cầu Route Optimization API:

  1. Chỉ sử dụng VisitRequest.duration trong thời gian cần thiết để thực hiện lượt truy cập. Ví dụ: để giao gói hàng và lấy chữ ký của khách hàng.

  2. Đố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.

  3. Thêm thẻ này vào các mục sau:

    1. VisitRequest.tags trong tất cả yêu cầu ghé thăm sử dụng chỗ đỗ xe này.

    2. Vehicle.start_tags nếu xe bắt đầu hành trình tại điểm đỗ xe này.

    3. Vehicle.end_tags nếu xe bắt đầu hoặc kết thúc tuyến đường tại điểm đỗ xe này.

  4. Đố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 điểm đỗ xe khác bằng cách làm như sau:

    1. Đặt TransitionAttributes.excluded_src_tag và TransitionAttributes.dst_tag thành PARKING_123.

    2. Đặt TransitionAttributes.delay thành thời gian cần thiết để đỗ xe.

    Ví dụ: khi thẻ của một vị trí là PARKING_123 và mất 150 giây để đỗ xe, bạn thêm mục sau vào ShipmentModel.transition_attributes:

    {
      "excluded_src_tag": "PARKING_123",
      "dst_tag": "PARKING_123",
      "delay": "150s"
    }
    

Bắt buộc phải dọn dẹp khi kết thúc tuyến đường

Trong trường hợp này, xe cần được vệ sinh ở cuối tuyến đường, với các điều kiện 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ử dụng cơ sở vệ sinh phù hợp nhất dựa trên vị trí của cơ sở đó, cũng như vị trí của các điểm đến lấy hàng và giao hàng của xe.
  • 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 thời gian tối đa của tuyến đường.

Bạn lập mô hình yêu cầu này bằng cách chỉ cho phép các tuyến đường trống hoặc có điểm đến 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 từ điểm xuất phát của tuyến đường:

  1. Chọn hai thẻ mới chưa được sử dụng ở bất kỳ đâu trong mô hình, ví dụ: CLEANED và ROUTE_END. Vị trí đầu tiên là nơi xe sạch hoặc được làm sạch, còn vị trí thứ hai là điểm cuối của tuyến đường.
  2. Đố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:
    1. Mỗi vị trí cơ sở dọn dẹp phải được thể hiện dưới dạng một yêu cầu ghé thăm giao hàng của lô hàng này.
    2. Thêm CLEANED vào VisitRequest.tags của mỗi yêu cầu ghé thăm của lô hàng cơ sở vệ sinh. Điều này cho biết rằng xe rời khỏi vị trí này đã sạch sẽ. Các yêu cầu ghé thăm khác 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 đó.
    3. 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_cost thành một số nhỏ.
  3. Đối với mỗi xe, hãy thêm CLEANED vào Vehicle.start_tags. Điều này dùng để đánh dấu xe là sạch trước khi xe thực hiện bất kỳ hoạt động đó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.

  4. Đối với mỗi xe, hãy thêm ROUTE_END vào Vehicle.end_tags.

  5. Thêm một mục mới vào ShipmentModel.transition_attributes để cấm xe đến điểm tham chiếu cuối cùng của xe khi xe chưa được vệ sinh, với các thuộc tính sau:

    1. Đặt TransitionAttributes.excluded_src_tag thành CLEANED.

    2. Đặt TransitionAttributes.dst_tag thành ROUTE_END.

    3. Đặt TransitionAttributes.delay thành một giá trị lớn. Khi đặt độ trễ dài hơn thời lượng tối đa của tuyến đường, bạn sẽ ngăn chặn một cách hiệu quả 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ờ (86.400 giây) để cấm chuyển đổi sang điểm cuối của tuyến đường từ bất kỳ nơi 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 và các quy tắc ràng buộc trong hoạt động kinh doanh được triển khai. Việc đặt TransitionAttributes.delay là cách tốt nhất để triển khai các quy tắc ràng buộc nghiêm ngặt hoặc để thể hiện sự đánh đổi về thời gian đã dành. TransitionAttributes.cost phù hợp hơn khi triển khai các lựa chọn ưu tiên hoặc sự đánh đổi không bắt buộc đượ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 giúp trình tối ưu hoá không bỏ qua yêu cầu này. Nếu bạn chỉ đặt chi phí, 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 chi phí kết hợp với độ trễ nếu tài xế dừng tại bãi đỗ xe có tính phí.

Cách thêm thuộc tính chuyển đổi khớp với tất cả yêu cầu truy cập

Các ví dụ trên sử dụng các thuộc tính chuyển đổi khớp với các vị trí có một thẻ nhất định hoặc các 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 hai thẻ TransitionAttributes.src_tag và TransitionAttributes.excluded_src_tag, đồng thời phải có một trong hai 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 sử dụng ở bất kỳ đâu trong mô hình. Thao tác này sẽ khớp với tất cả cá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 với tất cả các vị trí.

Tài liệu đọc thêm