Algoritma pengepakan 3d untuk pengiriman barang

24

Saya telah menerima tugas untuk membuat estimasi pengiriman yang menyarankan akomodasi barang terbaik di sesedikit mungkin kotak:

  1. Ada satu set terbatas dari ukuran kotak retangular yang diketahui

  2. Ada banyak item retangular sewenang-wenang untuk dikemas di dalam kotak

  3. Semakin sedikit kotak sebaiknya digunakan yang terbaik. Karena pengiriman dua kotak 1x1x1 jauh lebih mahal daripada satu kotak 1x2x1. Ini harus menjadi prioritas di sini.

  4. Ini juga harus dioptimalkan untuk menggunakan kotak yang lebih kecil mungkin, sebagai prioritas tingkat kedua. (mis .: jika disajikan dengan pilihan antara satu kotak besar dan dua kecil, itu harus memilih kotak lebih besar)

  5. Barang-barang dapat diputar agar sesuai dengan kotak, tetapi rotasi harus dibatasi pada kenaikan minimal 45 ° (dalam penelitian saya tampaknya beberapa konfigurasi memungkinkan rotasi 45 derajat agar lebih sesuai dengan kotak retangular di dalam kotak retangular yang lebih besar) , menjadi 90 ° rotasi standar yang harus diambil.

  6. Kotak memiliki batas berat dan item memiliki bobot sewenang-wenang (mis .: item dengan ukuran 1x1x1 dapat lebih berat daripada item 2x2x2 lainnya)

Saya telah meneliti sedikit dan menemukan beberapa algoritma abstrak pada pengemasan bin dan masalah ransel dan datang dengan variasi agak kasar berikut, mirip dengan algoritma paling sesuai:

  1. Sortir item dalam urutan volume menurun (lebih besar dulu) pada daftar "item untuk dikemas"

  2. Untuk setiap item dalam daftar ini:

    1. Pilih kotak yang lebih kecil yang ada di daftar "kotak bekas" dan memiliki volume yang tersisa dan batas berat yang sesuai dengan item (Saya akan menggunakan cocok di sini berarti menyesuaikan dimensi dan berat)

    2. Jika tidak ada kotak seperti itu, buat kotak baru dari kumpulan ukuran kotak yang mungkin diketahui yang merupakan ukuran terkecil yang sesuai dengan dimensi dan berat item dan tambahkan ke daftar "kotak bekas".

    3. Jika sebuah kotak cocok dengan item (menggunakan fungsi pas di bawah), tambahkan ke daftar "item kotak ini" dan hapus dari daftar "item yang cocok", tandai itu posisi 3d relatif di dalam kotak.

    4. Ulangi dari 2.1 hingga tidak ada item yang akan dipasang pada daftar "items to pack".

Fungsi pemeriksaan pas digunakan pada langkah 2 di atas:

  1. Periksa apakah volume sisa kotak cocok dengan volume item. Jika tidak, kembalikan salah.

  2. Periksa apakah jumlah berat "item kotak" ditambah berat item saat ini kurang atau sama dengan batas berat kotak. Jika tidak, kembalikan salah.

  3. Periksa daftar "item kotak" untuk memilih koordinat kotak pertama yang memiliki komponen Y terkecil dan yang memiliki ruang yang cukup untuk lebar, kedalaman, dan tinggi item, dengan mempertimbangkan item lain yang ditempatkan sebagai ruang yang tidak tersedia.

  4. Jika item tidak sesuai dengan orientasi saat ini, putarlah pada salah satu dari 6 kemungkinan rotasi, jangan anggap rotasi 45 ° untuk kesederhanaan. (Rotasi yang menghasilkan ukuran di mana yang sudah diuji dapat dilewati. Misalnya: memutar kotak 180 ° memberikan dimensi yang sama dengan posisi aslinya karena semua kotak dan item memiliki ukuran yang sama untuk wajah yang berlawanan sehingga dapat dilewati.)

  5. Jika item belum diputar pada semua cara yang mungkin kembali ke orientasi aslinya, coba lagi dari langkah 3.

  6. Jika semua rotasi tempat dicoba dan tidak ada kecocokan ditemukan, pertimbangkan koordinat saat ini sebagai ruang yang tidak tersedia.

  7. Jika tidak ada ruang untuk memeriksa, kembalikan salah. Lain, coba lagi dari langkah 3.

