Tôi đã nhận được một nhiệm vụ để xây dựng một ước tính vận chuyển cho thấy chỗ ở tốt nhất của hàng hóa trên càng ít hộp càng tốt:
Có một tập hợp hữu hạn các kích thước hộp hình chữ nhật đã biết
Có rất nhiều mặt hàng tùy ý được đóng gói trong hộp
Càng ít hộp nên được sử dụng tốt nhất. Bởi vì vận chuyển hai hộp 1x1x1 đắt hơn một hộp 1x2x1. Điều này nên được ưu tiên ở đây.
Nó cũng nên được tối ưu hóa để sử dụng các hộp nhỏ hơn có thể, như là một ưu tiên cấp hai. (ví dụ: nếu được đưa ra một lựa chọn giữa một hộp lớn hơn và hai hộp nhỏ, thì nên chọn hộp lớn hơn)
Các vật phẩm có thể được xoay để vừa với hộp, nhưng vòng quay phải được giới hạn ở mức tăng tối thiểu 45 ° (trong nghiên cứu của tôi, có vẻ như một số cấu hình cho phép xoay 45 độ để phù hợp hơn với các hộp có hình dạng lưới bên trong lớn hơn) , được quay 90 ° tiêu chuẩn cần thực hiện.
Các hộp có giới hạn trọng lượng và các vật phẩm có trọng lượng tùy ý (ví dụ: một vật phẩm có kích thước là 1x1x1 có thể có giá trị lớn hơn vật phẩm 2x2x2 khác)
Tôi đã nghiên cứu một chút và tìm thấy một số thuật toán trừu tượng về việc đóng gói bin và vấn đề về chiếc ba lô và đi kèm với biến thể hơi tàn bạo sau đây, tương tự như thuật toán phù hợp nhất:
Sắp xếp các mục theo thứ tự khối lượng giảm dần (đầu tiên lớn hơn) trong danh sách "các mục cần đóng gói"
Đối với mỗi mục trong danh sách này:
Chọn hộp nhỏ hơn trong danh sách "hộp đã sử dụng" và có đủ giới hạn khối lượng và trọng lượng còn lại để phù hợp với mặt hàng (Tôi sẽ sử dụng vừa vặn ở đây để có nghĩa là phù hợp với kích thước và trọng lượng)
Nếu không có hộp như vậy, hãy tạo một hộp mới từ bộ kích thước hộp có thể có kích thước nhỏ nhất có thể vừa với kích thước và trọng lượng của vật phẩm và thêm nó vào danh sách "hộp đã sử dụng".
Nếu một hộp vừa với vật phẩm (sử dụng chức năng khớp dưới), hãy thêm nó vào danh sách "vật phẩm của hộp này" và xóa nó khỏi danh sách "vật phẩm phù hợp", đánh dấu vị trí 3d tương đối bên trong hộp.
Lặp lại từ 2.1 cho đến khi không có mục nào được trang bị trong danh sách "các mục cần đóng gói".
Chức năng kiểm tra phù hợp được sử dụng ở bước 2 ở trên:
Kiểm tra xem âm lượng còn lại của hộp có khớp với âm lượng của vật phẩm không. Nếu không, trả lại sai.
Kiểm tra xem tổng trọng lượng của "vật phẩm trong hộp" cộng với trọng lượng vật phẩm hiện tại nhỏ hơn hoặc bằng giới hạn trọng lượng hộp. Nếu không, trả lại sai.
Kiểm tra danh sách "vật phẩm của hộp" để chọn tọa độ hộp đầu tiên có thành phần Y nhỏ nhất và có đủ không gian cho chiều rộng, chiều sâu và chiều cao của vật phẩm, xem xét các vật phẩm khác được đặt là không gian có sẵn.
Nếu vật phẩm không phù hợp với hướng hiện tại của nó, hãy xoay nó trên một trong 6 góc quay có thể, không giả sử xoay 45 ° cho đơn giản. (Các phép quay dẫn đến kích thước đã được kiểm tra có thể bị bỏ qua. Ví dụ: xoay hộp 180 ° có cùng độ sáng với vị trí ban đầu vì tất cả các hộp và vật phẩm có cùng kích thước cho các mặt đối diện và vì vậy có thể bỏ qua.)
Nếu mục không được xoay theo tất cả các cách có thể trở lại hướng ban đầu, hãy thử lại từ bước 3.
Nếu tất cả các phép quay mà đã thử và không phù hợp được tìm thấy, hãy xem tọa độ hiện tại là không gian có sẵn.
Nếu không có chỗ trống để kiểm tra, hãy trả về false. Khác, thử lại từ bước 3.
Tôi muốn biết liệu có thể có một giải pháp tốt nhất cho vấn đề của tôi không, với các ràng buộc được trình bày.
Điều này dường như hoạt động trên lý thuyết nhưng tôi đã không thử nó trên mã. Tôi muốn biết liệu tôi đang đi đúng hướng hay có những cách tốt hơn, hiệu quả hơn để làm điều này.
Tài liệu tham khảo sẽ là tuyệt vời.
Chỉnh sửa:
Tôi đã tìm thấy một số API bên thứ 3 thú vị làm những gì tôi muốn, nhưng điều này sẽ phải bị ngắt kết nối, vì vậy tôi sẽ không có quyền truy cập vào các API này.
Một số ví dụ:
Chỉnh sửa 2:
Một ví dụ thực tế về vấn đề cần giải quyết sẽ là:
- Tôi có 4 kích thước hộp WxHxD: 10x12x18, 12x16x24, 16x20x30, 24x32x40
- Tôi có một đơn đặt hàng gồm 4 mặt hàng, là 1 kích thước 6x8x10, 2x 22x14x30 và 1x 22x4x20
Làm cách nào để tôi lắp vật phẩm này vào bất kỳ số lượng hộp nào có một hoặc nhiều kích cỡ bằng cách sử dụng càng ít hộp càng tốt, sử dụng các hộp nhỏ nhất có thể và để lại ít không gian trống nhất có thể?
packing
thẻ liên quan;algorithms
đủ điều kiện :)