Ive punya banyak persegi panjang benda-benda yang saya butuhkan untuk berkemas ke ruang terkecil mungkin (dimensi ruang ini harus menjadi kekuatan dari dua).
I'm menyadari berbagai kemasan algoritma yang akan mengemas barang-barang serta mungkin ke dalam ruang yang diberikan, namun dalam hal ini saya perlu algoritma untuk bekerja keluar berapa besar ruang yang harus juga.
Misalnya mengatakan Ive got berikut persegi panjang
Mereka dapat dikemas menjadi 128*128 ruang
_________________ |128*32 | |________________| |128*64 | | | | | |________________| |64*32 |64*32 | |_______|________|Namun jika ada juga 160\*32 dan 64\*64 itu akan membutuhkan 256\*128 ruang
________________________________ |128*32 |64*64 |64*32 | |________________| |_______| |128*64 | |64*32 | | |_______|_______| | | | |________________|___ | |160*32 | | |____________________|___________|
Apa algoritma-algoritma yang ada yang bisa untuk mengemas banyak persegi panjang dan menentukan ukuran yang dibutuhkan untuk wadah (dengan kekuatan 2, dan hanya diberikan ukuran maksimum untuk masing-masing dimensi)?
Lihat halaman ini pada BUSUR proyek untuk survei solusi, ada trade-off antara kompleksitas implementasi/waktu dan optimalitas, tetapi ada berbagai macam algoritma untuk memilih dari. Berikut ini's ekstrak algoritma:
Cepat dan kotor pertama melewati larutan adalah selalu salah besar untuk mulai dengan, sebagai perbandingan jika tidak ada yang lain.
Serakah penempatan dari besar ke kecil.
Menempatkan terbesar persegi panjang yang tersisa ke dikemas daerah. Jika hal ini dapat't cocok di mana saja, tempat itu di tempat yang meluas pack wilayah sesedikit mungkin. Ulangi sampai anda selesai dengan persegi panjang terkecil.
It's tidak sempurna sama sekali tapi itu's mudah dan bagus baseline. Itu masih akan pack asli anda misalnya dengan sempurna, dan memberikan anda sebuah setara jawaban untuk kedua juga.
Silahkan lihat di packing masalah. Saya pikir anda berada di bawah '2D bin packing.' Anda harus dapat belajar banyak dari solusi untuk itu dan kemasan lainnya masalah.
Lihat juga: Kemasan persegi panjang data gambar menjadi persegi tekstur.
Ada literatur yang luas pada masalah ini. Baik greedy heuristik adalah untuk menempatkan persegi dari luas terbesar ke terkecil, dalam posisi ke arah bawah dan kiri dari wadah. Berpikir gravitasi menarik semua barang-barang ke pojok kiri bawah. Untuk keterangan ini google "Chazelle kiri bawah kemasan".
Untuk solusi yang optimal, negara-of-the-art teknik dapat paket lebih dari 20 persegi panjang dalam beberapa detik. Huang an algoritma yang memisahkan masalah untuk menemukan yang terkecil melampirkan bounding box dari masalah memutuskan apakah atau tidak satu set persegi panjang yang dapat disimpan dalam sebuah kotak batas ukuran tertentu. Anda memberikan program satu set persegi panjang, dan ia memberitahu anda terkecil melampirkan kotak batas yang diperlukan untuk paket mereka.
Untuk kasus anda, anda outer loop harus beralih dari yang terkecil mungkin bounding box ke atas (dengan lebar dan tinggi berturut-turut meningkat oleh kekuatan dari dua). Untuk masing-masing bounding box, tes untuk melihat apakah anda dapat menemukan kemasan untuk persegi panjang. Anda akan mendapatkan banyak "tidak" jawaban, sampai pertama "ya" jawaban, yang akan dijamin untuk menjadi solusi yang optimal.
Untuk inner loop algoritma anda-salah satu yang jawaban "ya" atau "tidak" untuk bounding box dari ukuran tertentu, saya akan mencari Huang referensi dan hanya menerapkan algoritma-nya. Ia mencakup banyak optimasi di atas dasar algoritma, tetapi anda hanya benar-benar membutuhkan dasar daging dan kentang. Karena anda ingin menangani rotasi, pada setiap titik cabang selama pencarian anda, hanya mencoba kedua rotasi dan mundur ketika rotasi tidak menghasilkan solusi.
I'm cukup yakin bahwa ini adalah NP-hard problem, sehingga, untuk solusi optimal, anda'd harus menerapkan algoritma backtracking yang mencoba setiap kombinasi yang mungkin.
Kabar baiknya adalah bahwa karena kebutuhan untuk paket 2D persegi panjang di ruang 2D, anda dapat memangkas banyak kemungkinan pada awal, jadi itu mungkin tidak akan seburuk ITU.
Yang anda butuhkan adalah di https://github.com/nothings/stb/blob/master/stb_rect_pack.h
contoh:
stbrp_context context;
struct stbrp_rect rects[100];
for (int i=0; i< 100; i++)
{
rects[i].id = i;
rects[i].w = 100+i;
rects[i].h = 100+i;
rects[i].x = 0;
rects[i].y = 0;
rects[i].was_packed = 0;
}
int rectsLength = sizeof(rects)/sizeof(rects[0]);
int nodeCount = 4096*2;
struct stbrp_node nodes[nodeCount];
stbrp_init_target(&context, 4096, 4096, nodes, nodeCount);
stbrp_pack_rects(&context, rects, rectsLength);
for (int i=0; i< 100; i++)
{
printf("rect %i (%hu,%hu) was_packed=%i\n", rects[i].id, rects[i].x, rects[i].y, rects[i].was_packed);
}
Solusi umum adalah non-sepele (matematika berbicara untuk benar-benar ****ing mustahil) Umumnya orang-orang menggunakan algoritma genetika untuk mencoba kombinasi yang mungkin, tetapi dapat anda lakukan dengan cukup baik dengan meletakkan terbesar dalam bentuk pertama dan kemudian mencoba tempat yang berbeda untuk terbesar berikutnya dan seterusnya.
I'm menggunakan salah satu dari:
Menerapkan guillotine algoritma dan membutuhkan sebagai masukan satu dimensi dan mencoba untuk mengoptimalkan lain (anda juga dapat mengatur maksimum dengan sedikit perubahan pada kode). Mungkin jika anda mencoba berbagai kekuatan dari dua nilai itu akan bekerja untuk anda.
Hal ini tidak optimal dalam cara apapun, tapi itu kecil, portabel (.jam saja), dan tidak memiliki ketergantungan lainnya dari C++ dan STL.