RESUMEN DE ALGORITMOS PROBABILÍSTICOS En los algoritmos probabilísticos hay ciertas decisiones que se toman al azar bajo condiciones estadísticamente estables como una distribución uniforme. Normalmente no se dispone de un generador de números aleatorios y se debe usar un generador pseudoaleatorio, así que se usa un método determinista que proporcione una sucesión de números basados en un valor inicial (semilla). En adelante, supondremos la existencia de una función uniforme(a,b), de coste O(1), que devuelve un número real x tal que a x < b. Un algoritmo probabilístico, al ejecutarse sobre el mismo ejemplar puede Tardar tiempos distintos en terminar. Encontrar soluciones distintas del ejemplar. Encontrar soluciones falsas del problema. por lo que hay que tener cuidado con la forma de usarlos y de considerar como válido el resultado obtenido. ALGORITMOS NUMÉRICOS Resuelven cuestiones de cálculo mediante métodos de aproximación. Cuanto más tiempo estén ejecutando, más preciso es el resultado ( o no) Ejemplos: cálculo de áreas, aproximación de integrales, estimaciones Ejemplo: Aproximación de una integral Función Integral(E puntos: Natural, E a, b, cota: Real) dev Real dentro 0 Desde i 1 hasta puntos Hacer x uniforme(a,b) y uniforme(0,cota) Si y f(x) entonces dentro dentro + 1 fdesde a cota b a dentro Devolver puntos cota b Jesús Lázaro García Pág. 1 / 6
ALGORITMOS TIPO LAS VEGAS Universidad de Alcalá Se usan para problemas que necesitan una solución exacta (no aproximación). El tiempo que tarda el algoritmo en encontrar la solución no es relevante. Si el algoritmo encuentra una solución, entonces es la solución correcta. Ejemplos: ordenación aleatoria de elementos, el problema de las 8 reinas, el recorrido del caballo Ejemplo: El problema de las 8 reinas Se generan combinaciones de reinas al azar y se comprueba si forman solución. Usaremos las ideas vistas en Backtracking para los conjuntos Col, Diag45 y Diag135 y así poder reducir los casos. Función ReinasLasVegas(E N: Natural) dev Conjunto Col Diag45 Diag135 fila 1 Repetir libres Desde columna 1 hasta N Hacer Si (columna Col) Y (fila - columna Diag45) Y (fila + columna Diag135) entonces libres libres {columna} fdesde Si libres entonces eleccion Elemento_aleatorio(libres) Solucion[fila] eleccion Col Col {eleccion} Diag45 Diag45 {fila columna} Diag135 Diag135 {fila + columna} fila fila + 1 hasta (fila > N) O (libres = ) Si (libres = ) entonces Devolver SolucionVacia si no Devolver Solucion ffun Jesús Lázaro García Pág. 2 / 6
Para que este método encuentre solución o siga buscando, se le llamaría desde otra función como la siguiente: Función ConseguirReinasLasVegas(E N: Natural) dev Conjunto Repetir s ReinasLasVegas(N) hasta (s SolucionVacia) Devolver s ffun ALGORITMOS TIPO MONTECARLO Se usan para problemas que necesitan una respuesta, como problemas de decisión. No se está seguro que la respuesta obtenido sea la correcta: obtienen la respuesta correcta con una determinada probabilidad. Cuanto más tiempo se dedica a la ejecución, más probable es encontrar la respuesta correcta. Para una probabilidad 2 1 < p < 1, un algoritmo de MonteCarlo se dice p-correcto si propociona soluciones correctas con una probabilidad no inferior a p. Ejemplos: determinación de propiedades: elementos mayoritarios en un vector, números primos Ejemplo: Decir si un vector tiene un elemento mayoritario Se quiere comprobar si hay algún elemento en un vector que aparezca en más de la mitad de las componentes. Vamos a tomar un dato cualquiera al azar, contamos sus apariciones y si son más de 2 N entonces es el elemento mayoritario. Función MayoritarioMonteCarlo(E v: vector, E N: Natural) dev Lógico x v[aleatorio(1..n)] total 0 Desde i 1 hasta N Hacer Si (v[i] = x) entonces total total + 1 fdesde Devolver (total > N 2) ffun Jesús Lázaro García Pág. 3 / 6
Para los vectores no mayoritarios este método tiene probabilidad 1 de acertar (ya que N ningún elemento se repite más de veces). Para los vectores que sí tienen un elemento 2 mayoritario, el método acierta con probabilidad mayor que 2 1, exactamente con probabilidad # apariciones del elemento mayoritario p, luego falla con N mejorar haciendo p f 1 2. No está mal. Se podría Función MayoritarioMonteCarlo2(v, N) Si MayoritarioMonteCarlo(v, N) entonces Devolver Verdad si no Devolver MayoritarioMonteCarlo(v, N) Ahora, suponiendo que v sea mayoritario, solo fallará si el MayoritarioMC falla 1 1 1 dos veces, luego MayoritarioMC2 falla con probabilidad p, luego su utilidad 2 2 4 3 1 1 sería mayor que. Para generalizarlo a una cota de error > 0 4 2 4 Función MayoritarioMonteCarlo_(v, N, e) p 1 m Falso Repetir p p 2 m MayoritarioMonteCarlo(v, N) Hasta m O (p < e) Devolver m ALGORITMOS DE SHERWOOD Es una subclase de los algoritmos Las Vegas: dan siempre respuesta y siempre es correcta. Hacen uso del azar para intentar eliminar la diferencia entre los ejemplares buenos y malos de algún algoritmo determinista. La idea es que el caso peor dependerá del azar, y no de los datos del ejemplar. La idea general es preprocesar los datos del ejemplar antes de aplicar el algoritmo. Este coste añadido deberá ser menor que la aplicación directa del algoritmo sobre los casos malos. El coste del caso promedio no se mejora, solo se reduce la probabilidad de que aparezcan los casos no deseados. Jesús Lázaro García Pág. 4 / 6
Ejemplo: Quicksort modificado El método Quicksort tiene un coste medio perteneciente a O(n lg n), pero si los datos no son favorables el coste puede irse a O(n 2 ): el problema viene de la elección del pivote que puede resultar en que a medida que se realiza la recursión se produzcan casos poco equilibrados y aumente el coste total. El caso ideal se produce cuando Quicksort genera dos llamadas recursivas con 2 n datos cada una de ellas, y el peor caso cuando solo se obtiene una llamada recursiva con n 1 datos. Normalmente, para ordenar el vector V entre los puntos i y j se utiliza el valor V[i] como pivote ya que es un dato de acceso inmediato (sin coste de búsqueda), pero al ser un valor fijado puede darse situaciones como las siguientes. Supongamos que se quiere ordenar un vector de 101 elementos y resulta que el elemento V[1] deja exáctamente 50 valores a su izquierda (son menores o iguales que el pivote) y otros 50 a su derecha (todos mayores que el pivote). El vector V sería 1 2 3 99 100 101 V[1] V[2] V[3] V[99] V[100] V[101] y tras el primer paso tendríamos el vector W 1 50 51 52 101 W[i] V[1] V[1] W[i] > V[1] Inicialmente todo parece ir bien, pero supongamos que casualmente la sección izquierda queda bastante ordenada y que sus sucesivas ordenaciones resultan ser costosas con relación a sus pivotes W[1], W[2], etc. Esto hace que, independientemente de cómo resuelva el Quicksort de W entre los puntos 52 y 101 (es decir, independientemente del valor de los elementos que haya en esas 50 última posiciones de W) el coste total de la ordenación será bastante alto. En conclusión, hay un total de 50! casos del problema original (que son las formas posibles en las que pueden presentarse los 50 elementos de la derecha de W[51]) que van a ser costosos de resolver, por culpa de unos datos que ni siquiera están en esa zona. Para evitar estas posibilidades, se puede utilizar un pivote aleatorio (o con unas ciertas propiedades, ver luego) en cada ocasión. El caso peor sigue existiendo ya que puede que casualmente ese dato provoque separaciones poco equilibradas, pero ahora ese caso depende solo del azar y del tamaño del vector, así que cuanto más grande sea el vector más difícil será que ocurra esta posibilidad. No depende del orden concreto en que aparecen los datos en el vector. Jesús Lázaro García Pág. 5 / 6
Procedimiento QS_Sherwood(E/S V: vector de elemento; E inicio, final: posición) Var pivote: elemento i, j: posición Si (final - inicio) es pequeño entonces {si hay pocos datos se usa algún método básico, p.e. inserción} Ordenar(V, inicio, final) si no pivote V[ uniforme(inicio, final) ] Separar(V, inicio, final, pivote, i, j) { Separar recoloca los datos en V de manera que: V[x] pivote, si inicio x < i V[x] = pivote, si i x j V[x] > pivote, si j < x final } QS_Sherwood(V, inicio, i-1) QS_Sherwood(V, j+1, final) fproc Jesús Lázaro García Pág. 6 / 6