예제 #1
0
  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;
    }
  }
예제 #2
0
  // 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;
  }