Thuật toán đóng gói 3d để vận chuyển hàng


24

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:

  1. 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

  2. Có rất nhiều mặt hàng tùy ý được đóng gói trong hộp

  3. 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.

  4. 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)

  5. 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.

  6. 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:

  1. 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"

  2. Đối với mỗi mục trong danh sách này:

    1. 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)

    2. 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".

    3. 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.

    4. 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:

  1. 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.

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

  3. 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.

  4. 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.)

  5. 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.

  6. 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.

  7. 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ể?


4
Không cần packingthẻ liên quan; algorithmsđủ điều kiện :)
Chris Cirefice

Tôi tò mò, liệu việc đóng gói thực tế sẽ được thực hiện bởi robot hay con người? Nếu đó là cái sau, thì việc tối ưu hóa không gian sẽ có giá trị thời gian cần thiết để tìm ra cách xoay từng hộp để lắp nó vào không?
trả trước

Câu hỏi hay. Việc đóng gói thực tế sẽ được thực hiện bởi con người, nhưng phần mềm sẽ đề xuất thứ tự đóng gói và vị trí của mỗi hộp. Nó sẽ không yêu cầu kinh nghiệm trong việc đóng gói để xem xét bố trí được cung cấp và đặt hàng hóa bên trong hộp. Lúc đầu, một số thời gian sẽ được sử dụng để làm quen với nó, nhưng nó sẽ không đòi hỏi phải suy nghĩ về cách xử lý tốt nhất.
Ricardo Souza

1
Tôi nghĩ tất cả những gì @msw đang nói là loại vấn đề này không phù hợp với giải pháp "hoàn hảo", nhưng phù hợp hơn cho giải pháp chấp nhận được trong một khoảng thời gian hợp lý dựa trên các quy tắc bạn dựa trên các quy tắc bạn đã cung cấp. Từ quan điểm toán học, điều này thường có nghĩa là bạn tiếp cận nó với một bộ thuật toán và công cụ khác nhau, vì vậy tôi nghĩ rằng anh ta chỉ đề xuất điều đó. Ví dụ, các thuật toán di truyền, ủ mô phỏng và các phương pháp khác theo đường cong giảm dần xấp xỉ không gian giải pháp đối với phương pháp phỏng đoán của bạn có thể mang lại lợi ích ở đây.
J Trana

1
Tôi chỉ đăng một ý tưởng ở đây. Trong trường hợp bạn không nghĩ rằng nó sẽ hiệu quả, bạn có thể bỏ qua nó. Giải pháp này (giống như tối ưu hóa) thực sự phụ thuộc vào mức độ tương tự của đầu vào thuật toán của bạn. Vì vậy, khai thác thực tế là đầu vào của bạn sẽ có một số điểm tương đồng theo thời gian. Bạn có thể lưu trữ / lưu trữ các kết quả được tính toán (có độ phức tạp tính toán đắt đỏ), sau đó so sánh chúng với đầu vào của bạn và nếu bạn có kết quả khớp hoàn toàn hoặc khớp một phần, bạn sẽ chỉ cần thực hiện một vài phép tính để sắp xếp lại một số đối tượng kích thước nhỏ. Tất nhiên điều này gây ra vấn đề mới để tăng lên.
JAAAY

Câu trả lời:


4

Bin đóng gói rất khó tính toán. Hãy nghĩ về một nửa vấn đề: bạn muốn đóng gói sản phẩm trong các hộp vận chuyển mà không lãng phí trong hộp. Một giải pháp tối ưu cho điều đó sẽ yêu cầu đi qua tất cả các tập hợp con có thể và tất cả các sắp xếp 3d có thể có của sản phẩm cần vận chuyển trong một xe tải. Tôi sẽ cung cấp cho bạn giải pháp tối ưu cho việc đó vì tôi có một người bạn làm sáu điều không thể trước khi ăn sáng.

Bây giờ bạn chỉ cần có được tất cả các hộp trên xe tải mà không lãng phí. Bạn tôi làm điều không thể thứ hai của mình và đưa ra giải pháp cho bạn. Thật không may, với kích thước hộp bạn đã chọn ở trên, có khoảng trống trong xe tải có thể giảm nếu bạn chọn các hộp khác nhau (lớn hơn hoặc nhỏ hơn) trong tác vụ đầu tiên. Nếu bạn thay đổi kích thước của một hộp, tốt nhất bạn sẽ phải đóng gói lại xe tải; tệ nhất, bạn có thể phải đóng gói lại tất cả các hộp khó như vấn đề chúng ta bắt đầu. Và, như với giai đoạn đầu tiên, bạn phải thử tất cả các sắp xếp 3d có thể.

