Advertisement
Guest User

Untitled

a guest
Feb 9th, 2017
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.56 KB | None | 0 0
  1. package algo;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.FileInputStream;
  5. import java.io.InputStreamReader;
  6. import java.util.HashSet;
  7.  
  8.  
  9.  
  10.  
  11.  
  12. //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  13. // Klasse fuer den Algorithmus von Floyd-Warshall
  14. //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  15. public class Floyd_Warshall {
  16.  
  17. static double[][] DISTANZ; // Distanz-Matrix
  18. static Integer[][] VORGANGER; // Vorgaenger-Matrix
  19.  
  20.  
  21. // * filetointarray: Werte aus Datei (dat) werden gelesen und Graph wird in Array gelegt
  22. // *
  23. // * @param dat - eine Datei mit int-Werten:
  24. // * 1.Reihe: Knotenanzahl -->n
  25. // * 2.Reihe: Kantenanzahl -->m
  26. // * 3.Reihe0: (m+2)e Zeile--> Endknoten der Kante und das Kantengewicht
  27. // *
  28. // *
  29. // * @return Array aus Graphen von dat:
  30. // * -->Jedes Teil des Arrays hat ein Array mit 3 Zahlen
  31. // * -->Teil 0 hat Knotenzahl und Kantenzahl (Index 0 und 1)
  32. // * -->Teil 1 hat Kanten (u,v)
  33. //
  34.  
  35. static Integer[][] filetointarray(String dat) {
  36. Integer[][] A = null;
  37. FileInputStream fis = null;
  38. try {
  39. fis = new FileInputStream(dat);
  40. } catch (Exception e) {
  41. System.out.println(dat + " konnte nicht geoeffnet werden");
  42. System.out.println(e.getMessage());
  43. }
  44. try {
  45. InputStreamReader isr = new InputStreamReader(fis);
  46. BufferedReader br = new BufferedReader(isr);
  47.  
  48. // Knotenanzahl lesen
  49. String einZeile;
  50. einZeile = br.readLine();
  51. Integer n = new Integer(einZeile);
  52.  
  53. // Kantenanzahl lesen
  54. einZeile = br.readLine();
  55. Integer m = new Integer(einZeile);
  56. A = new Integer[m + 1][3];
  57.  
  58. // Knoten- und Kantenanzahl -> Array
  59. A[0][0] = n;
  60. A[0][1] = m;
  61.  
  62. // Kanten lesen
  63. for (int i = 1; i <= m; i++) {
  64. einZeile = br.readLine();
  65. Integer sepIndex1 = einZeile.indexOf(' ');
  66. Integer sepIndex2 = einZeile.indexOf(' ', sepIndex1 + 1);
  67. String vStr = einZeile.substring(0, sepIndex1);
  68. String uStr = einZeile.substring(sepIndex1 + 1, sepIndex2);
  69. String wStr = einZeile.substring(sepIndex2 + 1, einZeile.length());
  70. Integer v = new Integer(vStr);
  71. Integer u = new Integer(uStr);
  72. Integer w = new Integer(wStr);
  73. if (!(u >= 0 && u < n && v >= 0 && v < n))
  74. throw new Exception("Knotennummer nicht korrekt");
  75. A[i][0] = v;
  76. A[i][1] = u;
  77. A[i][2] = w;
  78. }
  79. } catch (Exception e) {
  80. System.out.println("Einlesen nicht möglich");
  81. System.out.println(e.getMessage());
  82. }
  83.  
  84. return A;
  85. }
  86.  
  87.  
  88.  
  89.  
  90.  
  91.  
  92.  
  93.  
  94.  
  95.  
  96.  
  97.  
  98. // * Floyd-Warshall Algorithmus zum bestimmen des kürzesten Weges und des Vorgängers
  99. // *
  100. // * @param G - der zu untersuchende Graph
  101. // * gibt false zurück, wenn es negativen zyklus hat, sonst gibt er true zurück
  102. // *
  103. // * Aktion - vorgänger/distanzmatrix bestimmen und zeigt sie
  104. // *
  105. //
  106.  
  107. static boolean floydalgorithmus(Integer[][] G) {
  108.  
  109. // Knoten-ID mit 0,...,n indizieren
  110.  
  111. HashSet<Integer> vertexIds = new HashSet<Integer>();
  112. // Knoten-ID sammeln
  113. for (Integer[] reihe : G) {
  114. if (reihe == G[0]) continue;
  115. vertexIds.add(reihe[0]);
  116. vertexIds.add(reihe[1]);
  117. }
  118.  
  119. // Knoten-IDs aufsteigend sortieren
  120. Object[] sort0 = vertexIds.toArray();
  121. int[] sortie = new int[sort0.length];
  122. for (int i = 0; i < sortie.length; i++) {
  123. sortie[i] = (int) sort0[i];
  124. }
  125. MergeSort.mergesort(sortie, 0, sortie.length - 1);
  126.  
  127. // Knoten IDs bezeichnen von 0 ...n
  128. for (int i = 0; i < vertexIds.size(); i++) {
  129. for (Integer[] reihe : G) {
  130. if (reihe[0] == sortie[i]) reihe[0] = i;
  131. if (reihe[1] == sortie[i]) reihe[1] = i;
  132. }
  133. }
  134. //danach--> Jetzt von 0,...,vertexIds.size()-1
  135.  
  136.  
  137. // Distanz/Vorganger-Matrix mit MAX_VALUE / null initialisieren
  138. DISTANZ = new double [G[0][0]][G[0][0]];
  139. VORGANGER = new Integer[G[0][0]][G[0][0]];
  140.  
  141. for (int i = 0; i < DISTANZ.length; i++) {
  142. for (int j = 0; j < DISTANZ[i].length; j++) {
  143. DISTANZ[i][j] = Double.MAX_VALUE;
  144. VORGANGER[i][j] = null;
  145. }
  146. }
  147.  
  148. // Vorgaenger/ Distanzen löschen ausm Graphen
  149. for (int i = 1; i < G.length; i++) {
  150. DISTANZ[G[i][0]][G[i][1]] = G[i][2];
  151. VORGANGER[G[i][0]][G[i][1]] = G[i][0];
  152. }
  153.  
  154.  
  155.  
  156. // IDs zurück benennen
  157. for (Integer i = 0; i < vertexIds.size(); i++) {
  158. for (Integer[] reihe : G) {
  159. if (reihe[0] == i) reihe[0] = sortie[i];
  160. if (reihe[1] == i) reihe[1] = sortie[i];
  161. }
  162. for (Integer[] reihe : VORGANGER) {
  163. for (Integer j = 0; j < reihe.length; j++) {
  164. if (reihe[j] == i) reihe[j] = sortie[i];
  165. }
  166. }
  167. }
  168. // IDs haben jetzt alten Namen
  169.  
  170. // Ausgabe der Graphen / Distanz / VorgaangerMatrix
  171. zeichnegraph(G);
  172. System.out.println("\n");
  173. System.out.println("Ursprungsmatrizen: \n");
  174.  
  175. printDISTANZ(DISTANZ);
  176. System.out.println();
  177. printVORGANGER(VORGANGER);
  178. System.out.println();
  179.  
  180. // Hauptaufgabe -->Distanz/ Vorgaenger-Matrix bestimmen
  181. for (int k = 0; k < DISTANZ.length; k++) {
  182. for (int i = 0; i < DISTANZ.length; i++) {
  183. for (int j = 0; j < DISTANZ.length; j++) {
  184. if (DISTANZ[i][j] > DISTANZ[i][k] + DISTANZ[k][j]) {
  185. DISTANZ[i][j] = DISTANZ[i][k] + DISTANZ[k][j];
  186. VORGANGER[i][j] = VORGANGER[k][j];
  187. }
  188. }
  189. }
  190. // Fehlermeldung wenn Zyklus negativ ist
  191. if (DISTANZ[k][k] < 0.0) {
  192. System.out.println("Negativer Zyklus");
  193. return false;
  194. }
  195. }
  196.  
  197. // Ausgabe End- Distanz/Vorgaenger
  198. System.out.println("Endmatrizen \n");
  199. System.out.println("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
  200. printDISTANZ(DISTANZ);
  201. System.out.println();
  202. printVORGANGER(VORGANGER);
  203. System.out.println();
  204. return true;
  205. }
  206.  
  207.  
  208.  
  209.  
  210.  
  211.  
  212.  
  213.  
  214.  
  215.  
  216.  
  217.  
  218.  
  219.  
  220.  
  221.  
  222.  
  223.  
  224.  
  225.  
  226. // * Methode für Ausgabe Graph
  227. // *
  228. // * @param g - Graph, der angezeigt wird
  229.  
  230. static void zeichnegraph(Integer[][] g) {
  231.  
  232. System.out.println("Graph der Matrix");
  233. System.out.println("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
  234.  
  235. for (Integer[] reihe : g) {
  236. // Erste Zeile wird ignoriert, da nur knoten/kantenzahl
  237.  
  238. if (reihe == g[0]) continue;
  239. for (Integer c : reihe) {
  240. System.out.printf(" %5d ", c);
  241. }
  242. System.out.print("\n");
  243.  
  244. }
  245. System.out.println("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
  246. }
  247.  
  248.  
  249.  
  250.  
  251.  
  252.  
  253.  
  254.  
  255.  
  256.  
  257.  
  258.  
  259.  
  260.  
  261.  
  262. // * Methodeum Vorgangermatrix anzuzeigen
  263. // *
  264. //
  265.  
  266. static void printVORGANGER(Integer[][] vorganger) {
  267.  
  268. System.out.println("Die UrsprungsMatrix");
  269. System.out.println("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
  270. for (Integer[] reihe : vorganger) {
  271. for (Integer c : reihe) {
  272. // Bei (noch) nicht bekanntem Vorgaenger:
  273. if (c == null) System.out.printf(" %5s ", "?");
  274. else {
  275. System.out.printf(" %5d ", c);
  276. }
  277. }
  278. System.out.print("\n");
  279. }
  280. }
  281.  
  282.  
  283.  
  284.  
  285.  
  286.  
  287.  
  288.  
  289.  
  290.  
  291.  
  292.  
  293.  
  294. // * Methode um Distanzmatrix anzuzeigen
  295.  
  296. static void printDISTANZ(double[][] dist) {
  297.  
  298. System.out.println("Distanz der Matrix");
  299. System.out.println("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
  300.  
  301. for (double[] reihe : dist) {
  302. for (double c : reihe) {
  303. // Bei nicht bekannten Distanzen: (Inf. -> Infinity)
  304. if (c == Double.MAX_VALUE) System.out.printf(" %5s ", "∞");
  305. else {
  306. System.out.printf(" %5.1f ", c);
  307. }
  308. }
  309. System.out.print("\n");
  310. }
  311. }
  312.  
  313. static public void main(String[] args) {
  314.  
  315. // Beispieltest aus Vorlesung
  316. Integer[][] G1 = filetointarray("graphwfw.txt");
  317. floydalgorithmus(G1);
  318.  
  319.  
  320.  
  321. }
  322. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement