2017-03-01 11:12:18 +01:00
# -*- coding:utf-8 -*-
2017-03-01 10:03:21 +01:00
############################
### ARE-DYNAMIC.py
###
### Auteurs:
2017-03-01 11:56:05 +01:00
### Julian Barathieu (3670170)
### Lucie Hoffmann (3671067)
2017-03-01 19:53:11 +01:00
### Nicolas Boussenina (3670515)
2017-03-01 11:56:05 +01:00
### Constance Poulain (3671006)
2017-03-08 10:56:31 +01:00
###
### Projet: Théorie des Jeux, Dilemne du Prisonier
### ARE-DYNAMIC 2016-2017 UPMC MIPI
###
######################
### Importations
2017-03-15 12:18:43 +01:00
import copy
2017-03-08 11:19:45 +01:00
import random
import numpy as np
import matplotlib as mpl
2017-03-15 11:40:43 +01:00
import matplotlib . pyplot as plt
2017-03-15 12:18:43 +01:00
import matplotlib . animation as animation
2017-04-10 17:53:27 +02:00
from tkinter import *
from tkinter . ttk import *
2017-03-08 10:56:31 +01:00
######################
### Variables Globales
# taille de la grille
TailleGrilleX = 15
TailleGrilleY = 15
2017-04-17 21:02:18 +02:00
# la grille
2017-03-15 10:25:35 +01:00
Grille = np . ndarray ( ( TailleGrilleX , TailleGrilleY ) )
2017-03-08 10:56:31 +01:00
# historique des grilles aux itérations précédentes
# utilisé durant l'affichage dynamique
HistoriqueGrilles = list ( )
# chaque StratsResultats[i] est un triplet [nb_utilisations, total_ans_prisons, utilisation_detail] avec:
# i = index de la stratégie en question
# nb_utilisations = nombre total d'utilisations de la stratégie
# total_ans_prisons = total d'années de prisons subies par les utilisateurs de la stratégie
2017-04-10 11:55:05 +02:00
# utilisation_detail[i] = une liste de triplets [utilisateurs, utilisations, prisons]
2017-04-17 21:02:18 +02:00
# utilisateur = nombre d'utilisateurs de la stratégie a la FIN de l'iteration i
# utilisations = le nombre de fois que la fonction stratégie a été appelée au course de l'itération i
# prisons = nombre total d'années de prisons pris par les utilisateurs de la stratégie au course de l'itération i
2017-03-08 10:56:31 +01:00
StratsResultats = list ( )
# liste des stratégies (fonctions Joueur^2 -> {0, 1} décidant si un joueur nie ou non en fonction de son adversaire)
ListeStrategies = list ( )
# liste des fonctions génératrices de grille
ListeGenGrille = list ( )
# génératrice de grille à utiliser
2017-03-15 10:25:35 +01:00
TypeGrilleInitiale = 3
2017-03-08 10:56:31 +01:00
2017-03-15 11:05:52 +01:00
# itération actuelle
Iteration = 0
2017-03-08 11:19:45 +01:00
# nombre max d'itérations
2017-03-29 11:26:02 +02:00
MaxIterations = 4
2017-03-15 10:25:35 +01:00
# stratégie par défaut
StratParDefaut = 0
# affichage dynamique
AffichageDynamique = True
2017-03-15 11:51:33 +01:00
# nécessaire pour matrice_init_pourcents_choisis()
ListePourcents = list ( )
2017-04-17 21:02:18 +02:00
# couleurs des stratégies (pour l'affichage dynamique)
2017-04-18 15:21:16 +02:00
CouleursStrat = [ ' b ' , ' r ' , ' black ' , ' g ' ]
2017-03-22 12:20:24 +01:00
2017-04-10 18:28:31 +02:00
# Vitesse de défilement des images dans l'affichage dynamique en millisecondes
Vitesse = 1
2017-04-10 17:53:27 +02:00
# Fonction pour le GUI
def saisir_les_pourcentages ( ) :
"""
2017-04-17 21:02:18 +02:00
S ' il y a eu clic sur le bouton du
type 4 , affiche 5 entry box pour
saisir les pourcentages voulus
2017-04-10 17:53:27 +02:00
"""
2017-04-17 21:02:18 +02:00
2017-04-10 17:53:27 +02:00
Label ( fenetre , text = " % s tratégie0: " ) . grid ( row = 9 , column = 0 )
2017-04-17 21:02:18 +02:00
per0 = IntVar ( )
2017-04-10 17:53:27 +02:00
Entry ( fenetre , textvariable = per0 , width = 3 ) . grid ( row = 9 , column = 1 )
Label ( fenetre , text = " % s tratégie1: " ) . grid ( row = 10 , column = 0 )
2017-04-17 21:02:18 +02:00
per1 = IntVar ( )
2017-04-10 17:53:27 +02:00
Entry ( fenetre , textvariable = per1 , width = 3 ) . grid ( row = 10 , column = 1 )
Label ( fenetre , text = " % s tratégie2: " ) . grid ( row = 11 , column = 0 )
2017-04-17 21:02:18 +02:00
per2 = IntVar ( )
2017-04-10 17:53:27 +02:00
Entry ( fenetre , textvariable = per2 , width = 3 ) . grid ( row = 11 , column = 1 )
Label ( fenetre , text = " % s tratégie3: " ) . grid ( row = 12 , column = 0 )
2017-04-17 21:02:18 +02:00
per3 = IntVar ( )
2017-04-10 17:53:27 +02:00
Entry ( fenetre , textvariable = per3 , width = 3 ) . grid ( row = 12 , column = 1 )
global ListePourcents
2017-04-17 21:02:18 +02:00
ListePourcents = [ per0 . get ( ) , per1 . get ( ) , per2 . get ( ) , per3 . get ( ) , per4 . get ( ) ]
2017-04-10 17:53:27 +02:00
2017-04-17 21:06:02 +02:00
#####################################
# Types:
# Coord = tuple(x, y)
# Joueur = dict("x", "y", "etat", "historique_etats", "strategie", "annees_de_prison", "historique_strategies")
# GrilleJoueurs = matrice2d(Joueur)
2017-03-08 10:56:31 +01:00
#####################################
### Génération de la matrice initiale
2017-04-17 21:02:18 +02:00
2017-03-08 10:56:31 +01:00
def gen_matrice_initiale ( ) :
2017-04-17 21:02:18 +02:00
return ( ListeGenGrille [ TypeGrilleInitiale ] ) ( )
2017-03-08 10:56:31 +01:00
##############################
### Execution des tours / jeux
def partie1v1 ( joueur , adversaire ) :
"""
2017-04-17 21:02:18 +02:00
Joueur ^ 2 - > int ^ 2
2017-03-08 10:56:31 +01:00
Effectue une partie à deux joueurs
2017-03-29 11:26:02 +02:00
Renvoie : paire ( prison_joueur , prison_adversaire )
2017-03-08 10:56:31 +01:00
"""
stratj = ListeStrategies [ joueur [ " strategie " ] ]
strata = ListeStrategies [ adversaire [ " strategie " ] ]
2017-04-17 21:02:18 +02:00
2017-03-08 10:56:31 +01:00
etatj = stratj ( joueur , adversaire )
etata = strata ( adversaire , joueur )
2017-04-17 21:02:18 +02:00
2017-03-08 10:56:31 +01:00
# 1 = avouer
# 0 = nier
if etatj == 0 :
if etata == 0 :
# nie-nie
ans_prison = ( 2 , 2 )
else :
# nie-avoue
ans_prison = ( 10 , 0 )
else :
if etata == 0 :
# avoue-nie
ans_prison = ( 0 , 10 )
else :
# avoue-avoue
ans_prison = ( 5 , 5 )
2017-03-15 11:51:33 +01:00
StratsResultats [ joueur [ " strategie " ] ] [ 0 ] + = 1
StratsResultats [ joueur [ " strategie " ] ] [ 1 ] + = ans_prison [ 0 ]
StratsResultats [ adversaire [ " strategie " ] ] [ 0 ] + = 1
StratsResultats [ adversaire [ " strategie " ] ] [ 1 ] + = ans_prison [ 1 ]
2017-03-15 11:40:43 +01:00
2017-03-15 11:51:33 +01:00
StratsResultats [ joueur [ " strategie " ] ] [ 2 ] [ Iteration ] [ 1 ] + = 1
StratsResultats [ joueur [ " strategie " ] ] [ 2 ] [ Iteration ] [ 2 ] + = ans_prison [ 0 ]
StratsResultats [ adversaire [ " strategie " ] ] [ 2 ] [ Iteration ] [ 1 ] + = 1
StratsResultats [ adversaire [ " strategie " ] ] [ 2 ] [ Iteration ] [ 2 ] + = ans_prison [ 0 ]
2017-04-17 21:02:18 +02:00
2017-04-10 17:29:39 +02:00
joueur [ " historique_etats " ] . append ( etatj )
adversaire [ " historique_etats " ] . append ( etata )
2017-03-15 11:05:52 +01:00
2017-04-10 17:36:13 +02:00
joueur [ " historique_strategies " ] . append ( stratj )
adversaire [ " historique_strategies " ] . append ( strata )
2017-04-17 21:02:18 +02:00
2017-03-22 11:29:42 +01:00
joueur [ " etat " ] = etatj
adversaire [ " etat " ] = etata
2017-03-08 10:56:31 +01:00
joueur [ " annees_de_prison " ] + = ans_prison [ 0 ]
adversaire [ " annees_de_prison " ] + = ans_prison [ 1 ]
2017-03-15 11:05:52 +01:00
2017-03-29 11:26:02 +02:00
return ans_prison
2017-03-08 11:19:45 +01:00
def partie8tours ( x , y ) :
2017-04-17 21:02:18 +02:00
"""
Coord - > NoneType
Effectue huit parties 1 v1 entre le joueur et chacun de ses voisins l ' un après l ' autre
2017-03-08 10:56:31 +01:00
"""
2017-03-08 11:19:45 +01:00
for i in range ( - 1 , 2 ) :
for j in range ( - 1 , 2 ) : #(i,j) sont les coordonnées de l'adversaire
2017-04-10 17:21:14 +02:00
if ( 0 < = x + i and x + i < TailleGrilleX ) and ( 0 < = y + j and y + j < TailleGrilleY ) and i != 0 and j != 0 :
2017-03-08 11:19:45 +01:00
partie1v1 ( Grille [ x ] [ y ] , Grille [ x + i ] [ y + j ] )
2017-03-08 10:56:31 +01:00
2017-03-08 11:19:45 +01:00
def partie_globale ( ) :
2017-03-08 10:56:31 +01:00
"""
2017-03-08 11:19:45 +01:00
Effectue une partie de huit par joueur
2017-03-08 10:56:31 +01:00
"""
2017-03-15 10:25:35 +01:00
global Grille
2017-03-08 11:19:45 +01:00
2017-04-10 17:21:14 +02:00
for i in range ( TailleGrilleX ) :
for j in range ( TailleGrilleY ) :
2017-03-08 11:19:45 +01:00
partie8tours ( i , j )
2017-04-17 21:02:18 +02:00
2017-03-08 11:19:45 +01:00
# Changement des stratégies
2017-03-29 11:26:02 +02:00
2017-03-08 11:19:45 +01:00
# On parcourt une copie de la grille pour avoir accès aux anciennes stratégies et non pas aux nouvelles adoptées
2017-03-29 09:46:20 +02:00
2017-03-29 11:26:02 +02:00
copie_grille = np . copy ( Grille )
2017-04-17 21:02:18 +02:00
for x in range ( len ( copie_grille ) ) :
2017-03-15 10:25:35 +01:00
for y in range ( len ( copie_grille [ 0 ] ) ) :
2017-03-29 11:26:02 +02:00
#(x,y) : joueur dont on va modifier la stratégie, si besoin
2017-03-15 10:25:35 +01:00
min_prison = copie_grille [ x ] [ y ] [ " annees_de_prison " ]
new_strat = copie_grille [ x ] [ y ] [ " strategie " ]
2017-03-08 11:19:45 +01:00
for i in range ( - 1 , 2 ) :
2017-03-15 10:25:35 +01:00
for j in range ( - 1 , 2 ) : #(x+i,y+j) : adversaires autour de (x,y)
2017-04-10 17:21:14 +02:00
if ( 0 < = x + i and x + i < TailleGrilleX ) and ( 0 < = y + j and y + j < TailleGrilleY ) and i != 0 and j != 0 :
2017-03-15 10:25:35 +01:00
if min_prison > copie_grille [ x + i ] [ y + j ] [ " annees_de_prison " ] :
new_strat = copie_grille [ x + i ] [ y + j ] [ " strategie " ]
2017-03-08 11:19:45 +01:00
Grille [ x ] [ y ] [ " strategie " ] = new_strat # on modifie la stratégie du joueur dans la Grille et pas dans la copie
2017-04-17 21:02:18 +02:00
2017-03-08 11:19:45 +01:00
# Réinitialisation du nb d'années de prison
2017-04-10 17:21:14 +02:00
for i in range ( TailleGrilleX ) :
for j in range ( TailleGrilleY ) :
2017-03-29 11:26:02 +02:00
Grille [ i ] [ j ] [ ' annees_de_prison ' ] = 0
2017-04-17 21:02:18 +02:00
2017-03-29 11:26:02 +02:00
return Grille
2017-03-08 10:56:31 +01:00
#####################################
### Fonction génératrices de matrices
def matrice_init_vide ( ) :
"""
2017-03-08 11:19:45 +01:00
Crée une matrice contenant des dicts vides { }
2017-03-08 10:56:31 +01:00
"""
return [ [ dict ( ) for x in range ( TailleGrilleX ) ] for y in range ( TailleGrilleY ) ]
2017-03-15 10:25:35 +01:00
def matrice_init_meme_strat ( ) :
2017-03-29 11:26:02 +02:00
"""
2017-03-29 08:50:49 +02:00
Index : 0
2017-04-17 21:02:18 +02:00
2017-03-08 11:19:45 +01:00
Crée la matrice des joueurs où chacun a la même stratégie
2017-04-10 17:53:27 +02:00
mais commence avec des états différents , générés aléatoirement
2017-03-08 10:56:31 +01:00
"""
2017-03-15 10:25:35 +01:00
histo_strat = [ StratParDefaut ]
2017-03-08 10:56:31 +01:00
matrice = matrice_init_vide ( )
2017-03-29 11:26:02 +02:00
2017-03-08 10:56:31 +01:00
for i in range ( TailleGrilleY ) :
for j in range ( TailleGrilleX ) :
etat = random . randint ( 0 , 1 )
2017-03-29 11:26:02 +02:00
matrice [ i ] [ j ] = { ' x ' : i , ' y ' : j , ' etat ' : etat , ' strategie ' : StratParDefaut , ' annees_de_prison ' : 0 , \
2017-03-08 10:56:31 +01:00
' historique_strategies ' : histo_strat , ' historique_etats ' : [ etat ] }
return matrice
2017-03-15 10:25:35 +01:00
def matrice_init_nie_sauf_un ( ) :
2017-03-29 11:26:02 +02:00
"""
2017-03-29 08:50:49 +02:00
Index : 1
2017-03-08 11:19:45 +01:00
Crée la matrice des joueurs tel que chaque joueurs
nie , sauf un qui avoue . Chaque joueur à la même
stratégie
2017-03-08 10:56:31 +01:00
"""
2017-04-17 21:02:18 +02:00
2017-03-15 10:25:35 +01:00
histo_strat = [ StratParDefaut ]
2017-03-08 10:56:31 +01:00
matrice = matrice_init_vide ( )
for i in range ( TailleGrilleY ) :
for j in range ( TailleGrilleX ) :
2017-03-29 11:26:02 +02:00
matrice [ i ] [ j ] = { ' x ' : i , ' y ' : j , ' etat ' : 1 , ' strategie ' : StratParDefaut , ' annees_de_prison ' : 0 , \
2017-03-08 10:56:31 +01:00
' historique_strategies ' : histo_strat , ' historique_etats ' : [ 1 ] }
index_aleatoirex = random . randint ( 0 , TailleGrilleX - 1 )
index_aleatoirey = random . randint ( 0 , TailleGrilleY - 1 )
( matrice [ index_aleatoirex ] [ index_aleatoirey ] ) [ ' etat ' ] = 0
return matrice
2017-03-15 10:25:35 +01:00
def matrice_init_avoue_sauf_un ( ) :
2017-03-29 11:26:02 +02:00
"""
2017-03-29 08:50:49 +02:00
Index : 2
2017-03-08 11:19:45 +01:00
Créer la matrice des joueurs tel que chaque joueur avoue ,
sauf un qui nie . Tous les joueurs ont la même strategie
2017-03-08 10:56:31 +01:00
"""
2017-03-15 10:25:35 +01:00
histo_strat = [ StratParDefaut ]
2017-03-08 10:56:31 +01:00
matrice = matrice_init_vide ( )
for i in range ( TailleGrilleY ) :
for j in range ( TailleGrilleX ) :
2017-03-29 11:26:02 +02:00
matrice [ i ] [ j ] = { ' x ' : i , ' y ' : j , ' etat ' : 0 , ' strategie ' : StratParDefaut , ' annees_de_prison ' : 0 , \
2017-03-08 10:56:31 +01:00
' historique_strategies ' : histo_strat , ' historique_etats ' : [ 0 ] }
index_aleatoirex = random . randint ( 0 , TailleGrilleX - 1 )
index_aleatoirey = random . randint ( 0 , TailleGrilleY - 1 )
( matrice [ index_aleatoirex ] [ index_aleatoirey ] ) [ ' etat ' ] = 1
return matrice
def matrice_init_equitable ( ) :
"""
2017-04-17 21:02:18 +02:00
Index : 3
Crée la matrice des joueurs tel que le probabilité d ' apparition de chaque
2017-03-08 11:19:45 +01:00
stratégie est équitable . Les états initiaux de chaque
joueur sont aléatoires .
2017-03-08 10:56:31 +01:00
"""
matrice_strat = np . full ( ( TailleGrilleX , TailleGrilleY ) , - 1 , dtype = int )
nb_de_joueurs_de_chaque = int ( ( TailleGrilleX * TailleGrilleY ) / len ( ListeStrategies ) )
2017-04-17 21:02:18 +02:00
2017-03-15 10:25:35 +01:00
places_vides = TailleGrilleX * TailleGrilleY
2017-03-08 10:56:31 +01:00
for e in range ( len ( ListeStrategies ) ) :
count_joueurs = 0
2017-04-17 21:02:18 +02:00
2017-03-08 10:56:31 +01:00
while count_joueurs < = nb_de_joueurs_de_chaque :
index_aleatoirex = random . randint ( 0 , TailleGrilleX - 1 )
index_aleatoirey = random . randint ( 0 , TailleGrilleY - 1 )
if matrice_strat [ index_aleatoirex ] [ index_aleatoirey ] != - 1 :
2017-03-15 10:25:35 +01:00
if places_vides < 1 :
break
2017-03-08 10:56:31 +01:00
continue
matrice_strat [ index_aleatoirex ] [ index_aleatoirey ] = e
count_joueurs + = 1
2017-03-15 10:25:35 +01:00
places_vides - = 1
2017-03-08 10:56:31 +01:00
2017-03-29 11:26:02 +02:00
for i in range ( TailleGrilleY ) : #on vérifie qu'il n'y a pas d'index vides
2017-03-08 10:56:31 +01:00
for j in range ( TailleGrilleX ) : #si oui, on le rempli avec une strat aléatoire
if matrice_strat [ i ] [ j ] == - 1 :
matrice_strat [ i ] [ j ] = random . randint ( 0 , len ( ListeStrategies ) )
matrice = matrice_init_vide ( )
for i in range ( TailleGrilleY ) :
for j in range ( TailleGrilleX ) :
etat = random . randint ( 0 , 1 )
2017-03-29 11:26:02 +02:00
matrice [ i ] [ j ] = { ' x ' : i , ' y ' : j , ' etat ' : etat , ' strategie ' : matrice_strat [ i ] [ j ] , ' annees_de_prison ' : 0 , \
2017-03-08 10:56:31 +01:00
' historique_strategies ' : [ matrice_strat [ i ] [ j ] ] , ' historique_etats ' : [ etat ] }
return matrice
2017-03-15 10:25:35 +01:00
def matrice_init_pourcents_choisis ( ) :
2017-03-29 11:26:02 +02:00
"""
2017-03-29 08:50:49 +02:00
Index : 4
2017-03-08 11:19:45 +01:00
2017-03-15 11:51:33 +01:00
ListePourcents contient des float de 0.0 à 1.0 .
2017-03-08 11:19:45 +01:00
Crée la matrice des joueurs tel que le pourcentage de
chaque stratégie est choisi . Les états initiaux sont
choisis aléatoirement .
2017-03-08 10:56:31 +01:00
"""
2017-03-15 11:51:33 +01:00
if ( len ( ListePourcents ) != len ( ListeStrategies ) ) :
2017-03-15 10:25:35 +01:00
print ( " Erreur: matrice_init_pourcents_choisis: liste_pourcent est de taille incorrecte! " )
2017-04-17 21:02:18 +02:00
2017-03-08 10:56:31 +01:00
matrice_strat = np . full ( ( TailleGrilleX , TailleGrilleY ) , - 1 , dtype = int )
list_nb_joueurs_de_chaque = list ( )
2017-03-15 11:51:33 +01:00
for i in range ( len ( ListePourcents ) ) :
list_nb_joueurs_de_chaque . append ( ( TailleGrilleX * TailleGrilleY ) * ListePourcents [ i ] )
2017-04-17 21:02:18 +02:00
2017-03-08 10:56:31 +01:00
places_vides = TailleGrilleX * TailleGrilleY
2017-03-15 11:51:33 +01:00
for e in range ( len ( ListePourcents ) ) :
2017-03-08 10:56:31 +01:00
count_joueurs = 0
while count_joueurs < = list_nb_joueurs_de_chaque [ e ] :
index_aleatoirex = random . randint ( 0 , TailleGrilleX - 1 )
index_aleatoirey = random . randint ( 0 , TailleGrilleY - 1 )
if matrice_strat [ index_aleatoirex ] [ index_aleatoirey ] != - 1 :
if places_vides < 1 :
break
continue
matrice_strat [ index_aleatoirex ] [ index_aleatoirey ] = e
count_joueurs + = 1
places_vides - = 1
2017-04-17 21:02:18 +02:00
2017-03-08 10:56:31 +01:00
for i in range ( TailleGrilleY ) : #on vérifie qu'il n'y a pas d'index vides
for j in range ( TailleGrilleX ) : #si oui, on le rempli avec une strat aléatoire
if matrice_strat [ i ] [ j ] == 0 :
2017-03-15 11:51:33 +01:00
matrice_strat [ i ] [ j ] = random . randint ( 0 , len ( ListePourcents ) )
2017-03-08 10:56:31 +01:00
matrice = matrice_init_vide ( )
for i in range ( TailleGrilleY ) :
for j in range ( TailleGrilleX ) :
etat = random . randint ( 0 , 1 )
2017-03-29 11:26:02 +02:00
matrice [ i ] [ j ] = { ' x ' : i , ' y ' : j , ' etat ' : etat , ' strategie ' : matrice_strat [ i ] [ j ] , ' annees_de_prison ' : 0 , \
2017-03-08 10:56:31 +01:00
' historique_strategies ' : [ matrice_strat [ i ] [ j ] ] , ' historique_etats ' : [ etat ] }
return matrice
2017-03-01 11:06:44 +01:00
#######################
2017-03-01 10:18:47 +01:00
### Fonction stratégies
2017-03-15 10:25:35 +01:00
2017-03-01 11:26:39 +01:00
def strat_toujours_nier ( joueur , adversaire ) :
2017-03-29 11:26:02 +02:00
"""
2017-03-01 11:26:39 +01:00
Index : 0
Toujours nier ( coopération )
"""
return 0 # 0 : coop
2017-04-17 21:02:18 +02:00
2017-03-01 11:26:39 +01:00
def strat_toujours_avouer ( joueur , adversaire ) :
2017-03-29 11:26:02 +02:00
"""
2017-03-01 11:26:39 +01:00
Index : 1
Toujours avouer ( trahir )
"""
return 1 #1 : traître
2017-03-29 11:26:02 +02:00
def strat_altern ( joueur , adversaire ) :
2017-03-01 11:26:39 +01:00
"""
2017-03-29 10:28:27 +02:00
Index : 2
2017-03-29 11:26:02 +02:00
Le joueur alterne entre nier et avouer
2017-03-29 10:28:27 +02:00
"""
2017-03-29 11:26:02 +02:00
return 1 - joueur [ ' etat ' ]
2017-04-17 21:02:18 +02:00
2017-03-01 11:26:39 +01:00
def strat_precedent_adversaire ( joueur , adversaire ) :
2017-03-29 11:26:02 +02:00
"""
2017-03-01 11:26:39 +01:00
Index : 3
Le joueur avoue / nie si durant la partie locale précédente , son adversaire avait avoué / nié ( on utilise l ' hisorique des états)
"""
return adversaire [ ' historique_etats ' ] [ len ( adversaire [ ' historique_etats ' ] ) - 1 ] == 0
2017-04-17 21:02:18 +02:00
2017-03-01 11:26:39 +01:00
def strat_principal_adversaire ( joueur , adversaire ) :
2017-03-29 11:26:02 +02:00
"""
2017-03-01 11:26:39 +01:00
Index : 4
Le joueur avoue / nie si l ’ adversaire avait majoritairement avoué / nié durant ses parties précédentes ( on utilise l ' hisorique des états)
Si aucun état n ’ est majoritaire , la coopération l ’ emporte ( le joueur nie )
2017-03-15 10:25:35 +01:00
"""
2017-04-17 21:02:18 +02:00
2017-03-01 11:26:39 +01:00
s = 0 # somme des entiers représentant les états
2017-03-15 10:25:35 +01:00
for i in adversaire [ ' historique_etats ' ] :
2017-03-01 11:26:39 +01:00
s + = i
2017-04-17 21:02:18 +02:00
2017-03-15 10:25:35 +01:00
if len ( adversaire [ ' historique_etats ' ] ) == 0 :
2017-03-01 11:26:39 +01:00
return 0
2017-04-17 21:02:18 +02:00
elif ( s / len ( adversaire [ ' historique_etats ' ] ) ) > 0.5 :
2017-03-01 11:26:39 +01:00
return 1
else :
return 0
2017-04-17 21:02:18 +02:00
2017-04-10 20:31:18 +02:00
def strat_meilleur_gain ( joueur , adversaire ) :
"""
Index : 5
2017-04-17 21:02:18 +02:00
Le joueur adopte l ' état de l ' adversaire ayant obtenu le meilleur gain ( = le moins d ' années de prison)
2017-04-10 20:31:18 +02:00
"""
max_gain = joueur [ ' annees_de_prison ' ]
nveau_etat = joueur [ ' etat ' ]
for i in range ( - 1 , 2 ) :
2017-04-10 20:58:40 +02:00
for j in range ( - 1 , 2 ) : #(i,j) sont les coordonnées de l'adversaire
x = joueur [ ' x ' ]
y = joueur [ ' y ' ]
2017-04-10 20:31:18 +02:00
if ( 0 < = x + i and x + i < len ( Grille ) ) and ( 0 < = y + j and y + j < len ( Grille [ 0 ] ) ) and i != 0 and j != 0 :
if Grille [ i ] [ j ] [ ' annees_de_prison ' ] < max_gain :
max_gain = Grille [ i ] [ j ] [ ' annees_de_prison ' ]
nveau_etat = Grille [ i ] [ j ] [ ' etat ' ]
return nveau_etat
2017-03-01 10:18:47 +01:00
2017-04-10 17:53:27 +02:00
######################
#INTERFACE GRAPHIQUE UTILISATEUR (GUI)
######################
# Initialise la fenetre principale
2017-04-17 21:02:18 +02:00
fenetre = Tk ( )
2017-04-10 17:53:27 +02:00
# Taille en abscisse de la matrice
2017-04-17 21:02:18 +02:00
X = IntVar ( fenetre )
2017-04-10 17:53:27 +02:00
# Taille en ordonnée de la matrice
2017-04-17 21:02:18 +02:00
Y = IntVar ( fenetre )
2017-04-10 17:53:27 +02:00
# Strategie definie pour le type 1
2017-04-17 21:02:18 +02:00
Strat = IntVar ( fenetre )
2017-04-10 17:53:27 +02:00
# Type de matrice selectionné par l'user
2017-04-17 21:02:18 +02:00
Var_choix = IntVar ( fenetre )
2017-04-10 17:53:27 +02:00
# Nombre d'itérations maximum
2017-04-17 21:02:18 +02:00
It = IntVar ( fenetre )
2017-04-10 17:53:27 +02:00
2017-04-10 18:28:31 +02:00
# Vitesse de défilement des images dans l'affichage dynamique en millisecondes, pré-variable IntVar
Vit = IntVar ( )
2017-04-11 10:16:19 +02:00
def affichage_fenetre_infos ( ) :
"""
S ' il y a eu clic sur le bouton " Infos " , affiche une fenetre contenant
le détail de chaque stratégie et de chaque type de matrice de départ .
"""
2017-04-17 21:02:18 +02:00
fenetre_infos = Tk ( )
2017-04-11 10:16:19 +02:00
Label ( fenetre_infos , text = " INFORMATIONS " ) . grid ( )
Label ( fenetre_infos , text = " " ) . grid ( sticky = W )
Label ( fenetre_infos , text = " STRATEGIES : " ) . grid ( sticky = W )
Label ( fenetre_infos , text = " Stratégie 0 : Toujours nier. " ) . grid ( sticky = W )
Label ( fenetre_infos , text = " Stratégie 1 : Toujours avouer. " ) . grid ( sticky = W )
2017-04-18 20:42:36 +02:00
#Label(fenetre_infos, text="Stratégie 2 : Alterner entre avouer et nier.").grid(sticky=W)
Label ( fenetre_infos , text = " Stratégie 2 : Choisis l ' état de son adversaire précédent. " ) . grid ( sticky = W )
2017-04-18 15:21:16 +02:00
Label ( fenetre_infos , text = " Stratégie 3 : Choisis l ' état que son adversaire a majoritairement choisi avant. " ) . grid ( sticky = W )
#Label(fenetre_infos, text="Stratégie 5 : Choisis l'état de son voisin ayant obtenu le meilleur gain.").grid(sticky=W)
2017-04-11 10:16:19 +02:00
Label ( fenetre_infos , text = " " ) . grid ( sticky = W )
Label ( fenetre_infos , text = " GRILLES DE DEPART : " ) . grid ( sticky = W )
2017-04-18 15:21:16 +02:00
Label ( fenetre_infos , text = " Type 0 : La répartition des stratégies est équitable, les états de départs sont aléatoires. " ) . grid ( sticky = W )
2017-04-11 10:16:19 +02:00
Label ( fenetre_infos , text = " Type 1 : Tous les joueurs nient sauf un qui avoue, même stratégie pour tous. " ) . grid ( sticky = W )
Label ( fenetre_infos , text = " Type 2 : Tous les joueurs avouent sauf un qui nie, même stratégie pour tous. " ) . grid ( sticky = W )
2017-04-18 15:21:16 +02:00
Label ( fenetre_infos , text = " Type 3 : Même stratégie pour tout le monde, les états sont aléatoires. " ) . grid ( sticky = W )
2017-04-11 10:16:19 +02:00
Label ( fenetre_infos , text = " Type 4 : Les pourcentages de chaque stratégie sont choisis, les états de départ sont aléatoires. " ) . grid ( sticky = W )
fenetre_infos . mainloop ( )
2017-04-17 21:02:18 +02:00
2017-04-10 17:53:27 +02:00
def affichage_combobox ( ) :
"""
2017-04-17 21:02:18 +02:00
S ' il y a eu clic sur le bouton,
on affiche un combobox pour selectionner
la stratégie par défaut voulue
2017-04-10 17:53:27 +02:00
"""
global Strat
Label ( fenetre , text = " Stratégie n° " ) . grid ( row = 5 , column = 0 , sticky = E )
2017-04-18 20:51:07 +02:00
Combobox ( fenetre , textvariable = Strat , values = ( 0 , 1 , 2 , 3 ) , width = 3 ) . grid ( row = 5 , column = 1 , sticky = W )
2017-04-10 17:53:27 +02:00
def Interface ( ) :
"""
2017-04-17 21:02:18 +02:00
Affiche l ' interface graphique utilisateur
qui permet de saisir les paramètres de la
simulation
2017-04-10 17:53:27 +02:00
"""
global X
global Y
global Var_choix
2017-04-10 18:28:31 +02:00
global Vit
2017-04-10 17:53:27 +02:00
Label ( fenetre , text = " Paramétrage des variables " ) . grid ( row = 0 , columnspan = 2 )
Label ( fenetre , text = " Saisir la taille de la matrice souhaitée: " ) . grid ( row = 1 , columnspan = 2 )
Label ( fenetre , text = " X = " ) . grid ( row = 2 , column = 0 , sticky = E )
Entry ( fenetre , textvariable = X , width = 3 ) . grid ( row = 2 , column = 1 , sticky = W )
Label ( fenetre , text = " Y = " ) . grid ( row = 3 , sticky = E , column = 0 )
Entry ( fenetre , textvariable = Y , width = 3 ) . grid ( row = 3 , column = 1 , sticky = W )
Label ( fenetre , text = " Choisir le type de la matrice initiale: " ) . grid ( row = 4 , columnspan = 2 )
2017-04-17 21:02:18 +02:00
2017-04-18 20:51:07 +02:00
Radiobutton ( fenetre , text = " Type 0 " , variable = Var_choix , value = 0 ) . grid ( row = 5 , sticky = W )
2017-04-11 09:44:27 +02:00
Radiobutton ( fenetre , text = " Type 1 " , variable = Var_choix , value = 1 , command = affichage_combobox ) . grid ( row = 6 , sticky = W )
Radiobutton ( fenetre , text = " Type 2 " , variable = Var_choix , value = 2 , command = affichage_combobox ) . grid ( row = 7 , sticky = W )
2017-04-18 20:51:07 +02:00
Radiobutton ( fenetre , text = " Type 3 " , variable = Var_choix , value = 3 command = affichage_combobox ) . grid ( row = 8 , sticky = W )
2017-04-11 09:44:27 +02:00
Radiobutton ( fenetre , text = " Type 4 " , variable = Var_choix , value = 4 , command = saisir_les_pourcentages ) . grid ( row = 9 , sticky = W )
2017-04-11 10:16:19 +02:00
Button ( fenetre , text = " Infos " , command = affichage_fenetre_infos ) . grid ( row = 7 , column = 1 , sticky = W )
2017-04-10 18:28:31 +02:00
Label ( fenetre , text = " Saisir le nombre d ' itérations: " ) . grid ( row = 15 , columnspan = 1 )
Entry ( fenetre , textvariable = It , width = 3 ) . grid ( row = 16 )
2017-04-10 17:53:27 +02:00
2017-04-11 12:02:42 +02:00
Label ( fenetre , text = " Saisir la vitesse de défilement des images en ms: " ) . grid ( row = 17 )
2017-04-10 18:28:31 +02:00
Entry ( fenetre , textvariable = Vit , width = 3 ) . grid ( row = 18 )
2017-04-10 17:53:27 +02:00
2017-04-10 18:28:31 +02:00
Button ( fenetre , text = " Continuer " , command = fenetre . quit ) . grid ( row = 19 , column = 0 )
2017-04-10 17:53:27 +02:00
fenetre . mainloop ( )
2017-03-29 11:26:02 +02:00
2017-03-15 10:25:35 +01:00
###############################################################################
##############
### Simulation
def init_complete ( ) :
2017-03-01 10:25:40 +01:00
"""
Rajoute à ListeStrategies toutes les fonctions stratégies
2017-03-15 10:25:35 +01:00
Rajoute à ListeGenGrille toutes les fonctions de génération de grille
2017-03-01 10:25:40 +01:00
"""
2017-04-18 15:21:16 +02:00
ListeGenGrille . append ( matrice_init_equitable ) # 0
ListeGenGrille . append ( matrice_init_meme_strat ) # 1
ListeGenGrille . append ( matrice_init_nie_sauf_un ) # 2
ListeGenGrille . append ( matrice_init_avoue_sauf_un ) # 3
2017-04-17 21:02:18 +02:00
ListeGenGrille . append ( matrice_init_pourcents_choisis ) # 4
2017-03-15 10:25:35 +01:00
ListeStrategies . append ( strat_toujours_nier ) # 0
ListeStrategies . append ( strat_toujours_avouer ) # 1
2017-04-18 15:21:16 +02:00
# ListeStrategies.append(strat_altern) #
ListeStrategies . append ( strat_precedent_adversaire ) # 2
ListeStrategies . append ( strat_principal_adversaire ) # 3
# ListeStrategies.append(strat_meilleur_gain) #
2017-03-01 11:26:39 +01:00
2017-03-15 10:25:35 +01:00
global Grille
global StratsResultats
2017-04-17 21:02:18 +02:00
2017-04-10 17:53:27 +02:00
global Vitesse
2017-04-10 18:28:31 +02:00
Vitesse = Vit . get ( )
2017-04-10 17:53:27 +02:00
global TailleGrilleX
global TailleGrilleY
TailleGrilleX = X . get ( )
TailleGrilleY = Y . get ( )
global TypeGrilleInitiale
TypeGrilleInitiale = Var_choix . get ( )
global StratParDefaut
StratParDefaut = Strat . get ( )
global MaxIterations
MaxIterations = It . get ( )
2017-03-15 10:25:35 +01:00
Grille = gen_matrice_initiale ( )
2017-03-15 11:51:33 +01:00
for i in range ( len ( ListeStrategies ) ) :
StratsResultats . append ( [ 0 , 0 , [ [ 0 , 0 , 0 ] ] ] )
for x in range ( TailleGrilleX ) :
for y in range ( TailleGrilleY ) :
if Grille [ x ] [ y ] [ " strategie " ] == i :
StratsResultats [ i ] [ 2 ] [ 0 ] [ 0 ] + = 1
return Grille
2017-03-15 10:25:35 +01:00
def simulation ( ) :
2017-03-15 11:05:52 +01:00
global Iteration
2017-03-15 10:25:35 +01:00
global HistoriqueGrilles
2017-04-17 21:02:18 +02:00
2017-03-15 11:05:52 +01:00
Iteration = 0
while Iteration < = MaxIterations :
2017-03-15 10:25:35 +01:00
HistoriqueGrilles . append ( copy . deepcopy ( Grille ) )
2017-03-15 11:40:43 +01:00
2017-03-15 11:05:52 +01:00
Iteration + = 1
2017-04-17 21:02:18 +02:00
2017-03-15 11:40:43 +01:00
for i in range ( len ( StratsResultats ) ) :
StratsResultats [ i ] [ 2 ] . append ( [ 0 , 0 , 0 ] )
2017-04-17 21:02:18 +02:00
2017-03-15 11:40:43 +01:00
partie_globale ( )
2017-04-17 21:02:18 +02:00
2017-03-15 11:40:43 +01:00
for i in range ( len ( StratsResultats ) ) :
for x in range ( TailleGrilleX ) :
for y in range ( TailleGrilleY ) :
2017-03-15 11:43:18 +01:00
if Grille [ x ] [ y ] [ " strategie " ] == i :
StratsResultats [ i ] [ 2 ] [ Iteration ] [ 0 ] + = 1
2017-04-17 21:02:18 +02:00
2017-03-15 10:25:35 +01:00
return Grille
2017-03-15 11:51:33 +01:00
2017-03-22 11:29:42 +01:00
###############################################################################
### Affichage dynamique et graphiques
def matRecup ( i , param ) :
2017-04-17 21:02:18 +02:00
"""
array * str - > array
Récupère la grille avec seulement la valeur de la clef " stratégie " pour chaque joueur , à litération i voulue
"""
# on initialise la matrice résultat avec que des 0
2017-03-22 11:29:42 +01:00
matR = np . random . randint ( 0 , 1 , ( TailleGrilleX , TailleGrilleY ) )
2017-04-17 21:02:18 +02:00
# on récupère la grille à l'itération i voulue
2017-03-22 11:29:42 +01:00
matrice = HistoriqueGrilles [ i ]
2017-04-17 21:02:18 +02:00
# on parcourt toute la grille
2017-03-22 11:29:42 +01:00
for ligne in range ( 0 , TailleGrilleX ) : #int ligne
for colonne in range ( 0 , TailleGrilleY ) : #int colonne
2017-04-17 21:02:18 +02:00
# on place à l'indice (ligne,colonne) de matR la valeur de la clef "stratégie" de la grille pour l'individu (ligne,colonne)
matR [ ligne ] [ colonne ] = matrice [ ligne ] [ colonne ] [ param ]
2017-03-22 11:29:42 +01:00
return matR
2017-03-22 12:20:24 +01:00
2017-03-22 11:29:42 +01:00
def afficher_strat_dynamique ( ) :
2017-04-17 21:02:18 +02:00
"""
Affichage dynamique de l ' évolution de la stratégie dans une fenêtre, avec des couleurs
"""
fig = plt . figure ( )
2017-03-22 11:29:42 +01:00
fig . suptitle ( ' Animation des stratégies ' )
2017-04-18 15:21:16 +02:00
cmap = mpl . colors . ListedColormap ( [ " b " , " r " , " black " , " g " ] )
2017-03-22 11:29:42 +01:00
2017-04-18 15:21:16 +02:00
bounds = [ 0 , 1 , 2 , 3 , 4 ]
2017-04-17 21:02:18 +02:00
norm = mpl . colors . BoundaryNorm ( bounds , cmap . N )
img = plt . imshow ( matRecup ( 0 , ' strategie ' ) , interpolation = " nearest " , cmap = cmap , norm = norm )
cb = plt . colorbar ( img , cmap = cmap , norm = norm , boundaries = bounds , ticks = bounds )
2017-04-18 15:21:16 +02:00
labels = np . arange ( 0 , 4 , 1 )
2017-03-22 11:29:42 +01:00
cb . set_ticklabels ( labels )
2017-04-17 21:02:18 +02:00
2017-03-22 11:29:42 +01:00
def update ( next_iteration , * args ) :
2017-03-22 12:23:56 +01:00
img . set_array ( matRecup ( next_iteration , ' strategie ' ) )
2017-03-22 11:29:42 +01:00
return [ img ]
2017-03-29 11:26:02 +02:00
anim = animation . FuncAnimation ( fig , update , frames = range ( MaxIterations ) , interval = 500 , repeat = False )
2017-03-22 11:29:42 +01:00
2017-03-22 12:23:56 +01:00
plt . show ( block = True )
2017-04-17 21:02:18 +02:00
2017-03-22 12:20:24 +01:00
2017-03-22 12:23:56 +01:00
def afficher_etat_dynamique ( ) :
2017-04-17 21:02:18 +02:00
"""
Affichage dynamique de l ' évolution des états des individus dans une fenêtre, avec des couleurs
"""
fig = plt . figure ( )
2017-03-22 12:20:24 +01:00
fig . suptitle ( ' Animation des états ' )
cmap = mpl . colors . ListedColormap ( [ " black " , " white " ] )
2017-04-17 21:02:18 +02:00
bounds = [ 0 , 1 , 2 ]
norm = mpl . colors . BoundaryNorm ( bounds , cmap . N )
img = plt . imshow ( matRecup ( 0 , ' etat ' ) , interpolation = " nearest " , cmap = cmap , norm = norm )
cb = plt . colorbar ( img , cmap = cmap , norm = norm , boundaries = bounds , ticks = bounds )
2017-03-22 12:20:24 +01:00
labels = np . arange ( 0 , 2 , 1 )
cb . set_ticklabels ( labels )
2017-04-17 21:02:18 +02:00
2017-03-22 12:20:24 +01:00
def update ( next_iteration , * args ) :
img . set_array ( matRecup ( next_iteration , ' etat ' ) )
return [ img ]
2017-03-29 11:26:02 +02:00
anim = animation . FuncAnimation ( fig , update , frames = range ( MaxIterations ) , interval = 500 , repeat = False )
2017-03-22 12:20:24 +01:00
2017-03-22 12:23:56 +01:00
plt . show ( block = True )
2017-03-22 11:29:42 +01:00
2017-03-29 08:50:49 +02:00
2017-03-22 11:29:42 +01:00
def affichage_strats_resultats_totaux ( ) :
2017-04-17 21:02:18 +02:00
"""
Retourne les diagrammes en baton qui mettent en évidence le nombre moyen d ' années
de prison en fonction de la stratégie et le nombre d ' utilisation de chaque stratégies
"""
# initialisation des paramètres
2017-03-22 11:29:42 +01:00
gain = [ ]
stratUtili = [ ]
2017-04-17 21:02:18 +02:00
2017-03-22 11:29:42 +01:00
#nb_utilisations
utilisateurs = list ( )
2017-04-17 21:02:18 +02:00
#utilisateurs[strat][iter] = nombre d'utilisateur d'une stratégie à une itération
2017-03-22 11:29:42 +01:00
iteration = [ ]
2017-04-17 21:02:18 +02:00
# on ajoute des 0 dans les listes gain() et stratUtili() autant qu'il y a de stratégies
2017-04-18 15:21:16 +02:00
for i in range ( 4 ) :
2017-03-29 11:26:02 +02:00
gain . append ( 0 )
stratUtili . append ( 0 )
2017-04-17 21:02:18 +02:00
for i in range ( 0 , len ( ListeStrategies ) ) : # on parcourt les stratégies
stratUtili [ i ] = StratsResultats [ i ] [ 0 ] # L'indice i de la liste stratUtili vaut le nombre total d'utilisations de la stratégie i
if StratsResultats [ i ] [ 0 ] == 0 : # si la stratégie a été utilisée 0 fois
pass # le gain ne change pas
2017-03-22 11:29:42 +01:00
else :
2017-04-11 11:33:52 +02:00
gain [ i ] = StratsResultats [ i ] [ 1 ] / StratsResultats [ i ] [ 0 ] #Sinon le gain pour la stratégie i vaut le nombre d'années de prison pour une stratégie divisée par son utilisation (pour avoir une moyenne)
2017-04-17 21:02:18 +02:00
utilisateurs . append ( [ ] ) # on initialise une liste vide dans la liste utilisateurs afin de s'en servir juste après
for i in range ( 0 , MaxIterations + 1 ) : # on parcourt toutes les itréations
for j in range ( 0 , len ( ListeStrategies ) ) : # on parcourt toutes les stratégies
utilisateurs [ j ] . append ( StratsResultats [ j ] [ 2 ] [ i ] [ 0 ] ) # on ajoute à lindice j de la liste utilisateurs le nombre d'utilisateurs d'une stratégie donnée j à l'itération i
2017-04-11 11:33:52 +02:00
iteration . append ( i ) #on ajoute à la liste itération l'indice i
2017-04-17 21:02:18 +02:00
2017-04-18 15:21:16 +02:00
Strat = ( ' 0 ' , ' 1 ' , ' 2 ' , ' 3 ' )
2017-04-17 21:02:18 +02:00
2017-03-22 11:29:42 +01:00
x_pos = np . arange ( len ( Strat ) )
2017-04-17 21:02:18 +02:00
2017-03-22 11:29:42 +01:00
plt . subplot ( 221 )
plt . title ( " Nombre d ' adoptions de chaque stratégie " )
plt . bar ( x_pos , stratUtili , align = ' center ' , color = CouleursStrat )
plt . xlabel ( " Stratégies " )
plt . ylabel ( " Nombre individus ayant adopté stratégie " )
plt . xticks ( x_pos , Strat )
2017-04-17 21:02:18 +02:00
2017-03-22 11:29:42 +01:00
plt . subplot ( 222 )
plt . title ( " Nombre moyen d ' années de prison de chaque stratégie " )
plt . bar ( x_pos , gain , align = ' center ' , color = CouleursStrat )
2017-04-17 21:02:18 +02:00
2017-03-22 11:29:42 +01:00
plt . xlabel ( " Stratégies " )
plt . ylabel ( " Nombre moyen d ' années de prison " )
plt . xticks ( x_pos , Strat )
2017-04-17 21:02:18 +02:00
plt . subplot ( 223 )
2017-03-22 11:29:42 +01:00
plt . title ( " Evolution du nombre d ' utilisateurs de chaque stratégie au cours des itérations " )
plt . xlabel ( ' Iterations ' )
plt . ylabel ( " Nombre utilisateurs " )
2017-04-17 21:02:18 +02:00
2017-03-22 11:29:42 +01:00
for i in range ( len ( ListeStrategies ) ) :
plt . plot ( iteration , utilisateurs [ i ] , CouleursStrat [ i ] , linewidth = 5 , label = " Stratégie " + str ( i ) )
plt . show ( )
2017-04-17 21:02:18 +02:00
plt . legend ( )
2017-04-10 17:53:27 +02:00
#######################
# SCRIPT
#######################
2017-03-22 11:29:42 +01:00
2017-04-17 21:02:18 +02:00
if __name__ == ' __main__ ' :
Interface ( )
init_complete ( )
simulation ( )
afficher_etat_dynamique ( )
afficher_strat_dynamique ( )
affichage_strats_resultats_totaux ( )
2017-03-29 11:26:02 +02:00