Algoritmo di imballaggio 3D per la spedizione dell'articolo


24

Ho ricevuto l'incarico di costruire un preventivo di spedizione che suggerisca la migliore sistemazione della merce nel minor numero possibile di scatole:

  1. Esiste un set finito di dimensioni di scatole retangolari note

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

  3. Il minor numero di scatole dovrebbe essere usato al meglio. Perché spedire due scatole 1x1x1 è molto più costoso di una scatola 1x2x1. Questa dovrebbe essere la priorità qui.

  4. Dovrebbe anche essere ottimizzato per utilizzare le caselle più piccole possibili, come priorità di secondo livello. (es .: se presentato con 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 ° come minimo (secondo le 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) , essendo rotazioni di 90 ° lo standard da prendere.

  6. Le scatole hanno un limite di peso e gli articoli hanno pesi arbitrari (es .: un articolo di dimensioni 1x1x1 può essere più pesante di altri articoli 2x2x2)

Ho studiato un po 'e ho trovato alcuni algoritmi astratti sull'imballaggio del cestino e il problema dello zaino e sono arrivato con la seguente variazione leggermente brutaforce, simile all'algoritmo best fit:

  1. Ordinare gli articoli in ordine di volume decrescente (prima il più grande) in un elenco di "articoli da imballare"

  2. Per ogni elemento in questo elenco:

    1. Scegli la scatola più piccola che si trova nell'elenco "scatole usate" e ha abbastanza volume residuo e limite di peso per adattarsi all'articolo (userò fit qui per significare adattamento delle dimensioni e del peso)

    2. Se non esiste una casella del genere, crea una nuova casella dal set noto di possibili dimensioni della casella che sia la dimensione più piccola in grado di adattarsi alle dimensioni e al peso dell'articolo e aggiungila all'elenco di "scatole usate".

    3. Se una scatola si adatta all'elemento (usando la seguente funzione di adattamento), aggiungila all'elenco degli "articoli di questa scatola" e rimuovila dall'elenco "articoli per adattarsi", contrassegnando la relativa posizione 3d all'interno della scatola.

    4. Ripetere dal punto 2.1 fino a quando non ci sono articoli da inserire nell'elenco "Articoli da imballare".

La funzione di controllo adattamento utilizzata al passaggio 2 sopra:

  1. Controlla se il volume rimanente della scatola si adatta al volume dell'articolo. In caso contrario, restituisce false.

  2. Controllare se la somma del peso degli "articoli della scatola" più il peso dell'articolo attuale è inferiore o uguale al limite del peso della scatola. In caso contrario, restituisce false.

  3. Controlla l'elenco "elementi della scatola" per scegliere la prima coordinata della scatola che ha il componente Y più piccolo e che ha spazio sufficiente per la larghezza, la profondità e l'altezza dell'articolo, considerando gli altri oggetti posizionati come spazio non disponibile.

  4. Se l'oggetto non si adatta al suo orientamento corrente, ruotalo su una delle 6 possibili rotazioni, non assumendo per semplicità rotazioni a 45 °. (Le rotazioni che risultano in dimensioni che erano già state testate possono essere saltate. Ad esempio: ruotando una scatola di 180 ° si ottengono le stesse dimmerazioni della posizione originale perché tutte le scatole e gli oggetti hanno le stesse dimensioni per facce opposte e quindi possono essere saltate.)

  5. Se l'elemento non è stato ruotato in tutti i modi possibili per tornare al suo orientamento originale, riprovare dal passaggio 3.

  6. Se tutte le rotazioni sono state provate e non è stato trovato alcun adattamento, considerare le coordinate correnti come spazio non disponibile.

  7. Se non è disponibile spazio disponibile per il controllo, restituire false. Altrimenti, riprova dal passaggio 3.

Voglio sapere se può esserci la migliore soluzione al mio problema, dati i vincoli presentati.

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

I riferimenti sarebbero fantastici.

Modificare:

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

Alcuni esempi sono:

Modifica 2:

Un esempio reale del problema da risolvere sarebbe:

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

Come posso inserire questi articoli in qualsiasi quantità di scatole di una o più dimensioni usando il minor numero possibile di scatole, usando le scatole più piccole possibili e lasciando meno spazio libero possibile?


4
Non è necessario un packingtag correlato; algorithmsbasta :)
Chris Cirefice,

