Avertissement : Je'n'ai jamais vraiment parlé de cela en long et en large à qui que ce soit, alors je'laisse tout sortir ici. Ce sera long et très probablement fastidieux.
J'ai écrit une simulation simple de la théorie des jeux de l'évolution en R, basée principalement sur le modèle à base d'agents dans cet article de 1991 de Kristian Lindgren : Page sur lib.chalmers.se, que j'ai trouvée en lisant cet article de 2013 de W Brian Arthur : Page sur ineteconomics.org. J'ajouterai que je ne me suis pas permis de lire l'article de Lindgren avant d'écrire le code, donc ce n'est pas une réplique exacte.
Voici l'essentiel du modèle, qui se déroule dans le " temps " : il y a une population (de taille fixe - c'est vraiment simple), et à chaque période de temps, la population est appariée aléatoirement par paires. Ensuite, chacune de ces paires joue le dilemme du prisonnier, où chaque "joueur" peut choisir de coopérer avec son partenaire ou de le trahir (c'est-à-dire de le "baiser"). L'issue de ce dilemme du prisonnier détermine les chances de chacun des deux joueurs de survivre jusqu'au tour suivant.*
Le choix de la stratégie d'un joueur n'est bien sûr pas aléatoire : chaque joueur choisit de coopérer ou de faire défection en fonction de sa stratégie, qui prend comme entrées son propre historique de jeu et celui de son partenaire au cours des deux dernières périodes.** C'est cette stratégie qui évolue dans le temps : à chaque période, chaque joueur survivant a une chance de voir l'un de ses " gènes de stratégie " " muter "."***
Enfin, une fois que toutes les parties ont été jouées et qu&rsquoil a été décidé qui survivra à la période suivante (de manière aléatoire, en fonction des probabilités de survie des joueurs&apos ; qui sont déterminées par leur choix et celui de leurs partenaires&apos ; entre coopérer et faire défection), les membres survivants de la population sont "répliqués" de manière aléatoire (pour que la taille de la population reste fixe), et éventuellement mutés également.
Alors, comment cette simulation fonctionne-t-elle en pratique ? Une simulation sur 25 000 périodes avec une population de 2 000 personnes - qui a duré environ 80 secondes - a donné les résultats ci-dessous, où la ligne noire désigne le pourcentage de la population qui coopère dans une période donnée, et la ligne bleue désigne le pourcentage de la population qui a survécu dans une période donnée (toutes deux enregistrées toutes les 25 périodes).
Comme vous pouvez le voir, même ce modèle très simple donne une dynamique de population intéressante. En particulier, le choix dominant bascule entre la coopération et la défection, mais l'un ou l'autre peut rester dominant pendant des milliers de périodes. Dans une simulation de 500 000 périodes que j'ai effectuée, la coopération et la défection ont continué à s'échanger les places en tant que choix dominant, avec des "règnes" de durées variables - parfois seulement des dizaines ou des centaines de périodes, et parfois des dizaines de milliers. En outre, il y avait des "ères de commutation" qui duraient des centaines ou des milliers de périodes, où la population fluctuait rapidement entre >90% et <10% choisissant la coopération, pour finalement se fixer sur une extrémité de ce spectre pendant des milliers de périodes.
La prochaine étape, je pense, est d'étendre ce cadre à un cadre "tribal", c'est-à-dire d'incorporer des groupes d'agents qui doivent coopérer entre eux pour rivaliser avec d'autres groupes. Et peut-être même que la coopération entre les groupes pourrait être incorporée.
Si vous'êtes intéressé par le code R, faites-le moi savoir. Il'est un peu désordonné mais assez court, ~100 lignes au total, et j'aurais un plaisir fou à en parler à quelqu'un.
* - Par définition, le dilemme du prisonnier's est toujours structuré de la manière suivante : si les deux joueurs coopèrent, ils reçoivent tous deux un gain élevé (dans ce cadre, une forte chance de survivre) ; si les deux joueurs font défection ou " se foutent sur la gueule ", ils ont tous deux une faible chance de survivre ; et si l'un coopère et l'autre fait défection (se fout sur la gueule du coopérateur), le coopérateur a une très faible chance de survivre, tandis que le transfuge a une très forte chance de survivre. Le jeu est structuré de telle sorte que, quoi qu'il arrive, il est toujours dans l'intérêt d'un joueur de faire défection - mais les deux joueurs seraient mieux lotis s'ils pouvaient se mettre d'accord pour coopérer. Dans mon code, je modifie les probabilités de survie, mais celles que j'ai choisies (arbitrairement, je l'admets) sont les suivantes : 95 % pour la défection contre un coopérateur (défection réussie), 90 % pour la coopération réussie, 60 % pour la défection contre un transfuge (défection non réussie) et 50 % pour la coopération avec un transfuge (coopération non réussie).
** - On peut s'attendre, par exemple, à ce qu'une bonne stratégie consiste à faire défection si votre partenaire a fait défection la période précédente (parce que vous ne pouvez pas vous attendre à ce qu'elle soit digne de confiance) ; faire défection si vous avez fait défection la période précédente (parce que votre partenaire ne peut pas s'attendre à ce que vous soyez digne de confiance) ; et coopérer si vous avez tous les deux coopéré la période précédente, parce que vous avez tous les deux des raisons de croire que l'autre est digne de confiance, vous serez tous les deux relativement bien lotis si vous coopérez tous les deux, et coopérer maintenant est une façon de signaler au partenaire de la période suivante que vous êtes un coopérateur. En effet, il s'agit d'une bonne stratégie, et soignée en ce qu'elle'est coopérative, mais elle est assez bonne pour survivre aux "mauvaises périodes" dans lesquelles la population fait massivement défection.
*** - Puisque chaque agent prend exactement quatre jeux historiques différents comme entrées dans sa stratégie, et puisque chaque jeu est binaire, i.c'est-à-dire " coopéré " ou " défectionné ", il y a exactement 4^2 = 16 entrées possibles dans sa stratégie, donc il a 16 " gènes de stratégie ", dont chacun est juste un 0 (pour " coopérer ") ou un 1 (pour " défectionner "). Une "mutation" est juste le changement d'un de ces gènes de 0 à 1 ou vice-versa.