it-swarm.com.de

3D-Verpackungsalgorithmus für den Versand des Artikels

Ich habe die Aufgabe erhalten, einen Versandschätzer zu erstellen, der die bestmögliche Unterbringung von Waren auf so wenigen Kartons wie möglich vorschlägt:

  1. Es gibt einen endlichen Satz bekannter retangularer Kastengrößen

  2. Es gibt viele beliebige retanguläre Gegenstände, die in Kartons verpackt werden müssen

  3. Je weniger Boxen verwendet werden sollten, desto besser. Weil der Versand von zwei Kartons 1x1x1 viel teurer ist als der Versand einer Box 1x2x1. Dies sollte hier Priorität haben.

  4. Es sollte auch optimiert werden, die kleineren Boxen als Priorität der zweiten Ebene so weit wie möglich zu verwenden. (zB: wenn eine Auswahl zwischen einer größeren und zwei kleinen Boxen getroffen wird, sollte die größere Box gewählt werden)

  5. Elemente können gedreht werden, um in die Box zu passen, aber die Drehung muss auf mindestens 45 ° begrenzt werden (nach meinen Untersuchungen scheinen einige Konfigurationen eine Drehung um 45 Grad zu ermöglichen, um retanguläre Boxen besser in eine größere retanguläre Box zu passen). 90 ° -Drehungen sind der Standard.

  6. Boxen haben eine Gewichtsbeschränkung und Artikel haben beliebige Gewichte (z. B.: Ein Artikel mit einer Größe von 1x1x1 kann schwerer sein als andere 2x2x2 Artikel).

Ich habe ein bisschen recherchiert und einige abstrahierte Algorithmen zum Packen von Behältern und zum Rucksackproblem gefunden und bin mit der folgenden etwas Bruteforce-Variation gekommen, ähnlich dem Best-Fit-Algorithmus:

  1. Sortieren Sie die Artikel in absteigender Reihenfolge (zuerst größer) in einer Liste "Zu verpackende Artikel"

  2. Für jeden Eintrag in dieser Liste:

    1. Wählen Sie die kleinere Box aus, die in der Liste "gebrauchte Boxen" aufgeführt ist und über genügend Restvolumen und Gewichtsbeschränkung verfügt, um auf den Artikel zu passen (ich werde hier "Fit" verwenden, um die Abmessungen und das Gewicht anzupassen).

    2. Wenn es keine solche Box gibt, erstellen Sie eine neue Box aus dem bekannten Satz möglicher Boxgrößen, die die kleinste Größe ist, die den Abmessungen und dem Gewicht des Artikels entspricht, und fügen Sie sie der Liste der "gebrauchten Boxen" hinzu.

    3. Wenn eine Box zum Element passt (mithilfe der Anpassungsfunktion unten), fügen Sie sie der Liste der "Elemente dieser Box" hinzu und entfernen Sie sie aus der Liste "Zu passende Elemente", wobei Sie die relative 3D-Position innerhalb der Box markieren.

    4. Wiederholen Sie diesen Vorgang ab 2.1, bis kein Artikel mehr in der Liste "Zu verpackende Artikel" enthalten ist.

