Sugerencias de IA de personajes de PacMan para una próxima dirección óptima

9

En primer lugar, esto es IA para PacMan y no los fantasmas .

Estoy escribiendo un fondo de pantalla en vivo de Android que reproduce PacMan alrededor de sus iconos. Si bien admite sugerencias de los usuarios mediante toques en la pantalla, la mayoría del juego será jugado por una IA. He terminado el 99% con toda la programación del juego, pero la IA para el propio PacMan sigue siendo extremadamente débil. Estoy buscando ayuda para desarrollar una buena IA para determinar la próxima dirección de viaje de PacMan.

Mi plan inicial fue este:

  1. Inicialice un contador de puntaje para cada dirección con un valor de cero.
  2. Comience en la posición actual y use un BFS para atravesar hacia afuera en las cuatro direcciones iniciales posibles agregándolas a la cola.
  3. Saque un elemento de la cola, asegúrese de que aún no se haya "visto", asegúrese de que sea una posición válida en el tablero y agregue a las direcciones iniciales correspondientes un valor para la celda actual basado en:

    1. Tiene un punto: más 10
    2. Tiene un poder: más 50
    3. Tiene una fruta: más el valor de la fruta (varía según el nivel)
    4. Tiene un fantasma asustado: más 200
    5. Tiene un fantasma que viaja hacia PacMan: resta 200
    6. Tiene un fantasma viajando lejos de PacMan: no hagas nada
    7. Tiene un fantasma que viaja perpendicular: resta 50
    8. Multiplique el valor de la celda por un porcentaje basado en el número de pasos a la celda, cuantos más pasos desde la dirección inicial, más cerca el valor de la celda llega a cero.

    y poner en cola las tres direcciones posibles desde la celda actual.

  4. Una vez que la cola esté vacía, encuentre la puntuación más alta para cada una de las cuatro direcciones iniciales posibles y elíjala.

Me pareció bien en el papel, pero los fantasmas rodean a PacMan extremadamente rápido y se mueve de un lado a otro en las mismas dos o tres celdas hasta que uno lo alcanza. Ajustar los valores para la presencia fantasma tampoco ayuda. Mi punto BFS más cercano puede al menos llegar al nivel 2 o 3 antes de que termine el juego.

Estoy buscando código, pensamientos y / o enlaces a recursos para desarrollar una IA adecuada, preferiblemente los dos primeros. Me gustaría lanzar esto en el mercado en algún momento de este fin de semana, así que tengo un poco de prisa. Cualquier ayuda es muy apreciada.


FYI, esto fue publicado originalmente en StackOverflow

Jake Wharton
fuente
Mucho de esto depende de la IA fantasma. Si está utilizando exactamente el mismo algoritmo de IA del juego original, podría hacer que el pac-man siga uno de los muchos patrones que ya se han descubierto, no se necesita IA, excepto una tabla de búsqueda. Si los fantasmas se están acercando rápidamente a su pac-man, ¿ha considerado que el problema es que la IA fantasma es demasiado buena, en lugar de que la IA de pac-man sea demasiado débil?
Ian Schreiber
@Ian La IA fantasma es exactamente como es en el juego, pero el diseño del tablero no es el mismo. Es solo un diseño de cuadrícula simple que limita con el diseño de su icono (4x4, etc.). El PacMan actual es el punto más cercano que no tiene un fantasma entre él y el punto. Se dirigirá directamente hacia un fantasma siempre que haya puntos en el medio. Quizás solo necesito mirar unos pasos más allá del punto más cercano y determinar si esa es una buena dirección. Dado que esta lógica de búsqueda de dirección completa tiene que ocurrir en cada movimiento celular, también debe ser relativamente simple y rápido.
Jake Wharton el
Investigue la difusión colaborativa, podría ayudarle de alguna manera.
user712092

Respuestas:

3

La idea de Tandem del algoritmo de escalada es buena. Otra es: alguna variación en A * para ver qué tan lejos puede llegar para ver cómo puede obtener el puntaje más alto en los próximos N turnos, donde N se sintoniza para dar el resultado deseado.

