Introducción
En el siguiente ejercicio se generó un programa que obtiene la distribución de grado y la densidad de una red compleja asignada y que es representada por su matriz de adyacencias correspondiente a la Unidad 2: "Algoritmos Adaptativos".
Desarrollo
Para calcular la densidad de la red y la distribución de grado se utilizo un método llamado Calculos( ) dentro de la clase Network.java.
La parte más importante del codigo se encuentra obviamente aquí, ya que se evalúan los elementos de la matriz inicial (matriz[ ]) para sacar los valores de m y n y los nodos del grafo.
Lo primero que se calculan son el número de vértices, así como los nodos de la matriz para sacar lo valores de n y m y poder hacer el primer cálculo que es el de la densidad de la red.
for (int i=0; i < matriz.lenght;i++) { for(int j=0;j < matriz.lenght;j++) { suma += matriz[i][j]; } sumas[k] = suma; nodos += suma; k++; suma = 0; n = k; m = nodos / 2; // } densidad = (float)(2*m) / (float)( n*(n-1) );
Una vez que se tienen ya los valores de n y m de la matriz se hace un conteo en los vértices de las repeticiones de número de nodos que hay en cada uno. Esto es para calcular el número de vértices con grado k y posteriormente encontrar la Distribución de grado.
También mediante un for se guardan los diferentes nodos que se encuentran en la matriz g[ ] ( != 0 ) y poder tener los grados de la red analizada.
do { for (int r=0;r < n;r++) { if ( sumas[r] == aux ) { rep++; vertices[j] = sumas[r]; repet[j] = rep; g[aux] = aux; } } aux++; rep=0; j++; }while(j <= n); int aux1=0; for (int z=0;z < n;z++) { if (g[z] != 0 ) { grado[aux1] = g[z]; aux1++; } }
Por último se imprimen los resultados obtenidos en un método independiente, llamado mostrarDatos( ) ahí mismo se realiza el cálculo de la distribución de grado antes de imprimirla para no guardarla en otro vector para cada grado.
for(int r=0;r < 1;r++){System.out.println("\n");} System.out.println("\t\t ----------------------"); System.out.println("\t\t ~Densidad de la Red~ "); System.out.println("\t\t ----------------------"); System.out.println(" \tn = "+n); System.out.println(" \tm = "+m); System.out.println("\t\tDensidad = 2m / n(n-1)"); System.out.println("\t\tDensidad = 2 x "+m+" / "+n+"("+n+"-1)"); System.out.println("\t\tDensidad de la Red -> "+(2*m)+"/"+(n*(n-1))+" = "+densidad); for(int r=0;r < 1;r++){System.out.println("\n");} System.out.println("\t\t--------------------------------"); System.out.println("\t\t ~Distribucion de Grado~ "); System.out.println("\t\t--------------------------------"); System.out.println("\t\t|| K || Vertices || Pr(k) ||"); int aux2 = 0; for(int v=0; v < n;v++){ if (repet[v] != 0 ) { int r = repet[v]; float Pr = (float)r / n; System.out.println("\t\t "+grado[aux2]+"\t "+repet[v]+"\t "+Pr); aux2++; } }
Para ver el código completo:
https://gist.github.com/4092835
A continuación se presenta la gráfica de la Distribución de Grado:
EXTRA: Se realizó la agrupación de la red mediante los grados calculados, se clasificó por color cada vértice dependiendo el grado de los subgrafos:
Video
Conclusiones
Se pretendió desde un principio adaptar este programa a cualquier red compleja que se pretenda analizar, teniendo la matriz de adyacencias en un archivo .txt, se presentaron algunas fallas al insertas los valores enteros en la matriz del programa y se optó que para fines prácticos por esta ocasión se insertaran los datos manualmente. Se harán las modificaciones correspondientes para adaptarlo a cualquier tamaño de red.