¿Qué diferencias y relaciones hay entre los algoritmos aleatorios y los algoritmos no deterministas?
De Wikipedia
UNA algoritmo aleatorio es un algoritmo que emplea un grado de aleatoriedad como parte de su lógica. El algoritmo generalmente utiliza bits aleatorios uniformes como entrada auxiliar para guiar su comportamiento, con la esperanza de lograr un buen rendimiento en el "caso promedio" sobre todas las opciones posibles de bits aleatorios. Formalmente, el rendimiento del algoritmo será una variable aleatoria determinada por los bits aleatorios; por lo tanto, el tiempo de ejecución o la salida (o ambas) son variables aleatorias.
Un algoritmo no determinista es un algoritmo que puede exhibir diferentes comportamientos en diferentes ejecuciones, a diferencia de un algoritmo determinista. Hay varias formas en que un algoritmo puede comportarse de manera diferente de una ejecución a otra. Un algoritmo concurrente puede funcionar de manera diferente en diferentes carreras debido a una condición de carrera. El comportamiento de un algoritmo probabilístico depende de un generador de números aleatorios. Un algoritmo que resuelve un problema en tiempo polinomial no determinista puede ejecutarse en tiempo polinomial o exponencial dependiendo de las elecciones que realice durante la ejecución.
¿Son los algoritmos aleatorios y los algoritmos probabilísticos el mismo concepto?
En caso afirmativo, ¿los algoritmos aleatorios son solo una especie de algoritmos no deterministas?
Respuestas:
Los algoritmos no deterministas son muy diferentes de los algoritmos probabilísticos.
Los algoritmos probabilísticos son los que utilizan el lanzamiento de monedas y funcionan "la mayor parte del tiempo". Como ejemplo, las variantes aleatorias de clasificación rápida funcionan en el tiempo en expectativa (y con alta probabilidad), pero si tiene mala suerte, podría tomar tanto como Θ ( n 2 )Θ(nlogn) Θ(n2) . Los algoritmos probabilísticos son prácticos y su computadora los utiliza, por ejemplo, cuando genera claves RSA (para probar que los dos factores de su clave secreta son primos). Algoritmo probabilístico que no utiliza ningún lanzamiento de monedas a veces se llama "determinista".
Los algoritmos no deterministas son aquellos que "necesitan una pista" pero siempre son correctos: no pueden ser engañados si se les da una pista incorrecta. Como ejemplo, aquí hay un algoritmo no determinista que factoriza un número entero : adivine una factorización de n , y verifique que todos los factores sean primos (hay un algoritmo determinista "rápido en teoría" para hacerlo). Este algoritmo es muy rápido y rechaza sugerencias falsas. La mayoría de la gente piensa que los algoritmos aleatorios no pueden factorizar números enteros tan rápido. Claramente, este modelo de cálculo no es realista.n n
¿Por qué nos importan los algoritmos no deterministas? Hay una clase de problemas, conocidos como NP, que consiste en problemas de decisión que tienen algoritmos no deterministas eficientes. La mayoría de la gente piensa que los problemas más difíciles en esa clase, los llamados problemas NP completos, no tienen algoritmos deterministas eficientes (o incluso aleatorizados) eficientes; Esto se conoce como la pregunta P vs NP. Dado que muchos problemas naturales son NP-completos, es interesante saber si en realidad no se pueden resolver de manera eficiente, en el peor de los casos (en la práctica, a menudo las instancias que surgen en la práctica se pueden resolver en un tiempo razonable).
fuente
Un algoritmo especifica un método para pasar de una entrada dada a una salida deseada que tiene una cierta relación con la entrada. Decimos que este algoritmo es determinista si en algún momento se especifica de manera exacta e inequívoca cuál es el siguiente paso en el algoritmo que debe realizarse como parte de ese método, potencialmente dependiente de la entrada o los datos parciales calculados hasta ahora, pero siempre identificado de forma única.
El no determinismo significa que una parte del algoritmo se deja debajo o incluso sin especificar. Por ejemplo, "int i = un número par entre 0 yn" está subespecificado. Esto significa que no hay un comportamiento único que se especifique en este momento.
Para que esta distinción sea útil, necesita el concepto (habitual) de "corrección" para los algoritmos (deterministas), que informalmente es que "el algoritmo siempre calcula lo que quiero que calcule". Entonces se vuelve interesante pensar qué significaría la corrección para los algoritmos no deterministas, que deben tener en cuenta las opciones posibles en instrucciones poco especificadas.
Hay dos formas de definir la corrección para el no determinismo. El primero es bastante simple y menos interesante, para lo cual la corrección significa "el algoritmo siempre calcula lo que quiero que calcule, para todas las secuencias de elecciones que se me permite hacer". Esto a veces ocurre si un autor de un poco de pseudocódigo es demasiado vago para elegir un número y dice "elegir cualquier número par entre 0 y n", cuando "elegir 0" habría hecho que el algoritmo fuera determinista. Esencialmente, al reemplazar todo el no determinismo por el resultado de alguna elección, puede hacer que el algoritmo sea determinista.
Este es también el "no determinismo" mencionado en su segundo párrafo. Este es también el no determinismo en los algoritmos paralelos: en estos algoritmos no está muy seguro de cómo se ve la ejecución con precisión, pero sabe que siempre funcionará, sin importar lo que suceda exactamente (de lo contrario, su algoritmo paralelo sería incorrecto).
La definición interesante de corrección para el algoritmo no determinista es "el algoritmo siempre calcula lo que quiero que calcule, para alguna secuencia de elecciones que se me permite hacer". Esto significa que puede haber elecciones incorrectas, en el sentido de que hacen que el algoritmo produzca la respuesta incorrecta o incluso que entren en un ciclo infinito. En el ejemplo "elija cualquier número par entre 0 yn", quizás 4 y 16 son opciones correctas, pero todos los demás números son incorrectos, y estos números pueden variar dependiendo de la entrada, los resultados parciales y las elecciones realizadas hasta ahora.
Cuando se usa en ciencias de la computación, el no determinismo generalmente se limita a elegir de manera no determinista un 0 o un 1. Sin embargo, si elige muchos de estos bits de manera no determinista, puede generar números largos no deterministas u otros objetos, así como tomar decisiones no deterministas, por lo que esto difícilmente (si alguna vez) limita su aplicabilidad: si la aplicabilidad es limitada, el no determinismo era demasiado poderoso en primer lugar.
El no determinismo es una herramienta que es exactamente tan poderosa como un algoritmo determinista basado en certificados, es decir, un algoritmo que verifica una propiedad dada una instancia y un certificado para esa propiedad. Simplemente puede adivinar de forma no determinista el certificado para una dirección, y puede proporcionar un certificado que contenga todas las respuestas "correctas" para las suposiciones no deterministas de 0 y 1 de su programa para la otra dirección.
Si agregamos tiempo de ejecución a la mezcla, las cosas se vuelven aún más interesantes. El tiempo de ejecución de un algoritmo no determinista generalmente se considera el mínimo sobre todas las opciones (correctas). Sin embargo, otras opciones pueden conducir a un tiempo de ejecución dramáticamente peor (que puede ser asintóticamente peor o incluso arbitrariamente peor que el mínimo), o incluso un ciclo infinito. Es por eso que tomamos el mínimo: no nos importan estos casos extraños.
Ahora llegamos a algoritmos aleatorios. Los algoritmos aleatorios son como algoritmos no deterministas, pero en lugar de 'permitir' la elección entre 0 y 1 en ciertos puntos, esta elección se determina mediante un lanzamiento aleatorio de monedas en el momento en que debe hacerse la elección (que puede diferir de una carrera a otra) , o cuando la misma elección debe hacerse nuevamente más tarde durante la ejecución del algoritmo). Esto significa que el resultado es 0 o 1 con igual probabilidad. La corrección ahora se convierte en "el algoritmo casi siempre calcula lo que quiero que calcule" o "el algoritmo siempre calcula lo que quiero que calcule" (solo la versión determinista). En el segundo caso, el tiempo que el algoritmo necesita para calcular su respuesta suele ser "casi siempre rápido", en contraste con un determinista "siempre rápido".
fuente
En resumen: no determinismo significa tener múltiples opciones igualmente válidas de cómo continuar un cálculo. La aleatorización significa utilizar una fuente externa de bits (aleatorios) para guiar el cálculo.
Para entender el no determinismo, le sugiero que mire los autómatas finitos (FA). Para un FA determinista (DFA), la función de transición es, bueno, una función. Dado el estado actual y el siguiente símbolo de entrada, el siguiente estado se define de manera única.
[ fuente ]
El punto clave aquí es que la aceptación se define como "aceptar si hay una ejecución de aceptación" para NFA. Este criterio de existencia puede interpretarse como "siempre acertando", a pesar de que no hay conjeturas reales.
Tenga en cuenta que no hay probabilidades aquí, en ningún lado. Si fuera a traducir el no determinismo a lenguajes de programación, tendría declaraciones que pueden causar saltos a otras declaraciones diferentes con el mismo estado . Tal cosa no existe, excepto tal vez en lenguajes de programación esotéricos diseñados para ignorarlo.
La aleatorización es bastante diferente. Si lo desglosamos, el autómata / programa no tiene múltiples opciones para continuar la ejecución. Una vez que se dibujan los bits aleatorios, la siguiente declaración se define de manera única:
En términos de autómatas finitos, considere esto:
[ fuente ]
Una nota final: podemos ver que el no determinismo es un concepto puramente teórico, ¡no se puede implementar! Entonces, ¿por qué lo usamos?
A menudo permite representaciones más pequeñas. Es posible que sepa que hay NFA para los que el DFA más pequeño es exponencialmente tan grande¹. Usar los más pequeños es solo una cuestión de simplificar el diseño del autómata y las pruebas técnicas.
La traducción entre modelos a menudo es más directa si se permite el no determinismo en el modelo de destino. Considere, por ejemplo, convertir expresiones regulares a DFA: la forma habitual (y simple) es traducirla a un NFA y determinar esta. No tengo conocimiento de una construcción directa.
Esto puede ser una preocupación académica, pero es interesante que el no determinismo puede aumentar el poder de un dispositivo. Este no es el caso de los autómatas finitos y las máquinas de Turing, discutibles como los dispositivos de modelos de máquinas más populares, pero por ejemplo, los autómatas deterministas pushdown, los autómatas Büchi y los autómatas de árbol de arriba hacia abajo pueden aceptar estrictamente menos idiomas que sus hermanos no deterministas².
fuente
Debe tener en cuenta que hay dos definiciones diferentes de no determinismo lanzadas por aquí.
Como lo define Wikipedia, prácticamente "no es determinismo", es decir, cualquier algoritmo que no siempre tiene el mismo comportamiento en las mismas entradas. Los algoritmos aleatorios son un caso especial de algoritmos "no deterministas", porque se ajustan a la definición que acabo de dar.
Los modelos de cómputo no deterministas (como las máquinas de Turing no deterministas) son modelos teóricos de cómputo. Pueden tener múltiples rutas posibles de ejecución y "aceptan" si alguna de esas rutas acepta. Debes tener en cuenta que no son reales. No hay forma de ejecutar físicamente un algoritmo que no sea determinista en este sentido, aunque puede simularlo con uno aleatorio o determinista.
En CS, el no determinismo generalmente significa (2), por lo que la definición de Wikipedia que dio (que es (1)) es engañosa. La mayoría de las respuestas dadas hasta ahora explican (2), no (1).
fuente
Revisar esto debido a algunas investigaciones relacionadas que estoy haciendo, el desacuerdo entre mí y algunos de los otros que respondieron, puede asimilarse en una comprensión holística en la que todos estábamos en lo correcto. Pero en mi opinión, la terminología informática adoptada "no determinismo limitado" es un oxímoron incorrecto (que era mi punto antes).
El punto clave es distinguir entre el no determinismo acotado y no acotado. [1]
Las máquinas de Turing no deterministas (también conocidas como "NTM") tienen un no determinismo limitado en el sentido de que cada transición de estado tiene un límite número de posibilidades, es decir, el número de programas (también conocido como "configuraciones") es finito. La cinta permanece sin límites, por lo que la prueba de terminación permanece indecidible. Pero para cualquier entrada dada que se detenga, la salida es determinista y limitada en el tiempo, es decir, para cualquier entrada el resultado es determinista o no termina. Además, las NTM ejecutan todas las configuraciones posibles en paralelo, por lo que se ejecutan exponencialmente más rápido que la emulación de las NTM en máquinas de Turing deterministas (también conocidas como "DTM"). [2]
Realmente no hay ninguna relación no determinista entre las entradas y los resultados en las MNA porque el resultado es siempre el mismo para cualquier entrada o estado inicial, lo cual es evidente porque pueden ser emulados por las MTM sin ninguna aleatoriedad adicional. [2] Indecidible no es la antítesis de determinista, porque no detenerse es también un resultado determinista. Las máquinas deterministas siempre tienen el mismo resultado para una entrada dada, incluso cuando ese resultado no debe detenerse. El no determinismo localizado de las NTM está en cada transición de estado del algoritmo de ejecución. Es indecidible a priori qué ruta del árbol podría terminar proporcionando el estado de salida. Pero la indecidibilidad no es no determinismo. Por lo tanto, el término "no determinismo limitado" pretende describir la indeterminación localizada dentro de la máquina de estados, pero no la relación de las entradas con los resultados, de ahí el concepto de "acotado". Sigo pensando que el término "no determinismo limitado" es un oxímoron y podría haberse descrito con mayor precisión como una máquina de Turing de "transición de estado paralela".
Mientras que, para cualquier entrada o estado inicial, el no determinismo ilimitado (también conocido como "indeterminismo") tiene un número ilimitado de estados posibles. El no determinismo ilimitado implica no solo el número de configuraciones posibles de programas, sino también un estado externo ilimitado que no es parte de la entrada o el estado inicial, como retrasos ilimitados. Y, por lo tanto, los resultados pueden variar en ejecuciones repetidas para la misma entrada o condición inicial; por lo tanto, no es una relación determinista entre entradas y resultados. [3]
Los algoritmos aleatorios y probabilísticos emplean cierto no determinismo, es decir, la selección aleatoria de posibles configuraciones posiblemente limitadas en un número de configuraciones, pero no ejecutan todas las configuraciones posibles como lo hacen las NTM. Por lo tanto, no son deterministas a menos que la aleatoriedad sea determinista (por ejemplo, PRNG) y el estado inicial de la entropía para la aleatoriedad se considere parte de la entrada.
[1] https://en.wikipedia.org/w/index.php?title=Unbounded_nondeterminism&oldid=710628370#Nondeterministic_automata
[2] https://en.wikipedia.org/w/index.php?title=Non-deterministic_Turing_machine&oldid=754212081#Equivalence_with_DTMs
[3] Hewitt, Meijer y Szyperski: The Actor Model (todo lo que querías saber ...) . Salta a la marca de 17:44 minutos.
fuente
Además de todas las respuestas que explican la diferencia, tengo un ejemplo que puede ayudarlo a entender lo que quieren decir.
Considere una moneda al aire, o bien obtener un H o una camiseta . Si el lanzamiento de la moneda es aleatoria, es muy probable que de 1000 lanzamientos de moneda, 500 habría H y es muy poco probable que 999 fuera de ellos sería H . Pero si el lanzamiento de la moneda no es determinista, no podemos decir que obtener 999 H sería altamente improbable.
fuente
Los algoritmos aleatorizados (tiempo polinómico, resultado booleano) se encuentran en la clase de complejidad computacional RP, que es un subconjunto de NP donde residen los algoritmos no deterministas (tiempo polinómico, resultado booleano) y un superconjunto de P donde los deterministas (tiempo polinómico, resultado booleano) Los algoritmos residen.
La complejidad de los subconjuntos consiste en reducir los problemas de un conjunto a otro. Por lo tanto, RP ⊆ NP excluye la posibilidad de algoritmos aleatorios que también son no deterministas porque, de manera definitoria, un superconjunto contiene el subconjunto. Subconjunto significa que cada algoritmo RP (o cualquier algoritmo RP completo) puede reducirse a algún algoritmo NP (o cualquier algoritmo NP completo). P es un subconjunto de RP porque cada problema en P puede reducirse a un problema en RP donde la cantidad de entropía no controlada es 0.
Tangencialmente, esto es análogo a cómo cada problema en NC (cómputo paralelo) puede reducirse a un problema en P simulando el cómputo paralelo en una reducción a un problema en serie en P, pero aún no se ha demostrado que lo contrario sea cierto, es decir que cada problema en P es reducible a un problema en NC, ni demostrado que no sea cierto, es decir, la prueba inverosímil de que un problema P-completo no es reducible a un problema en NC. Puede ser posible que haya problemas que son inherentemente seriales y no pueden calcularse en paralelo, pero para probar que probar P ≠ NC parece ser inverosímil (por razones demasiado tangenciales para discutir en esta respuesta).
En términos más generales (es decir, sin limitarse a los tipos de resultados booleanos), los algoritmos aleatorios se distinguen de los algoritmos deterministas en el sentido de que parte de la entropía se origina externamente . Los algoritmos aleatorios se distinguen de los algoritmos no deterministas porque la entropía está limitada y, por lo tanto, se puede demostrar que los algoritmos aleatorios (y no no deterministas) siempre terminan.
La imprevisibilidad de los algoritmos no deterministas se debe a la incapacidad de enumerar todas las permutaciones posibles de la entropía de entrada (lo que resulta en la imprevisibilidad de la terminación). La imprevisibilidad de un algoritmo aleatorio se debe a la incapacidad de controlartoda la entropía de entrada (que da como resultado una imprevisibilidad de un resultado indeterminado, aunque se puede predecir la tasa de imprevisibilidad). Ninguna de estas son declaraciones sobre la imprevisibilidad de la respuesta correcta al problema, sino que la imprevisibilidad se manifiesta en el canal lateral de terminación y el resultado indeterminado, respectivamente. Parece que muchos lectores están combinando la imprevisibilidad en un área con la imprevisibilidad del resultado correcto, que es una combinación que nunca escribí (revise el historial de edición).
Es clave comprender que el no determinismo es siempre (en cualquier ciencia o uso del término) la incapacidad de enumerar la entropía universal (es decir, sin límites). Mientras que, la aleatorización se refiere al acceso a otra fuente de entropía (en programas de entropía diferentes y, por lo tanto, no bajo el control de las variables de entrada) que pueden o no estar ilimitadas.
Agregué el siguiente comentario debajo de la respuesta más popular actualmente al otro hilo que hace una pregunta similar.
Agregando algunos de los mejores comentarios para aclarar mi punto sobre la única distinción sobresaliente entre aleatorizado y no determinista.
Es realmente bastante elegante y fácil ver la distinción, una vez que todos dejan de confundirlo al tratar de describirlo desde un punto de vista operativo en lugar de desde el punto de vista de la entropía más destacado.
.
.
.
Los diccionarios son herramientas. Aprende a usarlos.
Por lo tanto, la aleatorización solo requiere que parte de la entropía de entrada sea equiprobable, lo que es congruente con mi definición de que parte de la entropía de entrada no puede ser controlada por el llamador de la función. Tenga en cuenta que la aleatorización no requiere que la entropía de entrada sea indecidible hasta la terminación.
Esto nos dice que los algoritmos deterministas deben estar completamente determinados por el estado de entrada de la función, es decir, debemos ser capaces de demostrar que la función terminará (o no terminará) y eso no puede ser indecidible. A pesar del intento confuso de Wikipedia de describir no determinista, la única antítesis para determinista como se define anteriormente en Wikipedia, son los algoritmos cuyo estado de entrada (entropía) está mal definido. Y la única forma en que el estado de entrada puede estar mal definido es cuando no está acotado (por lo tanto, no se puede preanalizar determinísticamente). Esto es precisamente lo que distingue a una máquina de Turing no determinista (y muchos programas del mundo real que están escritos en lenguajes completos comunes de Turing como C, Java, Javascript, ML, etc.) de TM deterministas y lenguajes de programación como HTML, fórmulas de hojas de cálculo, Coq, Epigram,
Wikipedia y otros intentan combinar la aleatorización con el no determinismo, pero ¿cuál es el punto de tener los dos conceptos si no los va a distinguir elocuentemente?
Claramente, el determinismo se trata de la capacidad de determinar. Claramente, la aleatorización se trata de hacer que parte de la entropía sea equiparable.
Incluir entropía aleatoria en el estado de un algoritmo no necesariamente lo hace indeterminable. Por ejemplo, un PRNG puede tener la distribución estadística equiprobable requerida, pero también puede ser completamente determinista.
La combinación de conceptos ortogonales es lo que las personas de bajo coeficiente intelectual. ¡Espero algo mejor que eso de esta comunidad!
fuente