Tôi tìm thấy Skiena Hướng dẫn thiết kế thuật toán rất hữu ích để suy nghĩ về loại thuật toán phù hợp với loại vấn đề nào, nhưng tôi chủ yếu học được rằng các giải pháp tốt cho các vấn đề trần tục thậm chí còn gặp phải khó khăn trong tính toán. Hầu hết những gì bạn cần phù hợp với lớp các vấn đề về thùng rác và bài viết đó là một điểm tốt. Điều đáng chú ý là một số thuật toán tốt nhất cho điều này là các sản phẩm thương mại vì nhiệm vụ này xuất hiện ở mọi nơi trong hậu cần (số lượng xe lửa nhỏ nhất tôi có thể đưa hàng hóa của mình vào đâu? Và như vậy). Có một số tiền đáng kể được thực hiện nếu các heuristic đúng có thể tiết kiệm cho nhà sản xuất 100 toa tàu mỗi tháng.

Thật không may, tài liệu về tối ưu hóa heuristic không lớn bằng thuật toán. Nếu bạn cố gắng đi một mình, tôi đảm bảo rằng bạn sẽ mơ về việc di chuyển lăng kính hình chữ nhật vào khoảng tháng thứ hai. Tôi có một vấn đề khó khăn là nếu tôi phải làm lại thì có lẽ tôi sẽ tìm đến các chuyên gia (hoặc phần mềm sở hữu của họ).

Cảm ơn @JTrana vì đã mở rộng bình luận của tôi.


Cảm ơn phản hôi của bạn. Như tôi đã nói về câu hỏi, tôi đã nghiên cứu về chủ đề này và đã tìm ra một sự kết hợp của một vài thuật toán để đề xuất một thuật toán ở trên. Tôi chỉ quan tâm đến việc đóng gói chính nó. Tất cả các hộp này sẽ được gửi qua dịch vụ văn phòng gửi bài. Fortunatally, tôi sẽ không phải đối phó với tải xe tải.
Ricardo Souza

Đó là một phần tốt trong lời giải thích của tôi. Bạn không thể "trích xuất" thuật toán từ các công ty muốn bạn trả tiền cho dịch vụ của họ. Hai công ty bạn liệt kê có API, nhưng việc đóng gói được thực hiện trên máy chủ của họ và bạn không có quyền truy cập vào mã triển khai trừ khi bị đánh cắp. Và thật tốt khi bạn không phải đóng gói xe tải, bây giờ vấn đề của bạn chỉ là một nửa khó khăn, đó là lý do tại sao các công ty muốn bán cho bạn một giải pháp và mọi người sẵn sàng mua dịch vụ.
msw

1
Tôi nghĩ rằng chúng ta có một sai lầm ở đây. Tôi có thể không thể hiện tốt với tôi (như bạn có thể nhận thấy, tiếng Anh không phải là ngôn ngữ nhà của tôi). Tôi không yêu cầu ăn cắp các thuật toán. Tôi đã đến đây để làm rõ về chủ đề này. Tôi đã thực hiện một số nghiên cứu và đưa nó vào ví dụ trên cho analisys. Có lẽ có ai đó đã gặp phải những vấn đề tương tự có thể cho tôi một số hướng tốt hơn. Nếu giải pháp của tôi không áp dụng được, tôi có thể làm gì để có kết quả tốt hơn? Đây là câu hỏi thực sự của tôi trên đó. Tôi hy vọng tôi đã làm cho tôi rõ ràng hơn bây giờ.
Ricardo Souza

Tiếng anh của bạn tốt; Tôi nghĩ vấn đề là chúng ta đang nói về các lớp khác nhau của nhiệm vụ. Bạn đang suy nghĩ thực hiện và tôi đang nghĩ bùng nổ tổ hợp. Tôi nghĩ rằng việc giải quyết Chỉnh sửa 2 của bạn sẽ giúp bạn hiểu rõ hơn vấn đề từ cách tôi nhìn nhận vấn đề. Bạn có thể giải quyết điều đó như đã nêu? Không lãng phí, với số lượng hộp tối thiểu có kích thước tối thiểu? Đó là vấn đề đa cực hóa mà tôi đã đề cập trước đây mà tôi đã nói là không thể làm được: bạn sẽ phải hy sinh ít nhất một trong những yếu tố đó để tối ưu hóa một yếu tố khác.
msw

