Ich habe die Aufgabe erhalten, einen Versandkalkulator zu erstellen, der die bestmögliche Unterbringung von Waren auf möglichst wenigen Kartons vorschlägt:
Es gibt eine endliche Menge bekannter rechteckiger Kastengrößen
Es gibt viele beliebige rechteckige Gegenstände, die in Schachteln verpackt werden können
Die weniger Boxen sollten am besten genutzt werden. Denn der Versand von zwei Kartons 1x1x1 ist deutlich teurer als ein Karton 1x2x1. Dies sollte hier Priorität haben.
Es sollte auch optimiert werden, um die kleineren Boxen als Priorität der zweiten Ebene zu verwenden. (Bsp .: Wenn eine Auswahl zwischen einer größeren und zwei kleinen Kisten vorliegt, sollte die größere Kiste ausgewählt werden.)
Elemente können gedreht werden, um in die Box zu passen, aber die Drehung muss auf mindestens 45 ° -Schritte begrenzt werden (nach meinen Recherchen lassen einige Konfigurationen eine 45-Grad-Drehung zu, um Retangular-Boxen besser in eine größere Retangular-Box zu passen). wobei 90 ° -Drehungen der zu nehmende Standard sind.
Boxen haben ein Gewichtslimit und Gegenstände haben ein beliebiges Gewicht (zB: ein Gegenstand mit einer Größe von 1x1x1 kann schwerer sein als andere 2x2x2 Gegenstände)
Ich habe ein bisschen recherchiert und einige abstrahierte Algorithmen zum Packen von Behältern und zum Rucksackproblem gefunden. Dabei habe ich die folgende etwas bruteforce-Variante gefunden, die dem am besten passenden Algorithmus ähnelt:
Sortieren Sie die Artikel in absteigender Volumenreihenfolge (zuerst größer) in einer Liste "Zu verpackende Artikel"
Für jeden Artikel auf dieser Liste:
Wählen Sie die kleinere Box, die in der Liste "Verwendete Boxen" aufgeführt ist und über genügend verbleibendes Volumen und Gewichtslimit verfügt, um auf den Artikel zu passen.
Wenn es keine solche Box gibt, erstellen Sie eine neue Box aus dem bekannten Satz möglicher Boxgrößen, die der kleinsten Größe entspricht, die den Abmessungen und dem Gewicht des Artikels entspricht, und fügen Sie sie der Liste der "verwendeten Boxen" hinzu.
Wenn eine Box zu dem Objekt passt (unter Verwendung der unten stehenden Anpassungsfunktion), fügen Sie sie der Liste der Objekte dieser Box hinzu und entfernen Sie sie aus der Liste der anzupassenden Objekte. Markieren Sie dabei die relative 3D-Position innerhalb der Box.
Wiederholen Sie diesen Vorgang ab 2.1, bis auf der Liste "Zu verpackende Artikel" kein einzupassender Artikel vorhanden ist.
Die in Schritt 2 oben verwendete Anpassungsprüffunktion:
Überprüfen Sie, ob das verbleibende Volumen der Box zum Volumen des Artikels passt. Wenn nicht, geben Sie false zurück.
Überprüfen Sie, ob die Summe aus dem Gewicht der Box und dem aktuellen Gewicht der Box kleiner oder gleich dem Gewichtslimit der Box ist. Wenn nicht, geben Sie false zurück.
Überprüfen Sie die Liste "Elemente der Box", um die erste Boxkoordinate auszuwählen, die die kleinste Y-Komponente und genügend Platz für die Breite, Tiefe und Höhe des Elements hat, wobei die anderen Elemente als nicht verfügbarer Platz betrachtet werden.
Wenn das Element nicht in die aktuelle Ausrichtung passt, drehen Sie es der Einfachheit halber um eine der 6 möglichen Umdrehungen, wobei Sie keine 45 ° -Umdrehungen annehmen. (Umdrehungen, die zu Größen führen, die bereits getestet wurden, können übersprungen werden. Beispiel: Durch Drehen einer Schachtel um 180 ° werden die gleichen Abmessungen wie in der ursprünglichen Position erzielt, da alle Schachteln und Gegenstände für gegenüberliegende Seiten die gleiche Größe haben und daher übersprungen werden können.)
Wenn das Objekt nicht auf allen möglichen Wegen in seine ursprüngliche Ausrichtung gedreht wurde, versuchen Sie es ab Schritt 3 erneut.
Wenn alle Rotationen ausprobiert wurden und keine Übereinstimmung gefunden wurde, wird die aktuelle Koordinate als nicht verfügbarer Raum betrachtet.
Wenn kein zu überprüfender Speicherplatz verfügbar ist, geben Sie false zurück. Andernfalls versuchen Sie es ab Schritt 3 erneut.
Ich möchte wissen, ob es angesichts der vorgestellten Einschränkungen eine beste Lösung für mein Problem gibt.
Dies scheint theoretisch zu funktionieren, aber ich habe es nicht mit Code versucht. Ich möchte wissen, ob ich in die richtige Richtung gehe oder ob es bessere und performantere Möglichkeiten gibt, dies zu tun.
Referenzen wären toll.
Bearbeiten:
Ich habe einige interessante APIs von Drittanbietern gefunden, die tun, was ich will, aber diese müssen getrennt werden, sodass ich keinen Zugriff auf diese habe.
Einige Beispiele sind:
Bearbeiten 2:
Ein reales Beispiel für ein zu lösendes Problem wäre:
- Ich habe 4 Kastengrößen BxHxT: 10x12x18, 12x16x24, 16x20x30, 24x32x40
- Ich habe eine Bestellung von 4 Artikeln, wobei 1 Artikel die Größe 6x8x10, 2x 22x14x30 und 1x 22x4x20 hat
Wie kann ich diese Artikel in eine beliebige Anzahl von Kartons einer oder mehrerer Größen unter Verwendung der geringstmöglichen Anzahl von Kartons unter Verwendung der kleinstmöglichen Anzahl von Kartons und unter Beibehaltung des geringstmöglichen freien Platzes einpassen?
packing
zugehöriges Tag erforderlich .algorithms