Microsoft Excel

Herbers Excel/VBA-Archiv

Lagerbereich nacheinander anfahren


Betrifft: Lagerbereich nacheinander anfahren von: Viktoria
Geschrieben am: 28.09.2017 13:14:09

https://www.herber.de/bbs/user/116605.xlsm

Hay Ihr lieben,
ich hab hier eine Aufgabe, wo ich total am verzweifeln bin :( ...
Ich würde mich sehr freuen, wenn sich jemand die Aufgabe mal näher anschauen könnte.
Ich würde mich um jede Hilfe freuen.
Ich bin für alle Ideen und Tipps offen, vielleicht ist ja jemand so nett und kann mir einen neuen Quellcode als Ansatz schreiben, da meiner nicht, bzw nur teilweise funktioniert.

LG Viktoria

Bei einem Logistikdienstleister werden im Lager die Kommissionieraufträge abgearbeitet. Die Kommissionspositionen können von 6 Lagerbereichen „A“ bis „F“ bezogen werden. Ein Kommissionierauftrag enthält maximal 5 Positionen. Die Artikel des Kommissionierauftrags dürfen in unterschiedlichen Lagerbereichen gelagert werden. Die Zuordnung der Artikel zu Lagerbereichen stellt das Blatt „Artikel“ dar. Das Blatt „Entfernungen“ stellt die Entfernungen zwischen den Lagerbereichen und dem Kommissionierbereich in Metern dar. Auf dem Blatt „Auftrag“ werden beispielhafte Kommissionieraufträge dargestellt (die Anzahl der Aufträge und die Anzahl der Artikel können variieren).

Der Kommissionierer führt jeden Kommissionierauftrag einzeln durch, d.h. er fängt seine Fahrt mit dem Kommissionierfahrzeug bzw. -wagen im Kommissionierbereich an, fährt zu dem entsprechenden Lagerbereich, wo er den gewünschten Artikel findet und danach zu dem anderen Lagerbereich, wo er den nächsten gewünschten Artikel finden kann. Wenn er alle Artikel des Kommissionierauftrags gesammelt hat, kehrt er zum Kommissionierbereich zurück. Die Reihenfolge des Sammelns der Artikel innerhalb des Auftrags entspricht der Reihenfolge der Artikel in dem Kommissionierauftrag. Das wird als „Standard“-Reihenfolge genannt. Wenn man die Auftragslisten entsprechend umstellt, dass die Artikel aus dem gleichen Bereich nacheinander in der Liste stehen, dann könnte die Dauer des Sammelns verkürzt werden. Diese Reihenfolgen werden „Verbesserte“ genannt. Im Gegensatz dazu, wird auch eine optimale Reihenfolge betrachtet, in der die Sequenz der Artikelsammlung so gewählt wird, das der Kommissionierweg am kürzesten ist.

Auf dem Blatt „Verbesserung“ stelle ich die Auftragslisten so um, dass die gleichen Lagerbereiche innerhalb eines Auftrags nicht mehrmals angefahren werden müssen. Die entsprechende Dauer soll in die Spalte „Dauer“ auf diesem Blatt eingetragen werden.

  

Betrifft: AW: Lagerbereich nacheinander anfahren von: lupo1
Geschrieben am: 28.09.2017 13:49:46

Maximal 5 verschiedene Positionen bedeutet maximal 5 verschiedene Orte.

1. Sortieren der Positionen nach Orten
2. Duplikate eliminieren
3. Die kürzesten Wege kannst Du verdrahtet ablegen:

1 Ort ist nicht optimierbar
2 Orte sind nicht optimierbar
3-5 sind optimierbar


  

Betrifft: Problem des Handlungsreisenden von: Zwenn
Geschrieben am: 28.09.2017 13:53:15

Hallo Viktoria,

sofern Du die entsprechende Mathematik nicht beherrscht, bist Du auf jemanden angewiesen, der Dir dieses Problem vollständig löst. Was Du machen sollst, ist eine Optimierung die unter Namen Problem des Handlungsreisenden bzw. im englischen unter Traveling Salesman Problem bekannt ist. Dafür muss man in Graphentheorie fit sein und eines der Optimierungsverfahren beherrschen, soweit ich weiß.

Um zu sehen, worum es dabei geht, ist Wikipedia ein ganz guter Anlaufpunkt:
https://de.wikipedia.org/wiki/Problem_des_Handlungsreisenden

Viele Grüße,

Zwenn


  

Betrifft: grundsätzlich richtig, aber von: lupo1
Geschrieben am: 28.09.2017 14:04:32

es gibt nur 62 Szenarien der Orte (Kombinationen für 1 bis 5 Orte)

6 1 Ort
15 2 Orte
20 3 Orte
15 4 Orte
6 5 Orte

Davon können nur 41 (nämlich 3-5 Orte) optimiert werden. Das sind dann Permutationen:

3 Orte 6 Permutationen für jede Kombination
4 Orte 24 Permutationen für jede Kombination
5 Orte 120 Permutationen für jede Kombination

Somit die besten 41 Wege aus
20 x 6 = 120
15 x 24 = 360
6 x 120 = 720
==============
1200 Kombinationen zu ermitteln, und zwar genau, nicht nur näherungsweise.

Das bekommt man leicht mit VBA gebacken.


  

Betrifft: AW: grundsätzlich richtig, aber von: Zwenn
Geschrieben am: 28.09.2017 14:19:41

Da hast Du recht,

Deine Erklärung ändert jedoch nix an der Tatsache, dass man wenigstens erstmal wissen muss, was Kombinatorik ist und wie sie funktioniert. Das meine ich mit dem benötigten Beherrschen der zugehörigen Mathematik. Also, man muss ja in diesen Strukturen denken können, sonst wird das nix werden.

Du hast allerdings auch in sofern recht, dass es erst komplizierter wird, wenn die Anzahl der Orte steigen würde.


  

Betrifft: AW: Lagerbereich nacheinander anfahren von: SF
Geschrieben am: 28.09.2017 14:18:50

Hola JoJo, Viktoria, Aisha,

wenn du schon mehrere Foren mit unterschiedlichen Namen bemühst, so verlinke sie untereinander!

Gruß,
steve1da


  

Betrifft: AW: alles probieren von: Fennek
Geschrieben am: 28.09.2017 16:30:20

Hallo,

der Code prüft für alle Varianten die jeweilige Entfernung und bestimmt das Minimum.

Die Ausgabe erfolgt ins Direktfenster, wenn es zusagt, kann das noch geändert werden.

Es wird ein weiteres sheet("Kombinatorik") erwartet.

Der Code MUSS in ein neues Modul

Option Base 1
Dim Entfernung
Dim Reihe As String
Dim MM As Long
Sub T1()
Dim Artikel
Dim c As Range
Dim Weg As Byte
Dim Bo As Boolean
Dim WSF As WorksheetFunction: Set WSF = Application.WorksheetFunction
Artikel = Sheets("Artikel").Cells(1).CurrentRegion
Entfernung = Sheets("Entfernungen").Range("A1:H8")
With Sheets("Auftrag")
    For i = 2 To .Cells(Rows.Count, "A").End(xlUp).Row
    Weg = 0
    Tx = ""
        For Each c In .Range(.Cells(i, "B"), .Cells(i, "F"))
            If Not IsEmpty(c.Value) Then
                For k = 2 To UBound(Artikel)
                    If c.Value = Artikel(k, 1) Then
                        Weg = Weg Or 2 ^ (Asc(Artikel(k, 2)) - 65)
                        Tx = Tx & Artikel(k, 2)
                    End If
                Next k
            End If
        Next c
        Ty = ""
        For k = 0 To 5
        Bo = Weg And 2 ^ k
        If Bo Then Ty = Ty & Chr(65 + k)
        Next k
        'Debug.Print .Cells(i, "A"), Tx, Ty, Format(WSF.Dec2Bin(Weg), "0#######")
        Kombinatorik (Ty)
        Debug.Print .Cells(i, "A"), Reihe, MM
    Next i
End With
End Sub

Sub Kombinatorik(ByVal Base)
'Quelle: http://www. _
online-excel.de/fom/fo_read.php?f=1&bzh=71253&h=71239


Application.Calculation = xlCalculationManual
Dim iStart As Double, Spalte As String
With Sheets("Kombinatorik")
.UsedRange.Clear
iStart = Timer
'
'Startwerte eingeben <<<<<<<<<<<  >>>>>>>>>>>

'Const Base As String = "ABCD" 'maximal 8 Zeichen <<<<<<<<< hier eingeben
Spalte = "A" ' Ausgabe <<<<<<<<<<<< hier Spalte eingeben
'

Dim ar
Dim Anz As Long
Anz = WorksheetFunction.Fact(Len(Base)) + 7
ReDim ar(Anz, 3)
Dim F(10), Fak, Fa As Long, i As Long, j As Long, z As Long, res1 As Integer
Fak = Array(362880, 40320, 5040, 720, 120, 24, 6, 2, 1, 1)
ar(8, 1) = Base

'Spalte H der Vorlage

For z = 1 To Anz - 7
    For i = 1 To 10
        F(i) = z Mod Fak(i)
    Next i
        ar(z, 2) = 10 - Application.Match(0, F, -1)
Next z

'Spalte I der Vorlage

For z = 9 To Anz + 1
ar(z - 8, 3) = -1 * WorksheetFunction.Fact(ar(z - 8, 2)) + z
Next z

'Text zusammensetzen

For z = 9 To Anz
    i = ar(z - 8, 3) ' Spalte I
    j = ar(z - 8, 2) 'Spalte H
    ar(z, 1) = Left(ar(i, 1), Len(Base) - j - 1) _
            & Right(ar(i, 1), j) & Left(Right(ar(i, 1), j + 1), 1)
    'Cells(z, "P") = ar(z, 1)
Next z

'Ausgabe in Spalte

For z = 8 To Anz
.Cells(z - 7, Spalte) = ar(z, 1)
Next z

'Debug.Print Timer - iStart
Application.Calculation = xlCalculationAutomatic
End With
Distanz
End Sub
Sub Distanz()

Dim WSF As WorksheetFunction: Set WSF = Application.WorksheetFunction

With Sheets("Kombinatorik")
    For i = 1 To .Cells(Rows.Count, "A").End(xlUp).Row
        Tx = .Cells(i, "A")
        km = 0
        rr = 2
        For j = 1 To Len(Tx)
                Sp = Asc(Mid(Tx, j, 1)) - 64 + 2
            km = km + Entfernung(rr, Sp)
            rr = Sp
        Next j
        .Cells(i, "B") = km + Entfernung(2, Sp)
    Next i
    MM = WSF.Min(.Columns(2))
    r = WSF.Match(MM, .Columns(2), 0)
    Reihe = .Cells(r, 1)
End With
End Sub

mfg

("Victoria" steht "Sieg" (der Bundewehr))


  

Betrifft: AW: um Antwort wird gebeten! owT von: Fennek
Geschrieben am: 28.09.2017 18:41:38




  

Betrifft: AW: um Antwort wird gebeten! owT von: Zwenn
Geschrieben am: 28.09.2017 19:44:26

Hi Fennek,

da hast Du Dir ja echt Mühe gegeben. Aber ich nehme an, das war vergebens. Hast Du den Beitrag über Deinem ersten gelesen, von Steve? Ich habe mal nach den anderen Beiträgen gesucht. Du hast sowas, wie eine Hausaufgabe gelöst, für jemanden, der dieses Problem unter verschiedenen Namen an unterschiedlichen Orten veröffentlicht hat.

Hier der Beitrag als Aisha:
http://www.vba-forum.de/forum/View.aspx?ziel=39893-Kommissionierlager_-_Lagerbereiche_nacheinander_abfahren

Hier sind Verlinkungen, denen Du folgen kannst:
http://www.vba-forum.de/forum/View.aspx?ziel=39904-OWT

Viele Grüße,

Zwenn


  

Betrifft: AW: um Antwort wird gebeten! owT von: Viktoria
Geschrieben am: 28.09.2017 22:24:09

Hallo Zwenn,
ich weiß leider nicht, wo dein Problem ist.
Ja ich habe noch andere Beiträge online.
Mein Name ist Joyce (jojo) Viktoria und der Name meiner Partnerin Aisha.
Leider scheint es online mit den Namen ein paar Probleme zu geben, ich weiß auch nicht, warum jedes mal ein anderer angegeben wird.
Wenn ihr diese findet, dann ist das gut für mich und ich freue mich, dass ihr so viel Interesse zeigt. Umso mehr freue ich mich über den Beitrag von Fennek, dass er auch sinnvoll geantwortet hat.

Dies ist ein Forum für alle Probleme im Excel und VBA Bereich, deswegen verstehe ich nicht, warum "sowas, wie eine Hausaufgabe" hier fehl am Platz ist.

LG Joyce (jojo) Viktoria


  

Betrifft: Weil es A-Soziales Verhalten ist von: Zwenn
Geschrieben am: 29.09.2017 11:58:35

Hallo Viktoria,

dann erkläre ich Dir gerne, wo (nicht nur mein) Problem ist.

Im Kern geht es um das Posten des gleichen Problems in unterschiedlichen Foren, ohne dies in den einzelnen Beiträgen mitzuteilen. Wenn dieses Problem zusätzlich noch unter verschiedenen Namen veröffentlicht wurde, trägt auch nicht grade zur Transparenz bei. Ich weiß auch nicht, was so schwer daran ist einen Namen in ein Textfeld mit der Bezeichnung Name: einzugeben. Da gibt es gar keine Probleme oder ich hatte bisher immer Glück, dass die Zeichenkette dort erscheint, die ich reingeschrieben habe ;-)