Saya ingin tahu apakah ada solusi terbaik untuk masalah saya, mengingat kendala yang disajikan.

Ini sepertinya bekerja pada teori tetapi saya belum mencobanya pada kode. Saya ingin tahu apakah saya akan ke arah yang benar atau ada cara yang lebih baik dan performan untuk melakukan ini.

Referensi akan sangat bagus.

Edit:

Saya telah menemukan beberapa API pihak ke-3 yang menarik yang melakukan apa yang saya inginkan, tetapi ini harus diputus, jadi saya tidak akan memiliki akses ke ini.

Beberapa contoh adalah:

Edit 2:

Contoh dunia nyata masalah yang harus dipecahkan adalah:

  • Saya memiliki 4 ukuran kotak WxHxD: 10x12x18, 12x16x24, 16x20x30, 24x32x40
  • Saya memiliki pesanan 4 item, yaitu 1 ukuran 6x8x10, 2x 22x14x30, dan 1x 22x4x20

Bagaimana saya memasukkan barang-barang ini ke dalam sejumlah kotak dengan satu ukuran atau lebih menggunakan kotak sesedikit mungkin, menggunakan kotak sekecil mungkin dan menyisakan ruang kosong sesedikit mungkin?

Ricardo Souza
sumber
4
Tidak perlu packingtag terkait; algorithmscukup :)
Chris Cirefice
Saya ingin tahu, apakah pengepakan yang sebenarnya dilakukan oleh robot atau manusia? Jika ini yang terakhir, apakah optimasi ruang akan sepadan dengan waktu yang diperlukan untuk mencari tahu cara memutar setiap kotak agar sesuai?
foraidt
Pertanyaan bagus. Pengepakan yang sebenarnya akan dilakukan oleh manusia, tetapi perangkat lunak akan menyarankan urutan pengepakan dan posisi masing-masing kotak. Tidak perlu pengalaman dalam pengepakan untuk melihat tata letak yang disediakan dan menempatkan barang di dalam kotak. Pada awalnya, beberapa waktu akan dihabiskan untuk membiasakan diri, tetapi itu tidak akan memerlukan pemikiran tentang disposisi terbaik.
Ricardo Souza
1
Saya pikir semua @msw katakan adalah bahwa jenis masalah tidak mungkin cocok untuk solusi "sempurna", tetapi lebih cocok untuk solusi yang dapat diterima ditemukan dalam jumlah waktu yang wajar dengan heuristik berdasarkan aturan yang telah Anda disediakan. Dari sudut pandang matematika, ini sering berarti Anda mendekatinya dengan serangkaian algoritma dan alat yang berbeda, jadi saya pikir dia hanya merekomendasikan itu. Misalnya, algoritma genetika, anil simulasi, dan metode lain untuk mengikuti kurva gradient descent yang mendekati ruang solusi sehubungan dengan heuristik Anda mungkin memberikan manfaat di sini.
J Trana
1
Saya memposting hanya ide di sini. Jika Anda tidak berpikir itu akan efektif, Anda dapat mengabaikannya. Solusi ini (ini lebih seperti optimasi) benar-benar tergantung pada seberapa mirip input dari algoritma Anda nantinya. Jadi, manfaatkan fakta bahwa input Anda akan memiliki beberapa kesamaan dari waktu ke waktu. Anda dapat menyimpan / cache hasil yang dihitung (yang memiliki kompleksitas penghitungan mahal), kemudian membandingkannya dengan input Anda dan jika Anda memiliki kecocokan penuh atau kecocokan parsial Anda hanya perlu melakukan beberapa perhitungan untuk menyusun ulang beberapa objek ukuran kecil. Tentu saja hal ini menimbulkan masalah baru.
JAAAY

Jawaban:

4

Tempat sampah sangat sulit secara komputasi. Pikirkan setengah dari masalah: Anda ingin mengemas produk dalam kotak pengiriman tanpa ada pemborosan di dalam kotak. Solusi optimal untuk itu akan membutuhkan melalui semua himpunan bagian yang mungkin dan semua kemungkinan pengaturan 3d dari produk yang perlu dikirim dalam satu truk. Saya akan memberi Anda solusi optimal untuk itu karena saya punya teman yang melakukan enam hal yang mustahil sebelum sarapan.

