Öğenin nakliye için 3d Ambalaj algoritması


24

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:

  1. Bilinen dikdörtgen kutu boyutlarının sonlu bir kümesi var

  2. Kutularda paketlenecek çok sayıda rasgele dikdörtgen öğe var

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

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

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

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

  1. Öğeleri "paketlenecek öğeler" listesinden alçalma cilt sırasına göre (ilk önce daha büyük) sıralayın

  2. Bu listedeki her öğe için:

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

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

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

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

  1. Kutunun kalan hacminin, maddenin hacmine uyup uymadığını kontrol edin. Değilse false döndürün.

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

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

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

  5. Öğe, olası tüm yönleriyle orijinal yönüne döndürülmediyse, 3. adımdan itibaren tekrar deneyin.

  6. Denenen ve uyumsuz olan tüm dönüşler bulunursa, geçerli koordinatı kullanılamaz alan olarak kabul edin.

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


4
packingİlişkili bir etikete gerek yoktur ; algorithmsyeterli değil :)
Chris Cirefice

Merak ediyorum, gerçek paketleme robotlar veya insanlar tarafından mı yapılacak? İkincisi ise, alan optimizasyonu her bir kutunun içine sığacak şekilde nasıl döndürüleceğini bulmak için gereken süreye değer mi olacak?
foraidt

İyi soru. Asıl paketleme insanlar tarafından yapılacak, ancak yazılım her bir kutunun paketleme sırasını ve konumunu önerecektir. Sağlanan düzene bakmak ve malları kutunun içine yerleştirmek için ambalaj tecrübesi gerektirmez. İlk başta, buna alışmak için biraz zaman harcanacak, ancak en iyi eğilimi düşünmek gerekmeyecek.
Ricardo Souza

1
Bence @ msw'nin söylediği şey, bu tür bir sorunun "mükemmel" bir çözüm için uygun olmadığının, bunun yerine, sizin belirlediğiniz kurallara dayanarak sezgisel olarak makul bir sürede bulunan kabul edilebilir bir çözüme daha iyi bir uyum olduğunu düşünüyorum. sağlanan. Matematiksel bir bakış açısıyla, bu genellikle farklı bir algoritma ve araç seti ile yaklaşmanız anlamına gelir, bu yüzden sadece bunu tavsiye ettiğini düşünüyorum. Örneğin, genetik algoritmalar, benzetilmiş tavlama ve buluşsal bulgunuza göre çözüm uzayına yaklaşan gradyan bir iniş eğrisini izlemenin diğer yöntemleri burada fayda sağlayabilir.
J Trana,

1
Burada sadece bir fikir yazıyorum. Etkili olacağını düşünmüyorsanız, görmezden gelebilirsiniz. Bu çözüm (daha çok bir optimizasyon gibidir) gerçekten algoritmanızın girdisinin ne kadar benzer olduğuna bağlıdır. Dolayısıyla, girdilerinizin zaman içinde bazı benzerliklere sahip olacağı gerçeğinden istifade etmek. Hesaplanan sonuçları (pahalı bir hesaplama karmaşıklığına sahip olan) saklayabilir / önbelleğe alabilir, ardından bunları girişinizle karşılaştırabilir ve tam eşleşmenize veya kısmi eşleşmenize sahipseniz, bazı küçük boyutlu nesneleri yeniden sıralamak için yalnızca birkaç hesaplama yapmanız gerekir. Elbette bu yeni sorunların ortaya çıkmasına neden olur.
JAAAY

Yanıtlar:


4

Depo gözü paketleme işlemi çok hesaplama açısından zordur. Sorunun yarısını düşünün: Ürünü, kutuda israfı olmayan nakliye kutularında paketlemek istiyorsunuz. Bunun için en uygun çözüm, tüm olası altkümelerin ve bir kamyonda gönderilmesi gereken ürünün tüm olası 3d düzenlemelerinin üzerinden geçirilmesini gerektirecektir. Size bunun için en uygun çözümü vereceğim çünkü kahvaltıdan önce altı imkansız şey yapan bir arkadaşım var.