Sono curioso, l'imballaggio vero e proprio verrà eseguito da robot o umani? Se è quest'ultimo, l'ottimizzazione dello spazio varrà il tempo necessario per capire come ruotare ciascuna scatola per adattarla?
foraidt

Buona domanda. L'imballaggio effettivo verrà eseguito dall'uomo, ma il software suggerirà l'ordine di imballaggio e la posizione di ogni scatola. Non richiederà esperienza nell'imballaggio per guardare il layout fornito e posizionare la merce all'interno della scatola. All'inizio, un po 'di tempo verrà impiegato per abituarsi, ma non richiederà di pensare alla migliore disposizione.
Ricardo Souza,

1
Penso che tutto ciò che @msw stia dicendo sia che è improbabile che questo tipo di problema sia adatto per una soluzione "perfetta", ma piuttosto una soluzione migliore per una soluzione accettabile trovata in un ragionevole lasso di tempo con l'euristica basata sulle regole che hai fornito. Da un punto di vista matematico, questo spesso significa che ti approcci con una serie diversa di algoritmi e strumenti, quindi penso che lo stia solo raccomandando. Ad esempio, algoritmi genetici, ricottura simulata e altri metodi per seguire una curva di discesa del gradiente che si avvicina allo spazio della soluzione rispetto al tuo euristico potrebbero fornire vantaggi qui.
J Trana,

1
Sto postando solo un'idea qui. Nel caso in cui non pensi che sarà efficace, puoi ignorarlo. Questa soluzione (è più simile a un'ottimizzazione) dipende davvero da quanto sarà simile l'input del tuo algoritmo. Quindi sfruttando il fatto che il tuo input avrà alcune somiglianze nel tempo. È possibile archiviare / memorizzare nella cache i risultati calcolati (che hanno una costosa complessità di calcolo), quindi confrontarli con i dati immessi e se si dispone di una corrispondenza completa o parziale, sarà sufficiente eseguire alcuni calcoli per riordinare alcuni oggetti di dimensioni minori. Naturalmente questo fa sorgere nuovi problemi.
JAAAY,

Risposte:


4

L'imballaggio del cestino è molto difficile 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 richiederebbe di esaminare tutti i possibili sottoinsiemi e tutte le possibili disposizioni 3D del prodotto che deve essere spedito in un camion. Ti darò la soluzione ottimale per questo perché ho un amico che fa sei cose impossibili prima di colazione.

Ora devi solo mettere 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 delle scatole che hai selezionato sopra, c'è spazio vuoto nel camion che potrebbe essere ridotto se avessi scelto scatole diverse (più grandi o più piccole) nella prima attività. Se cambi le dimensioni di una scatola, nella migliore delle ipotesi dovrai reimballare il camion; nel peggiore dei casi, potresti dover reimballare tutte le scatole, il che è altrettanto difficile del problema con cui abbiamo iniziato. E, come con il primo stadio, dovresti provare tutti i possibili arrangiamenti 3d.

Ho trovato il manuale di progettazione dell'algoritmo di Skiena per essere utile per pensare a quale classe di algoritmi si adatta a quali tipi di problemi, ma soprattutto ho imparato che buone soluzioni per problemi anche banali esplodono in faccia con difficoltà computazionali. La maggior parte di ciò di cui hai bisogno rientra nella classe dei problemi di impacchettamento e quell'articolo è un buon punto di partenza. Vale la pena notare che alcuni dei migliori algoritmi per questo sono prodotti commerciali perché questo compito si presenta ovunque nella logistica (qual è il numero più piccolo di vagoni ferroviari in cui posso inserire le mie merci? E simili). Ci sono molti soldi da guadagnare se la giusta euristica può far risparmiare 100 macchinine al mese a un produttore.