Die in Schritt 2 oben verwendete Funktion zur Überprüfung der Anpassung:

  1. Überprüfen Sie, ob das verbleibende Volumen der Box zum Volumen des Artikels passt. Wenn nicht, geben Sie false zurück.

  2. Überprüfen Sie, ob die Summe aus dem Gewicht der "Artikel der Box" plus dem aktuellen Artikelgewicht kleiner oder gleich der Gewichtsgrenze der Box ist. Wenn nicht, geben Sie false zurück.

  3. Überprüfen Sie die Liste "Elemente der Box", um die erste Feldkoordinate auszuwählen, die die kleinste Y-Komponente aufweist und genügend Platz für die Breite, Tiefe und Höhe des Elements bietet, wobei die anderen Elemente als nicht verfügbarer Platz berücksichtigt werden.

  4. Wenn das Objekt nicht in die aktuelle Ausrichtung passt, drehen Sie es bei einer der 6 möglichen Umdrehungen, wobei der Einfachheit halber keine 45 ° -Drehungen angenommen werden. (Drehungen, die zu Größen führen, die bereits getestet wurden, können übersprungen werden. Beispiel: Wenn Sie eine Box um 180 ° drehen, erhalten Sie die gleichen Abmessungen wie die ursprüngliche Position, da alle Boxen und Elemente für gegenüberliegende Flächen dieselbe Größe haben und daher übersprungen werden können.)

  5. Wenn das Objekt nicht auf allen möglichen Wegen wieder in seine ursprüngliche Ausrichtung gedreht wurde, versuchen Sie es ab Schritt 3 erneut.

  6. Wenn alle Umdrehungen versucht wurden und keine Anpassung gefunden wurde, betrachten Sie die aktuelle Koordinate als nicht verfügbaren Platz.

  7. Wenn kein zu prüfender Speicherplatz verfügbar ist, geben Sie false zurück. Andernfalls versuchen Sie es erneut ab Schritt 3.

Ich möchte wissen, ob es angesichts der dargestellten Einschränkungen eine beste Lösung für mein Problem geben kann.

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, performante Wege gibt, dies zu tun.

Referenzen wären toll.

Bearbeiten:

Ich habe eine interessante API von Drittanbietern gefunden, die das tut, was ich will, aber diese muss getrennt werden, damit ich keinen Zugriff darauf habe.

Einige Beispiele sind:

Bearbeiten 2:

Ein reales Beispiel für ein zu lösendes Problem wäre:

  • Ich habe 4 Kartongrößen BxHxT: 10x12x18, 12x16x24, 16x20x30, 24x32x40
  • Ich habe eine Bestellung von 4 Artikeln, von denen 1 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 einbauen, indem ich so wenig Kartons wie möglich verwende, die kleinstmöglichen Kartons verwende und so wenig freien Platz wie möglich lasse?

25
Ricardo Souza

Das Verpacken von Behältern ist sehr rechenintensiv. Denken Sie an die Hälfte des Problems: Sie möchten das Produkt in Versandkartons verpacken, ohne dass Verschwendung in dem Karton auftritt. Eine optimale Lösung hierfür würde das Durchlaufen aller möglichen Teilmengen und aller möglichen 3D-Anordnungen des Produkts erfordern, das in einem LKW versendet werden muss. Ich gebe Ihnen die optimale Lösung dafür, weil ich einen Freund habe, der vor dem Frühstück sechs unmögliche Dinge tut.

Jetzt müssen Sie nur noch alle Kisten ohne Verschwendung auf den LKW bringen. Mein Freund macht sein zweites Unmögliches und gibt Ihnen die Lösung. Leider gibt es bei den oben ausgewählten Kartongrößen einen leeren Raum im LKW, der reduziert werden könnte, wenn Sie in der ersten Aufgabe andere (entweder größere oder kleinere) Kartons ausgewählt hätten. Wenn Sie die Größe einer Box ändern, müssen Sie den LKW bestenfalls neu verpacken. Im schlimmsten Fall müssen Sie möglicherweise alle Kartons neu verpacken, was genauso schwierig ist wie das Problem, mit dem wir begonnen haben. Und wie bei der ersten Stufe müssten Sie alle möglichen 3D-Arrangements ausprobieren.

Ich fand Skienas The Algorithm Design Manual hilfreich, um darüber nachzudenken, welche Klasse von Algorithmen für welche Art von Problemen geeignet ist, aber ich habe meistens gelernt, dass gute Lösungen für selbst alltägliche Probleme mit Rechenschwierigkeiten in die Luft jagen. Das meiste, was Sie brauchen, passt in die Klasse von Probleme beim Verpacken von Behältern und dieser Artikel ist ein guter Ausgangspunkt. Es ist erwähnenswert, dass einige der besten Algorithmen dafür kommerzielle Produkte sind, da diese Aufgabe überall in der Logistik auftaucht (in wie viele Waggons kann ich meine Waren einbringen? Und so weiter). Es gibt beträchtliches Geld zu verdienen, wenn die richtige Heuristik einem Hersteller 100 Waggons pro Monat einsparen kann.

