Thursday, November 15, 2012

Reporte 2 [CLASE]

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.