% Dilemme des prisonniers
% 
% Représentation graphique du dilemme des prisonniers.
% Attention, le programme est gourmand en mémoire et prend du temps.

% jbr, 26-2-1997.

% Initialisation des données
clear
nbiter=16;
b=1.85;				% bénéfice de la traîtrise
N=60;				% taille de l'échiquier
p=0.1;				% proportion des traîtres
mg=[1 0				% matrice des gains
    b 0];
marque=zeros(N,N);	
ns=marque;
coul=ns;
co=[];
	
c=[1 2
   3 4];			% matrice des couleurs

% initialisation de l'échiquier
%s=(rand(N)<p)+1;
s=ones(N,N);
s(30,30)=2;

% conditions au bord
cb=[N, 1:N, 1];		% conduit vers les voisins du bord

% Jeu
for m=1:nbiter
	for i=1:N		% calcule les résultats de chaque joueur
		for j=1:N
			ma=0;
			for k=-1:1
				for l=-1:1
					ma=ma+mg(s(i,j),s(cb(i+k+1),cb(j+l+1)));
				end
			end
			marque(i,j)=ma;
		end
	end
	for i=1:N		% cherche la meilleure marque de chaque groupe		
		for j=1:N	% de voisins, et calcule les nouvelles stratégies.
			mm=marque(i,j);
			ns(i,j)=s(i,j);
			for k=-1:1
				for l=-1:1
					if marque(cb(i+k+1),cb(j+l+1))> mm
						mm=marque(cb(i+k+1),cb(j+l+1));
						ns(i,j)=s(cb(i+k+1),cb(j+l+1));
					end
				end
			end
		end
	end
	
	for i=1:N
		for j=1:N
			coul(i,j)=c(ns(i,j),s(i,j));
		end
	end
	s=ns;
	co=[co,coul];
end

% affichage à l'écran
C=[0 0 0			% noir
   1 0 0			% rouge
   1 1 0			% jaune
   0 0 1];			% bleu
colormap(C);
montage(co,[N N nbiter]);
axis equal
axis off
figure(gcf)
			
			
	
