/** * 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); }
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(); }