public static void main(String[] args) { try { Datos datos = Datos.cargarDatosDeArgs(args); String salidaFun = "SALIDA_FUN_GREEDY.txt"; String salidaVar = "SALIDA_VAR_GREEDY.txt"; if (args.length >= 7) { salidaFun = args[8]; } if (args.length >= 8) { salidaVar = args[9]; } System.out.println("---- Parametros a utilizar ----"); System.out.println("Salidas: " + salidaFun + ", " + salidaVar); double[] params = {0.0, 0.05, 0.1, 0.15, 0.20, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5}; SolutionSet solSetGreedy = new SolutionSet(params.length); Problem problem = new Problema(datos); for (double p : params) { Permutation resultado = ejecutarGreedy(datos, p); Solution solucionGreedy = new Solution(problem, new Variable[] {resultado}); problem.evaluateConstraints(solucionGreedy); problem.evaluate(solucionGreedy); solSetGreedy.add(solucionGreedy); // Imprimo y genero datos de la misma forma que el AE System.out.println("F1: " + solucionGreedy.getObjective(0)); System.out.println("F2: " + solucionGreedy.getObjective(1)); System.out.println("----"); } ((Problema) problem).imprimirSolucion("SALIDA_GREEDY.txt", solSetGreedy); solSetGreedy.printFeasibleFUN(salidaFun); solSetGreedy.printFeasibleVAR(salidaVar); } catch (Throwable t) { System.out.println(t.getMessage()); return; } }
// No recoge contenedores que esten en < de minBasura al momento de visitarlos, usar 0 para // recoger siempre. // min basura esta entre 0 y 1 public static ZeroPermutation ejecutarGreedy(Datos datos, double minBasura) { if (datos.puntosOrdenados == null) { datos.puntosOrdenados = datos.cargarPuntosOrdenados(datos.distancias); } boolean[] visitados = new boolean[datos.puntos.length]; for (int i = 0; i < visitados.length; i++) visitados[i] = false; visitados[0] = true; // origen visitado para no tomarlo en cuenta. int cantPorCamion = datos.datosBasicos.capacidadCamiones + datos.datosBasicos.capacidadCamiones / 2; int[] resultado = new int[datos.datosBasicos.cantidadCamiones * cantPorCamion]; int libres = visitados.length - 1; int index = 0; for (int i = 0; i < datos.datosBasicos.cantidadCamiones; i++) { int actual = 0; // indice del punto actual double recogido = 0; int cant = 0; // cantidad de contenedores que ha visitado un camion int tiempo = 0; while (cant < cantPorCamion && libres > 0) { int elegido = -1; double sumaBasura = -1; int sumaTiempo = -1; boolean encontrado = false; // de los mas cercanos, voy al mas cercano que no supere la capacidad del camion. for (int j = 1; j < datos.puntosOrdenados.length; j++) { elegido = datos.puntosOrdenados[actual][j]; if (!visitados[elegido]) { sumaTiempo = tiempo + datos.tiempos[actual][elegido]; sumaBasura = (datos.llenados[elegido].v + datos.velocidades[elegido].v * sumaTiempo) / 100; if (sumaBasura > minBasura && recogido + sumaBasura <= datos.datosBasicos.capacidadCamiones) { encontrado = true; break; } } } if (encontrado) { visitados[elegido] = true; tiempo = sumaTiempo + datos.datosBasicos.tiempoRecoleccionContenedor; recogido += sumaBasura; libres--; resultado[index] = elegido; actual = elegido; cant++; index++; } else { break; // si llegue aca quiere decir que se lleno el camion. } } if (cant < cantPorCamion) { while (cant < cantPorCamion) { resultado[index] = 0; index++; cant++; } } } // Construyo resultado de permutacion para poder utilizar con AE ZeroPermutation res = new ZeroPermutation(); res.vector_ = resultado; res.size_ = resultado.length; return res; }