Leider ist die Literatur zur Optimierung der Heuristik bei weitem nicht so umfangreich wie für Algorithmen. Wenn Sie versuchen, es alleine zu machen, werden Sie garantiert davon träumen, bis zum zweiten Monat rechteckige Prismen zu bewegen. Ich hatte ein Problem mit dem Lagerbestand, das ich, wenn ich es noch einmal tun müsste, wahrscheinlich an die Experten (oder deren Software für die Angemessenheit) weitergeben würde.

Vielen Dank an @JTrana für die feine Erweiterung meines Kommentars.

4
msw

Die Heuristik, die Sie in Ihrem Beitrag erwähnen, scheint interessant zu sein.

Ich würde einige Modifikationen vorschlagen, um die endgültige Lösung zu verbessern.

Versuchen Sie bei einer Lösung, bei der alle Artikel in einer Schachtel verpackt sind, den Inhalt von zwei kleinen Schachteln in einer größeren Schachtel zusammenzuführen (dies sollte dazu beitragen, Ihre Kriterien für die Verwendung möglichst weniger Schachteln zu verbessern).

Alternativ können Sie jedes Mal, wenn Sie eine neue Box starten, anstatt die kleinste Box zu verwenden, die das aktuelle Element aufnehmen kann, die größte Box auswählen, die es aufnehmen kann. Wenn jedes Element einer Box zugewiesen ist, versuchen Sie, alle Elemente einer zuzuweisen Box zu einer kleineren Box.

In Ihrer Anpassungsfunktion können Sie sich auch vorstellen, die Ladereihenfolge zu ändern, anstatt die Position Ihrer anderen Boxen als fest zu betrachten. Auf diese Weise sollten Sie bessere Lösungen auf Kosten einer längeren Laufzeit finden.

1
Renaud M.

Wenn ich neue Algorithmen erstelle und kürzlich selbst einen Packalgorithmus erstellt habe (ich weiß, dass er noch Optimierungspotenzial hat), gehe ich immer am einfachsten vor:

Wie würde ich es als Mensch tun und versuchen, es in einen Algorithmus zu übersetzen: Von meinem (Robotik-) KI-Lehrer Rolf Pfeifer denke ich immer noch daran, dass scheinbare Intelligenz manchmal mit sehr einfachen Regeln erzeugt werden kann, also anstatt zu überarbeiten Ich versuche zu unterentwickeln

  1. Identifizieren Sie zu große Gegenstände (Gegenstände, die nicht in eine bestimmte Schachtel passen).
  2. Versuchen Sie, die bestmögliche Box zu finden (indem Sie das Gesamtvolumen und die Artikelabmessungen miteinander vergleichen).
  3. Bestellen Sie Artikel von groß bis klein und Kisten (Leerzeichen) von klein bis groß
  4. Passen Sie den größten Gegenstand auf kleinstem Raum an
  5. Wenn der größte Gegenstand keinen findet, springen Sie darüber und versuchen Sie es mit dem nächsten, bis nichts mehr passt
  6. Suchen Sie für die verbleibenden Elemente in der neuen besten Box. ...

    X. Denken Sie immer an außergewöhnliche Ereignisse (übergroße Elemente, seltsame Formen, wenn eine Box nur 1 Element enthält, wäre es nicht besser, ein Element ohne Box zu senden? Usw.), aber Sie können eine Heuristik auch in Form einer Entscheidung treffen Baum.

Natürlich gibt es weitere Einschränkungen, je weiter Sie kommen, ich gebe diese Ideen nur als Ausgangspunkt. Von dort gibt es viele Möglichkeiten. Eine Alternative wäre, eine Box in kleine Würfel (z. B. 5 cm x 5 cm x 5 cm) zu teilen und sie als besetzt/frei zu verfolgen. Ein anderer Ansatz könnte als 3D-Tetris usw. bezeichnet werden.

