Hallo.
Ich habe eine Matrix, wie z. B. die folgende:
5 2 3 4 0 5
0 2 2 6 7 0
5 4 4 1 2 9
8 8 1 1 5 4
1 6 8 9 5 9
5 0 3 2 7 4
Diese Matrix möchte ich durch umsortieren der Spalten oder der
Zeilen (also entweder nur die Spalten oder nur die Zeilen
vertauschen) so anordnen, dass auf einer der beiden Diagonalen
die Summe der Zahlen möglichst gering wird.
Wenn ich über dein Problem nachdenke, kommt mir folgende Idee:
Es ist egal, ob man die Spalten oder Zeilen umsortiert, man kann jede beliebige mögliche Diagonale auf beide Arten erreichen.
Man muss also erstmal nur schauen, dass man aus jeder Zeile und jeder Spalte genau eine Zahl wählt, die hinterher in der Diagonale stehen soll, dann kann man passend umsortieren.
Ich würde dann so vorgehen:
Summe\_min = unendlich
Summe = 0
Zeile = 1
Spaltenliste = {}
Spaltenliste\_min = {}
Wähle aus der aktuellen Zeile aus den Spalten, die nicht in Spaltenliste sind, die kleinste Zahl aus.
Füge die Spalte zur Spaltenliste hinzu
Summe += Matrix(Zeile, Spalte)
Wenn Summe \>= Summe\_min
[Sprungmarke1]
Summe -= Matrix(Zeile, Spalte)
entfenre Spalte aus Spaltenliste
Wenn noch nicht alle möglichen Spalten der Zeile probiert,
Wähle nächstgrößere Zahl als Spalte
Sonst
Wenn Zeile = erste Zeile
Abbruch
Sonst gehe eine Zeile zurück und mache weiter bei Sprungmarke1
Wenn Zeile = letzte Zeile
Summe\_min = Summe
Spaltenliste\_min = Spaltenliste
Weiter bei Sprungmarke1
Summe_min enthält dann die kleinste erreichbare Summe und Spaltenliste_min die Spalten der jeweiligen Zeilen, die zu dieser Summe führen. Damit enthält Spaltenliste dann auch gleich die Zeilennummer, in die die jeweilige Zeile geschoben werden muss.
Am Beispiel sollte am Ende
Summe_min = 3
Spaltenliste_min = {5, 6, 4, 3, 1, 2}
sein. Damit wird Zeile 1 also in der neuen Matrix zu Zeile 5, Zeile 2 zu Zeile 6 usw.
Sorry, der Algo ist ein wenig holprig beschrieben, ich hoffe, du kommst trotzdem damit zurecht.
Sebastian.