Şimdi kamyona bütün kutuları boşa harcamadan vermek zorundasın. Arkadaşım ikinci imkansız şeyini yapar ve size bir çözüm sunar. Maalesef, yukarıda seçtiğiniz kutu boyutlarında, ilk görevde farklı (daha büyük veya daha küçük) kutular seçtiyseniz, istif aracında boşaltılabilir. Bir kutunun boyutunu değiştirirseniz, en iyi ihtimalle aracı yeniden paketlemeniz gerekir; en kötüsü, başladığımız sorun kadar zor olan tüm kutuları yeniden doldurmanız gerekebilir. Ve, ilk aşamada olduğu gibi, mümkün olan tüm 3B düzenlemeleri denemeniz gerekir.

Skiena'nın Algoritma Tasarım El Kitabı'nı hangi algoritma sınıflarının hangi problemlere uyduğunu düşünmek için faydalı buldum, fakat çoğunlukla sıradan problemler için bile iyi çözümlerin hesaplama zorluğuyla karşı karşıya kaldığını öğrendim. İhtiyacınız olan şeylerin çoğu çöp toplama problemleri sınıfına giriyor ve bu makale iyi bir başlangıç ​​noktası. Bunun için en iyi algoritmalardan bazılarının ticari ürünler olduğuna dikkat etmek önemlidir, çünkü bu görev lojistikte her yerde ortaya çıkıyor (en az sayıda tren vagonu mallarımı alabilirim? Doğru sezgisel bir üreticiyi ayda 100 tren vagonu kurtarabilirse, kazanılması gereken önemli para var.

Ne yazık ki, sezgisel araştırmayı optimize etme literatürü algoritmalar için olduğu kadar büyük değildir. Yalnız gitmeye çalışırsanız, ikinci ayınıza kadar dikdörtgen prizma taşımanın hayalini kuracağınızı garanti ederim. Kesin bir stok sorunum vardı, eğer bir daha yapmak zorunda kalırsam muhtemelen uzmanlara (veya onların mülkiyet yazılımlarına) yetişebilirim.

Yorumumun iyi bir şekilde genişletilmesi için @JTrana'ya teşekkür ederim.


Geri bildiriminiz için teşekkür ederiz. Soruda söylediğim gibi, bu konuyu zaten araştırdım ve yukarıdaki konuyu önermek için birkaç algoritmanın karışımı oldum. Sadece ambalajın kendisiyle ilgili endişeliyim. Tüm bu kutular, ofis hizmetleri gönderilerek gönderilecektir. Neyse ki, kamyon yükleme ile uğraşmak zorunda kalmayacağım.
Ricardo Souza

Bu benim açıklamamın güzel bir parçasıydı. Algoritmasını hizmetlerini ödemenizi isteyen firmalardan "çıkaramazsınız". Listelenen iki firmanın bir API'si var, ancak paketleme sunucularında yapılıyor ve hırsızlık dışında uygulama koduna erişiminiz yok. Ve kamyonları paketlemek zorunda kalmamanız güzel, şimdi sorun sadece yarısı zor, bu yüzden firmaların size bir çözüm satmak istemesi ve insanların hizmet almaya istekli olmaları.
msn

1
Sanırım burada bir yanlış anlaşılma var. Beni iyi ifade etmemiş olabilirim (fark ettiğiniz gibi, İngilizce benim ana dilim değil). Algoritmaları çalmayı istemiyorum. Konuyla ilgili açıklama için buraya geldim. Bazı araştırmalar yaptım ve analiz için yukarıdaki örneğe koydum. Belki de bana daha iyi yönler verebilecek aynı problemleri yaşayan biri var. Eğer çözümüm uygulanabilir değilse, daha iyi sonuçlar almak için ne yapabilirim? Bu benim asıl sorum şu. Umarım şimdi beni daha da netleştirmişimdir.
Ricardo Souza

İngilizcen iyi; Sanırım sorun şu ki, görevin farklı katmanlarından söz ediyoruz. Uygulamayı düşünüyorsunuz ve kombinasyonsal patlamayı düşünüyorum. Ben senin çözme düşünüyorum Edit 2 daha iyi ben ona bakıyorum biçiminden sorunu anlamanıza yardımcı olacaktır. Belirtildiği gibi çözebilir misiniz? En az boyutta, en az sayıda kutu ile israf olmadan? Bu daha önce bahsettiğim multioptimization problemidir ki yapması imkansız: Birini optimize etmek için bu faktörlerden en az birini feda etmeniz gerekecek.
msn

Teşekkür ederim. Sanırım şimdi anladım. Kodlamaya çalışmadım. Daha somut bir çözümden önce kodlama için zaman harcamamayı ya da en azından teklifim hakkında olumlu bir geri bildirim almamı düşünüyordum, çünkü bu ilk başta bir teklif içindi. Hala araştırıyorum ama korkarım ki bu API'lerden birini alıp aygıtların (Win CE 6.0 çalıştıran veri toplayıcıları) internete bağlı olarak çalışıp çalışamayacağını görmem gerekecek. Müşteriden aldığım ilk bilgi, işyerinde internet erişiminin olmayacağını belirtti.
Ricardo Souza

1

Yeni algoritmalar oluştururken ve son zamanlarda kendimden bir paketleme algoritması yaptım (hala bazı optimizasyon potansiyelleri olduğunu biliyorum), her zaman en basit yaklaşımı yaparım:

Bir insan olarak bunu nasıl yaparım ve onu bir algoritmaya çeviririm: Ben (robotik) AI öğretmenimden Rolf Pfeifer'den hala aklımda, görünür zekanın bazen çok basit kurallarla yaratılabileceğini, bu yüzden de inşallah yerine Ben mühendisliğe çalışıyorum

  1. Çok büyük öğeleri tanımlayın (belirli bir kutuya sığmayan öğeler)
  2. Mümkün olan en iyi kutuyu bulmaya çalışın (toplam hacim ve öğe boyutlarını çapraz karşılaştırarak)
  3. Büyükten küçüğe, kutudan (boşluk) küçükten büyüğe ürün siparişi verin
  4. En büyük öğeyi mümkün olan en küçük alana sığdırın
  5. Eğer en büyük madde üstüne zıplayamazsa ve bir şey daha uymayacaksa bir sonrakini deneyin
  6. Kalan öğeler için yeni en iyi kutuda arama yapın. ...

    X. her zaman istisnai olaylar hakkında düşünün (bir kutu yalnızca 1 öğe içeriyorsa, kutudan öğe göndermek daha iyi olmaz mıydı? Vs.), her zaman istisnai olayları düşünün, ancak bir karar biçiminde de bir buluşsal yöntem yapabilirsiniz. ağacı.

Elbette ne kadar ileri alırsan daha fazla uyarılar var, sadece bu fikirleri başlangıç ​​noktası olarak veriyorum. Oradan mümkün birçok yol var. Bir alternatif, bir kutuyu küçük küplere bölmek (örneğin 5 cm x 5 cm x 5 cm) ve onları dolu / boş olarak izlemek olabilir, başka bir yaklaşım 3d tetris, vb. Olarak adlandırılabilir.

Bu yaklaşımla, birleşme patlamaları için mutlaka endişelenmenize gerek yoktur. Öte yandan, eğer tren yüklerinden bahsediyorsak birleşme patlaması meydana gelebilir, ancak daha sonra tekrar: Bir şirketin paketleme listesini, maddeye göre kontrol edeceğini düşünüyor musunuz? Hayır, bir bölmeye yaklaşırlar ve fethedilemezler: Standartlaştırılmış hacimleri (örneğin paletler veya sabit boyutlu kutular) kullanarak karmaşıklığı bölün. Bu yüzden pratikler için bile, sadece trenlerin değil, bazen çalışanların zamanının da para olduğunu göz önünde bulundurun. Bir tren x palet yükleyebilir, her palet sabit hacme sahiptir, bu nedenle öğeleri palet içine paketleyin, ancak daha sonra yine bir palet birkaç düzenden oluşur, bu nedenle daha sonra yüklenen paletlere yüklenen ürünler için sabit kutular kullanın Trenlere.

En azından ben bir insan olarak görevle başa çıkacağım, en iyi kutuyu elde edeceğim ve en büyük maddeyi tek tek mevcut en küçük alana sığdıracağım (ve biraz önizleme ekleyeceğim).

Algoritmamda olduğu gibi, sonunda en iyi çözüme sahip değilsinizdir, ancak daha sonra rafine edebileceğiniz çok iyi bir sezgisel çözüm.

Bazen, ilk adımla başlamak ve yolunuzdaki sorunları çözmek daha kolaydır, tabii ki ideal değil, ideal adım kenarda bir adım atmak değil, biraz zekice ... bazen zorlamak, alternatifleri araştırmak ve seçmek zorunda kalabilirsiniz en iyisi veya "geri adım" uygulamak.

Fakat AI öğretmenimden öğrendiğim gibi (Rolf Pfeifer, bununla tekrar rahatsız ettiğim için üzgünüm): Bazen bazı basit ve az kurallı bazı belirgin davranışlarla görünür zekâlı davranış yaratabiliyorsunuz. sağ tarafta bir engel tespit ederler, sol tarafta bir engel varsa sağa dönerler ve engel yoksa veya önünde engel varsa düz giderler. Bunun gibi 3 veya 4 robot, çok sayıda ping pong topuyla 3m x 3m kareye koymak, robotların ping pong toplarını köşelere iterek, temizlenmiş gibiydiler. sadece engelleri önlemek için programlanmış.

PD: Bu yaklaşımdan bulduğum tek gerçek sapma, metallica, demir kızlık, britney spears, paul mcCartney, U olarak adlandırılan büyük konserler için yarı zamanlı çalıştığım zamandı. Uluslararası turlar, her bir öğeye göre hassas paketleme listelerine sahiptir. Hesaplamalar bir kez yapılıyor (insanlar veya makineler tarafından bilmiyorum) ve sonra çoğaltılıyor. Bazen ilk kez toplandıklarında, katman katman katman resimler bile yapıyorlar ve kamyonun içine yapıştırıyorlardı, böylece yerel ekipler tam olarak ne zaman ve nerede şarj edilmek zorunda kalacaklarını biliyorlardı. Ancak bu aynı zamanda her zaman aynı kutular ve kamyonlarla çalışan tek bir tur için olduğu gibi özel bir paketleme ihtiyacıdır.


1

Görevinizde bahsettiğiniz sezgisel buluş ilginç görünüyor.

Nihai çözümü geliştirmek için birkaç değişiklik önerebilirim.

Tüm eşyaların tek bir kutuda toplanmasıyla bir çözüm verildiğinde, iki küçük kutunun içeriğini daha büyük bir kutuda birleştirmeyi deneyin (bu, mümkün olduğunca az kutu kullanma kriterlerinizin iyileştirilmesine yardımcı olmalıdır).

Alternatif olarak, yeni bir kutuya her başlattığınızda, geçerli öğeyi barındırabilecek en küçük kutuyu kullanmak yerine, sığabilecek en büyük kutuyu seçebilirsiniz ve her öğe bir kutuya atandığında, bir öğenin tüm öğelerini atamayı deneyin. daha küçük bir kutuya.

Ayrıca, yerleştirme işlevinizde, diğer kutularınızın konumunu sabit olarak kabul etmek yerine, yükleme sırasını değiştirmeyi düşünebilirsiniz. Bu, daha uzun bir çalışma süresi pahasına daha iyi çözümler bulmanıza izin vermelidir.


Bu ilginç gelişmelere benziyor. Bu soruna uzun zamandır dokunmadım. Belki bugünlerden birini denemeliyim. Teşekkürler.
Ricardo Souza
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.