Sfortunatamente, la letteratura sull'ottimizzazione dell'euristica non è così grande come per gli algoritmi. Se provi ad andare da solo, ti garantisco che sognerai di spostare i prismi rettangolari in giro entro il tuo secondo mese. Ho avuto un problema con il materiale di taglio che se dovessi rifarlo probabilmente mi rivolgerei agli esperti (o al loro software di proprietà).

Grazie a @JTrana per l'ottima espansione del mio commento.


Grazie per il tuo feedback. Come ho detto sulla domanda, ho già studiato questo argomento e ho trovato un mix di alcuni algoritmi per proporlo sopra. Sono preoccupato solo per l'imballaggio stesso. Tutte queste caselle verranno inviate tramite i servizi dell'ufficio postale. Fortunatamente, non dovrò occuparmi del caricamento del camion.
Ricardo Souza,

Questa è stata una buona parte della mia spiegazione. Non puoi "estrarre" l'algoritmo dalle aziende che vogliono che tu paghi per il loro servizio. Le due aziende che hai elencato hanno un'API, ma l'imballaggio viene eseguito sui loro server e non hai accesso al codice di implementazione se non per furto. Ed è positivo che tu non debba imballare i camion, ora il tuo problema è solo la metà difficile, motivo per cui le aziende vogliono venderti una soluzione e le persone sono disposte ad acquistare il servizio.
msw,

1
Penso che abbiamo una cattiva comunicazione qui. Potrei non avermi espresso bene (come avrai notato, l'inglese non è la mia lingua madre). Non sto chiedendo di rubare gli algoritmi. Sono venuto qui per chiarimenti sull'argomento. Ho fatto alcune ricerche e l'ho messo sull'esempio sopra per l'analisi. Forse c'è qualcuno che ha riscontrato gli stessi problemi che possono darmi delle indicazioni migliori. Se la mia soluzione non è applicabile, cosa posso fare per ottenere risultati migliori? Questa è la mia vera domanda lassù. Spero di avermi chiarito ora.
Ricardo Souza,

Il tuo inglese va bene; Penso che il problema sia che stiamo parlando di diversi livelli del compito. Stai pensando all'implementazione e io sto pensando all'esplosione combinatoria. Penso che risolvere il tuo Edit 2 ti aiuterà a capire meglio il problema dal modo in cui lo sto osservando. Puoi risolverlo come indicato? Senza sprechi, con un numero minimo di scatole di dimensioni minime? Questo è il problema della multioptimizzazione che ho citato prima di cui ho detto che è impossibile fare: dovrai sacrificare almeno uno di quei fattori per ottimizzarne un altro.
msw,

Grazie. Penso di averlo capito adesso. Non ho provato a codificarlo. Stavo pensando di non perdere tempo a scrivere codice prima che sorgesse una soluzione più concreta o almeno un feedback positivo sulla mia proposta poiché questo è, inizialmente, per un preventivo. Sto ancora effettuando ricerche, ma temo che dovrò ottenere una di quelle API e vedere se i dispositivi (raccoglitori di dati che eseguono Win CE 6.0) possono funzionare connessi a Internet. Le prime informazioni che ho ricevuto dal cliente hanno dichiarato che non avranno accesso a Internet sul posto di lavoro.
Ricardo Souza,

1

Durante la creazione di nuovi algoritmi e recentemente ho appena eseguito un algoritmo di impacchettamento da solo (so che ha ancora un certo potenziale di ottimizzazione), faccio sempre l'approccio più semplice:

Come farei io come umano e proverei a tradurlo in un algoritmo: dal mio insegnante di robotica Rolf Pfeifer, continuo a ricordare che a volte l'intelligenza apparente può essere creata con alcune regole molto semplici, quindi invece di ingegnerizzare troppo Cerco di sotto ingegnere

  1. Identifica oggetti troppo grandi (oggetti che non rientrano in nessuna casella)
  2. Prova a 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 allo spazio più piccolo possibile
  5. Se l'oggetto più grande non trova saltare su di esso e provare il prossimo fino a quando non si adatta più nulla
  6. Per gli altri elementi, cerca la nuova casella migliore. ...

    X. pensa sempre a eventi eccezionali (oggetti fuori misura, forme strane, se una scatola contiene solo 1 oggetto non sarebbe meglio inviare un articolo senza scatola? Ecc.) Ma puoi fare un'euristica anche sotto forma di decisione albero.

Ovviamente ci sono ulteriori avvertenze quanto più ottieni, 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 seguirli 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, potrebbe verificarsi un'esplosione combinatoria se parliamo di carichi di articoli, ma poi di nuovo: pensi davvero che un'azienda controllerà la lista di imballaggio articolo per articolo? No, si avvicineranno a una soluzione di divisione e conquista: dividi la complessità usando volumi standardizzati (ad es. Pallet o scatole di dimensioni fisse). Quindi, anche per motivi di praticità, tieni presente che non solo i treni, a volte anche il tempo dei dipendenti è denaro. un treno può caricare x palette, ogni pallet ha un volume fisso, quindi impacchettare gli elementi in palette, ma poi di nuovo, forse un pallet è composto da più ordini, quindi utilizzare scatole fisse per gli elementi, che vengono quindi caricati in palette, che vengono quindi caricate in treni.

Almeno è così che io come essere umano avrei dovuto affrontare il compito, ottenere la scatola migliore e quindi inserire l'elemento più grande uno per uno nello spazio più piccolo disponibile (e aggiungere un po 'di anteprima).

