Entwickler-Ecke
Basistechnologien - Verrechnung von Array
sebastian1234 - Mi 05.03.14 13:37
Titel: Verrechnung von Array
Hallo zusammen,
nachdem ich nun schon einiges entwickelt habe komme ich nun zum Kern meines Programms - der Clusteranalyse! Ich versuch mal kurz die Clusteranalyse anzusprechen, ich hoffe es ist verständlich =)…
Ausgangspunkt solle eine solche Matrix sein! (Array?!)
- / 1 / 2 / 3
1 / 0 / 10 / 20
2 / 10/ 0 / 30
3 / 20 / 30 / 0
1, 2, 3 stehen für die verschiedenen Unternehmen bzw. die Start-Cluster!
Die Aufgabe ist jetzt in der Matrix den geringsten Wert zu finden und diese Unternehmen bzw. Start-Cluster miteinander zu verschmelzen. Also im obigen Beispiel Unternehmen 1 und 2, weil 10 der geringste Wert ist!
Ausgabe in der Konsole sollte dann später ungefähr so aussehen: (Beispiel)
1.Schritt (also noch keine Verschmelzung durchgeführt sondern erstmal nur die Unternehmen anzeigen): {1}; {2}; {3}
2.Schritt (Unternehmen 1 und 2 werden verschmelzt): {1,2}; {3}
Dadurch das die Unternehmen 1 und 2 verschmelzt wurden, muss auch die Matrix angepasst werden… denn es muss festgelegt werden inwieweit Unternehmen {3} nun von „Unternehmenscluster“ {1, 2} enfernt ist. Die Berechnung sieht folgender Maßen aus…
verbleibendes Cluster {3}
Abstand {1} zu {3} war 20
Abstand {2} zu {3} war 10 (alles entnommen aus oberer Matrix)
ich nehme immer den niedrigsten Wert, in diesem Fall also die 10!… also sieht die neue Matrix so aus…
- {1,2} / {3}
{1, 2} 0 / 10
{1, 2} 10 / 0
und auf dieser Basis soll dann weiter verschmolzen werden… bis nichts mehr da ist…!
Um jetzt nicht einfach zu fragen wie würdet ihr das machen, vielleicht Schritt für Schritt!
Die erste Frage die sich mir stellt bezieht sich somit auf das Array!
Der letzte Schritt bevor die Clusteranalyse durchgerechnet werden soll sind die Methoden „distanzBerechnungEukli“ oder „distanzBerechnungCity“ jenachdem was man an der Oberfläche auswählt! Danach sollte das angepasste Array an die Methode? übergeben werden die Clusteranalyse durchführt.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61:
| public static void distanzBerechnungEukli(double[][] kunde) { double Ergebnis = 0; double Formel = 0; Console.WriteLine("Berechnung auf Basis Euklidischer Distanz!"); Console.WriteLine(""); for (int a = 0; a < kunde.Length; ++a) { Console.WriteLine(""); Console.WriteLine("Unternehmen: "+kunde[a][0]);
for (int b = 0; b < kunde.Length; ++b) { for (int i = 1; i < kunde[0].Length; ++i) { Formel = (Math.Pow(kunde[a][i] - kunde[b][i],2)); Ergebnis += Formel; } double Endergebnis = 0; Endergebnis = Math.Sqrt(Ergebnis); Console.WriteLine(Endergebnis); Endergebnis = 0; Ergebnis = 0; } } }
public static void distanzBerechnungCity(double[][] kunde) { double Ergebnis = 0; double Formel = 0;
Console.WriteLine("Berechnung auf Basis CityBlock Distanz!"); Console.WriteLine("");
for (int a = 0; a < kunde.Length; ++a) { Console.WriteLine(""); Console.WriteLine("Unternehmen: " + kunde[a][0]);
for (int b = 0; b < kunde.Length; ++b) { for (int i = 1; i < kunde[0].Length; ++i) { Formel = (Math.Abs(kunde[a][i] - kunde[b][i])); Ergebnis += Formel; }
double Endergebnis = 0; Endergebnis = Ergebnis; Console.WriteLine(Endergebnis); Endergebnis = 0; Ergebnis = 0; } } |
Jetzt meine Frage!
Die Werte die innerhalb der Methoden ausgegeben werden, werden zum jetzigen Zeitpunkt nicht in das Array geschrieben! Das heißt es findet ja nur eine Ausgabe statt die aber nicht das Array mit den neue Werten anpasst! Was muss ich innerhalb der beiden Methoden ungefähr tun damit diese neuen Werte in das Array übertragen werde und vorallendingen wie erhalte ich eine solche Matrix wie sie oben bei der weiteren Verrechnung der CLusteranalyse aufgeführt wird? Oder anders gefragt ist ein solche Matrix für die weitere Verrechnung nötig? oder gibt es vielleicht auch eine andere einfachere Lösung!
Oder reicht vielleicht sogar nur der Clone des Arrays aus um die Berechnung in der nächsten Methode durchzuführen?
Die Ausgabe der Methoden in der Konsole sieht so aus:
Unternehmen 0:
0
0,194
Unternehmen 1:
0,194
0
Würde mich über Tipps sehr freuen!
Moderiert von
Th69: Beitragsformatierung überarbeitet (Text aus zitiertem und editiertem Beitrag übernommen).
sebastian1234 - Mi 05.03.14 17:41
War wohl zu viel auf einmal... =)
Ich mach es in kleinen Schritten!
Die Methode...
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35:
| public static void distanzBerechnungCity(double[][] kunde) { double Ergebnis = 0; double Formel = 0; Console.WriteLine("Berechnung auf Basis CityBlock Distanz!"); Console.WriteLine("");
for (int a = 0; a < kunde.Length; ++a) { Console.WriteLine(""); Console.WriteLine("Unternehmen: " + kunde[a][0]);
for (int b = 0; b < kunde.Length; ++b) { for (int i = 1; i < kunde[0].Length; ++i) { Formel = (Math.Abs(kunde[a][i] - kunde[b][i])); Ergebnis += Formel; } double Endergebnis = 0; Endergebnis = Ergebnis; Console.WriteLine(Endergebnis); Endergebnis = 0; Ergebnis = 0; } } } |
liefert folgende Ausgabe in der Konsole:
Unternehmen: 0
0
11
Unternehmen: 1
11
0
(Unternehmen 0 zu 0 = 0
Unternehmen 0 zu 1 = 11)
(Unternehmen 1 zu O = 11
Unternehmen 1 zu 1 = 0)
Was muss ich ändern damit ich das so in das arrayDistanzCity schreiben kann:
das quasi zu Unternehmen0 folgende Zeile im Array angelegt wird...
0 / 0 / 11
und für unternehmen1 ...
1 / 11 / 0
An der Stelle wo es jetzt steht geht es nicht, da dann eine falsche Reihenfolge heraus kommt...
EDIT: Unter Console.WriteLine("Unternehmen: " + Kunde[a][0]);
arrayDistanzCity[a][0] = kunde[a][0];
aber wie benenne ich das untere Array i geht ja nicht...
Christian S. - Do 06.03.14 14:41
Hallo!
Welche Reihenfolge erhältst Du denn anstatt der gewünschten? Ich hätte jetzt schon drauf getippt, dass
arrayDistanzCity[a][b] die richtige Wahl ist.
aist dann die Zeile im Array und
b geht die Spalten durch.
Auch ist diese Frage völlig unverständlich:
sebastian1234 hat folgendes geschrieben : |
aber wie benenne ich das untere Array i geht ja nicht... |
Grüße
Christian
P.S.: Ruf mal bitte Deine privaten Nachrichten ab.
sebastian1234 - Sa 08.03.14 14:23
Ja habe ich gelesen, ich weiß jetzt bescheid!
Also in der Methode wird ja unter...
C#-Quelltext
1:
| Console.Writeline(Endergebnis); |
ein Wert ausgegeben.
Das Array sieht ungefähr so aus...
0/10/20
1/30/40
2/50/60 usw...
Der erste Wert der ausgegeben wird soll (0 für unternehmen0) an die Stelle /10/ der nächste an die stelle /20/ dann der nächste (1 für unternehmen1) an die stelle 30 geschrieben werden usw...
Also die erste Spalte in Array (0,1,2) soll unberührt bleiben. Denn bspw. da wo jetzt der Wert /20/ steht steht nach der Berechnung ein Wert der die Beziehung zwischen Unternehmen 0 und 1 darstellt...
sebastian1234 - Mo 10.03.14 18:27
Ich habe jetzt mal die Konsolenausgabe mit dazu geschrieben, vllt hilft das bei der Lösung des Problems...
Nochmal die 1.Methode! Hier soll eigentlich nichts anderes passieren als die Übertragung der Werte in das neue Array...
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40:
| public static void distanzBerechnungCity(double[][] kunde) { double Ergebnis = 0; double Formel = 0; double[][] arrayDistanzCity = (double[][])kunde.Clone();
Console.WriteLine("Berechnung auf Basis CityBlock Distanz!"); Console.WriteLine("");
for (int a = 0; a < kunde.Length; ++a) { Console.WriteLine(""); Console.WriteLine("Unternehmen: " + kunde[a][0]);
arrayDistanzCity[a][0] = kunde[a][0];
for (int b = 0; b < kunde.Length; ++b) { for (int i = 1; i < kunde[0].Length; ++i) { Formel = (Math.Abs(kunde[a][i] - kunde[b][i])); Ergebnis += Formel; } double Endergebnis = 0; Endergebnis = Ergebnis; Console.WriteLine(Endergebnis); arrayDistanzCity[a][b] = Endergebnis; Endergebnis = 0; Ergebnis = 0; } } clusterAnalyse(arrayDistanzCity); } |
... welches dann über diese Methode ausgelesen wird ...
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| public static void clusterAnalyse(double[][] kunde) { for (int a = 0; a < kunde.Length; ++a) { Console.WriteLine(""); Console.WriteLine("Unternehmen :" + kunde[a][0]);
for (int i = 1; i < kunde[0].Length; ++i) { Console.WriteLine(+kunde[a][i]); } }
} |
... aber falsche Werte liefert! Links die Ausgabe der Methode (distanzBerechnungCity) rechts die Ausgabe der Methode (clusterAnalyse)!
distanzBerechnungCity----------------------------------------clusterAnalyse
Unternehmen: 0---------------------------------------------Unternehmen: 0
0----------------------------------------------------------------11
11---------------------------------------------------------------2
Unternehmen: 1---------------------------------------------Unternehmen: 65
65---------------------------------------------------------------0
0----------------------------------------------------------------1
Ich frage mich auch wie der Wert 2 zustande kommt?
EDIT: Vermutlich liegt das Problem in der ersten Methode beim hochzählen von b?
EDIT2: Irgendwie scheint noch mehr falsch zu sein denn das Ergebnis 65 müsste eigentlich auch 11 sein!
Moderiert von
Th69: Beiträge zusammengefasst--> Antwort zu EDIT2: Ich glaube das problem liegt an dem Array clon, ich habe es in eine andere Methode eingbaut und da ist es jetzt auch falsch...
Das Array das ich clone hat nicht unbedingt die richtige große -> die Größe die ich benötige orientiert sich in der Methode distanzBerechnungCity an den Zeilenwerten -> Also 2 Zeilenwerte dann ist das Array 2x2 groß! Wie schaffe ich es das so umzusetzen?
Moderiert von
Th69: Vollzitat entfernt.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!