Von Deiner Warte aus betrachtet ist es natürlich wünschenswert, so viele Leute wie möglich zu erreichen, weil das Deine Aussicht auf Hilfe steigert. Verständlich. Von unserer Warte aus betrachtet ist es aber äußerst ärgerlich, sich mit einem Problem zu beschäftigen, ohne zu wissen, dass an anderer Stelle vielleicht auch schon jemand damit beschäftigt ist oder sogar schon eine Lösung besteht.

Die einfache Lösung für dieses Dilemma wäre, wenn Crossposter, wie Du, die ganzen Foren untereinander verlinken würden. Das passiert aber regelmäßig nicht. Deshalb reagieren Leute, die Hilfe in diesen Foren leisten und sich mit den Problemen anderer beschäftigen, äußerst allergisch auf eine Nicht-Verlinkung.

Du schreibst, wenn wir diese Beiträge finden, ist das gut für Dich. Glaubst Du ernsthaft, wir schauen für jeden eröffneten Thread erstmal in allen Excel Foren nach, ob das gleiche Problem vom gleichen Fragensteller dort auch veröffentlicht wurde? Das ist eine sehr egoistische denkweise. Da diese einen sozialen Kontext hat, ist sie Unsozial, Anti-Sozial ... A-Sozial. Deine Einstellung dazu ist: Hauptsache Mein Problem wird gelöst, wenn andere dadurch Nachteile haben, ist mir das egal. Sorry, geht gar nicht.

