// Anticonfiabilidad sobre Modelo Fuente-Terminal (s-t) // F-Monte Carlo sobre Modelo Estatico de Redes // Leslie Muray - FCEIA, Universidad Nacional de Rosario, Argentina // - Julio, 2023 - #include #include #include #include #include "mt.c" #define G genrand_int32() #define semilla(s) init_genrand(s) int s; // s: nodo fuente u origen. int t; // t: nodo terminal o destino. int numnodes; // numnodes: numero de nodos. int numlinks; // numlinks: numero de enlaces. int **adj; // Es la matriz de adyacencia de dimension [numnodes][numnodes]. Un "0" en la // posicion [i][j] significa que no hay enlace entre los nodos "i" y "j", // mientras que un "1" en la posicion [i][j] significa que hay enlace entre los // nodos "i" y "j" double **rlb; // Lo mismo que "adj" solo que en la posición de cada "1" en la matriz "adj", la // matriz "rlb" tiene el valor de confiabilidad del enlace correspondiente. int **smp; // "smp" lleva un registro actualizado de los enlaces sorteados. Es una mtatriz // de dimension [numnodes][numnodes]. Se inicia con ceros y cada vez que se // sortea un enlace entre los nodos (i,j), se ponene en "1" los pares (i,j) y // (j,i). int **adj_f; // Lo mismo que "adj" pero luego de una configuracion generada por Conf(k). void clean(); // Completa con ceros "smp" y "adj_f" y los deja listos para una nueva falla. int *visited; // Es un arreglo de dimension [numnodes]. Si visited[n]=1 significa que el nodo // "n" ha sido visitado por DFS mientras que visited[n]=0 indica que el nodo "n" // no ha sido visitado por DFS. int connected; // connected=1 indica que los nodos "s" y "t" estan conectados, connected=0 // indica que "s" y "t" no estan conectados. void Initialize(char* filename); // filename es el nombre del archivo que contiene la topologia de la red. // Initialize es la función que asigna memoria para todas las estructuras de // dimensión variable e inicializa todas la variables. int Phi(); // Es la funcion de Estructura. Devuelve 1 si los nodos "s" y "t" estan // conectados y 0 en caso contrario. void DFS(int node); // Hace un Depth First Search a partir de "nodo". Se inicia con nodo=s y al // final fija el valor de "connected" segun el recorrido haya alcanzado el nodo // "t", o no. void Conf(int k); // Genera una configuracion fijando, con distribucion uniforme, k enlacces // en 0 y los restantes en 1. int *link; // Arreglo de dimension [numlinks] para ser usado en Conf() int *pos; // Arreglo de dimension [numlinks] para ser usado en Conf() double mass(int m, int j); // Calcula la masa de probabilidad del conjunto de configuraciones con j enlaces // sanos, siendo m el total de enlaces. double pot(int j); // Calcula la q elevado a la potencia j, con el mismo mecanismo que trabaja la // función mass(), por lo que se evita el calculo directo y se hace la potencia // de forma iterativa, sin riesgos de overflows ni inestabilidades double beta(int k); // es el coeficiente beta, cuando hay k links en cero y numlink-k links en uno int size; // es el numero de pruebas de monte carlo (global) para evaluar la varianza int Num; // es el numero de pruebas de monte carlo por etapa, para las estimaciones de // cada uno de los beta double p; // la confiabilidad de cada enlace (es para hacer mas simple las cuentas, ya que // la red se carga de un archivo que permite diferentes valores por link) double q; // la anti-confiabilidad de cada enlace (es para hacer mas simple las cuentas, // ya que la red se carga de un archivo que permite diferentes valores por link) int seed; // Guarda el valor de la semilla del generador de numeros aleatorios. /******************************************************************************* * El ejecutable "e", resultante de la compilacion, se ejecuta como * ./e , donde: * nombre del archivo con los datos de la red * numero de prunas de Monte Carlo * semilla del generador de numeros aleatorios /******************************************************************************/ int main(int argc, char *argv[]){ int i,j,k,l; double X,V,S,Q,t; clock_t ti; if(argc<5){ printf("\n ¡Faltan argumentos! Ejecutar como:\n"); printf("\n ./ejecutable \n\n"); exit(1); } if(argc>5){ printf("\n ¡Se han insertado argumentos de mas! Ejecutar como:\n\n"); printf("\n ./ejecutable \n\n"); exit(1); } if((size=atoi(argv[2]))<1){ printf("\n ¡El numero de pruebas no puede ser < 1! Ejecutar como:\n"); printf("\n ./ejecutable \n\n"); exit(1); } if((Num=atoi(argv[3]))<1){ printf("\n ¡El numero de pruebas no puede ser < 1! Ejecutar como:\n"); printf("\n ./ejecutable \n\n"); exit(1); } if((seed=atoi(argv[4]))<0){ printf("\n ¡La semilla no puede ser negativa! Ejecutar como:\n"); printf("\n ./ejecutable \n\n"); exit(1); } Initialize(argv[1]); //-------------------- EL ALGORITMO DE MONTE CARLO CRUDO --------------------- ti = clock(); S=0; X=0.0; V=0.0; for(i=0;i=(j+1);i--){ ce = ce * (i*p*a/(i-j)); } return ce; } /******************************************************************************/ double pot(int j){ int i; long double ce = 1.0; for(i=0;i