/**
  * Inicializa la matriz de adyacencia según los nodos adyacentes de la Instancia pasada como
  * parámetro
  *
  * @param i
  */
 private void initAdy(Instancia i) {
   for (Eje e : i.dameEjesTodos()) {
     int posV1 = pos(e.dameDesde().nodo, i.dameNodosV1Todos());
     int posV2 = pos(e.dameHasta().nodo, i.dameNodosV2Todos());
     ady[posV1][posV2] = true;
   }
 }
  public MatrizAdyacencia(Instancia i) {
    int dimV1 = i.dameNodosV1().size();
    int dimV2 = i.dameNodosV2().size();
    ady = new boolean[dimV1 + i.dameNodosIV1().size()][dimV2 + i.dameNodosIV2().size()];
    resetAdy();
    initAdy(i);

    initEjesYNodos(i);
  }
示例#3
0
  public Grafo resolverConGolosoRandom() {
    Grafo grafo = instancia.dameGrafoOriginal().clone();
    Grafo grafoTotal = instancia.dameGrafo().clone();

    LinkedList<Nodo> nodosIV1 = new LinkedList<Nodo>(instancia.dameNodosIV1());
    cantidadOperaciones = cantidadOperaciones + instancia.getCantidadDeOperaciones();
    LinkedList<Nodo> nodosIV2 = new LinkedList<Nodo>(instancia.dameNodosIV2());
    cantidadOperaciones = cantidadOperaciones + instancia.getCantidadDeOperaciones();
    cantidadOperaciones = cantidadOperaciones + nodosIV1.size() + nodosIV2.size();

    int sizeTotal = nodosIV1.size() + nodosIV2.size();
    cantidadOperaciones = cantidadOperaciones + 4;

    while (sizeTotal > 0) {
      LinkedList<Nodo> nodosActuales;
      boolean esIV1;

      int randomIVx = randomGenerator.nextInt(2);
      cantidadOperaciones = cantidadOperaciones + 1;

      cantidadOperaciones = cantidadOperaciones + 1;
      if (randomIVx == 0) {
        cantidadOperaciones = cantidadOperaciones + nodosIV1.size() + 1;
        if (nodosIV1.size() != 0) {
          nodosActuales = nodosIV1;
          esIV1 = true;
          cantidadOperaciones = cantidadOperaciones + 2;
        } else {
          nodosActuales = nodosIV2;
          esIV1 = false;
          cantidadOperaciones = cantidadOperaciones + 2;
        }
      } else {
        cantidadOperaciones = cantidadOperaciones + nodosIV2.size() + 1;
        if (nodosIV2.size() != 0) {
          nodosActuales = nodosIV2;
          esIV1 = false;
          cantidadOperaciones = cantidadOperaciones + 2;
        } else {
          nodosActuales = nodosIV1;
          esIV1 = true;
          cantidadOperaciones = cantidadOperaciones + 2;
        }
      }

      Nodo nodoRandom;

      if (esIV1) {
        nodoRandom = grafoTotal.dameNodoConMayorGradoDeV1RestringidoA(nodosActuales);
        cantidadOperaciones = cantidadOperaciones + grafoTotal.getCantidadDeOperaciones();
      } else {
        nodoRandom = grafoTotal.dameNodoConMayorGradoDeV2RestringidoA(nodosActuales);
        cantidadOperaciones = cantidadOperaciones + grafoTotal.getCantidadDeOperaciones();
      }
      cantidadOperaciones = cantidadOperaciones + 2;

      LinkedList<Eje> adyacentesHastaAhora =
          instancia.dameEjesConAdyacentes(grafo, nodoRandom, esIV1);
      cantidadOperaciones = cantidadOperaciones + grafo.getCantidadDeOperaciones();
      cantidadOperaciones = cantidadOperaciones + instancia.getCantidadDeOperaciones();

      int minCruces = Integer.MAX_VALUE;
      int posMinCruce = -1;
      cantidadOperaciones = cantidadOperaciones + 3;

      for (int j = 0; j < (esIV1 ? grafo.dameNodosV1().size() : grafo.dameNodosV2().size()); j++) {
        cantidadOperaciones = cantidadOperaciones + grafo.getCantidadDeOperaciones();
        int cruces = grafo.cantidadCruces(nodoRandom, adyacentesHastaAhora, j, esIV1);
        cantidadOperaciones = cantidadOperaciones + grafo.getCantidadDeOperaciones();
        cantidadOperaciones = cantidadOperaciones + 2;
        if (minCruces > cruces) {
          minCruces = cruces;
          posMinCruce = j;
          cantidadOperaciones = cantidadOperaciones + 2;
        }
      }

      if (esIV1) {
        grafo.agregarNodoYEjesEnV1(nodoRandom, adyacentesHastaAhora, posMinCruce);
        cantidadOperaciones = cantidadOperaciones + grafo.getCantidadDeOperaciones();
      } else {
        grafo.agregarNodoYEjesEnV2(nodoRandom, adyacentesHastaAhora, posMinCruce);
        cantidadOperaciones = cantidadOperaciones + grafo.getCantidadDeOperaciones();
      }

      nodosActuales.remove(nodoRandom);
      cantidadOperaciones = cantidadOperaciones + nodosActuales.size();

      sizeTotal--;
    }
    return grafo;
  }
 /** @param g */
 private void initEjesYNodos(Instancia i) {
   ejes = i.dameEjes();
   nodos = i.dameNodosV1();
 }