Atención: Nunca he hablado de esto en profundidad con nadie, así que lo voy a soltar todo aquí. Esto será largo y muy posiblemente tedioso.
Escribí una simple simulación de teoría de juegos evolutivos en R, basada principalmente en el modelo basado en agentes en este documento de 1991 por Kristian Lindgren: Página en lib.chalmers.se, que encontré leyendo este artículo de 2013 de W Brian Arthur: Página en ineteconomics.org. Añadiré que no me permití leer el artículo de Lindgren antes de escribir el código, por lo que no es una réplica exacta.
Aquí está la esencia del modelo, que se ejecuta en el «tiempo»: hay una población (de un tamaño fijo – esto es realmente simple), y cada período de tiempo, la población se empareja al azar en parejas. A continuación, cada una de estas parejas juega al dilema del prisionero, en el que cada «jugador» puede elegir entre cooperar o desertar (es decir, «fastidiar») a su compañero. El resultado de este dilema del prisionero determina las posibilidades de cada uno de los dos jugadores de sobrevivir a la siguiente ronda.*
La elección de la estrategia de un jugador, por supuesto, no es aleatoria: cada jugador elige si cooperar o desertar basándose en su estrategia, que toma como entradas su propio historial de jugadas y el de su compañero en los dos últimos periodos.** Esta estrategia es la que evoluciona con el tiempo: en cada periodo, cada jugador superviviente tiene la posibilidad de que uno de sus «genes de estrategia» «mute».»***
Por último, una vez que se han jugado todas las partidas y se ha decidido quién sobrevivirá al siguiente periodo (de forma aleatoria, basándose en las probabilidades de supervivencia de los jugadores, que vienen determinadas por sus elecciones y las de sus compañeros entre cooperar o desertar), los miembros supervivientes de la población se «replican» de forma aleatoria (para mantener fijo el tamaño de la población), y posiblemente también mutan.
Entonces, ¿cómo funciona esta simulación en la práctica? Una simulación de 25.000 periodos con una población de 2.000 personas, que duró unos 80 segundos, arrojó los siguientes resultados, en los que la línea negra indica el porcentaje de la población que coopera en un periodo de tiempo determinado y la línea azul indica el porcentaje de la población que sobrevive en un periodo de tiempo determinado (ambos registrados cada 25 periodos).
Como se puede ver, incluso este modelo tan simple produce una dinámica de población interesante. En particular, la elección dominante cambia entre la cooperación y la deserción, pero una u otra puede seguir siendo dominante durante miles de períodos. En una simulación de 500.000 periodos que realicé, la cooperación y la deserción se intercambiaban como opción dominante, con «reinados» de duración variable: a veces sólo decenas o cientos de periodos, y otras veces decenas de miles. Además, había «épocas de cambio» que duraban cientos o miles de periodos en los que la población fluctuaba rápidamente entre >90% y <10% eligiendo la cooperación, para finalmente establecerse en un extremo de este espectro durante miles de periodos.
El siguiente paso, creo, es ampliar este marco a un escenario «tribal», es decir, incorporar grupos de agentes que deben cooperar entre sí para competir con otros grupos. Y quizás incluso se podría incorporar la cooperación entre grupos.
Si te interesa el código R, házmelo saber. Es un poco desordenado pero bastante corto, ~100 líneas en total, y me encantaría hablar con alguien sobre él.
* – Por definición, el dilema del prisionero siempre está estructurado de la siguiente manera: si ambos jugadores cooperan, ambos reciben una alta recompensa (en este caso, una alta probabilidad de sobrevivir); si ambos jugadores desertan o se «joden mutuamente», ambos tienen una baja probabilidad de sobrevivir; y si uno coopera y el otro deserta (jode al cooperador), el cooperador tiene una muy baja probabilidad de sobrevivir, mientras que el desertor tiene una muy alta probabilidad de sobrevivir. El juego está estructurado de manera que, pase lo que pase, siempre le conviene a un jugador desertar, pero ambos jugadores estarían mejor si pudieran acordar cooperar de alguna manera. En mi código, cambié las probabilidades de supervivencia, pero las que elegí (arbitrariamente) fueron las siguientes 95% para desertar contra un cooperador (desertar con éxito), 90% para cooperar con éxito, 60% para desertar contra un desertor (desertar sin éxito) y 50% para cooperar con un desertor (cooperar sin éxito).
** – Se puede esperar, por ejemplo, que una buena estrategia sea desertar si su pareja desertó el último periodo (porque no puede’esperar que sea digna de confianza); desertar si usted desertó el último periodo (porque su pareja no puede’esperar que sea digna de confianza); y cooperar si ambos cooperaron el último período, porque ambos tienen razones para creer que el otro es digno de confianza, ambos estarán relativamente bien si ambos cooperan, y cooperar ahora es una forma de señalar al socio del próximo período que usted es un cooperador. De hecho, esta es una buena estrategia, y limpia en el sentido de que es cooperativa, pero es bastante buena para sobrevivir a los «malos tiempos» en los que la población está desertando de forma abrumadora.
*** – Dado que cada agente toma exactamente cuatro jugadas históricas diferentes como entradas en su estrategia, y dado que cada jugada es binaria, es decir, «cooperado» o «no cooperado».es decir, «cooperó» o «desertó», hay exactamente 4^2 = 16 entradas posibles para su estrategia, por lo que tiene 16 «genes de estrategia», cada uno de los cuales es simplemente un 0 (para «cooperar») o un 1 (para «desertar»). Una «mutación» es simplemente cambiar uno de estos genes de 0 a 1 o viceversa.