250 Conceptos de Probabilidad, Variables Aleatorias y Procesos Estocásticos en Redes de Comunicaciones Marco Aurelio Alzate Monroy Universidad Distrital F.J.C. 179 d. Generación de Muestras de Variables Aleatorias Hemos insistido en que la aleatoriedad de un experimento se refiere a la imposibilidad de predecir su resultado antes de ejecutar el experimento. La característica más sobresaliente de un programa de computador es, precisamente, que los resultados son perfectamente predecibles, pues resultan de la realización de un algoritmo específico ¿Cómo puede una máquina así generar muestras de variables aleatorias? La verdad es que no lo hace, pues no puede lanzar dados o monedas. En vez de esto, se usa un algoritmo determinístico para generar secuencias de números completamente determinísticas que "se comportan" como si fueran aleatorias. Por ejemplo, considere los primeros 100000 dígitos de la expansión decimal de (3141592653 5897932384 6264338327 9502884197 1693993751 0582097494 5505822317 5665933446 4592307816 2535940812 1284756482 4062862089 8481117450 3378678316 9862803482 2841027019 5271201909 5342117067 3852110555 1456485669 9821480865 9644622948 2346034861 1328230664 9549303819 0454326648 7093844609 6442881097 2133936072 6024914127 3724587006 6063155881 7488152092 0962829254 etc.). La gráfica izquierda de la Figura 83 muestra cómo la distribución de cada dígito es perfectamente uniforme (cada dígito aparece cerca de 10000 veces). Si condicionamos en el dígito anterior, por ejemplo si calculamos la frecuencia relativa de los dígitos precedidos por un 0, como muestra la gráfica intermedia de la Figura 83, la distribución sigue siendo uniforme (cada dígito aparece cerca de 1000 veces después de un 0). Más aún, la función de autocovarianza normalizada es un impulso unitario, lo cual enfatiza la sugerencia de independencia, pues ninguna sub-secuencia de dígitos parece contener información sobre cuál será el siguiente dígito, como muestra la gráfica de la derecha de la Figura 83 . Otra característica interesante es que una secuencia de N dígitos sólo se repetirá cerca de 105-N veces. Por ejemplo, la secuencia '3' aparece 10026 veces, la secuencia '31' aparece 975 veces, la secuencia '314' aparece 95 veces, la secuencia '3141' aparece 9 veces y la secuencia '31415' aparece 2 veces, pero la secuencia '314159' sólo aparece una vez (de hecho aparecen todas las secuencias de 4 dígitos o menos, pero sólo aparece el 37% de las secuencias de 5 dígitos). Si pudiésemos generar 100000 dígitos decimales realmente aleatorios, todas estas características también se cumplirían. distribución de los dígitos de distribución de los dígitos de que siguen a un 0 0.15 0.15 Covarianza entre los dígitos de 1.2 0.1 0.05 0.8 0.1 Covarianza fracción de ocurrencias fracción de ocurrencias 1 0.6 0.4 0.05 0.2 0 0 0 1 2 3 4 5 dígito 6 7 8 9 0 0 1 2 3 4 5 dígito 6 7 8 9 -20 -10 0 separación 10 20 Figura 83. Características estadísticas de los primeros 100000 dígitos de la expansión decimal de Así como existen algoritmos para generar la secuencia de dígitos de , que es una secuencia determinística que satisface todos los criterios de aleatoriedad, existen diferentes algoritmos para generar secuencias de números enteros que satisfagan criterios de aleatoriedad como los mencionados anteriormente, aunque en realidad sean completamente determinísticos. Por esa razón se conocen como secuencias pseudo-aleatorias. La idea es que un generador de números enteros entre 0 y m-1, que satisfaga criterios como los anteriores, puede usarse para generar números 250 Conceptos de Probabilidad, Variables Aleatorias y Procesos Estocásticos en Redes de Comunicaciones Marco Aurelio Alzate Monroy Universidad Distrital F.J.C. 180 racionales en el intervalo [0,1) si dividimos cada entero de la secuencia entre m; estos racionales podrían interpretarse como probabilidades en el programa simulador. El área de la generación de números pseudo-aleatorios y la generación de muestras con otras distribuciones distintas a la uniforme ha sido ampliamente estudiada desde la teoría de números y ha arrojado muy interesantes algoritmos. Aquí mencionaremos unos pocos aspectos introductorios para que el estudiante tenga una idea muy general y pueda ser, al menos, un buen usuario de las funciones disponibles en las bibliotecas de los lenguajes de programación que utiliza. Uno de los algoritmos más usados en la generación de secuencias uniformemente distribuidas de números enteros es el generador congruencial lineal que, partiendo de una semilla Z0, genera los términos de la secuencia así: Z n Z n 1 mod m , n 1 Este es un algoritmo rápido que requiere poca memoria. Como los números obtenidos se evalúan módulo m, el conjunto de números que puede generar es Z{0,1,…,m-1}. Si la semilla Z0 se repite después de K iteraciones, Z0 = ZK, toda la secuencia se repetirá a partir de ahí y, por consiguiente, el período del generador será |Z| = K. La teoría de números describe condiciones en , , m y Z0 para que (1) la secuencia esté uniformemente distribuida en Z, (2) los números de la secuencia sean estadísticamente independientes, y (3) tengan un período tan grande como sea posible (ojalá m) –en efecto, si un programa de simulación necesita 10000 números aleatorios, no sirve un generador que repita la secuencia después de 5000 muestra–. Obsérvese que, si hace falta, cualquier secuencia puede ser reproducible inicializando Z0 adecuadamente; esto es de gran importancia para comparar resultados de diferentes modelos de simulación bajo idénticas condiciones. Por ejemplo, empezando con Z0 = 0, el generador lineal congruencial {Zn = (5Zn-1 + 1) mod 16} genera la secuencia {1, 6, 15, 12, 13, 2, 11, 8, 9, 14, 7, 4, 5, 10, 3, 0} que es perfectamente uniforme y tiene máximo período, aunque se pueden ver fácilmente ciertas correlaciones (en cuatro ocasiones ocurre el par (n, n+1), pero nunca ocurre el par (n, n+2), por ejemplo). Un generador útil debe tener un valor alto de m (para un período suficientemente grande) y un valor alto de (para proporcionar suficiente aleatoriedad). Algunos generadores lineales congruenciales usados en diferentes lenguajes de programación son los siguientes: Zn = (1103515245 Zn-1 + 12345) Zn = (22695477 Zn-1 + 1) Zn = (6364136223846793005 Zn-1 + 1) Zn = (16807 Zn-1 + 0) etc. mod 231 (la librería de GNU para el lenguaje C) mod 232 (C/C++ de Borland) mod 264 (la librería estándar C de newlib) mod 231-1 (original de matlab®) Sin embargo, existen otros algoritmos recientemente desarrollados con mejores características. Por ejemplo, matlab permite escoger entre el generador multiplicativo congruencial anterior y otros métodos como el siguiente generador multiplicativo retardado de Fibonacci, 250 Conceptos de Probabilidad, Variables Aleatorias y Procesos Estocásticos en Redes de Comunicaciones Marco Aurelio Alzate Monroy Universidad Distrital F.J.C. 181 Zn = (Zn-31 * Zn-63) mod 264 que tiene un período de 2124, o el más aceptado en la actualidad, el "Mersene twister", que tiene un increíble período de 219937-1 y mucho mejores características estadísticas, aunque requiere más recursos de cómputo y de memoria para su evaluación. Para calcular Zn se usa una forma generalizada de generadores por registros de desplazamiento y generadores retardados de Fibonancci. Matlab usa, por defecto, el generador Mersene twister y le da al usuario la opción de cambiarlo por otros de su preferencia. Con cualquiera de estos generadores, la secuencia rn = Zn/m corresponde a una serie de números uniformemente distribuidos en el intervalo [0, 1), independientes entre ellos, de manera que podemos usar la secuencia como una generadora de probabilidades. En la mayoría de lenguajes de programación, existe la función rand() para generar el siguiente número de la secuencia (como en matlab). Así, por ejemplo, para simular la lanzada de una moneda, asignamos los valores 0 y 1 a los elementos del espacio muestral cara y sello, respectivamente, y escogemos cada uno de los posibles valores con probabilidad 1/2. Esto es, evaluamos r = rand() y, si r cae en el intervalo [0,0.5), escogemos 0 y, si r cae en el intervalo [0.5,1), escogemos 1. >> lado = {'cara','sello'}; >> moneda = (rand()>=0.5); disp(lado{moneda+1}) Cada vez que repitamos la última línea obtendremos el resultado 'cara' o 'sello' con idéntica probabilidad, independientemente de anteriores resultados. Este algoritmo equivale a invertir la función de distribución acumulativa de Bernoulli, como muestra la Figura 84. FX(x) 1.0 r2 (sello) x FX1 rnd () 0.5 r1 (cara) 0 x 0 (cara) 1 (sello) Figura 84. Obtención de muestras de variables de Bernoulli mediante inversión de la CDF Si tenemos un enlace que permanece ocupado el 80% del tiempo y queremos generar una muestra de cuántos enlaces están ocupados en un instante dado usamos la siguiente línea: >> EnlacesOcupados = (rand()>=0.2) que retorna 1 con probabilidad 0.8 y 0 con probabilidad 0.2. Si transmitimos un bit sobre un canal con BER=10-5 y queremos generar una muestra de cuántos bits se dañaron durante la transmisión, usamos la siguiente línea 250 Conceptos de Probabilidad, Variables Aleatorias y Procesos Estocásticos en Redes de Comunicaciones Marco Aurelio Alzate Monroy Universidad Distrital F.J.C. 182 >> BitsErrados = (rand()<1e-5) que retorna 1 con probabilidad 10-5 y 0 con probabilidad 1-10-5. En cada caso, hemos invertido la CDF de la variable aleatoria de Bernoulli correspondiente. Si deseamos generar el estado de ocupación de 10 enlaces o el estado de error de 100000 bits usaríamos líneas como las siguientes >> EnlacesOcupados = (rand(10,1)>=0.2); >> BitsErrados = (rand(100000,1)<1e-5); Igual podemos hacer, por ejemplo, para lanzar cien dados: >> r = rand(100,1); dado = (r>=0)+(r>=1/6)+(r>=1/3)+(r>=1/2)+(r>=2/3)+(r>=5/6); Con la anterior instrucción, el vector dado será un arreglo de 100 números uniformemente distribuidos en {1,2,3,4,5,6} e independientes entre ellos pues, efectivamente, hemos hecho la inversión de la CDF, dado = F-1(rnd()), como muestra la Figura 85. FX(x) 1 5/6 Primero se genera una probabilidad, r0 = rnd () r0 2/3 1/2 1/3 1/6 x 1 2 3 4 5 6 x0 FX1 r0 Después se invierte la CDF Figura 85. Simulación de lanzar un dado mediante inversión de la CDF Supongamos que queremos generar una muestra de una variable aleatoria geométricamente distribuida en {0,1,2,…} con parámetro p, esto es, P[X=k] = pk(1-p). La CDF de esta variable es n FX (n) p j (1 p) 1 p n 1 de manera que, si hacemos rand() = FX(n), obtenemos n = log(1j 0 rand())/log(p) – 1. Como muestra la Figura 86, debemos seleccionar el mínimo entero no menor a n y, como 1-rand() es otro número probabilidad, podemos usar rand() en vez de 1-rand(). Por ejemplo, las siguientes líneas en matlab generan 10000 muestras de una variable aleatoria geométrica y comparan su histograma con la pmf P[X=k] = pk(1-p), como muestra la gráfica izquierda de la Figura 87. >> r = rand(10000,1); 250 Conceptos de Probabilidad, Variables Aleatorias y Procesos Estocásticos en Redes de Comunicaciones Marco Aurelio Alzate Monroy Universidad Distrital F.J.C. 183 >> n = ceil(log(r)/log(0.8) - 1); mx = max(n); >> h = hist(n,0:mx); h = h/sum(h); >> stem(0:mx,h,'bo'); hold on; stem(0:mx,0.2*0.8.^(0:mx),'rx') FX(x) 1 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1 0 x 0 2 4 6 8 10 12 14 16 18 20 Figura 86. Generación de muestras de una variable aleatoria geométrica Como último ejemplo, consideremos una variable aleatoria T exponencialmente distribuida con promedio 1/, FT(t) = 1-e-t. Usando como probabilidad 1-rand() obtenemos t = -log(rand())/. La siguiente secuencia de instrucciones de matalab® genera los tiempos de servicio de 10000 paquetes distribuidos exponencialmente con promedio 2 ms y estima la pdf mediante el histograma, como muestra la gráfica derecha de la Figura 87. >> >> >> >> >> >> t = -log(rand(10000,1))/500; [h,s] = hist(t,20); d = s(2)-s(1); f = h/sum(h)/d; g = 500*exp(-500*s); plot(s,f,'b-',s,g,'r--') pmf de la variable geométrica 0.2 pdf de la variable exponencial 400 estimada teórica estimada teórica 350 0.15 300 250 0.1 200 150 0.05 100 50 0 0 10 20 30 40 50 60 0 0 0.005 0.01 0.015 0.02 Figura 87. Distribuciones teóricas y empíricas, estimadas de 10000 muestras pseudo-aleatorias Desafortunadamente no todas las funciones acumulativas de distribución son invertibles. Por ejemplo, la Gaussiana ni siquiera tiene una expresión en forma cerrada. Entonces se usan otras propiedades estadísticas como, por ejemplo, el hecho de que un punto al azar en un cuadrado 250 Conceptos de Probabilidad, Variables Aleatorias y Procesos Estocásticos en Redes de Comunicaciones Marco Aurelio Alzate Monroy Universidad Distrital F.J.C. 184 unitario, (u1, u2), puede transformarse en dos muestras independientes de variables aleatorias gaussianas con media cero y varianza 1 mediante la transformación x1 cos(2 u2 ) 2 log(u ) 1 x sin(2 u ) 2 2 que en matlab se consigue así (por ejemplo) >> u = rand(2,1); >> x1 = sqrt(-2*log(u(1)))*cos(2*pi*u(2)); >> x2 = sqrt(-2*log(u(1)))*sin(2*pi*u(2)); En efecto, despejando para u1 y u2 obtenemos u1 e x12 x22 /2 u2 1 x tan 1 2 x1 2 cuyo jacobiano es la es la función de densidad de probabilidad conjunta de dos variables normales independientes, u1 u1 x1 x2 1 (x12 x22 )/2 1 x12 /2 1 x 22 /2 e e e u2 u2 2 2 2 x1 x2 Usando este método Box-Muller, como se le conoce, podemos verificar la función de densidad de probabilidad de las muestras obtenidas (ver Figura 88): >> >> >> >> >> >> >> >> >> u = rand(10000,2); x1 = sqrt(-2*log(u(:,1))).*cos(2*pi*u(:,2)); x2 = sqrt(-2*log(u(:,1))).*sin(2*pi*u(:,2)); [h,s] = hist([x1; x2],20); d = s(2)-s(1); f = h/sum(h)/d; g = exp(-s.*s/2)/sqrt(2*pi); plot(s,f,'b-',s,g,'r--') legend('estimada','teórica') 0.5 pdf de la variable gaussiana N(0,1) estimada teórica 0.4 0.3 0.2 0.1 0 -4 -3 -2 -1 0 1 2 3 4 5 Figura 88. Estimación de la pdf N(0,1) a partir de muestras generadas mediante Box-Muller 250 Conceptos de Probabilidad, Variables Aleatorias y Procesos Estocásticos en Redes de Comunicaciones Marco Aurelio Alzate Monroy Universidad Distrital F.J.C. 185 Como la CDF en un punto es el área debajo de la pdf desde - hasta ese punto, otro algoritmo típico consiste en generar puntos uniformemente distribuidos en un rectángulo que contenga toda el área debajo de la pdf. Si el punto cae debajo de la curva, su coordenada x es una muestra de la variable aleatoria. Si no, se rechaza el punto seleccionado y se repite el procedimiento hasta obtener una muestra válida. Este 'método de rechazo', como se le conoce, tiene algunas variantes interesantes que buscan mayor eficiencia o mayor exactitud, como el método ziggurat. En general, los métodos de generación de números pseudo-aleatorios y de muestras de variables aleatorias con distintas distribuciones es un campo de la teoría de números que avanza aceleradamente y que tiene importantes aplicaciones no sólo en simulación sino en criptografía, por ejemplo (aunque en esa área existen requerimientos adicionales de seguridad). En este aparte sólo queríamos mostrar una breve introducción a algunos de los métodos utilizados, en especial si el estudiante requiere generar muestras de sus propias distribuciones empíricas o teóricas. Matlab, en particular, no sólo permite seleccionar el algoritmo con que se obtienen muestras uniformes en [0,1) sino que también permite escoger el algoritmo con que se obtienen muestras de la variable normal a partir de las uniformes (ver en la documentación del matlab los detalles de la instrucción RandStream()). Excepto por razones de compatibilidad con programas existentes, o por la necesidad de usar múltiples flujos, es adecuado usar los algoritmos por defecto que matlab propone (Mersenne twister para números uniformes en [0,1) y Ziggurat para números gaussianos con media cero y norma 1) pues, hasta ahora, son los que mejores características presentan. De otro lado, matlab incluye rutinas para generar muestras de una gran cantidad de distribuciones mediante la instrucción random() –Beta, Binomial, 2, F, Exponencial, Gamma, Gaussiana, Geométrica, hipergeométrica, lognormal, Pareto, Poisson, Rayleigh, t de student, uniforme continua o discreta, Valor Extremo, Weibull, etc.–. Por ejemplo, si en el programa simulador del Listado 7 cambiamos los tiempos entre llegadas constantes por tiempos exponencialmente distribuidos con promedio 1/ y cambiamos los tiempos de servicio constantes por tiempos exponencialmente distribuidos con promedio 1/, habremos pasado de simular la cola D/D/n/k a simular la cola M/M/n/k. Aunque el cambio es mínimo en cuanto a la modificación del listado del programa simulador, el cambio en el análisis de los resultados de simulación es monumental, como veremos en el siguiente subtítulo. e. Simulación de colas aleatorias: Análisis de resultados Como mencionamos, para convertir el programa simulador de la cola D/D/n/k a un programa que simule la cola M/M/n/k basta con cambiar la distribución de los tiempos entre llegadas y tiempos de servicio, de determinística a exponencial. Las tres líneas relevantes del programa del Listado 7 son las siguientes 31 37 59 proximaLlegada = reloj + 1/lambda; proximaSalida(ss) = reloj + 1/mu; proximaSalida(k) = reloj + 1/mu; % Programa la próxima llegada % Programa la próxima salida de este servidor % Programa la próxima salida de este servidor 250 Conceptos de Probabilidad, Variables Aleatorias y Procesos Estocásticos en Redes de Comunicaciones Marco Aurelio Alzate Monroy Universidad Distrital F.J.C. 186 que ahora deberán expresar lo siguiente: 31 37 59 proximaLlegada = reloj + random('exp',1/lambda); proximaSalida(ss) = reloj + random('exp',1/mu); proximaSalida(k) = reloj + random('exp',1/mu); % Programa la próxima llegada % Programa la próxima salida de este servidor % Programa la próxima salida de este servidor Igualmente valdría la pena cambiar ahora la primera línea para indicar que es la cola M/M y no la cola D/D: 1 function [EN, EQ, ET, EW, PB, G] = ColaMMnk(lambda,mu,servidores,cupo,tiempoSimulacion) Mientras que al simular la cola D/D/n/k basta con obtener una traza y tomar las estadísticas temporales de esa traza, pues todas las simulaciones arrojarán la misma traza ya que no hay ningún componente aleatorio en ellas, cada ejecución del programa simulador de la cola M/M/n/k arrojará una traza diferente debido a la inclusión de muestras de variables aleatorias. Esto genera una incertidumbre en los resultados de la simulación de la cola M/M/n/k que no existían con la simulación de la cola D/D/n/k. Por ejemplo, si ejecutamos tres veces el programa simulador de la cola D/D/1 con =0.8 y =1, obtendremos tres veces la traza observada en la tercera gráfica de la Figura 78, pero si ejecutamos tres veces el programa simulador de la cola M/M/1 con los mismos parámetros, obtendremos tres trazas diferentes, como muestra la Figura 89. Número de paquetes en un sistema M/M/1 con =0.8 y =1 10 simulación 1 simulación 2 simulación 3 Número de paquetes 8 6 4 2 0 0 10 20 30 40 50 tiempo en segundos 60 70 80 90 100 Figura 89. Tres simulaciones distintas de un mismo sistema M/M/1 Este ejemplo ilustra muy bien el concepto de proceso estocástico: Cada ejecución del programa simulador es un experimento aleatorio que genera como resultado una traza del número de paquetes en función del tiempo. Con n simulaciones tenemos n trazas, {Ni(t), t0}, i=1,2,…n. Si hacemos n simulaciones, podemos estimar el número promedio de paquetes en el sistema en un instante t0 cualquiera mediante el estimador 1 n Eˆ [ N (t0 )] N i (t0 ) n i 1 Si suponemos que el sistema alcanza la estacionariedad, podríamos considerar que la función de valor medio llega a dejar de depender del tiempo: n 1 Eˆ [ N ] lim N i (t0 ) t0 n i 1 250 Co onceptos de Probabilidad, P Variables V Aleeatorias y Proceesos Estocástticos en Redess de Comuniccaciones Marco Aureliio Alzate Moonroy Universidadd Distrital F.JJ.C. 187 mar más y más m muestras se va reduciiendo la incertidumbre dee la Y, si la varianza ess finita, al tom estimacción: 1 n N i (t0 ) n t0 n i 1 E[ N ] lim lim Por otrro lado, con una sola trazza, las propieedades de erggodicidad y eestacionariedaad nos permitten saber que q basta con simular duraante un tiempo o infinito paraa calcular 1 T E N lim N (t )dt T T 0 tal com mo lo hacíamo os con la colaa D/D/n/k. Claaro, con la coola D/D/n/k noo queremos eestimar la meddia de un proceso esto ocástico estaccionario y errgódico, com mo con la coola M/M/n/k,, sino que sóólo mos minimizaar el efecto deel período tran nsiente. querem os veinte simu ulaciones paraa generar veinnte trazas com mo las de la F Figura 89 {Ni(t), Así pues, realicemo t0}, i= =1,2,…20, y calculemos el promedio deel número de paquetes en cada instante: for i= =1:20 % Co orre 20 sim mulaciones [t traza,EN,EQ, ,ET,EW,G,PB B] = ColaMMn nk(0.77,1,1 1,inf,1500); ; % genera una traza dt t = traza(2: :end,1) - traza(1:endt -1,1); % ti iempo entre eventos ar reas = traza a(1:end-1,2 2).*dt; % Ár reas de los rectángulo os EN N = cumsum(a areas)./tra aza(2:end,1) ); % Pr romedio acu umulado hast ta pl lot(traza(2: :end,1),EN); % ca ada instant te (Figura 80 0) ho old on end Si tomamos muestraas de EN cad da segundo, po odemos prom mediar los veinnte promedioos temporales en instanttes enteros para consideraar el promed dio temporal (en la variaable tiempo) y el promeddio probab bilístico (en la variable deel espacio mu uestral). El reesultado se aaprecia en la Figura 90 paara =0.75 5 y =1. Figuraa 90. Trazas obtenidas o de 20 2 simulacionnes y función de valor meddio Como podemos nottar, cada trazaa (y el promeedio estadísticco de las trazzas) sufre un transiente anntes bilidad, aunqu ue el promedio estadísticoo se estabilizaa más rápido,, tendiendo m más de alcaanzar la estab claram mente a lo que parece ser ell verdadero vaalor esperadoo del número de paquetes een el sistema. El tiempo o de simulació ón debe ser taan pequeño como c se puedda por razoness de eficienciia, pero tambiién 250 Conceptos de Probabilidad, Variables Aleatorias y Procesos Estocásticos en Redes de Comunicaciones Marco Aurelio Alzate Monroy Universidad Distrital F.J.C. 188 debe ser tan grande como se pueda para asegurar que el sistema alcanza el estado estable en el que queremos medir los promedios. De otro lado, a menos que empecemos a tomar estadísticas una vez haya transcurrido el período transiente, debemos alargar el tiempo de simulación para que el efecto de este período transiente sobre las estadísticas temporales se haga despreciable. En general, el tiempo de simulación se escoge de acuerdo con algunas pruebas piloto como las de la Figura 90. El otro aspecto importante en la planeación de experimentos consiste en la selección del número de repeticiones que debemos hacer para asegurar cierto nivel de confianza en los resultados de la simulación. Una alternativa es hacer una única simulación durante un tiempo increíblemente largo, pues la ergodicidad nos asegura que así nos acercaremos indefectiblemente al verdadero valor medio. El problema es que puede que el tiempo que se requiera sea excesivamente largo y, aun así, no tendríamos manera de medir si ya estamos suficientemente cerca del verdadero promedio o si debemos alargar el tiempo de simulación para acercarnos con un nivel de confianza suficiente. Supongamos, entonces, que escogimos un tiempo total de simulación T y repetimos la simulación n veces para obtener n trazas {Ni(t),0 t T}, i=1,2,…n. Con cada simulación calculamos el promedio temporal Ni 1 T Ni (t )dt , i 1, 2,..., n y finalmente calculamos el promedio estadístico 0 de los n resultados, Nˆ T n 1 Ni . Este valor será nuestro estimador del número promedio de n i 1 paquetes en el sistema, pero ¿qué tan cerca o qué tan lejos podemos estar del verdadero valor esperado? Consideremos cada Ni (el promedio temporal de cada simulación) como una variable aleatoria cuyo valor esperado es el verdadero promedio que queremos encontrar, m = E[N], y que tiene una varianza finita, 2 (esta varianza será más pequeña entre mayor sea el tiempo de simulación, T, pero hemos supuesto T fijo para todas las simulaciones). Sabemos entonces que el promedio N̂ tiende a tener una distribución normal con media m y varianza 2/n, y la variable normalizada Z = ( N̂ m)/(/n) tiende a tener una distribución normal con media cero y varianza 1, N(0,1), a medida que aumenta el número de simulaciones, n. El 100% percentil superior de Z es el valor z para el cual P[Z>z] = , de manera que P[|Z|z/2]=1-, como muestra la Figura 91. fZ ( z) 1 z 2 /2 e 2 fZ ( z) 1 z 2 /2 e 2 área P z /2 Z z / 2 1 área P Z z z z área P Z z / 2 / 2 área P Z z /2 / 2 z / 2 z /2 z Figura 91. Conceptos de percentil (a) e intervalo de confianza (b) En matlab® resulta muy fácil hallar los percentiles de la distribución normal. Por ejemplo, el valor de z que hace P[Z>z]=0.05 (el 5% percentil) se calcula así: 250 Conceptos de Probabilidad, Variables Aleatorias y Procesos Estocásticos en Redes de Comunicaciones Marco Aurelio Alzate Monroy Universidad Distrital F.J.C. 189 >> z_05 = norminv(1 - 0.05,0,1) pues la instrucción norminv invierte la CDF de la distribución normal, de manera que norminv(p,,) retorna el valor de x que hace FX(x) = P[Xx] = p si X~N(,). Tomemos la última expresión y remplacemos Z por ( N̂ - m)/(/n) para multiplicar por /n en los tres términos dentro del argumento de la probabilidad: z Nˆ m z z /2 P /2 Nˆ m / 2 1 P z / 2 Z z /2 P z / 2 / n n n Restando N̂ en los tres términos y multiplicando por -1, obtenemos la siguiente expresión. Ella determina un intervalo alrededor de N̂ donde se encuentra la verdadera media, m, con una confianza de 1-: z z P Nˆ /2 m Nˆ /2 1 n n El intervalo que delimita m, N̂ z/2/n, se denomina "intervalo de confianza" y la cantidad 1- es el "nivel de confianza", pues 1- es la probabilidad con que podemos asegurar que m se encuentra en dicho intervalo. Por ejemplo, si queremos un nivel de confianza del 95% (=0.05), usamos el percentil 2.5%, que es z0.025 = 1.96 (norminv(1-0.025,0,1)=1.96) y, con él, calculamos el intervalo del 95% de confianza en términos de N̂ , 2 y n. Desafortunadamente la anterior expresión se basa en el conocimiento de la varianza, 2, cuando apenas estamos tratando de estimar la media, m. Una alternativa es estimar 2 a partir de las muestras de las simulaciones mediante la expresión S2 1 n ( N i Nˆ ) 2 n 1 i 1 pero, en este caso, la variable normalizada T = ( N̂ - m)/(S/n) no es exactamente normal, sino que tiene una distribución t de student con n-1 grados de libertad. La Figura 92 muestra la distribución t de student con 1, 2, 5 e grados de libertad, donde el último caso corresponde exactamente a la variable N(0,1). Como era de esperarse, la distribución t es más dispersa que la distribución normal debido a que el uso del estimador S2 en vez de la varianza 2 introduce mayor incertidumbre. fT (t ; df ) 0.4 1 grado de libertad 2 grados de libertad 5 grados de libertad 9 grados de libertad 0.35 0.3 grados de libertad (N(0,1)) 0.25 0.2 0.15 0.1 0.05 0 -4 -3 -2 -1 0 1 2 3 4 t Figura 92. Comparación entre la distribución t de student y la distribución gaussiana 250 Conceptos de Probabilidad, Variables Aleatorias y Procesos Estocásticos en Redes de Comunicaciones Marco Aurelio Alzate Monroy Universidad Distrital F.J.C. 190 Procediendo de la misma manera que cuando se conocía la varianza, t S t S P Nˆ / 2;n 1 m Nˆ /2;n 1 1 n n donde t;df es el 100% percentil de la distribución t de student con df grados de libertad, esto es, P[T>t;df ]= si T es una variable aleatoria con distribución t de student con df grados de libertad. El percentil t;df es igualmente fácil de calcular con matlab: >> t_alfa_df = tinv(1-alfa,df); El programa del Listado 8 realiza tantas simulaciones como sean necesarias para satisfacer unos requerimientos de confianza específicos. Por ejemplo, supongamos que queremos obtener un intervalo del 95% de confianza para el número promedio de paquetes en una cola M/M/1 con =0.75 y =1, que sea 5% del promedio estimado. La manera de invocar el programa sería así: >> [m,v,delta]=SimulacionesMMnk(0.75,1,1,inf,8000,0.05,0.95) Un posible resultado sería el siguiente, en el que se requirieron 18 simulaciones: Con Con Con Con Con Con Con Con Con Con Con Con Con Con Con Con Con 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 simulaciones, simulaciones, simulaciones, simulaciones, simulaciones, simulaciones, simulaciones, simulaciones, simulaciones, simulaciones, simulaciones, simulaciones, simulaciones, simulaciones, simulaciones, simulaciones, simulaciones, el el el el el el el el el el el el el el el el el número número número número número número número número número número número número número número número número número promedio promedio promedio promedio promedio promedio promedio promedio promedio promedio promedio promedio promedio promedio promedio promedio promedio de de de de de de de de de de de de de de de de de paquetes paquetes paquetes paquetes paquetes paquetes paquetes paquetes paquetes paquetes paquetes paquetes paquetes paquetes paquetes paquetes paquetes es es es es es es es es es es es es es es es es es 2.8562 2.9041 2.9323 2.9419 2.9330 2.8847 2.8981 2.9213 2.9673 2.9848 2.9848 3.0277 3.0239 3.0022 3.0099 3.0000 2.9862 más más más más más más más más más más más más más más más más más o o o o o o o o o o o o o o o o o menos menos menos menos menos menos menos menos menos menos menos menos menos menos menos menos menos 243.646% 47.3829% 24.7332% 16.6842% 12.6756% 11.1464% 9.3492% 8.1855% 7.8915% 7.1108% 6.4123% 6.5325% 6.0101% 5.8067% 5.4117% 5.1205% 4.9235% function [m,v,delta] = SimulacionesMMnk(lambda, mu, servidores, cupo, ... tiempoSimulacion, intervalo, confianza) % [m,v,delta]=N_Simulaciones_MMnk(0.75,1,1,inf,8000,0.05,0.95) % Ejecuta no menos de 5 ni más de 50 simulaciones de una cola M/M/servidores/cupo % con tasa de llegadas lambda y tasa de servicio mu. Cada simulación se ejecuta % durante tiempoSimulación segundos. El número de simulaciones se detiene si los % intervalos del 95% de confianza se alcanzan a estimar dentro de más o menos 5% % del promedio estimado. Devuelve la media (m), la varianza (v) y el intervalo de % E[N], E[Q], E[T], E[W], Gamma y Pb % suma1 = [0 0 0 0 0 0]; % Acumula las muestras de las 6 variables suma2 = [0 0 0 0 0 0]; % Acumula los cuadrados de las muestras numeroSimulaciones = 0; % Cuenta las simulaciones que debe hacer porcentaje = 100; % Nivel de confianza while ((porcentaje/100 > intervalo) * (numeroSimulaciones<50) + ... 250 Conceptos de Probabilidad, Variables Aleatorias y Procesos Estocásticos en Redes de Comunicaciones Marco Aurelio Alzate Monroy Universidad Distrital F.J.C. 191 (numeroSimulaciones<2)) % no menos de dos ni más de 50 simulaciones, esperando satisfacer el % intervalo de confianza solicitado numeroSimulaciones = numeroSimulaciones + 1; % Una simulación más [traza,EN,EQ,ET,EW,G,PB] = ColaMMnk(lambda, mu, servidores, cupo, ... tiempoSimulacion); suma1 = suma1 + [EN EQ ET EW G PB]; % Acumula las medidas suma2 = suma2 + [EN^2 EQ^2 ET^2 EW^2 G^2 PB^2]; % y sus cuadrados if numeroSimulaciones > 1 m = suma1/numeroSimulaciones; % Estima los promedios y las varianzas v = (suma2 - suma1.*suma1/numeroSimulaciones)/(numeroSimulaciones-1); percentil = tinv(0.5+confianza/2,numeroSimulaciones-1); delta = percentil*sqrt(v/numeroSimulaciones); porcentaje = 100*delta(1)/m(1); disp(['Con ' num2str(numeroSimulaciones) ' simulaciones, el ' ... 'número promedio de paquetes es ' num2str(m(1)) ' más o ' ... 'menos ' num2str(porcentaje) '%']); end end Listado 8. Este programa hace tantas simulaciones como sean necesarias para obtener un intervalo de confianza y un nivel de confianza específicos . Es interesante notar que un estudio de simulación que involucre aleatoriedad jamás podrá arrojar resultados como "el número promedio de paquetes es 3", sino que sus resultados deben tener la siguiente forma: "Según el estudio de simulación, con un nivel de confianza del 95% el número promedio de paquetes se encuentra entre 2.9 y 3.1".