TD 5 : Le dilemme du prisonnier
Transcription
TD 5 : Le dilemme du prisonnier
TD 5 Le Dilemme du Prisonnier TD 5 : Le dilemme du prisonnier Décembre 2011 Dans ce TD, on modélisera avec Maple le dilemme du prisonnier, un des exemples les plus connus de situation étudiée par la théorie des jeux, qui montre simplement que même quand coopérer est dans leur intérêt commun, deux individus ne collaborent pas forcément. On tentera ensuite de programmer des stratégies efficaces pour la version répétée du jeu et de les faire s’affronter entre elles. Le dilemme du prisonnier On considère deux prisonniers (A et B) retrouvés ensemble sur les lieux d’un crime. La police, cherchant à connaître les responsabilités de chacun, leur propose (séparément) l’arrangement suivant : "Vous pouvez garder le silence et protéger votre complice ou alors le trahir et rejeter toute la faute sur lui. Si vous gardez le silence et que lui également, vous n’écoperez chacun que de 1 mois de prison. Si au contraire lui vous trahit, il repartira libre, mais vous passerez 1 an en prison (l’inverse est également vrai, il passera 1 an en prison si vous le trahissez et qu’il garde le silence). Dans le cas ou vous vous dénoncez tous les deux, vous passerez chacun 3 mois en prison." Que choisissez-vous ? Exercice 1 (Choix optimal ) 1. Quel choix doivent faire les deux prisonniers pour optimiser leur situation globale ? 2. Pour minimiser sa propre peine de prison, qu’est-ce qu’un prisonnier va naturellement décider ? Programmation Pour implémenter ce jeu en Maple de façon interactive, on va utiliser pour la première fois des fonctions d’entrée-sortie (print et readline), ainsi que des chaînes de caractères (type string) Exercice 2 (Programmation) 1. Écrire prisonnier:=proc(choixA,choixB), la procédure qui renvoie le couple correspondant aux mois de prisons reçus par A et B selon leur choix. On représentera la coopération par la chaîne "C" et la trahison par "T" 2. Écrire prisonnier_interactif:=proc(), la version interactive de la procédure précédente. Au lieu de prendre les choix des prisonniers en argument, celle-ci écrit avec print les questions "Que choisit le joueur A/B ?" et lit la réponse avec readline. Elle affiche ensuite le résultat sous la forme "Le joueur A va passer x mois en prison et le joueur B y" avant de renvoyer le couple demandé. Forme généralisée : le dilemme du prisonnier itéré En terme de jeu et d’élaboration de stratégie le dilemme du prisonnier n’est pas très intéressant, puisqu’un prisonnier a toujours intérêt à trahir son compagnon. On va s’intéresser à une version généralisée du jeu, où le choix entre coopérer et trahir se fait de façon répétée et où les coups successifs sont connus des participants. De cette manière il peut être intéressant de ne pas trahir pour mettre l’autre joueur en confiance et ultimement gagner plus de points. Les règles du jeu changent un peu dans cette version. De façon moins romanesque les deux joueurs sont maintenant deux personnes tenant chacun dans leur main deux cartes : Coopérer et Trahir. À chaque étape ils pose une carte face cachée sur la table, qu’ils retournent ensuite simultanément. Ils gagnent chacun un nombre de points donné par le tableau suivant (attention, les valeurs ne sont pas exactement les mêmes que pour le dilemme simple) : [email protected] 1 pauldcsimon.net TD 5 Le Dilemme du Prisonnier A,B Coopérer Trahir Coopérer (3,3) (5,0) Trahir (0,5) (1,1) Le nombre d’étapes du jeu n’est pas fixe. Si on sait quand le jeu va finir, on aura toujours intérêt à trahir au dernier tour, et donc, à l’avant-dernier tour, sachant que l’autre joueur trahira au coup suivant, à le trahir également, et ainsi de suite. Par récurrence, il est clair qu’on optera raisonnablement tout le temps pour la trahison. Élaboration de stratégies On définit une stratégie comme une fonction qui étant donné l’historique de la partie définit le prochain coup à jouer. On peut obtenir une grande variété de stratégies a priori raisonnables en introduisant plus ou moins de pardon, d’intransigeance ou de rouerie. On va tenter de les départager en les faisant s’affronter entre elles. Nos stratégies seront toutes des procédures sous la forme strategie:=proc(historique,joueur). historique contient la liste (éventuellement vide) des coups déjà joués sous la forme d’une liste de couples sur {”T ”, ”C”} et joueur vaut "A" ou "B" selon qui est le joueur (celui qui a joué les premiers coups des couples ou les seconds. Cette procédure doit renvoyer "C" ou "T". Exercice 3 1. Implémenter les stratégies suivantes : – Pure gentillesse : Toujours coopérer – Lunatique : Trahir une fois sur deux – Rancune tenace : coopérer jusqu’à ce que l’adversaire trahisse, puis toujours trahir – Donnant-donnant : commencer par coopérer puis toujours jouer ce que l’autre a joué au tour précédent 2. Réfléchir à d’autres stratégies (au moins 3) puis les implémenter (utiliser éventuellement le hasard). Exercice 4 (Organisation d’un tournoi ) Écrire une procédure tournoi:=proc(strategieA,strategieB qui fait s’affronter les deux stratégies données en argument sur un nombre de tours tiré au hasard (de l’ordre d’une centaine) et renvoie le couple des scores finaux. Vous pouvez faire afficher à votre programme les résultats de chaque coup (avec print). Exercice 5 (Version interactive) Adapter le programme précédent pour permettre à un humain de jouer contre l’ordinateur, ou à deux humains de jouer entre eux. Au lieu de modifier la procédure tournoi, vous pouvez simplement écrire une stratégie particulière strategieHumain qui demande au joueur les coups à jouer. [email protected] 2 pauldcsimon.net