Mit diesem Ansatz müssen Sie sich nicht unbedingt um eine kombinatorische Explosion sorgen. Auf der anderen Seite könnte eine kombinatorische Explosion auftreten, wenn es sich um Zugladungen von Gegenständen handelt, aber andererseits: Glauben Sie wirklich, dass ein Unternehmen die Packliste Artikel für Artikel überprüfen wird? Nein, sie nähern sich einer Divide and Conquer-Lösung: Teilen Sie die Komplexität mithilfe standardisierter Volumes (z. B. Paletten oder Boxen mit fester Größe). Berücksichtigen Sie also auch aus praktischen Gründen, dass nicht nur trainiert wird, sondern manchmal auch die Zeit des Mitarbeiters Geld ist. Ein Zug kann x Paletten laden. Jede Palette hat ein festes Volumen. Packen Sie also Elemente in die Palette. Andererseits besteht eine Palette möglicherweise aus mehreren Ordnungen. Verwenden Sie daher feste Felder für die Elemente, die dann in Paletten geladen und dann geladen werden in Züge.

Zumindest würde ich als Mensch so mit der Aufgabe umgehen, die beste Schachtel bekommen und dann den größten Gegenstand einzeln auf kleinstem Raum platzieren (und ein bisschen Vorschau hinzufügen).

Wie bei meinem Algorithmus werden Sie am Ende wahrscheinlich nicht die beste Lösung haben, sondern eine sehr gute Heuristik, die Sie dann weiter verfeinern können.

Manchmal ist es einfacher, mit dem ersten Schritt zu beginnen und Probleme auf Ihrem Weg zu beseitigen. Natürlich ist dies im Idealfall kein Schritt über den Edge-Schritt, aber ein bisschen klug. Manchmal sind Sie gezwungen, Alternativen zu suchen und zu wählen die beste oder implementieren Sie einen "Schritt zurück".

Aber wie ich von meinem KI-Lehrer gelernt habe (Rolf Pfeifer, tut mir leid, dass ich mich wieder darum kümmere): Manchmal kann man mit einigen sehr einfachen und wenigen Regelsätzen> intelligentes Verhalten in dem erwähnten Beispiel scheinbar intelligentes Verhalten erzeugen Sie erkennen ein Hindernis auf der rechten Seite, biegen rechts ab, wenn sich auf der linken Seite ein Hindernis befindet, und fahren geradeaus, wenn kein Hindernis vorhanden ist oder wenn sich das Hindernis vorne befindet. 3 oder 4 Roboter, die in ein 3 x 3 m großes Quadrat mit vielen Ping-Pong-Bällen eingesetzt werden, führen zu der erstaunlichen Tatsache, dass die Roboter aufzuräumen schienen und die Ping-Pong-Bälle in die Ecken schoben, obwohl die Roboter es sind Nur programmiert, um Hindernissen auszuweichen.

PD: Die einzige reale Abweichung, die ich von diesem Ansatz fand, war, als ich Teilzeit als Bühnenarbeiter für große Konzerte wie Metallica, Iron Maiden, Britney Spears, Paul McCartney und U arbeitete. Die Trucker, die an der Internationale Touren haben Artikel für Artikel genaue Packlisten. Die Berechnungen werden einmal durchgeführt (ich weiß es nicht von Menschen oder Maschinen) und dann repliziert. Manchmal, wenn sie das erste Mal packen, machen sie sogar Schicht für Schicht Bilder und kleben sie in den LKW, damit die örtlichen Besatzungen genau wissen, welche Box wann und wo aufgeladen werden muss. Dies ist aber auch ein spezifischer Verpackungsbedarf, da sie für eine Tour immer mit denselben Kisten und Lastwagen arbeiten.

1
Canelo Digital