Algoritmo, Generación Distribución Aleatoria
Discreta de Suma 1
1. Introducción A raíz del modelamiento matemático, para simular los efectos de la inversiones sobre la Brecha de Empleo en una región determinada de Chile, surgió la necesidad de llenar la Matriz de Cifras, con distribuciones estadísticas de diversos tamaños con valores ficticios, mientras el equipo de investigación establece las estimaciones reales, desde las fuentes de datos oficiales. Por tanto, debíamos encontrar una función capaz de construir series de distribución con valores ficticios, que nos permitieran verificar la arquitectura y funcionalidades del sistema de simulación, a nivel de insumos, de proceso y resultados. Encontrar manualmente distribuciones de diferentes longitudes que sumarán 1, era una tarea aritmética tediosa que demandaba demasiado tiempo. Buscamos entonces, desarrollar una rutina computacional que determine distribuciones de variable discreta y aleatoria, sobre un conjunto finito de elementos, cuyos términos tomen sólo valores positivos (y menores que 1). Donde su suma es igual a uno. En términos estadísticos, es análogo a buscar distribuciones de densidad discreta en el intervalo Real ]0,1[ . Nuestro primer paso fue indagar en Internet la existencia de rutinas y algoritmos que nos facilitaran la solución. Ciertamente encontramos centenas de rutinas métodos (Montecarlo), en los más diversos lenguajes, pero ninguno cumplía con lo requerido. Entonces recurrimos a nuestra propia experiencia, utilizando Análisis Numérico y en cierta forma a la Teoría de Números para lograr el proceso preciso de lo que necesitábamos. Es decir, encontrar la serie, pero que el algoritmo nos permitiera forzar ciertos valores y también incluir ciertos patrones de comportamiento. Los resultados de la solución los ponemos a disposición, con una herramienta computacional (aplicación), para aquellos usuarios que requieran distribuciones aleatorias cuya suma es 1. El usuario sólo debe ingresar el tamaño de la serie de distribución (limitado a n<=300), ejecutar el algoritmo y obtendrá el conjunto con los valores de la distribución aleatoria cuya suma es 1. El resultado se visualiza en una tabla y admite ser exportada al Excel. (Ver Algoritmo en Acción) 2. Enunciado Dado un n Î N, encontrar un conjunto A = {l1, l2, l3,...., ln} de n valores seleccionados aleatoriamente, tal que S li = 1 , donde li Î R / 0< li < 1 , " i = 1,2,3,..n 3. Aproximación Inicial Inicialmente desarrollamos un algoritmo que generaba conjuntos de valores aleatorios mediante iteraciones. Es decir, el algoritmo iba acumulando o sumando los valores aleatorios en una variable S, y salía del ciclo cuando el valor absoluto de la diferencia de su suma con 1 se localizaba en un intervalo de error pequeño (|S -1|<0.00001) . Este algoritmo inicial, presentaba tiempos de respuesta largos cuando el tamaño n >25, por tanto no era la solución apropiada. Nótese que el numero de distribuciones que cumple con las condiciones del enunciado es infinito. 4. Breve descripción de la Solución
A fin de encontrar un algoritmo más simple y de respuestas más rápidas, recurrimos a trabajar con el residuo (diferencias finitas) y colocaciones en torno a la densidad uniforme pm = 1/n , asegurando la convergencia hacia 1, con un tiempo de respuesta muy rápido, utilizamos un error de redondeo e<=10-5 , y valores a 5 decimales (cifras significativas). Es decir, la solución pasa por aproximar la serie de n valores, pareando armónicamente. Esto es, una vez se obtiene un valor aleatorio b<pm (u otras variante de b dentro de un rango), sumarlo a pm asignándolo a una variable li del arreglo y al mismo tiempo restarlo en otra lj, donde i ¹ j. Para finalizar el ciclo, se hace la distinción entre n par o impar, dado que que el contador finaliza la iteración en el término(s) central(es) de la serie. En síntesis la idea es colocar los valores aleatorios ßi espaciados para cada par de términos de la serie de longitud n, llevándola a un error e muy pequeño, la aproximación de la suma se hace extremadamente exacta y rápida, obteniendo así la distribución buscada. 5. Solución Normalizando la serie A Otra forma rápida que utilizamos aleatoriamente al interior de la función FDoc(n), es generar previamente los n valores aleatorios y aplicar una cierta normalización. Es decir, dividir cada uno de los elementos por la suma total la serie. De esta forma aplanar la secuencia obtenida. En síntesis: Sea S=Sli ,entonces una vez generado el conjunto A (Ver párrafo 2), normalizamos el conjunto y obtenemos A*= {l1/S, l2/S, l3/S,...ln/S}, asegurando que la distribución es igual a uno.
La función que sintetiza el algoritmo, la denominamos FDoc(n), y definida desde los Naturales hacia un conjunto de valores reales del intervalo ]0,1[.
7. Continuación de la Solución... Para forzar valores el algoritmo recurre a la función Fdoc(n). En efecto, supongamos el usuario desea una distribución de longitud n, donde el valor de un término lo ingresa directamente. Sea b1 el valor forzado, donde 0< b1 <1 con j=1,2,3...n => Que debemos buscar un distribución aleatoria discreta cuya suma D= 1-b1 , entonces ejecutamos la función FDoc(n-1) y los n-1 valores de esta serie resultante lo multiplicamos por D, configurando nuevamente la serie Af = {b1, l2, l3,...., ln} Así sucesivamente para los m valores forzados bj, que el usuario desee forzar. Nótese que m<n y Sbj <1 , el algoritmo ejecutará la función FDoc(n-m) y los n-m términos de la serie resultante como ponderadores de la diferencia D = 1- Sbj . Finalmente obtiene un serie que tiene m valores fijados por el usuario y n-m generados aleatoriamente por el sistema. Ejemplo de Serie con Valores Forzados Af Con el siguiente ejemplo, ilustraremos el algoritmo interno que opera en la aplicación, para el tratamiento de series aleatorias discretas con valores forzados. Sea n=10 e ingresemos 2 valores forzados en la serie Af , de modo que debemos buscar 8 términos aleatorios que complementen la distribución. Tabla 1
Por tanto la diferencia D = 1- 0,61 = 0,39 . Es decir, debemos encontrar 8 términos aleatorios que sume D=0.39 Entonces aplicamos FDoc(8) y obtenemos los siguientes 8 valores aleatorios cuya suma es 1 Tabla 2
Luego ponderamos la diferencia D con los valores de la Tabla 2, obteniendo la siguiente serie Tabla 3
Finalmente uniendo las Tablas 1 y 3 obtenemos la serie resultante Af : Tabla4
En los próximo capítulos, aplicaremos el algoritmo en forma múltiple en matrices de dimensiones de n x m. 8. Ejemplo de la aplicación Algoritmo en Acción Sea n=30, entonces pm = 1/30 = 0,03333
Notas.-
|