Algoritmo di imballaggio 3D per la spedizione dell'articolo

24

Ho ricevuto l'incarico di creare una stima di spedizione che suggerisca la migliore sistemazione di merci nel minor numero possibile di scatole:

  1. Esiste un insieme finito di dimensioni della casella retangolare note

  2. Ci sono molti oggetti retangolari arbitrari da imballare all'interno di scatole

  3. Meno caselle dovrebbero essere utilizzate al meglio. Poiché la spedizione di due scatole 1x1x1 è molto più costosa di una scatola 1x2x1. Questa dovrebbe essere la priorità qui.

  4. Dovrebbe anche essere ottimizzato per utilizzare le caselle più piccole possibile, come priorità di secondo livello. (es .: se viene presentata una scelta tra una scatola più grande e due piccole, dovrebbe scegliere la scatola più grande)

  5. Gli oggetti possono essere ruotati per adattarsi alla scatola, ma la rotazione deve essere limitata ad incrementi di 45 ° al minimo (nelle mie ricerche sembra che alcune configurazioni consentano una rotazione di 45 gradi per adattarsi meglio alle scatole retangolari all'interno di una scatola retangolare più grande), ruotando di 90 ° lo standard da adottare.

  6. Le scatole hanno un limite di peso e gli oggetti hanno pesi arbitrari (es .: un oggetto che è la dimensione è 1x1x1 può essere più pesante di un altro oggetto 2x2x2)

Ho studiato un po 'e ho trovato alcuni algoritmi astratti su bin packing e il problema dello zaino e sono venuti con la seguente variazione alquanto bruteforce, simile all'algoritmo best fit:

  1. Sort the items in decrescent volume order (bigger first) on an "items to pack" list

  2. For each item on this list:

    1. Choose the smaller box that is on the "used boxes" list and has enough remaining volume and weight limit to fit the item (I will use fit here to mean fitting the dimensions and weight)

    2. If there is not such box, create a new box from the know set of possible box sizes that is the smallest size that can fit the item's dimensions and weight and add it to the list of "used boxes".

    3. If a box fits the item (using the fitting function bellow), add it to the list of "this box's items" and remove it from the "items to fit" list, marking it's relative 3d position inside the box.

    4. Repeat from 2.1 until there is no item to be fitted on the "items to pack" list.

La funzione di controllo dell'adattamento utilizzata nel passaggio 2 sopra:

  1. Check if the remaining volume of the box fits the volume of the item. If not, return false.

  2. Check if the sum of "box's items" weight plus the current item weight is less or equal to the box weight limit. If not, return false.

  3. Check the "box's items" list to choose the first box coordinate that has the smallest Y component and that has enough space for the item's width, depth and height, considering the other items placed as unavailable space.

  4. If the item doesn't fit at it's current orientation rotate it on one of the 6 possible rotations, not assuming 45° rotations for simplicity. (Rotations that result in sizes that where already tested can be skipped. Eg.: rotating a box 180° gives the same dimmensions as the original position because all boxes and items have the same size for opposite faces and so can be skipped.)

  5. If the item hasn't been rotated on all the possible ways back to its original orientation, try again from step 3.

  6. If all rotations where tried and no fit was found, consider the current coordinate as unavailable space.

  7. If there is not avaliable space to check, return false. Else, try again from step 3.

Voglio sapere se può esserci una soluzione migliore per il mio problema, dati i vincoli presentati.

Questo sembra funzionare sulla teoria ma non l'ho provato sul codice. Vorrei sapere se sto andando nella direzione giusta o ci sono modi migliori e performanti per farlo.

I riferimenti sarebbero grandiosi.

Modifica

Ho trovato alcune API di terze parti interessanti che fanno ciò che voglio, ma questo dovrà essere disconnesso, quindi non avrò accesso a queste.

Alcuni esempi sono:

Modifica 2:

Un esempio reale di problema da risolvere sarebbe:

  • Ho 4 dimensioni di riquadro WxHxD: 10x12x18, 12x16x24, 16x20x30, 24x32x40
  • Ho un ordine di 4 articoli, essendo 1 di dimensione 6x8x10, 2x 22x14x30 e 1x 22x4x20

Come posso adattare questo articolo a qualsiasi quantità di scatole di una o più dimensioni usando meno scatole possibile, usando le scatole più piccole possibili e lasciando meno spazio libero possibile?

    
posta rcdmk 03.10.2014 - 15:39
fonte

2 risposte

4

L'imballaggio del contenitore è molto complicato dal punto di vista computazionale. Pensa a metà del problema: vuoi imballare il prodotto in scatole di spedizione senza sprechi nella scatola. Una soluzione ottimale per questo richiederebbe di passare attraverso tutti i possibili sottoinsiemi e tutte le possibili disposizioni 3D del prodotto che deve essere spedito in un unico camion. Ti darò la soluzione ottimale per questo perché ho un amico che fa sei cose impossibili prima di colazione.

Ora devi solo avere tutte le scatole sul camion senza sprechi. Il mio amico fa la sua seconda cosa impossibile e ti dà la soluzione. Sfortunatamente, con le dimensioni della scatola che hai selezionato sopra, c'è spazio nel camion che potrebbe essere ridotto se avessi scelto caselle diverse (più grandi o più piccole) nella prima operazione. Se cambi la dimensione di una scatola, nella migliore delle ipotesi dovrai reimballare il camion; nel peggiore dei casi, potrebbe essere necessario reimballare tutte le scatole che è altrettanto difficile quanto il problema con cui abbiamo iniziato. E, come nel primo stadio, dovresti provare tutti i possibili arrangiamenti 3D.

Ho trovato il Algorithm Design Manual di Skiena per essere utile per pensare a quale classe di algoritmi si adatta a quali tipi di problemi, ma io principalmente ho imparato che buone soluzioni anche per problemi banali esplodono in faccia con difficoltà computazionali. La maggior parte di ciò che è necessario inserire nella classe dei problemi di bin-packing e quell'articolo è un buon punto di partenza. Vale la pena notare che alcuni dei migliori algoritmi per questo sono prodotti commerciali perché questa attività si apre ovunque nella logistica (qual è il più piccolo numero di vagoni in cui posso inserire le mie merci?). Ci sono molti soldi da fare se la euristica giusta può salvare un costruttore di 100 vagoni al mese.

Sfortunatamente, la letteratura sull'ottimizzazione dell'euristica non è grande come per gli algoritmi. Se cerchi di fare da solo, ti garantisco che sognerai di spostare prismi rettangolari intorno al tuo secondo mese. Avevo un problema con il brodo di magazzino che se dovessi fare di nuovo probabilmente andrei dagli esperti (o dai loro software di proprietà).

Grazie a @JTrana per la buona espansione del mio commento.

    
risposta data 09.10.2014 - 08:51
fonte
1

Quando creo nuovi algoritmi e recentemente ho appena fatto un algoritmo di imballaggio da solo (so che ha ancora un potenziale di ottimizzazione), faccio sempre l'approccio più semplice:

Come potrei fare io come un essere umano e provare a tradurlo in un algoritmo: Dal mio (robotico) insegnante di intelligenza artificiale Rolf Pfeifer ho ancora in mente, quell'intelligenza apparente a volte può essere creata con alcune regole molto semplici, quindi, invece di sovrastampare, cerco di sottopormi a un ingannatore

  1. Identifica elementi troppo grandi (elementi che non rientrano in una determinata casella)
  2. Cerca di trovare la migliore scatola possibile (confrontando il volume totale e le dimensioni dell'articolo)
  3. Ordina articoli da grandi a piccoli e scatole (spazi) da piccoli a grandi
  4. Adatta l'elemento più grande nello spazio più piccolo possibile
  5. Se il più grande oggetto non lo trova saltato sopra e prova il prossimo fino a che niente di più si adatta
  6. Per gli articoli rimanenti, cerca la nuova scatola migliore. ...

    X. pensa sempre a eventi eccezionali (oggetti di grandi dimensioni, forme strane, se una scatola contiene solo 1 elemento non sarebbe meglio inviare oggetti senza scatola? ecc.) ma puoi anche fare euristica in una forma di albero decisionale.

Ovviamente ci sono ulteriori avvertimenti più ti avvicini, io do solo queste idee come punto di partenza. Da lì ci sono molti modi possibili. Un'alternativa sarebbe quella di dividere una scatola in piccoli cubetti (ad esempio 5 cm x 5 cm x 5 cm) e tracciarli come occupati / liberi un altro approccio potrebbe essere chiamato 3d tetris, ecc.

Con questo approccio non devi necessariamente preoccuparti dell'esplosione combinatoria. D'altra parte, l'esplosione combinatoria potrebbe accadere se parliamo di treni di articoli, ma poi di nuovo: pensi davvero che un'azienda controllerà la lista di articoli per articolo? No, non si avvicinano a una soluzione di divisione e conquista: dividi la complessità utilizzando volumi standardizzati (ad es. Paletti o scatole di dimensioni fisse). Quindi, anche per motivi di praticità, considera che non solo i treni, a volte anche il tempo dei dipendenti è denaro. un treno può caricare x paletti, ogni paletto ha un volume fisso, quindi impacchettare gli oggetti in paletta, ma poi di nuovo, forse un paletto è costituito da più ordini, quindi usa le scatole fisse per gli oggetti, che poi vengono caricati in paletti, che poi vengono caricati nei treni.

Almeno questo è il modo in cui io come un essere umano affronterò il compito, otterrò la scatola migliore e poi adattare gli oggetti più grandi uno per uno nel più piccolo spazio disponibile (e aggiungere un po 'di anteprima).

Come nel mio algoritmo, alla fine probabilmente non avrai la soluzione migliore, ma una euristica molto buona che poi potrai perfezionare ulteriormente.

A volte è più facile iniziare con il primo passaggio e cancellare i problemi sulla strada, ovviamente fuori rotta, idealmente non una sorta di passaggio oltre il gradino, ma un po 'intelligente ... a volte potresti essere costretto a esplorare alternative e scegliere il migliore o implementare un "passo indietro".

Ma come ho imparato dal mio insegnante di intelligenza artificiale (Rolf Pfeifer, mi dispiace disturbarlo di nuovo): A volte puoi creare un comportamento apparente intelligente con alcuni set di regole molto semplici e pochi > comportamento emergente nell'esempio menzionato hanno programmato piccole macchine remote per girare a sinistra se individuano un ostacolo sul lato destro, girano a destra se c'è un ostacolo sul lato sinistro e vanno dritti se non ci sono ostacoli o se l'ostacolo è davanti. 3 o 4 robot come quello, messi in un quadrato di 3m x 3m con un sacco di palline da ping-pong portano al fatto incredibile che i robot sembravano ripulire, spingendo le palline da ping-pong agli angoli, anche se i robot sono solo programmato per evitare ostacoli.

PD: L'unica deviazione del mondo reale che ho trovato in questo approccio è quando lavoravo a tempo parziale come palcoscenico per grandi concerti come la metallica, la fanciulla di ferro, le lance di Britney, Paul McCartney, il nome U ... I camionisti lavorando alle tournée internazionali sono precisi gli elenchi di imballaggio articolo per articolo. I calcoli vengono eseguiti una volta (non so per gli esseri umani o le macchine) e quindi replicati. A volte, quando impacchettano per la prima volta, fanno persino delle immagini strato per strato e le attaccano all'interno del camion solo così che le squadre locali sanno esattamente, quale casella deve essere caricata quando e dove. Ma questa è anche una specifica esigenza di imballaggio, poiché per un tour funzionano sempre con gli stessi box e camion.

    
risposta data 22.09.2018 - 16:24
fonte

Leggi altre domande sui tag