Los valores de puntuación que da pueden considerarse como "costo de movimiento": básicamente está en el camino correcto, pero tendrá que ajustar los valores hasta obtener el resultado que desea.

En términos generales (no específicos de PacMan), debe asignar valores apropiados para

  • Herido al otro chico.
  • Mató a otro chico.
  • Alcanzó algún otro objetivo (que no sea matar)
  • Me lastimé.
  • Fue asesinado.

y luego busque el movimiento que conducirá a la puntuación máxima N turnos en el futuro. También es posible que desee evitar movimientos que conduzcan a una puntuación inferior a X (por ejemplo, el costo de morir) N se convierte en el futuro.

Una vez que haya anotado todos los movimientos posibles, haya agregado bonificaciones por lo bien que podría salir en el futuro y deducido por lo mal que podría salir en el futuro, entonces simplemente ordena la matriz y toma el mejor movimiento.

¡Déjenos saber cómo resulta!

Olie
fuente
0

Vas a realizar una búsqueda.

  • Nodo / Estado: ubicación de Pacman, ubicaciones de fantasmas, ubicaciones de pellets, puntaje total, vidas totales.
  • Transición: Pacman se mueve hacia arriba, abajo, izquierda o derecha. Si Pacman se muda a una pared y cambia de ubicación, eso está totalmente bien (podría conducir a algunas estrategias de estancamiento realmente interesantes). Si Pacman golpea a un fantasma, elimina una vida y muévelo a él y a los fantasmas al origen.
  • Costo: si Pacman se mueve a una pastilla 1, si se mueve a un espacio vacío 2.
    El costo es un poco complicado, ya que no es obvio. La función de costo que describí alentará a Pacman a terminar el nivel. Esto impide una posible estrategia y simplemente acampar esperando que aparezca la fruta de bonificación. Pero creo que queremos que el AI Pacman termine el laberinto incluso si produce una puntuación más baja.
  • Objetivo: puntuación máxima alcanzada. Eso significa que se comen todos los gránulos, fruta y gránulos de energía.

A * o UCS son excelentes cuando se busca un gol. La forma en que describí el Estado / Transición / Meta encontrará un gran camino para Pacman, la IA no necesita considerar específicamente evitar la muerte o buscar fruta. Lo hará solo. Dado que el juego es completamente determinista, puedes "buscar" desde la ubicación inicial de Pacman y encontrar el camino óptimo para caminar hasta el final (todos los pellets consumidos) como un cálculo previo y simplemente hacer que AI Pacman recorra ese camino, no sobre la marcha AI. El principal inconveniente de este enfoque es que fácilmente podría salirse de control en el tiempo de CPU y el consumo de memoria.

En lugar de dedicar la CPU y la memoria a realizar una búsqueda completa, puede realizar una búsqueda parcial sobre la marcha.

Todavía puede usar UCS / A *, pero deje de buscar después de que Nse hayan inspeccionado los nodos y simplemente use la mejor ruta encontrada hasta ahora. Este enfoque es bueno, ya que puede sintonizar Npara encontrar el equilibrio entre velocidad y precisión.

Otro método que me gusta especialmente es la búsqueda de árboles en Montecarlo. En este método, dejas que Pacman realice una caminata aleatoria de Nmovimientos. Después de cada caminata aleatoria, registra su movimiento inicial y puntaje final. Realiza Mcaminatas aleatorias (o simplemente sigue haciéndolas hasta que te quedes sin tiempo o lo que sea). Elija el movimiento inicial con el mejor promedio de las caminatas aleatorias.

Estas búsquedas parciales tienen un serio inconveniente. Si la búsqueda con UCS y Pacman no puntúa en absoluto en los primeros Nnodos inspeccionados, se quedará atascado y, como todos los movimientos son igualmente malos.
A * no tendría este problema siempre que la heurística tuviera cuidado de acercar a Pacman a los gránulos no consumidos.
MCTS podría ser capaz de evitar este problema si la caminata aleatoria está sesgada para moverse hacia perdigones sin comer y la caminata aleatoria nunca se detiene antes de anotar (es decir, la caminata aleatoria continúa si Pacman tiene un puntaje de 0.

deft_code
fuente