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:
- Inicialice un contador de puntaje para cada dirección con un valor de cero.
- 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.
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:
- Tiene un punto: más 10
- Tiene un poder: más 50
- Tiene una fruta: más el valor de la fruta (varía según el nivel)
- Tiene un fantasma asustado: más 200
- Tiene un fantasma que viaja hacia PacMan: resta 200
- Tiene un fantasma viajando lejos de PacMan: no hagas nada
- Tiene un fantasma que viaja perpendicular: resta 50
- 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.
- 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
fuente
Respuestas:
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
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!
fuente
Definitivamente mira este video: http://www.youtube.com/watch?v=2XjzjAfGWzY
Probablemente querrás algún tipo de algoritmo de búsqueda de senderos para escalar colinas .
fuente
Vas a realizar una búsqueda.
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.
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
N
se hayan inspeccionado los nodos y simplemente use la mejor ruta encontrada hasta ahora. Este enfoque es bueno, ya que puede sintonizarN
para 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
N
movimientos. Después de cada caminata aleatoria, registra su movimiento inicial y puntaje final. RealizaM
caminatas 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
N
nodos 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.
fuente