Hallo Holger,
habe gehofft du würdes etwas anderes sagen, bei 10 Zeilen sind das ca 3,6 Mio Kombinationen.
Gruß Sebastian
Holger schrieb am 23.03.2009 16:38:14:
Hallo sebas,
ich befürchte, dass dir nichts anderes übrig bleibt, als alle Kombinationen auszuprobieren, um dann die kleines Wertewechselzahl zu finden. Auf die Schnelle sehe ich leider keinen einfacheren Algorithmus.
Gruß
Holger
sebas schrieb am 22.03.2009 19:26:38:
Hallo Holger,
deine 2 Beispiele sind beide gleichwertig. Es kommt nur auf die Anzahl der Wertewechsel (vertikal) an.
Mal schauen ob ich die Spezifikation besser formulieren kann:
- Die Zeilen sollen gleich bleiben und nur in der Reihenfolge verändert/getauscht werden
- So wenig vertikale Wertewechsel wie möglich
- Die links liegenden Spalten haben höhere Priorität als die rechts liegenden Spalten
- Die Reihenfolge kann verändert werden, wenn in späteren Spalten Werte stehen, welche die Anzahl der Wertewechsel noch weiter minimieren
Somit würde dein drittes Beispiel optimiert so aussehen:
--> in der Dritten Spalte nun 3 statt 5 Wertewechsel
a b c c c
a c b b b
a a a a a
b a a c a
b c a d d
b b b b b
Bin nun (nach tagelangem Testen) auf keinen wirklich perfekten Algorithmus gekommen. Meistens klappts für die ersten Spalten, jedoch finde ich dann wieder eine Datenkonstellation bei der es nicht funktioniert. Womöglich ist die einzigste Möglichkeit (was jedoch die schlechteste, da langsamste wäre) alle möglichen Kombinationen auszuprobieren und bei jedem Durchgang die Anzahl der Wertewechsel zu berechnen, dabei immer die Konstellation der kleinsten Anzahl zu speichern und am Ende diese Kombi auszugeben.
Gruß Sebas
Holger schrieb am 21.03.2009 09:06:45:
Hallo sebas,
deine Spezifikation der Sortierreihenfolge ist unklar.
Was zeichnet
a a
a b
a c
b c
b b
b a
vor
a a
a b
a c
b c
b a
b b
aus?
Könnte die Reihenfolge dadurch noch verändert werden, weil in späteren Spalten Werte stehen, die Anzahl der Wertewechsel noch weiter minimieren, z.B.
a a a a a
a b c c c
a c b b b
b c a d d
b b b b b
b a a c a?
Gruß
Holger
sebas schrieb am 19.03.2009 20:15:23:
Hallo Profis,
habe in einer Excel Tabelle z.B. 10x10 Zellen mit Daten und möchte diese (zeilenweise) auf Gleichheit (NICHT nur alphabetisch!) sortieren. Zunächst soll nach Spalte A, dann nach B usw. sortiert werden, jedoch ohne dass die Zeile verändert wird und so, dass so wenig wie möglich Werte-Wechsel zwischen den Zeilen vorkommen.
Die "normale" Sortierfunktion von Excel oder anderer Ausführungen im Netz reicht hier leider nicht aus da folgender "Sortierfehler" auftritt (siehe Bsp)
Mit dem Code den ich bisher programmiert habe kann ich wie Excel auch sortieren, jedoch nach beliebiger Anzahl an Spalten. Jedoch soll das Programm verfeinert werden um so gleiche Elemente in der Matrix zusammen bringen. (Code am Ende)
Würde mich über jede Anregung freuen!!!!!
Gruß Sebas
Bsp: unsortiert
a c
a a
b b
b c
a b
b a
Bsp: nach Excel Sortierweise:
a a
a b
a c
b a
b b
b c
Bsp: nach Gleichheit sortieren
-> im Vergleich zu Excel-Weise ist hier Zeile 4 mit 6 vertauscht und somit sind die C's zusammen :)
a a
a b
a c
b c
b b
b a
CODE:
For x = erste_spalte To letzte_spalte
'Schleife über jedes Element im der Spalte(vom Erstem bis zum Voreltzten)
For y = erstesy To letztesy - 1
'Schleife über jedes folgende Element in der Spalte
For y2 = y + 1 To letztesy
'Untersuchen ob Elemente gleich sind
If tbl.Cells(y, x) = tbl.cells(y2, x) Then
'nur wenn scharf, soll Verschoben werden (Damit nicht Verschoben wird, wenn lauter gleiche Daten)
If scharf = True Then
'Abstand zwischen den zu betrachteten Elementen berechnen
abstand = y2 - y
'auswählen des momentan betrachteten Elementes
form_agregar.lb_ausw.ListIndex = y - 3
'Verschieben des momentan betrachteten Elementes bis es über dem gleichen Element steht
Do While abstand > 1
'Externe Funktion, welche Elemente tauscht
Call move_down
abstand = abstand - 1
Loop
' nach Verschieben nicht next sondern gleiche Poistion noch einmal
y = y - 1
scharf = False
Exit For
End If
Else
'Wenn keine gleichen Komponenten ->scharf stellen
scharf = True
End If
End If
Next y2
Next y
Next
|