Entschuldigt vielmals die Störung, aber nachdem ich am vergangenen Wochenende das Forum durchsucht habe, und ebenso von Google massiv gebrauch gemacht habe, jedoch noch immer keiner Lösung näher gekommen bin, würde ich gerne um ein wenig Hilfe bitten.
Es gab im Mathematik-Forum wie auch im Programmieren-Forum einige Beiträge, jedoch konnte ich im großen und ganzen kaum mit den meisten etwas anfangen, auch weil mein Problem so spezifisch erscheint.
Vorne weg muss ich jedoch gestehen, dass ich im Rahmen meines Studiums zwar mit MatLab in Berührung gekommen bin, allerdings haben wir mehr mit Excel gearbeitet, so dass ich absolut keine Ahnung habe.
Mein Problem besteht (darüberhinaus) im folgenden: für ein Paper im Rahmen meines Studiums anlysiere ich das TSP(Traveling Salesman Problem) und habe ein besonderes Interesse an der Ausgabe der Permutation aller Rundreisen, falls dies möglich ist.
Ich würde gerne alle möglichen Distanzen zwischen den einzelnen Knoten K in einer Matrix A(i,j) per Zufall erstellen lassen, diese dann Permutieren, anschließend alle Hamiltonkreise berechnen und schlussendlich als Grafik ausgeben lassen(wie mir scheint, noch das kleinste Problem).
Also nach zwei Tagen(kein Scherz!) ist es mir endlich geglückt eine Matrix zu erstellen, dessen Werte per pseudo Zufall bestimmt werden, wobei die Diagonalen immer Null sein soll.
Anschließend habe ich die Werte alle permutieren lassen und in eine Variable gepackt. Nun sollte jede Zeile in der Matrix aufsummiert werden, doch keiner meiner Versuche mit for-Schleifen hat gefrucht.
Ich habe die Schleifen mehrmals variiert, dennoch sind alle Versuche fehlgeschlagen. Meine statische summation der Zeile hingegen hat allerdings funktioniert.
Aber für n! Datensätze ist das ein bisschen viel, alles mit der Hand zu machen.
Meine Fragen sind daher nun, ob jemand Abhilfe weiß hinsichtlich der Zeilenweisen summation der Permutationsmatrix (am besten wäre eine Übergabe an einen Vektor, worin dann Zeilenweise die Summen der einzelnen Zeilen stehen) und wie ich die Ausgabe von MatLab so formatiere, dass er mir die Ergbeniss nicht in weitem Abstand untereinander ausgibt, sondern gesittet nebeneinander.(Ich hoffe den Rest bekomme ich auch so hin.)
Ich bin für jeden Vorschlag, Link worin ich mich einlesen kann und Hinweis auf mögliche Konzeptfehler bei der Herangehensweise des TSP-Problems mit Matlab sehr dankbar.
Ich hoffe ich habe alle Postingregeln beachtet und nicht allzu sehr Eure Zeit verschwendet.
Vielen Dank erst einmal für die schnelle Antwort. Ich war zuerst ganz happy, da es zwar für die einfache Matrix klappt, aber nicht für die Permutationsmatrix.
wie gesagt perms is für zeilen vektoren und nicht für ne nxn matrix. dein beispiel was geht ist ein zeilenvektor perms(A) kann nicht gehn da A eine 10x10 matrix ist
p=cell(size(A));
for k=1:size(A)
p{k}=perms(A(k,:));
end
allerdings steht auch schon in der doc das perms nur für n<11 praktikabel ist. die laufzeit wird doch recht lang. und irgendwann gibbet memory error
der speicher steigt ja exponentiell an. bei n=10 belegt die matrix ja schon über 270 mb speicher. bei 11 sinds dann schon über 3gigabyte ^^. meine mühle schafts nur bis n=9
Nach kleineren und größeren Rückschlägen habe ich eine lauffähige Version hinbekommen.
@Winkows Beitrag
Die Permutation geht tatsächlich nur für Vektoren. Ich habe mir ein Script gesucht für ganze Matrizen, aber da ist dann Matlab total abgestürzt wegen:
versucht, allerdings hat er dann gemeckert, als ich später eine Addition durchführen wollte, um den Hamiltonkreis zu schließen. Als Fehler kam das er die Strings nicht zusammenführen könnte.
Ich habe daraufhin einen neuen Ansatz probiert, indem ich festen Start- und Endknotenpunkt gewählt habe und nur die Wert dazwischen permutiere. Das hat den Vorteil, dass man nicht die ganze Matrix immer wieder Permutieren muss, sondern mit Vektoren arbeiten kann.
%Permutation der Wege
c_1 = ([B, C, D, E]);
p = perms(c_1);
y = length(p);
a = 5;
Z = zeros(a,a);
%(Pseudo)Zufallszuweisungen des Kantengewichts
for i = 1:a
for j = 1:a
if i == j
Z(i,j) = 0;
else
Z(i,j) = random('unid',1000);
end end end
Z
%Schließung des Hamiltionkreises
for q = 1:y
v = [A p(q,:) A]
z = length(v);
%Überprüfung des Vektors und zuweisung der Gewichtswerte, da
%[A B C D E A] <=> [AB BC CD DE EA] for f = 1:z-1
if v(f) == A && v(f+1)== B a_12 = Z(1,2); end if v(f) == A && v(f+1)== C a_13 = Z(1,3); end if v(f) == A && v(f+1)== D a_14 = Z(1,4); end if v(f) == A && v(f+1)== E a_15 = Z(1,5); end if v(f) == B && v(f+1)== C a_23 = Z(2,3); end if v(f) == B && v(f+1)== D a_24 = Z(2,4); end if v(f) == B && v(f+1)== E a_25 = Z(2,5); end if v(f) == C && v(f+1)== D a_34 = Z(3,4); end if v(f) == C && v(f+1)== E a_35 = Z(3,5); end if v(f) == D && v(f+1)== E a_45 = Z(4,5); end if v(f) == E && v(f+1)== D a_45 = Z(4,5); end if v(f) == E && v(f+1)== C a_35 = Z(3,5); end if v(f) == D && v(f+1)== C a_34 = Z(3,4); end if v(f) == E && v(f+1)== B a_25 = Z(2,5); end if v(f) == D && v(f+1)== B a_24 = Z(2,4); end if v(f) == C && v(f+1)== B a_23 = Z(2,3); end if v(f) == E && v(f+1)== A a_15 = Z(1,5); end if v(f) == D && v(f+1)== A a_14 = Z(1,4); end if v(f) == C && v(f+1)== A a_13 = Z(1,3); end if v(f) == B && v(f+1)== A a_12 = Z(1,2); end end
Mein Problem besteht jetzt in der Statik des Systems.
Gibt es eine Möglichkeit die Knoten dynamisch zu überprüfen und die Kantengewichte der Matrix Z zuzuweisen?
Vielen vielen dank nochmal, dass es letztes Mal so schnell Hilfe gab.
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.