/**
  * Inicializa la matriz de adyacencia según los nodos adyacentes del grafo pasado como parámetro
  *
  * @param g
  */
 private void initAdy(Grafo g) {
   for (Eje e : g.dameEjes()) {
     int posV1 = pos(e.dameDesde().nodo, g.dameNodosV1());
     int posV2 = pos(e.dameHasta().nodo, g.dameNodosV2());
     ady[posV1][posV2] = true;
   }
 }
  public MatrizAdyacencia(Grafo g) {
    int dimV1 = g.dameNodosV1().size();
    int dimV2 = g.dameNodosV2().size();
    ady = new boolean[dimV1][dimV2];
    resetAdy();
    initAdy(g);

    initEjes(g);
  }
Esempio n. 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;
  }