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