Cảm ơn bạn. Tôi nghĩ rằng tôi đã nhận nó ngay bây giờ. Tôi đã không cố mã hóa nó. Tôi đã suy nghĩ về việc không lãng phí thời gian mã hóa trước một giải pháp cụ thể hơn hoặc ít nhất là một phản hồi tích cực về đề xuất của tôi phát sinh vì lúc đầu, đây là một trích dẫn. Tôi vẫn đang nghiên cứu nhưng tôi sợ tôi sẽ phải lấy một trong những API đó và xem liệu các thiết bị (bộ thu thập dữ liệu chạy Win CE 6.0) có thể chạy được kết nối với internet không. Thông tin đầu tiên tôi nhận được từ khách hàng nói rằng họ sẽ không có quyền truy cập internet tại nơi làm việc.
Ricardo Souza

1

Khi tạo các thuật toán mới và gần đây tôi chỉ tự mình thực hiện một thuật toán đóng gói (tôi biết nó vẫn có một số tiềm năng tối ưu hóa), tôi luôn thực hiện cách tiếp cận đơn giản nhất:

Làm thế nào tôi với tư cách là một con người làm điều đó và thử tro dịch nó thành một thuật toán: Từ giáo viên AI (người máy) của tôi, Rolf Pfeifer, tôi vẫn nhớ, trí thông minh rõ ràng đôi khi có thể được tạo ra bằng một số quy tắc rất đơn giản, vì vậy thay vì áp đảo Tôi cố gắng cởi quần áo

  1. Xác định các mặt hàng quá lớn (các mặt hàng không phù hợp với bất kỳ hộp nào)
  2. Cố gắng tìm hộp tốt nhất có thể (bằng cách so sánh chéo tổng kích thước khối lượng và vật phẩm)
  3. Đặt hàng các mặt hàng từ lớn đến nhỏ và hộp (không gian) từ nhỏ đến lớn
  4. Lắp vật phẩm lớn nhất vào không gian nhỏ nhất có thể
  5. Nếu mục lớn nhất không tìm thấy nhảy qua nó và thử tiếp theo cho đến khi không có gì phù hợp hơn
  6. Đối với các mục còn lại, tìm kiếm hộp mới tốt nhất. ...

    X. luôn nghĩ về các sự kiện đặc biệt (vật phẩm quá khổ, hình thức lạ, nếu một hộp chỉ chứa 1 vật phẩm, sẽ tốt hơn nếu bạn gửi vật phẩm mà không có hộp?, V.v.) nhưng bạn có thể đưa ra quyết định theo hình thức quyết định cây.

Dĩ nhiên là có những cảnh báo xa hơn mà bạn nhận được, tôi chỉ đưa ra những ý tưởng này như một điểm khởi đầu. Từ đó có rất nhiều cách có thể. Một cách khác là chia một hộp thành các hình khối nhỏ (ví dụ 5cmx5cmx5cm) và theo dõi chúng khi chiếm / miễn phí một cách tiếp cận khác có thể được gọi là tetris 3d, v.v.

Với phương pháp này, bạn không nhất thiết phải lo lắng về vụ nổ tổ hợp. Mặt khác, vụ nổ kết hợp có thể xảy ra nếu chúng ta đang nói về khối lượng xe lửa của các mặt hàng, nhưng sau đó một lần nữa: Bạn có thực sự nghĩ rằng một công ty sẽ kiểm tra danh sách đóng gói từng mặt hàng không? Không có họ sẽ tiếp cận một giải pháp phân chia và chinh phục: Phân chia độ phức tạp bằng cách sử dụng các khối lượng được tiêu chuẩn hóa (ví dụ như các cung điện hoặc các hộp có kích thước cố định). Vì vậy, ngay cả đối với thực tế, hãy tính đến việc không chỉ đào tạo, đôi khi thời gian của nhân viên cũng là tiền. một đoàn tàu có thể tải x palet, mọi cung điện đều có khối lượng cố định, vì vậy hãy đóng gói các vật phẩm vào palet, nhưng một lần nữa, có lẽ một cung điện bao gồm một số thứ tự, vì vậy hãy sử dụng các hộp cố định cho các vật phẩm, sau đó được nạp vào các cung điện, sau đó được nạp vào vào tàu hỏa.