Sekarang Anda hanya perlu mendapatkan semua kotak di truk tanpa pemborosan. Teman saya melakukan hal mustahil kedua dan memberi Anda solusi. Sayangnya, dengan ukuran kotak yang Anda pilih di atas, ada ruang kosong di truk yang dapat dikurangi jika Anda memilih kotak yang berbeda (baik yang lebih besar atau lebih kecil) pada tugas pertama. Jika Anda mengubah ukuran satu kotak, paling baik Anda harus mengemas kembali truk; paling buruk, Anda mungkin harus mengemas ulang semua kotak yang sama sulitnya dengan masalah yang kami mulai. Dan, seperti pada tahap pertama, Anda harus mencoba semua pengaturan 3d yang mungkin.

Saya menemukan The Algorithm Design Manual milik Skiena sangat membantu untuk berpikir tentang kelas algoritma apa yang cocok dengan jenis masalah yang mana, tetapi saya sebagian besar belajar bahwa solusi yang baik untuk masalah biasa bahkan yang meledak di dalam Anda hadapi dengan kesulitan komputasi. Sebagian besar dari apa yang Anda butuhkan masuk ke dalam kelas masalah bin-packing dan artikel itu adalah titik loncatan yang baik. Perlu dicatat bahwa beberapa algoritma terbaik untuk ini adalah produk komersial karena tugas ini muncul di mana-mana dalam logistik (berapa jumlah kereta mobil terkecil yang dapat saya bawa barang-barang saya? Dan semacamnya). Ada banyak uang yang harus dihasilkan jika heuristik yang tepat dapat menghemat 100 gerbong kereta per bulan.

Sayangnya, literatur tentang mengoptimalkan heuristik tidak hampir sebesar algoritma. Jika Anda mencoba melakukannya sendiri, saya jamin Anda akan bermimpi tentang memindahkan prisma persegi panjang pada bulan kedua Anda. Saya memiliki masalah yang sulit, jika saya harus melakukannya lagi, saya mungkin akan mencari ahli (atau perangkat lunak kesopanan mereka).

Terima kasih kepada @JTrana untuk perluasan komentar saya yang bagus.

msw
sumber
Terima kasih atas tanggapan Anda. Seperti yang telah saya katakan pada pertanyaan, saya sudah meneliti tentang masalah ini dan menemukan beberapa algoritma untuk mengusulkan yang satu di atas. Saya hanya peduli tentang pengepakan itu sendiri. Semua kotak ini akan dikirim melalui layanan kantor pos. Untungnya, saya tidak harus berurusan dengan pemuatan truk.
Ricardo Souza
Itu adalah bagian dari penjelasan saya. Anda tidak dapat "mengekstrak" algoritme dari perusahaan yang ingin Anda membayar layanan mereka. Dua perusahaan yang Anda daftarkan memiliki API, tetapi pengepakan dilakukan di server mereka dan Anda tidak memiliki akses ke kode implementasi kecuali dengan pencurian. Dan bagus bahwa Anda tidak harus mengemas truk, sekarang masalah Anda hanya setengah dari kesulitan itulah sebabnya perusahaan ingin menjual Anda solusi dan orang-orang mau membeli layanan.
msw
1
Saya pikir kami memiliki miskomunikasi di sini. Saya mungkin tidak mengekspresikan saya dengan baik (seperti yang Anda perhatikan, bahasa Inggris bukan bahasa rumah saya). Saya tidak meminta untuk mencuri algoritme. Saya datang ke sini untuk klarifikasi tentang masalah ini. Saya telah melakukan beberapa penelitian dan meletakkannya pada contoh di atas untuk analisis. Mungkin ada seseorang yang mengalami masalah yang sama yang dapat memberi saya arahan yang lebih baik. Jika solusi saya tidak berlaku, apa yang bisa saya lakukan untuk mendapatkan hasil yang lebih baik? Ini pertanyaan saya yang sebenarnya di sana. Saya harap saya sudah membuat saya lebih jelas sekarang.
Ricardo Souza
Bahasa Inggris Anda baik-baik saja; Saya pikir masalahnya adalah kita berbicara tentang lapisan tugas yang berbeda. Anda sedang memikirkan implementasi dan saya sedang memikirkan ledakan kombinasi. Saya pikir menyelesaikan Edit 2 Anda akan membantu Anda lebih memahami masalah dari cara saya melihatnya. Bisakah Anda menyelesaikannya seperti yang dinyatakan? Tanpa pemborosan, dengan jumlah kotak minimal dengan ukuran minimal? Itulah masalah multi-optimasi yang saya sebutkan sebelumnya yang saya katakan tidak mungkin dilakukan: Anda harus mengorbankan setidaknya salah satu faktor untuk mengoptimalkan yang lain.
msw
Terima kasih. Saya pikir saya mengerti sekarang. Saya tidak mencoba kode itu. Saya berpikir untuk tidak membuang waktu untuk mengkode sebelum solusi yang lebih konkret atau setidaknya umpan balik positif atas proposal saya muncul karena ini, pada awalnya, untuk kutipan. Saya masih meneliti tetapi saya khawatir saya harus mendapatkan salah satu dari API tersebut dan melihat apakah perangkat (pengumpul data yang menjalankan Win CE 6.0) dapat berjalan terhubung ke internet. Info pertama yang saya dapatkan dari klien menyatakan bahwa mereka tidak akan memiliki akses internet di tempat kerja.
Ricardo Souza
1

