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.

