¡Tengo uno duro para ti!
Mi novia recientemente se encontró con un nuevo programa en MTV (EE. UU.). Es un espectáculo terrible, y todos en él son basura, pero el "juego" es bastante interesante. De Wikipedia:
¿Eres el elegido? Sigue a 20 personas que viven juntas en Hawai para encontrar su pareja perfecta. Si los 10 hombres y las 10 mujeres son capaces de elegir correctamente las diez parejas perfectas en diez semanas, ganarán $ 1 millón para dividirse entre ellos.
Ahora para la parte del juego (también de Wikipedia):
En cada episodio, el elenco se emparejará con quienes creen que su pareja perfecta es competir en un desafío. Los ganadores del desafío irán a una cita y tendrán la oportunidad de probar su partido en la cabina de la verdad. Los miembros del elenco elegirán una de las parejas ganadoras para ir al stand de la verdad y determinar si son una pareja perfecta o no. Esta es la única forma de confirmar coincidencias. Cada episodio termina con una ceremonia de emparejamiento en la que se les dirá a las parejas cuántas coincidencias perfectas tienen, pero no qué coincidencias son correctas.
TL; DR: Este es un derivado de Mastermind (M (10,10) para ser específico). Las reglas del juego son las siguientes:
Comienza con 2 conjuntos de 10, llamémoslos Conjunto A: {A, B, C, D, E, F, G, H, I, J} y Conjunto 2: {1,2,3,4,5, 6,7,8,9,10}
La computadora crea una solución (no visible para usted) en forma de {A1, B2, C3, D4, E5, F6, G7, H8, I9, J10}, donde los miembros del conjunto A se asignan de 1 a 1 para establecer 2. Otro ejemplo de una solución podría ser {A2, B5, C10, D8, E1, F7, G6, H4, I9, J3}.
Antes de tu primer turno, puedes preguntar si un par particular de tu elección es correcto. Su pregunta sería en forma de {A1} (por ejemplo, {C8}), y recibirá un 1 (que significa correcto) o 0 (que significa que su suposición es incorrecta).
Tu primer turno real. Usted hace su primera suposición en forma de {A1, B2, C3, D4, E5, F6, G7, H8, I9, J10}, o cualquier permutación de su elección. Su suposición no puede contener múltiplos de ningún elemento, es decir, una suposición de {A1, A2, A3, A4, A5, B6, B7, B8, B9, B10} NO es una suposición válida. Después de cada turno, la computadora le indica el número de coincidencias correctas, pero NO qué coincidencias son correctas.
Repita los pasos 3 y 4 hasta que obtenga todas las coincidencias correctas (es decir, una respuesta de 10), o hasta que sus 10 movimientos estén arriba (lo que ocurra antes). Si lo resuelve antes o en su décimo turno, gana $ 1 millón. De lo contrario, pierdes, y algunas personas (o letras y números) se van solos a casa para pasar la eternidad con sus 10 gatos.
Este NO es un concurso de código más corto. La persona que pueda resolver una coincidencia aleatoria en el menor número promedio de conjeturas será la ganadora. Es probable que el juego inteligente y la velocidad de cálculo también tengan en cuenta. Supongo que el número promedio de turnos seguramente será mayor que 10, por lo que las probabilidades de que ganes el premio de $ 1 millón (presumiblemente pagado por MTV, no yo) son escasas. Sólo la forma imposible es que para el reparto de ganar el gran premio?
Nota: Ponerlo en el formato {A1, B2, ...} no es necesariamente necesario. Simplemente utilicé ese formulario en la pregunta para dejar absolutamente claro cuál es el rompecabezas. Si no lo pone en este formulario, simplemente explique cómo llamarlo.
¡Buena suerte!
fuente
Respuestas:
Python 2 (corre más rápido si corres usando Pypy)
Se cree que casi siempre adivina el emparejamiento correcto en 10 rondas o menos
Mi algoritmo se toma de mi respuesta para mastermind como mi hobby (ver en Ideone ). La idea es encontrar la suposición que minimice el número de posibilidades que quedan en el peor de los casos. Mi algoritmo a continuación solo lo fuerza por fuerza bruta, pero para ahorrar tiempo, solo selecciona conjeturas aleatorias si el número de posibilidades restantes es mayor que
RANDOM_THRESHOLD
. Puede jugar con este parámetro para acelerar las cosas o para ver un mejor rendimiento.El algoritmo es bastante lento, en promedio 10 segundos para una ejecución si se ejecuta utilizando Pypy (si se utiliza el intérprete CPython normal, son alrededor de 30 segundos), por lo que no puedo probarlo en todas las permutaciones. Pero el rendimiento es bastante bueno, después de alrededor de 30 pruebas, no he visto ninguna instancia en la que no pueda encontrar el emparejamiento correcto en 10 rondas o menos.
De todos modos, si esto se usa en un espectáculo de la vida real, tiene mucho tiempo antes de la próxima ronda (¿una semana?), Por lo que este algoritmo se puede usar en la vida real = D
Así que creo que es seguro asumir que, en promedio, esto encontrará los emparejamientos correctos en 10 conjeturas o menos.
Inténtalo tú mismo. Podría mejorar la velocidad en los próximos días (EDITAR: parece difícil mejorar aún más, así que dejaré el código tal como está. Intenté hacer una selección aleatoria, pero incluso
size=7
en 3 de los 5040 casos falla , así que decidí mantener el método más inteligente). Puedes ejecutarlo como:O, si solo quiere ver cómo funciona, ingrese un número menor (para que se ejecute más rápido)
Para ejecutar una prueba completa (advertencia: tomará mucho tiempo
size
> 7), ingrese un número negativo.Prueba completa para
size=7
(completado en 2m 32s):Si
RANDOM_THRESHOLD
yCLEVER_THRESHOLD
se establecen en un valor muy alto (como 50000), que va a forzar el algoritmo para encontrar la estimación óptima que minimiza el número de posibilidades en el peor de los casos. Esto es muy lento, pero muy poderoso. Por ejemplo, ejecutarlosize=6
afirma que puede encontrar los emparejamientos correctos en un máximo de 5 rondas.Aunque el promedio es más alto en comparación con el uso de la aproximación (que es 4.11 rondas en promedio), pero siempre tiene éxito, aún más con una ronda de sobra. Esto fortalece aún más nuestra hipótesis de que cuando
size=10
, casi siempre debería encontrar los emparejamientos correctos en 10 rondas o menos.El resultado (completado en 3m 9s):
El código.
fuente
len(remove_perms ...)
parte). Y sí, quise decir en <= 10 rondas =). Por cierto, en el código anterior, la suposición realmente óptima nunca se realiza, ya que lo puseCLEVER_THRESHOLD=0
, lo que significa que solo intentará adivinar de la lista de posibilidades, aunque la suposición óptima podría estar fuera de este conjunto. Pero decidí desactivar eso para ahorrar tiempo. Agregué una prueba completa parasize=7
mostrar que siempre tiene éxito.size=8
y descubrí que la última versión solo tiene 40308 éxitos (en lugar de 40320) si se usa esta configuración. ¡Pero eso sigue siendo una tasa de éxito del 99.97%! Supongo que podemos hacer que el organizador del programa de televisión vaya a la quiebra.CJam -19 vueltas- La estrategia de un idiota
Esta no es una respuesta seria sino una demostración. Esta es la solución de un idiota en la que no tiene en cuenta la cantidad de información de emparejamiento correcta proporcionada en la segunda parte del turno. Con emparejamientos completamente aleatorios, esto toma un promedio de 27 semanas. Esta respuesta es insuficiente como he dicho, pero indica que las probabilidades de un grupo inteligente (mucho más inteligente que este programa) probablemente no sean tan escasas como cabría esperar. Los algoritmos más inteligentes que he escrito, sin embargo, toman mucho más tiempo en ejecutarse para que realmente pueda obtener respuestas de ellos.
Actualización: El siguiente código se actualizó para usar el estado de que debería eliminar los que no funcionan si los únicos correctos son los que ya sabíamos que eran correctos. También fue editado para mostrar mi generador aleatorio de "respuesta correcta". El resultado promedio ahora es solo 19. Sigue siendo una solución tonta, pero es mejor que la anterior marginalmente.
fuente
Versión C ++ multiproceso rápida
Sé que ha pasado un tiempo desde que este hilo estuvo activo, pero tengo una excelente adición para compartir: Aquí hay una implementación en C ++ del algoritmo minimax para Are You The One? , que utiliza subprocesos múltiples para acelerar la evaluación de cada posible suposición.
Esta versión es mucho más rápida que la versión de Python (más de 100 veces más rápida cuando la versión original de Python está configurada al máximo
RANDOM_THRESHOLD
yCLEVER_THRESHOLD
). No utiliza ninguna conjetura al azar, sino que evalúa todas las permutaciones y envía como suposición la permutación que elimina la mayor cantidad de soluciones posibles (dada la respuesta en el peor de los casos).Para juegos más pequeños, llamar "ayto -n" ejecutará el juego en todos los n! posibles coincidencias ocultas, y le dará un breve resumen de los resultados al final.
¡Ya que todavía es intratable evaluar los 10! posibles coincidencias ocultas, si llama "ayto 10", por ejemplo, el simulador realiza sus primeras tres conjeturas fijas, luego ejecuta minimax para elegir su suposición y asume que se le dio la peor evaluación. Esto nos lleva por el "camino del peor de los casos" a un vector oculto que presumiblemente está en la clase de vectores que le toma al algoritmo un número máximo de conjeturas para identificar. Esta conjetura no ha sido probada.
Hasta n = 9 , no ha habido una simulación que haya tomado más de n turnos para resolver.
Para probar esto usted mismo, una compilación de ejemplo sería la siguiente:
Aquí hay un pequeño ejemplo con salida:
Código
fuente