Ít nhất đó là cách tôi như một con người sẽ giải quyết công việc, lấy hộp tốt nhất và sau đó lắp từng vật phẩm lớn nhất vào không gian nhỏ nhất có sẵn (và thêm một chút xem trước).

Như trong thuật toán của tôi, cuối cùng bạn có thể sẽ không có giải pháp tốt nhất, nhưng một heuristic cực kỳ tốt mà sau đó bạn có thể tinh chỉnh thêm.

Đôi khi dễ dàng hơn để bắt đầu với bước đầu tiên và giải quyết các vấn đề trên đường đi của bạn, tất nhiên lý tưởng không phải là một bước vượt qua bước tiến, nhưng một chút thông minh ... đôi khi bạn có thể bị buộc phải khám phá các lựa chọn thay thế và chọn tốt nhất hoặc thực hiện một "bước lùi".

Nhưng như tôi đã học được từ giáo viên AI của mình (Rolf Pfeifer, xin lỗi vì đã làm phiền điều đó một lần nữa): Đôi khi bạn có thể tạo ra hành vi thông minh rõ ràng với một số quy tắc rất đơn giản và vài hành vi nổi bật trong ví dụ đề cập rằng họ đã lập trình những chiếc ô tô từ xa để rẽ trái nếu họ phát hiện chướng ngại vật ở phía bên phải, rẽ phải nếu có chướng ngại vật ở phía bên trái và đi thẳng nếu không có chướng ngại vật hoặc nếu chướng ngại vật ở phía trước. 3 hoặc 4 robot như vậy, đặt trong một hình vuông 3 x 3 m với rất nhiều quả bóng bàn dẫn đến một thực tế đáng kinh ngạc là các robot dường như đang dọn dẹp, đẩy những quả bóng bàn sang các góc, mặc dù các robot chỉ được lập trình để tránh chướng ngại vật.

PD: Sự sai lệch trong thế giới thực duy nhất tôi tìm thấy từ cách tiếp cận này là khi tôi làm việc bán thời gian cho các buổi hòa nhạc lớn như metallicica, thiếu nữ sắt, giáo britney, paul mcCartney, U tên nó ... Những người lái xe tải làm việc trên tour du lịch quốc tế có danh sách đóng gói chính xác từng mục. Các tính toán được thực hiện một lần (tôi không biết bởi con người hoặc máy móc), và sau đó được nhân rộng. Đôi khi khi họ đóng gói lần đầu tiên, họ thậm chí còn tạo ra từng lớp hình ảnh và dán nó vào trong xe tải chỉ để các thuyền viên địa phương biết chính xác, hộp nào phải được sạc khi nào và ở đâu. Nhưng đây cũng là một nhu cầu đóng gói cụ thể vì đối với một tour du lịch họ luôn làm việc với cùng các hộp và xe tải.


1

Các heuristic mà bạn đề cập trong bài viết của bạn có vẻ thú vị.

Tôi sẽ đề nghị một vài sửa đổi để cải thiện giải pháp cuối cùng.

Đưa ra một giải pháp với tất cả các mặt hàng được đóng gói trong một hộp, cố gắng hợp nhất nội dung của hai hộp nhỏ trong một hộp lớn hơn (điều này sẽ giúp cải thiện tiêu chí của bạn về việc sử dụng càng ít hộp càng tốt).

Ngoài ra, mỗi khi bạn bắt đầu một hộp mới, thay vì sử dụng hộp nhỏ nhất có thể chứa vật phẩm hiện tại, bạn có thể chọn hộp lớn nhất có thể chứa nó và một khi mọi vật phẩm được gán cho một hộp, hãy thử gán tất cả các vật phẩm của một hộp để hộp nhỏ hơn.

Ngoài ra, trong chức năng khớp của bạn, thay vì coi vị trí của các hộp khác là cố định, bạn có thể tưởng tượng việc thay đổi trình tự tải. Điều này sẽ cho phép bạn tìm giải pháp tốt hơn với chi phí thời gian chạy dài hơn.


Đó có vẻ là những cải tiến thú vị. Tôi đã không chạm vào vấn đề này trong một thời gian dài. Có lẽ tôi nên thử một trong những ngày này. Cảm ơn.
Ricardo Souza
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.