PageRenderTime 54ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 0ms

/src/main/Main.java

https://bitbucket.org/JanGames/algo1tp1
Java | 260 lines | 186 code | 40 blank | 34 comment | 27 complexity | f63662257c7a661481fefbaedd80269d MD5 | raw file
  1. package main;
  2. import java.util.Arrays;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. public class Main {
  6. public static int[][] matriz0 = {
  7. { 0, 7, -1, 5, -1, -1, -1},
  8. { 7, 0, 2, 9, 1, -1, -1},
  9. {-1, 2, 0, -1, 5, -1, -1},
  10. { 5, 9, -1, 0, 15, 6, -1},
  11. {-1, 1, 5, 15, 0, 1, 14},
  12. {-1, -1, -1, 6, 1, 0, 11},
  13. {-1, -1, -1, -1, 14, 11, 0}
  14. };
  15. //public static int[][] matriz;
  16. /*VALORES GENERALES
  17. public static int N = 5;
  18. public static int a = 1;
  19. public static int b = 2;
  20. public static int c = 3;
  21. public static int M = 70;
  22. public static int k = 40;
  23. public static int origen = 0;
  24. public static int destino = 1;*/
  25. public static void main(String[] args) {
  26. //Genera la matriz de NxN
  27. //matriz = generar_matriz(N, a, b, c, M, k);
  28. int[][] cb = {
  29. {5, 1, 2, 3, 70, 40, 0, 1},
  30. {5, 1, 2, 3, 70, 40, 2, 4},
  31. {9, 3, 5, 7, 3739, 2468, 0, 4},
  32. {9, 3, 5, 7, 3739, 2468, 8, 5},
  33. {10, 3, 5, 7, 1037, 120, 6, 8},
  34. {10, 3, 5, 7, 1037, 120, 0, 2},
  35. {10, 3, 5, 7, 1037, 120, 6, 1},
  36. };
  37. //Creo camino de todos los casos base y printeo camino y costo
  38. int i = 0;
  39. while(i < cb.length) {
  40. int[][] matriz = generar_matriz(cb[i][0], cb[i][1], cb[i][2], cb[i][3], cb[i][4], cb[i][5]);
  41. List<Integer> camino = camino_minimo(matriz, cb[i][6], cb[i][7]);
  42. int costo = calcular_costo(matriz, lista_array(camino));
  43. System.out.println("Camino: " + camino + ", Costo: " + costo);
  44. i++;
  45. }
  46. /*
  47. System.out.println(camino_minimo(generar_matriz(5, 1, 2, 3, 70, 40), 0, 1));
  48. System.out.println(camino_minimo(generar_matriz(5, 1, 2, 3, 70, 40), 2, 4));
  49. System.out.println(camino_minimo(generar_matriz(9, 3, 5, 7, 3739, 2468), 0, 4));
  50. System.out.println(camino_minimo(generar_matriz(9, 3, 5, 7, 3739, 2468), 8, 5));
  51. System.out.println(camino_minimo(generar_matriz(10, 3, 5, 7, 1037, 120), 6, 8));
  52. System.out.println(camino_minimo(generar_matriz(10, 3, 5, 7, 1037, 120), 0, 2));
  53. System.out.println(camino_minimo(generar_matriz(10, 3, 5, 7, 1037, 120), 6, 0));
  54. */
  55. }
  56. public static int[][] generar_matriz(int N, int a, int b, int c, int M, int k)
  57. {
  58. int i = 0, j = 0;
  59. int[][] nMatriz = new int[N][N];
  60. while(i < nMatriz.length) {
  61. while(j < nMatriz[i].length) {
  62. int valor = (int) ((Math.pow((i - j), 2) * (a * Math.pow(2, i+j) + b * i * j + c)) % M);
  63. //Modulo de java va entre -resto y resto, como no quiero costos negativos le sumo M en caso de que sea negativo
  64. if(valor < 0) { valor += M; }
  65. if(valor <= k) { nMatriz[i][j] = valor; }
  66. else { nMatriz[i][j] = -1; }
  67. j++;
  68. }
  69. i++;
  70. j = 0;
  71. }
  72. return nMatriz;
  73. }
  74. public static void actualizar_vecinos (int[][] matriz, int vertice, int[] padre, int[] costo)
  75. {
  76. int i = 0;
  77. int nCosto = 0;
  78. while(i < padre.length) {
  79. if(matriz[vertice][i] != -1) {
  80. nCosto = costo[vertice] + matriz[vertice][i];
  81. if(costo[i] == -1 || nCosto < costo[i]) {
  82. padre[i] = vertice;
  83. costo[i] = nCosto;
  84. }
  85. }
  86. i++;
  87. }
  88. }
  89. public static boolean existe_alcanzable(int[] padre, int[] uso)
  90. {
  91. int i = 0;
  92. boolean exists = false;
  93. while(i < padre.length) {
  94. if(padre[i] != -1 && uso[i] == 0) { exists = true; }
  95. i++;
  96. }
  97. return exists;
  98. }
  99. public static int buscar_minimo(int[] costo, int[] uso, int[] padre)
  100. {
  101. int i = 0;
  102. int minimo = -1;
  103. while(i < uso.length) {
  104. if(uso[i] == 0 && padre[i] != -1 && (minimo == -1 || costo[i] < costo[minimo])) { minimo = i; }
  105. i++;
  106. }
  107. return minimo;
  108. }
  109. public static List<Integer> generar_camino (int[] padre, int origen, int destino)
  110. {
  111. List<Integer> camino = new ArrayList<Integer>();
  112. int i = destino;
  113. while(i != -1 && i != origen) {
  114. camino.add(0, i);
  115. i = padre[i];
  116. }
  117. if(i != -1) { camino.add(0, i); }
  118. else { camino.clear(); }
  119. return camino;
  120. }
  121. public static List<Integer> camino_minimo (int[][] adj , int origen, int destino)
  122. {
  123. int[] uso = new int[adj.length];
  124. int[] padre = new int[adj.length];
  125. int[] costo = new int[adj.length];
  126. Arrays.fill(uso, 0);
  127. Arrays.fill(padre, -1);
  128. Arrays.fill(costo, -1);
  129. int i = origen;
  130. indicar_origen(uso, padre, costo, i);
  131. while(existe_alcanzable(padre, uso) && i != destino) {
  132. uso[i] = 1;
  133. actualizar_vecinos(adj, i, padre, costo);
  134. i = buscar_minimo(costo, uso, padre);
  135. }
  136. return generar_camino(padre, origen, destino);
  137. }
  138. public static int calcular_costo(int[][] matriz, int[] camino) {
  139. int i = 0;
  140. int costo = 0;
  141. while(i < camino.length - 1) {
  142. costo += matriz[camino[i]][camino[i + 1]];
  143. i++;
  144. }
  145. return costo;
  146. }
  147. public static void indicar_origen(int[] uso, int[] padre, int[] costo, int vertice)
  148. {
  149. uso[vertice] = 0;
  150. padre[vertice] = vertice;
  151. costo[vertice] = 0;
  152. }
  153. public static int[] lista_array(List<Integer> lista) {
  154. int[] array = new int[lista.size()];
  155. int i = 0;
  156. while(i < array.length) {
  157. array[i] = lista.get(i);
  158. i++;
  159. }
  160. return array;
  161. }
  162. /*
  163. * -----------------------------------------------------------------------
  164. * A PARTIR DE ACA SON TODAS FUNCIONES AUXILIARES NO NECESARIAS PARA EL TP
  165. * -----------------------------------------------------------------------
  166. */
  167. public static void print_matriz(int[][] matriz)
  168. {
  169. //Crea indices i y j, crea string
  170. int i = 0, j = 0;
  171. String mRow = "";
  172. //Crea primera fila de vx para referencia
  173. mRow = "\t";
  174. while(i < matriz.length) {
  175. mRow += "v" + i + "\t";
  176. i++;
  177. }
  178. System.out.println(mRow);
  179. mRow = "";
  180. i = 0;
  181. //Recorre matriz por i vertical y j horizontal y crea filas de ints, agrega vx al principio
  182. while(i < matriz.length) {
  183. while(j < matriz[i].length) {
  184. mRow += matriz[i][j] + ",\t";
  185. j++;
  186. }
  187. //Printea linea en consola
  188. System.out.println("v" + i + "\t" + mRow);
  189. //Reinicia loop en j
  190. mRow = "";
  191. i++;
  192. j = 0;
  193. }
  194. }
  195. public static void print_lista(int[] uso, int[] padre, int[] costo)
  196. {
  197. //Imprimo los valores de las listas
  198. int i = 0;
  199. String lRow = "Uso\t";
  200. while(i < uso.length) {
  201. lRow += uso[i] + "\t";
  202. i++;
  203. }
  204. System.out.println(lRow);
  205. lRow = "Padre\t";
  206. i = 0;
  207. while(i < padre.length) {
  208. lRow += padre[i] + "\t";
  209. i++;
  210. }
  211. System.out.println(lRow);
  212. lRow = "Costo\t";
  213. i = 0;
  214. while(i < costo.length) {
  215. lRow += costo[i] + "\t";
  216. i++;
  217. }
  218. System.out.println(lRow);
  219. }
  220. }