Hausaufgabenhilfe ist schon ok. Die Frage ist nur, wie sinnvoll es ist, die Aufgabe als Komplettlösung zu liefern. Nun hattest Du Glück, das Fennek sich in dieser Form darum gekümmert hat. Ob Du viel davon hast, bezweifle ich allerdings. Aber das ist Deine Sache.

Gruß,

Zwenn


  

Betrifft: Schöne Beschreibung! von: lupo1
Geschrieben am: 29.09.2017 13:39:29

Man sollte drauf verlinken.


  

Betrifft: +100 Internet-Punkte @ Zwenn - schönes WE und owT von: Michael (migre)
Geschrieben am: 29.09.2017 14:29:57




  

Betrifft: AW: um Antwort wird gebeten! owT von: Viktoria
Geschrieben am: 28.09.2017 22:16:04

Hallo Fennek,
die Antwort ist super! Danke für die viele Mühe ich werde mir den Quellcode auf jeden Fall nochmal genau durchschauen und dir morgen ein ausführliches Feedback geben.
LG Viktoria


  

Betrifft: AW: etwas einfacher von: Fennek
Geschrieben am: 29.09.2017 20:34:59

Hallo,

der Code kann auch etwas gestrafft werden. Er sollte in ein weiteres Modul

'Entfernung, Reihe, MM auf "Public" setzen
Dim Art, Auf
Dim iDic As Object
Dim WSF As WorksheetFunction

