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,616