Axelrod, le tournois

Au début des années 1980, Robert Axelrod avait organisé un concours d’algorithmes pour un dilemme du prisonnier répété. Je vous propose de remettre ça tous les ans, le premier vendredi de mars, en mettant à profit les progrès réalisés par l’informatique depuis (notamment en termes d’accessibilité au commun des mortels) et les possibilités que nous offre l’existence d’internet.

Le Principe

Le but du jeu est de créer l’algorithme qui, lorsqu’il sera confronté à tous les autres lors d’un tournoi, gagnera le plus de points.

En notant $n$ le nombre d’algorithmes en lice, un tournois est donc composé de $\binom{n}{2}$ matches :

$$\binom{n}{2} = \frac{n!}{(n-2)!2!}$$

Chaque match est composé de 2000 dilemmes du prisonnier successifs (2000 rounds). Cette année vous le savez mais, dès 2019, vous ne pourrez plus exploiter cette information (le nombre de rounds sera inconnu).

La matrice des paiements retenue est celle de Robert Axelrod dans les années 1980 :

CD
C[3,3][0,5]
D[5,0][1,1]

Pour la première année, le tournois aura lieu le 2 mars 2018. Les résultats seront publiés ici même (et sur Twitter).

Programmation

Vos algorithmes doivent être des fonctions codées sous R (téléchargeable gratuitement ici) qui respectent la forme suivante :

foo = function(p, o, n = 2000) {
 # faire quelque chose...
 return(res)
}

Où :

  • foo est le nom de la fonction (c'est-à-dire de votre algorithme),
  • L'argument p est la liste des coups joués par foo depuis le début de la partie (c'est une vecteur de logical ou booléens — c'est-à-dire une suite de TRUE pour coopération et de FALSE pour défaut),
  • L'argument o est l'historique des coups joués par l'adversaire de foo durant cette partie (même format),
  • L'argument n est de nombre de rounds dans une partie (par défaut, n = 2000),
  • res est le coup joué (TRUE s'il coopère ou FALSE s'il fait défaut).

Vous pouvez donc très facilement savoir où vous en êtes dans la partie : si la longueur de p est égale à 0 (length(p) == 0) c’est que vous jouez le premier round, si elle est égale à 5, c’est que vous jouez le 6ème round et si elle est égale à n-1 c’est que allez jouer le dernier coup de ce match.

Si vous ne savez pas coder sous R (ou pas coder du tout), vous pouvez quand même participer en décrivant précisément ce que fait votre algo. J’essaierais de le programmer pour vous.

Si vous cherchez de l’inspiration, vous pouvez consulter la liste des algos déjà en lice et tester vos œuvres avec les fonctions prévues à cet effet (je fournis aussi quelques exemples d’utilisations).

Lisez le README sur Github pour plus de détails (oui, c'est en anglais).

Participer

Pour soumettre vos algos, utilisez ce formulaire (avant le 1er mars 2018 à minuit, heure de Paris, au plus tard) :

Si vous avez des questions, posez-les dans les commentaires ci-dessous.

Aucun commentaire:

Enregistrer un commentaire

ChallengeR #8 - Solutions

Votre mission consistait donc à trouver un moyen de faire en sorte que : > x == 0 [1] TRUE > x + 1 == 2 [1] TRUE > x / 2 == 1 [1...