Saya telah menerima tugas untuk membuat estimasi pengiriman yang menyarankan akomodasi barang terbaik di sesedikit mungkin kotak:
Ada satu set terbatas dari ukuran kotak retangular yang diketahui
Ada banyak item retangular sewenang-wenang untuk dikemas di dalam kotak
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.
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)
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.
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:
Sortir item dalam urutan volume menurun (lebih besar dulu) pada daftar "item untuk dikemas"
Untuk setiap item dalam daftar ini:
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)
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".
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.
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:
Periksa apakah volume sisa kotak cocok dengan volume item. Jika tidak, kembalikan salah.
Periksa apakah jumlah berat "item kotak" ditambah berat item saat ini kurang atau sama dengan batas berat kotak. Jika tidak, kembalikan salah.
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.
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.)
Jika item belum diputar pada semua cara yang mungkin kembali ke orientasi aslinya, coba lagi dari langkah 3.
Jika semua rotasi tempat dicoba dan tidak ada kecocokan ditemukan, pertimbangkan koordinat saat ini sebagai ruang yang tidak tersedia.
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?
packing
tag terkait;algorithms
cukup :)