Pues es muy, muy simple, y no tiene nada que ver con entropias del universo y esas cosas -que me interesan mucho pero no tienen mucho que ver, por cierto, el principio de causalidad no es cierto en cuántica, aunque a Einstein le puso los pelos de punta, y si en 20 años hemos conseguido unificar relatividad y cuantíca, me sorprendería muchisimo, yo apuesto mas por 50-100 años siendo optimista.
Aquí tienes el esquema del algoritmo:
Tienes una simulación de un sistema físico, el que sea (el coche con su pista), que se puede "conducir" modificando solo ciertos parámetros que le permites (grados de libertad, en este caso solo un parámetro, es decir, puedo girar el volante un poco cada vez, con positivo a la derecha y negativo a la izquierda).
En cada décima de segundo, mi coche ha de decidir ese parámetro: cuanto suma al giro del volante.
La idea es que se numeran todas las posibles acciones (en mi caso uso dos, que serían dos valores numericos, giro +0.5 o giro -0.5, pero en general serían N vectores con tantas componentes como grados de libertad tengas) y luego se "puntuan" y se hace una media ponderada (de los N vectores, pero en nuestro caso son 0.5 y -0.5 simplemente).
Para puntuar una opción, por ejemplo girar un poco a la derecha, te imaginas que haces ese giro y usas la simulación para ver donde estarías (un poco mas a la derecha, no mucho), y ahora, desde ese punto inicial "un poco a la derecha", simulas 1000 veces como se moverá el coche en los próximos 5 o 6 segundos, usando intervalos de 0.1s como en la simulación "de verdad", pero esta vez moviendo el volante "al azar", con lo que obtienes 1000 "puntos finales", es decir, mil posibles futuros o posiciones del coche dentro de 5s.
Ahora, de esas 1000 futuras posiciones,
eliminas las "malas" (te estrellas con el borde de la pista) (nota: no había que eliminar las malas, funcionan igual de bien que las buenas aunque suene raro y son necesarias, en los videos a partir del 4 se ve que los choques se contabilizan como puntos, y el kart va mucho mejor
) y de las que te quedan, eliminas también las que sean "casi idénticas" a otra de la lista. En mi caso elimino las que están a menos de 5 pixeles de otra. Con eso, obtienes un "número de posibles futuros distintos" para la decisión "gira un poco a la derecha".
Repites para la izquierda, y ya tienes todo para tomar tu decisión: Si para la derecha encontraste 78 "finales felices diferentes" y para la izquierda 15, tienes que la decisión "+0.5" va ponderada por 78/(78+15) mientras que la decisión "-0.5" pondera por 15/(78+15), y ya esta, el resultado es el giro que has de darle al coche.
Giro inteligente:= +0.5 * 78/(78+15) -0.5 * 15/(78+15)
Ya lo tienes, haces ese giro, avanzas en la simulación 0.1s, y repites... y fijate que en un caso más complejo, "+0.5" sería un vector (array of float) y listo, sacas la media componente a componente y listo.
Si ahora veis el vídeo lo visualizareis perfectamente: El coche lanza miles de rayos "al futuro", unos son rojos (parten de "un poco a la derecha") y otro azules (izquierda), de estos, solo algunos terminan bien y son diferentes a los otros: esos son los puntos rojos y azules que forman una nube delante del coche. En cada momento, la cantidad de puntos rojos y de azules te dice para donde debes girar el volante: misma cantidad, deja el volante como lo tienes, mas rojos, gíralo un poco a la derecha, etc.
Realmente simple, si alguien se ha peleado con redes neuronales sabrá que son muchiiiismo más complejas y que no dan estos resultados, mucho menos "en tiempo real" como casi consigue este sistema.
Yo personalmente lo imagino como un caracol de carreras con muchos "cuernos": el caracol también puede ir a la derecha o la izquierda, y para decidirlo, alarga todos sus cuernos para adelante, y cuanta cuantos no han chocado con nada, como tiene la mitad saliendo de una parte de su cabeza y la otra mitad de la otra, imaginatelos pintados de rojo y azul. Ya esta, si mas cuernos rojos no chocan, va a la derecha, y si ganan los azules, va a la izquierda.
Espero que se me haya entendido!
Las integrales que conste que me dejaron helado a mi también, al final pase de ellas y probé a entenderlo sin formulas, y luego volví a las integrales y entonces si que tenían todo el sentido (y si las lees ahora veras el sentido): La primera integral es sobre todas las posibles decisiones (en mi caso sería el intervalo +5,-5 porque solo tengo un grado de libertad), y la segunda integral es sobre los posibles futuros después de tomar la decisión de la primera integral.
La verdad es que vi la luz cuando comenta que usando "montecarlo" se podía convertir a un algoritmo usable... vamos, que puedes pasar mucho de las integrales, elegir a mano o aleatoriamente N posibles acciones (2 en mi caso), y probar 10.000 veces a ver el futuro que te depara, quedarte con futuros "distintos" según tu criterio, y usar la cuenta de la vieja para obtener los coeficientes a usar en cada posible acción.