Come nel mio algoritmo, alla fine probabilmente non avrai la soluzione migliore, ma un'euristica decisamente buona che puoi ulteriormente affinare.

A volte è più facile iniziare con il primo passo e chiarire i problemi sulla tua strada, ovviamente fuori strada idealmente non è una sorta di passaggio oltre il limite, 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 molto semplici e poche regole> comportamento emergente nell'esempio menzionato hanno programmato piccole auto remote per girare a sinistra se rilevano 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 è di fronte. 3 o 4 robot del genere, posizionati in un quadrato di 3 x 3 m con un sacco di palline da ping-pong portano al fatto sorprendente che i robot sembravano ripulire, spingendo le palline da ping-pong agli angoli, anche se i robot sono programmato solo per evitare ostacoli.

PD: L'unica deviazione del mondo reale che ho trovato da questo approccio è quando lavoravo part-time come manista per grandi concerti come metallica, iron maiden, britney spears, Paul McCartney, U il nome ... I camionisti che lavorano sul i tour internazionali hanno liste di imballaggio precise articolo per articolo. I calcoli vengono eseguiti una volta (non lo so da umani o macchine) e quindi replicati. A volte, quando fanno le valigie per la prima volta, realizzano persino immagini strato per strato e lo attaccano all'interno del camion solo in modo che gli equipaggi locali sappiano esattamente quale scatola deve essere caricata quando e dove. Ma questa è anche una necessità di imballaggio specifica poiché per un tour lavorano sempre con le stesse scatole e camion.


1

L'euristica che citi nel tuo post sembra interessante.

Suggerirei un paio di modifiche per migliorare la soluzione finale.

Data una soluzione con tutti gli articoli confezionati in una scatola, prova a unire il contenuto di due scatole piccole in una scatola più grande (questo dovrebbe aiutare a migliorare i tuoi criteri di utilizzo del minor numero di scatole possibile).

In alternativa, ogni volta che si avvia una nuova casella, anziché utilizzare la casella più piccola in grado di ospitare l'elemento corrente, è possibile selezionare la casella più grande in grado di ospitarla e, una volta assegnato ogni elemento a una casella, provare ad assegnare tutti gli elementi di un scatola in una scatola più piccola.

Inoltre, nella tua funzione di adattamento, invece di considerare fissa la posizione delle altre caselle, potresti immaginare di cambiare la sequenza di caricamento. Ciò dovrebbe consentire di trovare soluzioni migliori a spese di un tempo di esecuzione più lungo.


Sembra miglioramenti interessanti. Non ho toccato questo problema per molto tempo. Forse dovrei provarlo uno di questi giorni. Grazie.
Ricardo Souza,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.