Sub Test2()
Set WSF = Application.WorksheetFunction
Einleitung

'Unique List der Lagerorte pro Auftrag
Set iDic = CreateObject("Scripting.Dictionary")
With Sheets("Auftrag")
    For i = 2 To UBound(Auf)
        iDic.Item(Auf(i, 1)) = " "
        For j = 2 To 6
            If Not IsEmpty(Auf(i, j)) Then
                Lag = WSF.VLookup(Auf(i, j), Art, 2, 0)
                If InStr(1, iDic.Item(Auf(i, 1)), Lag) = 0 Then iDic.Item(Auf(i, 1)) = iDic. _
Item(Auf(i, 1)) & Lag
            End If
        Next j
    Next i
End With

'Ermitteln der besten Route mit der minimalen Entfernung
For Each k In iDic.Keys
    Kombinatorik (Trim(iDic.Item(k)))
    iDic.Item(k) = Reihe & "|" & MM
    Debug.Print k, iDic.Item(k)
Next k
Set iDic = Nothing
End Sub

Sub Einleitung()
Art = Sheets("Artikel").Cells(1).CurrentRegion
Auf = Sheets("Auftrag").Cells(1).CurrentRegion
Entfernung = Sheets("Entfernungen").Range("A1:H8")
End Sub
mfg


Beiträge aus den Excel-Beispielen zum Thema "Lagerbereich nacheinander anfahren"