// Anticonfiabilidad sobre Modelo Fuente-Terminal (s-t) // Monte Carlo Crudo sobre Modelo Estatico de Redes // Leslie Muray - FCEIA, Universidad Nacional de Rosario, Argentina // - Junio, 2024 - #include #include #include #include #include "mt.c" #define U genrand_real1() #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 falla generada por la funcion Fail(). 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. int X(int a, int b); // Devuelve 1 si el enlace "e", entre los nodos "a" y "b", esta sano, con la // probabilidad rlb del enlace "e". Devuelve 0 si el enlace "e" esta fallado, // con probabilidad 1-rlb. void Fail(); // Genera una instancia de falla fijando valores para smp y adj_f, acorde a las // probabilidades rlb. 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,S,size; double X,V,Q,t; clock_t ti; if(argc<4){ printf("\n ¡Faltan argumentos! Ejecutar como:\n"); printf("\n ./ejecutable \n\n"); exit(1); } if(argc>4){ 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((seed=atoi(argv[3]))<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(k=0;k