Leí la entrada de Wikipedia sobre " Lista de problemas NP-completos " y descubrí que los juegos como Super Mario, Pokémon, Tetris o Candy Crush Saga son np-completos. ¿Cómo puedo imaginar np-completeness de un juego? Las respuestas no necesitan ser demasiado precisas. Solo quiero obtener una visión general de lo que significa que los juegos pueden ser np-completos.
50
Respuestas:
Simplemente significa que puedes crear niveles o acertijos dentro de estos juegos que codifican problemas NP-Hard. Puede tomar un problema de coloración del gráfico, crear un nivel asociado de Super Mario Bros., y ese nivel es superable si y solo si el gráfico es de 3 colores.
Si desea ver la forma específica en que los problemas de NP-Complete se traducen en los juegos, le recomiendo el artículo "Los juegos clásicos de Nintendo son (computacionalmente) difíciles" . Está bien escrito y es fácil de seguir.
Una advertencia importante a tener en cuenta es que la dureza NP requiere generalizar los juegos de manera "obvia". Por ejemplo, Tetris normalmente tiene una tabla de tamaño fijo, pero la prueba de dureza requiere que el juego permita tablas arbitrariamente grandes. Otro ejemplo son los enemigos fuera de la pantalla en Super Mario Bros: la prueba es una variante del juego donde los enemigos fuera de la pantalla continúan moviéndose como si estuvieran en la pantalla, en lugar de dejar de existir y volver a su posición inicial cuando Mario regresa .
fuente
Sinceramente, no sé exactamente qué tipo de modelo usan las personas que hacen esas afirmaciones; sin embargo, lo que me parece razonable sería hablar sobre la de decidir algo sobre una situación de juego.NP
Tomemos como ejemplo Tetris, ya que es el único de los que cita que entiendo lo suficiente como para hablar. Tetris tiene una regla llamada "claro perfecto", que le da al jugador una gran bonificación si una caída de pieza despeja el tablero por completo. Uno podría preguntarse si, dada una secuencia ordenada de piezas y un número entero , existe una secuencia legal de movimientos para las piezas que logra al menos claros perfectos. Los enunciados de problemas como los que son suficientemente abstractos pueden modelarse con las herramientas de la teoría de la complejidad.k P k{Pi} k P k
En pocas palabras, " -complete" significa una cosa y solo una cosa, afirmaciones sofisticadas como "Super Mario is -complete" tienen que traducirse en una declaración formal antes de que se realicen sentido.N PNP NP
fuente
Aquí hay una explicación simplista de agitar las manos:
Dichos juegos están en NP porque "ejecutar" el comportamiento de un jugador en el transcurso de un juego y verificar si gana o pierde se puede hacer de manera eficiente (necesitamos que sea en tiempo polinómico en la duración del juego, pero probablemente sea lineal u -ish).O(nlog(n))
Tales juegos son NP-hard porque el comportamiento del jugador es muy expresivo. Si bien en cualquier momento dado un jugador solo puede tener un número limitado, incluso fijo, de acciones posibles, eso es suficiente para crear un espacio de comportamientos o estrategias exponenciales en la duración del juego; y si bien puede proporcionar una condición simple o una fórmula lógica sobre la validez / beneficio / corrección de las acciones de un jugador a nivel local, globalmente obtendrá un efecto similar al de un circuito combinatorio grande o una fórmula k-CNF.
Con suerte, esto tiene un sentido intuitivo y también suena suficientes campanas de teoría CS.
PD: algunos juegos son mucho más complejos (computacionalmente) que eso. Por ejemplo, los juegos de mesa Hex , Go y Reversi son completos para PSPACE. Esto se debe esencialmente a que la fórmula que necesita satisfacer para una estrategia ganadora es una fórmula cuantificadora que alterna repetidamente: existe un movimiento por parte del jugador 1, de modo que para cada movimiento por parte del jugador 2, existe un movimiento por parte del jugador 1, etc., etc. de modo que con todos esos movimientos jugados, algunos de los movimientos del jugador 2 no son válidos o tenemos una secuencia válida que el jugador 1 ha ganado. Con los juegos NP, generalmente es solo el comportamiento / estrategia / elección de movimientos de un jugador.
fuente
Para los juegos de un solo jugador, siempre puede hacer la pregunta "¿hay una estrategia ganadora para el jugador", y esa pregunta a menudo tiene una respuesta de "SÍ" que puede verificarse en tiempo polinómico, y puede muy bien ser NP completa.
Para los juegos de dos jugadores, la respuesta a menudo no se puede verificar en tiempo polinómico, porque para verificar que un movimiento para A es un movimiento ganador, debes demostrar que por cada respuesta de B habrá nuevamente un movimiento ganador para A y pronto.
fuente
Bueno, ciertamente está en NP, porque una posible solución es solo un número finito de entradas (en cada cuadro de entrada puede seleccionar cualquiera de los botones k, representamos cada selección de los botones para cada cuadro con una letra) que lo lleva a La pantalla de triunfo. Sabemos que este juego ha sido derrotado antes, por lo que sabemos que existe una solución. Un NTM pasa por encima de su cinta y adivina mágicamente un certificado correcto de longitud n. Luego simula a Super Mario con la entrada y lo verifica. La verificación se puede hacer en tiempo polinómico (tiempo lineal en realidad, si la solución es correcta, tomará exactamente n cuadros para ganar).
Para mostrar la completitud de NP, podríamos reducir 3-SAT al construir un comprobador de 3 sat con el generador de niveles (que se construye mediante la ejecución de código arbitrario https://www.youtube.com/watch?v=IOsvuEA2h4w ).
Por lo tanto, tenemos una entrada CNF 3-SAT, que primero verificamos el formato correcto. Si está mal formateado, solo lo traducimos en una entrada de 'salto' (no es posible vencer a Super Mario dentro de un cuadro haciendo un salto).
Llamamos a la longitud de la entrada 3-CNF n.
Si está formateado correctamente, lo traducimos a una cantidad de entradas, que construye el verificador 3-CNF para nosotros (siempre el mismo código de longitud k), traduce el 3-CNF en una Cadena de entradas, que construye el 3- específico CNF en el verificador (en O (n)), y verifica todas las posibles soluciones por fuerza bruta. Está inactivo y no hace nada, si después de analizar todas las soluciones, no se encuentra ninguna. Reinicia el juego y utiliza una solución conocida para Super Mario para vencer al juego (el código para hacerlo tiene la longitud j). Por lo tanto, nuestra transformación está en O (n), por lo que está dentro del tiempo polinomial.
Si el CNF está mal formateado, no ganamos (por definición, nuestra entrada no es ganadora, si no hemos ganado un cuadro después de la ejecución). Si el CNF no es satisfactorio, no ganamos (no puede ganar si está inactivo por un cuadro en el generador de niveles, nos aseguramos de eso en nuestro código). Si el CNF es satisfactorio, el verificador encuentra una solución que se reinicia y gana el juego. Por lo tanto, la reducción polinómica de 3-Sat a Super Mario está completa y hemos demostrado que Super Mario está NP-completo.
(Espero no haber estropeado esto en alguna parte. Nos encontramos con un problema de almacenamiento, si el 3-CNF es demasiado largo, pero el almacenamiento limitado generalmente se ignora en estos contextos, creo)
fuente
Reescribí esta respuesta para tratar de abordar algunos comentarios en una versión anterior.
Supongo que has leído la definición de Wikipedia para completar NP que realmente no se centra en los juegos. Voy a diluir un poco el significado exacto de NP-completitud y teoría del juego y explicaré la esencia de un juego NP-Complete.
Consideremos un juego de 2 jugadores con movimientos alternativos, más restrictivamente se trata esencialmente de juegos combinatorios . Básicamente, un juego en el que tienes algunos movimientos que puedes hacer y debes elegir uno de ellos. Te gustaría jugar "perfectamente", lo que significa que nunca harías un movimiento "malo". Entonces, de los movimientos permitidos, te gustaría seleccionar el mejor. (Por supuesto, tu oponente tiene el mismo objetivo ...)
Dado el estado actual del juego, lo que le gustaría es poder usar un "algoritmo eficiente" para calcular el mejor movimiento. Por otro lado, observemos que un algoritmo que tiene que buscar en todo el árbol del juego es un "algoritmo ineficiente".
Ahora definamos "eficiencia" un poco más formalmente. Voy a simplificar esto un poco, pero la esencia es correcta. Considere la cantidad de cálculos, , que se deben hacer para elegir el próximo movimiento, que el promedio de cada movimiento tiene posibilidades (el factor de ramificación ) y que quedan movimientos en el juego. La noción también es que cada cálculo lleva el mismo tiempo para que el esfuerzo pueda traducirse en complejidad de tiempo , , en lugar de cálculos brutos.B n TC B n T
α
n
Ahora, el punto importante es que es imposible tener un algoritmo eficiente, el tiempo polinómico, que funcione perfectamente para un juego que completa NP. Para jugar perfectamente, un problema NP-completo debe, por definición, resolverse mediante un algoritmo ineficiente que se ejecuta en tiempo no polinómico.
Para Nim es posible crear un algoritmo de tiempo polinómico. En cualquier momento del juego, el algoritmo puede calcular qué jugador tiene un movimiento ganador y cuál debería ser ese movimiento.
Por otro lado, tomemos el juego de Qubic . (Estás tratando de hacer una línea de 4 en una cuadrícula 3D. Por lo tanto, es esencialmente tic-tac-toe en una cuadrícula de 4x4x4.) Qubic tiene NP completo, por lo que no hay un algoritmo de tiempo polinómico para calcular el siguiente movimiento perfecto. La única forma de saber si actualmente tiene un movimiento ganador es probar todos los movimientos posibles de ambos jugadores para verificar que un movimiento en particular sea un ganador, o al menos no un perdedor.
Ahora analicemos el ajedrez para analizar la función de evaluación ignorando algunas de las otras características de los programas de juego de ajedrez. El ajedrez sigue siendo un juego sin resolver . Se desconoce si el primer o segundo jugador debe ganar. No es posible obtener una posición en el tablero y predecir con certeza quién ganará. De hecho, el ajedrez tiene un árbol de juego tan grande que es imposible buscar en todo el árbol de juego. Necesitaría computadoras que no sean solo 10 o 100 veces más rápidas, sino miles de millones de veces más rápidas que cualquier computadora actual. (Existe la esperanza de que la computación cuántica pueda cortar este nudo gordiano).
Piense en la función de evaluación de ajedrez como si le diera a cada posible próximo movimiento una probabilidad de ser el mejor movimiento. Lo que hace un programa de ajedrez es combinar look aheads con la función de evaluación. Por lo tanto, el programa analiza todos los movimientos futuros posibles hasta que llega a un punto en el que se puede dar un "buen" puntaje a la posición del tablero. La computadora evalúa todas las rutas posibles a través del árbol de esta manera y luego elige la ruta con la mejor puntuación. Como la búsqueda nunca llegó al final del juego para todos los caminos que se evalúan, todos los programas de ajedrez finalmente utilizan una función de evaluación imperfecta. (Si está cerca del final del juego, entonces la computadora podría mirar todos los movimientos futuros posibles). Eso significa que podría ser posible vencer al programa incluso si el programa tenía una posición ganadora en algún momento.
fuente