Ketika membuat algoritma baru, dan saya baru saja melakukan algoritma pengemasan sendiri (saya tahu masih memiliki beberapa potensi optimasi), saya selalu melakukan pendekatan yang paling sederhana:

Bagaimana saya sebagai manusia melakukannya, dan mencoba menerjemahkannya ke dalam sebuah algoritma: Dari (AI) robotik saya, Rolf Pfeifer, saya masih ingat, bahwa kecerdasan yang jelas kadang-kadang dapat dibuat dengan beberapa aturan yang sangat sederhana, jadi alih-alih melakukan rekayasa ulang Saya mencoba untuk underengineer

  1. Identifikasi barang yang terlalu besar (barang yang tidak cocok dengan kotak apa pun)
  2. Cobalah untuk menemukan kotak terbaik yang mungkin (dengan membandingkan volume total dan dimensi item)
  3. Pesan barang dari besar ke kecil dan kotak (spasi) dari kecil ke besar
  4. Pasangkan barang terbesar ke dalam ruang sekecil mungkin
  5. Jika item terbesar tidak menemukan melompati dan coba berikutnya sampai tidak ada yang lebih cocok
  6. Untuk item yang tersisa, cari kotak terbaik baru. ...

    X. selalu berpikir tentang peristiwa luar biasa (item kebesaran, bentuk aneh, jika sebuah kotak hanya berisi 1 item tidak akan lebih baik untuk mengirim item tanpa kotak ?, dll) tetapi Anda dapat membuat heuristik juga dalam bentuk keputusan pohon.

Tentu saja ada peringatan lebih lanjut semakin Anda dapatkan, saya hanya memberikan ide-ide ini sebagai titik awal. Dari sana ada banyak cara yang memungkinkan. Salah satu alternatifnya adalah dengan membagi sebuah kotak menjadi kubus kecil (mis. 5cmx5cmx5cm) dan melacaknya sebagai terisi / gratis. Pendekatan lain bisa disebut 3d tetris, dll.

Dengan pendekatan ini, Anda tidak perlu khawatir tentang ledakan kombinasatori. Di sisi lain, ledakan kombinasi dapat terjadi jika kita berbicara tentang muatan barang yang sangat banyak, tetapi sekali lagi: Apakah Anda benar-benar berpikir suatu perusahaan akan memeriksa item daftar kemasan berdasarkan item? Tidak, mereka akan mendekati solusi membagi dan menaklukkan: Membagi kompleksitas dengan menggunakan volume standar (misalnya palet, atau kotak berukuran tetap). Jadi, bahkan demi praktik, pertimbangkan bahwa tidak hanya melatih, terkadang waktu karyawan juga berupa uang. kereta bisa memuat x palet, setiap palet memiliki volume tetap, jadi bungkus item ke palet, tapi sekali lagi, mungkin palet terdiri dari beberapa pesanan, jadi gunakan kotak tetap untuk item, yang kemudian dimuat ke palet, yang kemudian dimuat ke dalam kereta.

