Malların mümkün olduğu kadar az kutuya en iyi şekilde yerleştirilmesini öneren bir gönderi tahmini oluşturma görevi aldım:
Bilinen dikdörtgen kutu boyutlarının sonlu bir kümesi var
Kutularda paketlenecek çok sayıda rasgele dikdörtgen öğe var
Daha az sayıda kutu en iyisi kullanılmalıdır. Çünkü iki kutuya 1x1x1 nakliye, bir kutuya 1x2x1'den çok daha pahalıdır. Buradaki öncelik bu olmalı.
Ayrıca ikinci seviye önceliği olan mümkün olduğunca küçük kutuları kullanmak için de optimize edilmelidir. (örn .: bir büyük kutu ile iki küçük arasında bir seçenek sunulursa, büyük kutuyu seçmelidir)
Öğeler kutuya sığacak şekilde döndürülebilir, ancak rotasyonun minimumda 45 ° 'lik artışlarla sınırlandırılması gerekir (araştırmalarımda bazı yapılandırmaların daha büyük bir dikdörtgen kutu içindeki normal kutulara daha iyi oturması için 45 derecelik bir dönüşe izin verdiği görülüyor) 90 ° döndürülerek alınacak standart.
Kutularda ağırlık sınırı vardır ve öğeler isteğe bağlı ağırlığa sahiptir (örneğin: 1x1x1 boyutunda bir öğe diğer 2x2x2 öğesinden daha ağır olabilir)
Biraz araştırdım ve kutu ambalajında ve sırt çantası probleminde bazı soyutlanmış algoritmalar buldum ve en iyi algoritmaya benzer şekilde aşağıdaki bruteforce varyasyonuyla geldim:
Öğeleri "paketlenecek öğeler" listesinden alçalma cilt sırasına göre (ilk önce daha büyük) sıralayın
Bu listedeki her öğe için:
"Kullanılan kutular" listesindeki küçük kutuyu seçin ve öğeye uyacak kadar kalan hacim ve ağırlık sınırına sahip (Boyutlara ve ağırlığa uydurmak için buraya sığacak şekilde kullanacağım)
Eğer böyle bir kutu yoksa, ürünün boyutlarına ve ağırlığına uyabilecek en küçük boyut olan olası kutu boyutlarını bildiğiniz bir setten yeni bir kutu oluşturun ve "kullanılmış kutular" listesine ekleyin.
Bir kutu öğeye uyuyorsa (montaj işlevini aşağıdaki şekilde kullanın), "bu kutunun öğeleri" listesine ekleyin ve kutunun içindeki göreceli 3d konumunu işaretleyerek "sığdırılacak öğeler" listesinden çıkarın.
"Paketlenecek öğeler" listesine takılacak bir öğe bulunmayana kadar 2.1'den tekrarlayın.
Yukarıdaki 2. adımda kullanılan montaj kontrol işlevi:
Kutunun kalan hacminin, maddenin hacmine uyup uymadığını kontrol edin. Değilse false döndürün.
"Kutu eşyalarının" ağırlığının toplamının artı mevcut eşya ağırlığının kutu ağırlık sınırına eşit veya daha küçük olup olmadığını kontrol edin. Değilse false döndürün.
Kullanılamaz alan olarak yerleştirilen diğer öğeleri göz önünde bulundurarak, en küçük Y bileşenine sahip ve öğenin genişliği, derinliği ve yüksekliği için yeterli alana sahip ilk kutu koordinatını seçmek için "kutunun öğeleri" listesini işaretleyin.
Öğe mevcut yönüne uymuyorsa, basitlik için 45 ° döndürme varsayımıyla değil, 6 olası döndürmeden birinde döndürün. (Önceden test edilen yerlerin atlanabileceği boyutlara yol açan rotasyonlar atlanabilir. Örneğin: bir kutuyu 180 ° döndürmek, tüm kutular ve nesnelerin zıt yüzler için aynı boyuta sahip olması ve atlanabilmesi için orijinal konumla aynı boyutlarda olur.)
Öğe, olası tüm yönleriyle orijinal yönüne döndürülmediyse, 3. adımdan itibaren tekrar deneyin.
Denenen ve uyumsuz olan tüm dönüşler bulunursa, geçerli koordinatı kullanılamaz alan olarak kabul edin.
Kontrol edilecek bir alan yoksa, false döndürün. Aksi takdirde, 3. adımdan itibaren tekrar deneyin.
Sunulan kısıtlamalar göz önüne alındığında sorunuma en iyi çözümü olup olmadığını bilmek istiyorum.
Bu teori üzerinde çalışıyor gibi görünüyor ama ben kod üzerinde denemedim. Doğru yöne gidip gelmediğimi veya bunu yapmanın daha iyi ve daha etkili yolları olduğunu bilmek istiyorum.
Referanslar çok iyi olurdu.
Düzenle:
İstediğim şeyi yapan bazı ilginç 3. parti API'ler buldum, ancak bunun bağlantısının kesilmesi gerekiyor, bu yüzden bunlara erişemem.
Bazı örnekler:
Düzenleme 2:
Çözülecek problemin gerçek dünya örneği şöyle olacaktır:
- 4 kutu ebadım var WxHxD: 10x12x18, 12x16x24, 16x20x30, 24x32x40
- 1 adet 6x8x10, 2x 22x14x30 ve 1x 22x4x20 olmak üzere 4 ürün siparişim var
Bu öğeleri mümkün olan en küçük kutuları kullanarak ve mümkün olduğunca az boş alan bırakarak mümkün olduğunca az kutu kullanarak bir veya daha fazla boyuttaki herhangi bir kutudaki kutuya nasıl yerleştirebilirim?
packing
İlişkili bir etikete gerek yoktur ;algorithms
yeterli değil :)