Ho ricevuto l'incarico di costruire un preventivo di spedizione che suggerisca la migliore sistemazione della merce nel minor numero possibile di scatole:
Esiste un set finito di dimensioni di scatole retangolari note
Ci sono molti oggetti retangolari arbitrari da imballare all'interno di scatole
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.
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)
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.
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:
Ordinare gli articoli in ordine di volume decrescente (prima il più grande) in un elenco di "articoli da imballare"
Per ogni elemento in questo elenco:
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)
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".
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.
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:
Controlla se il volume rimanente della scatola si adatta al volume dell'articolo. In caso contrario, restituisce false.
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.
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.
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.)
Se l'elemento non è stato ruotato in tutti i modi possibili per tornare al suo orientamento originale, riprovare dal passaggio 3.
Se tutte le rotazioni sono state provate e non è stato trovato alcun adattamento, considerare le coordinate correnti come spazio non disponibile.
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?
packing
tag correlato;algorithms
basta :)