Skynet también juega a pacman

+100

+230

¡Hola!

/JavierLuna

blog.thequietdeveloper.com

@javierlunamolina

Soy Javi, Luna para los amigos

Mi "muso" Mihto

~ El menú del día ~

  • ¿Cómo llego de un sitio a otro?
    • Dijkstra
    • A *
  • ¿Cómo sé cuál es el mejor movimiento posible?
    • MinMax
  • A mí déjame aprender a solas...
    • NEAT

Pathfinding

Pathfinding

  • Algoritmos para "encontrar un camino"
  • Suele ser el camino más corto
  • Se basan en la teoría de grafos
  • Los dos más famosos son: Dijkstra y A *, aunque hay muchos más

Grafos 101

Se componen de:

  • Vértices: También llamados nodos o puntos.
  • Aristas: Conectan dos nodos entre sí. Pueden tener "peso" (la distancia entre los nodos por ejemplo)

¿Os suena? ¡Claro que sí!

Aplicándolo a videojuegos..

Dibujamos los nodos

Los conectamos con aristas

¡Habemus grafo!

Solución obvia...

Pero no para la máquina

YOU ARE HERE

Algoritmo de Dijkstra

  • No tiene información alguna de dónde está el destino
  • "Fuerza bruta" hasta que encuetra su objetivo.
  • Una vez que lo encuentra, sigue evaluando caminos (que sean más cortos que la solución anteriormente encontrada)
  • Garantiza que el camino encontrado es el más corto

Algoritmo de Dijkstra

Dijkstra algorithm: Exists

 

My CPU:

Algoritmo de A *

  • Conoce cierta información de dónde está la solución. Función heurística.
  • También se considera "fuerza bruta", pero prioriza los posibles caminos con mayor puntuación heurística (best first).
  • No garantiza que el camino encontrado sea el más corto.

Función heurística

  • Ayuda al algoritmo a saber más o menos cómo de buena es una solución
  • Se ejecuta por cada posible solución
  • Para una distancia entre dos puntos...
    • Distancia euclídea: Precisa pero muy cara de ejecutar (sqrt)
    • Distancia Manhattan: Suma de las diferencias (absolutas) de las coordenadas. Muy barata pero no tan precisa.
  • No hay una heurística perfecta: A veces interesa más precisión que coste, ¡otras lo contrario!

Python time!

pip install networkx

import networkx as nx
from networkx.algorithms.shortest_paths.weighted import dijkstra_path
from networkx.algorithms.shortest_paths.a_star import  astar_path

G = nx.Graph()

G.add_node(1) # Los nodos pueden ser cualquier objeto hasheable
G.add_node(2)
G.add_node(3)

G.add_edge(1, 2)
G.add_edge(2, 3)

dijkstra_path(G, 1, 3)

def heuristic(possible_node, solution):
  return abs(possible_node - solution)

astar_path(G, 1, 3, heuristic)

Zero-sum

Zero-sum

Un juego de suma de ceros es aquel en el que la ganancia de un jugador se equilibra con la pérdida del otro, y viceversa.

En resumen: "Si yo gano tú pierdes"

Empezamos la partida

Pongo mi X

X

...¿y ahora qué?

Minmax

  • Ayuda a elegir el siguiente movimiento minimizándo las ganancias del rival
  • En zero sum, esto equivale a ¡minimizar nuestras pérdidas y maximizar las ganancias!
  • "Fuerza bruta": Calcula una puntuación por cada escenario posible.
    • Escenario positivo: +1
    • Escenario negativo: -1

Minmax-vision

Minmax

Nuestro turno (IA): max

 Turno oponente: min

X

O

O

Nuestro tablero

O

X

X

X

X

X

O

O

O

Generación

X

X

X

O

O

O

O

X

X

X

O

O

O

O

X

X

X

O

O

O

O

+ 10

Generación

X

X

X

O

O

O

O

X

X

X

O

O

O

O

X

X

X

O

O

O

O

X

X

- 10

Nuestro turno (max)

+10

+10

-10

-10

-10

Max

Min

Max

Su turno (min)

+10

+10

-10

-10

-10

Max

Min

Max

+10

Nuestro turno (max)

+10

+10

-10

-10

-10

Max

Min

Max

+10

-10

-10

Solución

+10

+10

-10

-10

-10

Max

Min

Max

+10

-10

-10

+10

X

X

X

O

O

O

O

Esto no escala :(

X

X

X

O

O

O

O

Heurísticas al rescate: No evalúes todo el árbol

Hmmm...

HMMMMM...

Estos...CREO... que pintan bien

NEAT 👌

NEAT

"NeuroEvolution of Augmenting Topologies"

  • Generación de redes neuronales mediante algoritmos genéticos
  • ¿Aprendizaje automático? Sí, pero no
    • Aprender aprende solo
    • El aprendizaje se basa muchas veces en azar y no en qué está bien o qué está mal

Algoritmos genéticos

Algoritmos genéticos

  • Se basan en la evolución natural de Darwin
  • "Supervivencia del más apto"
  • ¿Cómo de apta es una solución? -> Función Fitness
  • Fases:
    • Generación
    • Selección
    • Operaciones genéticas
    • Terminación

NEAT bird

Inputs:

  • Posición y del pájaro
  • Y de las siguientes tuberías (arriba y abajo)
  • X de las siguientes tuberías
  • 4 en total

 

Output: Volar/No volar

 

Fitness: Número de tuberías que hemos atravesado

Demo!

/JavierLuna/neat-bird

¡Muchas gracias por la atención!

¿Alguna pregunta?

+100

???

Skynet también juega a pacman

By Javier Luna Molina

Skynet también juega a pacman

  • 1,525