Setidaknya begitulah saya sebagai manusia akan menangani tugas tersebut, dapatkan kotak terbaik, lalu muat item terbesar satu per satu di ruang terkecil yang tersedia (dan tambahkan sedikit pratinjau).

Seperti dalam algoritme saya, pada akhirnya Anda mungkin tidak akan memiliki solusi terbaik, tetapi heuristik yang jauh lebih baik yang kemudian dapat Anda perbaiki lebih lanjut.

Kadang-kadang lebih mudah untuk memulai dengan langkah pertama dan menyelesaikan masalah di jalan Anda, tentu saja idealnya bukan semacam langkah di atas langkah tepi, tetapi sedikit pintar ... kadang-kadang Anda mungkin terpaksa, untuk mencari alternatif dan memilih yang terbaik atau menerapkan "langkah mundur".

Tapi seperti yang saya pelajari dari guru AI saya (Rolf Pfeifer, maaf repot-repot dengan itu lagi): Kadang-kadang Anda dapat menciptakan perilaku cerdas yang tampak dengan beberapa peraturan yang sangat sederhana dan muncul beberapa perilaku dalam contoh yang disebutkan mereka memprogram mobil jarak jauh kecil untuk belok kiri jika mereka mendeteksi hambatan di sisi kanan, belok kanan jika ada hambatan di sisi kiri dan lurus jika tidak ada hambatan atau jika hambatan ada di depan. 3 atau 4 robot seperti itu, dimasukkan ke dalam persegi 3m x 3m dengan banyak bola ping-pong mengarah pada fakta luar biasa bahwa robot tampaknya membersihkan, mendorong bola ping-pong ke sudut-sudut, meskipun robot adalah hanya diprogram untuk menghindari rintangan.

PD: Satu-satunya penyimpangan dunia nyata yang saya temukan dari pendekatan ini adalah ketika saya paruh waktu bekerja sebagai tukang panggung untuk konser besar seperti metallica, iron maiden, britney spear, paul mcCartney, U nama itu ... Pengemudi truk yang bekerja di tur internasional memiliki daftar pengepakan yang tepat item demi item. Perhitungan dilakukan sekali (saya tidak tahu oleh manusia atau mesin), dan kemudian direplikasi. Kadang-kadang ketika mereka mengepak pertama kali, mereka bahkan membuat gambar lapis demi lapis dan menempelkannya di dalam truk agar kru setempat tahu persis, kotak mana yang harus diisi kapan dan di mana. Tetapi ini juga merupakan kebutuhan pengemasan khusus karena untuk satu tur mereka selalu bekerja dengan kotak dan truk yang sama.

Canelo Digital
sumber
1

Heuristik yang Anda sebutkan di pos Anda tampak menarik.

Saya akan menyarankan beberapa modifikasi untuk meningkatkan solusi akhir.

Diberikan solusi dengan semua item yang dikemas dalam satu kotak, cobalah untuk menggabungkan konten dua kotak kecil dalam satu kotak yang lebih besar (ini akan membantu dalam meningkatkan kriteria Anda menggunakan sesedikit mungkin kotak).

Atau, setiap kali Anda memulai kotak baru, alih-alih menggunakan kotak terkecil yang dapat mengakomodasi item saat ini, Anda bisa memilih kotak terbesar yang dapat menampungnya, dan begitu setiap item ditugaskan ke sebuah kotak, coba tetapkan semua item dari kotak ke kotak yang lebih kecil.

Juga, dalam fungsi pemasangan Anda, alih-alih mempertimbangkan posisi kotak Anda yang lain sebagai tetap, Anda dapat membayangkan mengubah urutan pemuatan. Ini akan memungkinkan Anda menemukan solusi yang lebih baik dengan mengorbankan waktu berjalan yang lebih lama.

Renaud M.
sumber
Itu sepertinya perbaikan yang menarik. Saya sudah lama tidak menyentuh masalah ini. Mungkin saya harus mencobanya hari ini. Terima kasih.
Ricardo Souza