Hola a todos,
El otro día, mi hijo me pidió que jugáramos a la versión en papel cuadriculado de "Battleship". Cada persona tenía 5 "barcos" de 5, 4, 3, 3 y 2 unidades de largo (y una unidad de ancho). Los "barcos" se colocaban en una cuadrícula de 10 por 10 en el espacio XY; cada "barco" tenía un conjunto único de coordenadas (x,y). Por ejemplo, uno de los 3 "barcos" de unidad podría tener coordenadas (3,4), (4,4) y (5,4). No más de un "barco" puede ocupar la misma coordenada (x,y). Los "barcos" solo pueden estar dispuestos en vertical u horizontal; no se permite la disposición en diagonal.
Luego nos turnamos para decir en voz alta pares de coordenadas (x,y) para ver quién había dado un golpe directo al "barco" de otra persona. Cada uno de nosotros sólo tenía 16 turnos para intentar dar (o hundir) la mayor cantidad posible de "barcos" de la otra persona. Mientras hacíamos esto, pensé que debía haber un enfoque mejor para maximizar las posibilidades de dar (y/o hundir) el "barco" de otra persona que simplemente decir las coordenadas al azar. Por supuesto, no dirías en voz alta una coordenada (x,y) que ya hayas usado, ya que sabrías si has dado o no a un "barco".
Al principio, pensé que tal vez la plataforma de diseño personalizado sería la opción correcta, pero si creas un diseño donde Y es "Hit" (0/1 para no/sí) y X1 = x y X2 = coordenadas y (numérico discreto de 10 niveles), la plataforma generará un diseño donde solo usa los niveles alto y bajo para cada X e Y. Por cierto, los términos del modelo son solo x, y, y el término cruzado x*y. Por lo tanto, desafortunadamente, el diseño personalizado no funciona.
La plataforma DOE factorial completo no funcionará porque quiere hacer 100 ejecuciones (factorial 10x10) y solo tenemos 16 ejecuciones (intentos) cada uno.
La plataforma RSM DOE solo funciona en los niveles alto/bajo, y se ingresan 1 y 10 para los niveles bajo/alto. Las opciones de diseño de CCD realmente no llenan el espacio de la cuadrícula de 10 por 10 donde se colocarían los "barcos"; hay demasiados recorridos centrales para cubrir el espacio de la cuadrícula.
La única otra plataforma que sería aplicable para esto sería el diseño de relleno de espacio. Usando los mismos ajustes bajos/altos, 1/10 para x e y y "Hit" como respuesta (esto sería binario, 0/1 para no/sí), puedo obtener una tabla DOE con pares (x,y) que llenan el espacio de la cuadrícula. No estoy seguro de cuál sería la mejor opción para los métodos de diseño de relleno de espacio, FFF o Uniform, o Latin Hypercube, etc.
Creo que lo más importante es que el DOE es fijo, no es "adaptable" en el sentido de que, en función del resultado de la primera ejecución, ¿cómo se modificaría el DOE para tener en cuenta la información conocida? Utilizando las coordenadas del barco de 3 unidades de arriba, digamos que mi primera ejecución es decir las coordenadas (3,4) y obtengo un resultado. Conociendo la disposición de los "barcos" como horizontales o verticales, mi siguiente llamada no sería seguir el DOE en absoluto, sino decir (3,5), (3,3), (2,4) o (4,4) - aumentaría x o y en una unidad y vería cuál es el resultado. Y así sucesivamente hasta que el barco se hunda o pase a la siguiente coordenada de inicio posible.
Me gustaría encontrar un método más científico para generar un DOE adaptativo que pueda optimizar las 16 ejecuciones para generar "aciertos". Partir de un DOE estático no lo hará porque después de cada ejecución, se "agota" una coordenada y aprendo si es un acierto o no. Cada ejecución informa a las n+1 ejecuciones posteriores. Hasta donde sé, no existe un DOE que pueda manejar algo como esto, pero tampoco soy un experto en este campo.
¿La selección aleatoria de un punto de partida es lo mejor que se puede hacer en "Battleship"? No lo creo, pero me resulta difícil encontrar la manera de tener un DOE adaptativo que básicamente tenga declaraciones "si/entonces" para que optimice el uso de mis 16 intentos y tenga en cuenta la información del paso anterior. Sería genial tener un DOE "adaptable" que optimizara tus elecciones para cada partida de modo de maximizar tus posibilidades de ganar en 16 intentos.
¡Gracias por la discusión!,
DS
PD: al buscar JMP y "Battleship", encontré esta publicación de @Jordan_Hiller que muestra cómo se puede usar JMP para jugar diferentes juegos, y @brady_brady escribió el código JSL para jugar "Battleship". ¡Muy bueno! ¡Pronto descargaré ese JSL!
Hola @Jordan_Hiller ,
Gracias por el enlace al blog, me gustó el artículo.
En general, entiendo el concepto detrás de cómo calcularon la probabilidad de que un barco esté en un cuadrado determinado: esto sería diferente para cada tipo de barco. Sin embargo, dado que el estado de probabilidad del tablero cambiaría después de cada ronda de juego, la elección de la siguiente casilla para disparar cambia, lo que para mí no es más que un diseño de relleno de espacio optimizado que tiene en cuenta los aciertos/errores/ tamaño del barco y número de pasadas restantes.
El cartel del blog pudo generar un algoritmo que puede con el juego en 34 movimientos, que es exactamente el doble del número de casillas ocupadas por los barcos. Presumiblemente, sería posible generar una ruta de decisión óptima que podría acercar a 17 el número requerido de movimientos para ganar. Tal vez no exactamente 17, pero muy cerca.
Ciertamente, un enfoque de ML/AI puede construir un algoritmo para ganar el juego, pero estoy de acuerdo, eso es excesivo y no es lo que realmente busco. Estoy más interesado en tal vez una combinación de lo que hizo la persona del blog y utilizar un DOE. Claramente, la función de densidad de probabilidad para el tablero de juego es fundamental para tomar decisiones. Pero, ¿podría uno modificar eso de un cálculo puramente de probabilidad a uno que se basa en un relleno de espacio optimizado, casi como alimentar la función de probabilidad de la placa como una función de "ponderación" para el DOE, de modo que el DOE generaría los aciertos más probables? Me parece que generar primero el conteo de visitas más alto y luego enfocarse en el hundimiento conduciría a una victoria más rápida en comparación con cómo lo hizo el blogger, que consistía en enfocarse en hundir un barco primero antes de pasar al modo de búsqueda.
De todos modos, lo encontré interesante para considerar y pensar, ¡y aparentemente otros también lo han hecho!
¡Gracias!,
SD
¡Divertida idea, Diedrich!
Aquí hay una publicación de blog antigua sobre este tema, alguien descubrió cómo calcular la probabilidad de que un barco esté en cada casilla de la cuadrícula para cualquier estado del juego. https://www.datagenetics.com/blog/december32011/ Después de eso, ni siquiera necesita un modelo, solo puede elegir el cuadrado más probable. También hay algunos proyectos de aprendizaje automático, ¡pero eso parece excesivo!
Jordán