Update ARE-DYNAMIC.py

This commit is contained in:
lucieho 2017-03-29 11:26:02 +02:00 committed by GitHub
parent f868e6d192
commit 7a7cae0eb8
1 changed files with 112 additions and 63 deletions

View File

@ -59,7 +59,7 @@ TypeGrilleInitiale = 3
Iteration = 0 Iteration = 0
# nombre max d'itérations # nombre max d'itérations
MaxIterations = 100 MaxIterations = 4
# stratégie par défaut # stratégie par défaut
StratParDefaut = 0 StratParDefaut = 0
@ -73,13 +73,11 @@ ListePourcents = list()
#Couleurs des Stratégies #Couleurs des Stratégies
CouleursStrat=['b','r','black','g','purple'] CouleursStrat=['b','r','black','g','purple']
#Vitesse de défilement des affichages dynamiques
Vitesse = 500
""" """
Types: Types:
Coord = tuple(x, y) Coord = tuple(x, y)
Joueur = dict("etat", "historique_etats", "strategie", "annees_de_prison", "historique_strategies") Joueur = dict("x", "y", "etat", "historique_etats", "strategie", "annees_de_prison", "historique_strategies")
GrilleJoueurs = matrice2d(Joueur) GrilleJoueurs = matrice2d(Joueur)
""" """
@ -98,7 +96,10 @@ def gen_matrice_initiale():
def partie1v1(joueur, adversaire): def partie1v1(joueur, adversaire):
""" """
Joueur^2 -> int
Effectue une partie à deux joueurs Effectue une partie à deux joueurs
Renvoie: paire (prison_joueur, prison_adversaire)
""" """
stratj = ListeStrategies[joueur["strategie"]] stratj = ListeStrategies[joueur["strategie"]]
@ -140,8 +141,12 @@ def partie1v1(joueur, adversaire):
joueur["annees_de_prison"] += ans_prison[0] joueur["annees_de_prison"] += ans_prison[0]
adversaire["annees_de_prison"] += ans_prison[1] adversaire["annees_de_prison"] += ans_prison[1]
return ans_prison
def partie8tours(x,y): def partie8tours(x,y):
""" """
Coord -> NoneType
Effectue huit parties 1v1 entre le joueur et chacun de ses voisins l'un après l'autre Effectue huit parties 1v1 entre le joueur et chacun de ses voisins l'un après l'autre
""" """
for i in range (-1,2): for i in range (-1,2):
@ -161,9 +166,10 @@ def partie_globale():
partie8tours(i,j) partie8tours(i,j)
# Changement des stratégies # Changement des stratégies
# On parcourt une copie de la grille pour avoir accès aux anciennes stratégies et non pas aux nouvelles adoptées
copie_grille = np.copy(Grille)
# On parcourt une copie de la grille pour avoir accès aux anciennes stratégies et non pas aux nouvelles adoptées
copie_grille = np.copy(Grille)
for x in range(len(copie_grille)): for x in range(len(copie_grille)):
for y in range(len(copie_grille[0])): for y in range(len(copie_grille[0])):
#(x,y) : joueur dont on va modifier la stratégie, si besoin #(x,y) : joueur dont on va modifier la stratégie, si besoin
@ -180,6 +186,9 @@ def partie_globale():
for j in range(len(Grille[0])): for j in range(len(Grille[0])):
Grille[i][j]['annees_de_prison'] = 0 Grille[i][j]['annees_de_prison'] = 0
return Grille
##################################### #####################################
### Fonction génératrices de matrices ### Fonction génératrices de matrices
@ -193,6 +202,8 @@ def matrice_init_vide():
def matrice_init_meme_strat(): def matrice_init_meme_strat():
""" """
int -> array
Index: 0 Index: 0
Crée la matrice des joueurs chacun a la même stratégie Crée la matrice des joueurs chacun a la même stratégie
@ -202,16 +213,19 @@ def matrice_init_meme_strat():
histo_strat = [StratParDefaut] histo_strat = [StratParDefaut]
matrice = matrice_init_vide() matrice = matrice_init_vide()
for i in range(TailleGrilleY): for i in range(TailleGrilleY):
for j in range(TailleGrilleX): for j in range(TailleGrilleX):
etat = random.randint(0, 1) etat = random.randint(0, 1)
matrice[i][j] = {'etat' : etat, 'strategie' : StratParDefaut, 'annees_de_prison' : 0,\ matrice[i][j] = {'x' : i, 'y':j, 'etat' : etat, 'strategie' : StratParDefaut, 'annees_de_prison' : 0,\
'historique_strategies' : histo_strat, 'historique_etats' : [etat]} 'historique_strategies' : histo_strat, 'historique_etats' : [etat]}
return matrice return matrice
def matrice_init_nie_sauf_un(): def matrice_init_nie_sauf_un():
""" """
int -> array
Index: 1 Index: 1
Crée la matrice des joueurs tel que chaque joueurs Crée la matrice des joueurs tel que chaque joueurs
@ -224,7 +238,7 @@ def matrice_init_nie_sauf_un():
for i in range(TailleGrilleY): for i in range(TailleGrilleY):
for j in range(TailleGrilleX): for j in range(TailleGrilleX):
matrice[i][j] = {'etat' : 1, 'strategie' : StratParDefaut, 'annees_de_prison' : 0,\ matrice[i][j] = {'x' : i, 'y' : j, 'etat' : 1, 'strategie' : StratParDefaut, 'annees_de_prison' : 0,\
'historique_strategies' : histo_strat, 'historique_etats' : [1]} 'historique_strategies' : histo_strat, 'historique_etats' : [1]}
index_aleatoirex = random.randint(0,TailleGrilleX-1) index_aleatoirex = random.randint(0,TailleGrilleX-1)
@ -235,6 +249,8 @@ def matrice_init_nie_sauf_un():
def matrice_init_avoue_sauf_un(): def matrice_init_avoue_sauf_un():
""" """
int -> array
Index: 2 Index: 2
Créer la matrice des joueurs tel que chaque joueur avoue, Créer la matrice des joueurs tel que chaque joueur avoue,
@ -246,7 +262,7 @@ def matrice_init_avoue_sauf_un():
for i in range(TailleGrilleY): for i in range(TailleGrilleY):
for j in range(TailleGrilleX): for j in range(TailleGrilleX):
matrice[i][j] = {'etat' : 0, 'strategie' : StratParDefaut, 'annees_de_prison' : 0,\ matrice[i][j] = {'x' : i, 'y' : j, 'etat' : 0, 'strategie' : StratParDefaut, 'annees_de_prison' : 0,\
'historique_strategies' : histo_strat, 'historique_etats' : [0]} 'historique_strategies' : histo_strat, 'historique_etats' : [0]}
index_aleatoirex = random.randint(0,TailleGrilleX-1) index_aleatoirex = random.randint(0,TailleGrilleX-1)
@ -282,7 +298,7 @@ def matrice_init_equitable():
count_joueurs += 1 count_joueurs += 1
places_vides -= 1 places_vides -= 1
for i in range(TailleGrilleY): #on vérifie qu'il ne reste pas d'index vides 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 for j in range(TailleGrilleX): #si oui, on le rempli avec une strat aléatoire
if matrice_strat[i][j] == -1: if matrice_strat[i][j] == -1:
matrice_strat[i][j] = random.randint(0, len(ListeStrategies)) matrice_strat[i][j] = random.randint(0, len(ListeStrategies))
@ -292,13 +308,15 @@ def matrice_init_equitable():
for i in range(TailleGrilleY): for i in range(TailleGrilleY):
for j in range(TailleGrilleX): for j in range(TailleGrilleX):
etat = random.randint(0, 1) etat = random.randint(0, 1)
matrice[i][j] = {'etat' : etat, 'strategie' : matrice_strat[i][j], 'annees_de_prison' : 0,\ matrice[i][j] = {'x' : i, 'y' : j, 'etat' : etat, 'strategie' : matrice_strat[i][j], 'annees_de_prison' : 0,\
'historique_strategies' : [matrice_strat[i][j]], 'historique_etats' : [etat]} 'historique_strategies' : [matrice_strat[i][j]], 'historique_etats' : [etat]}
return matrice return matrice
def matrice_init_pourcents_choisis(): def matrice_init_pourcents_choisis():
""" """
list[float] -> array
Index: 4 Index: 4
ListePourcents contient des float de 0.0 à 1.0. ListePourcents contient des float de 0.0 à 1.0.
@ -340,7 +358,7 @@ def matrice_init_pourcents_choisis():
for i in range(TailleGrilleY): for i in range(TailleGrilleY):
for j in range(TailleGrilleX): for j in range(TailleGrilleX):
etat = random.randint(0, 1) etat = random.randint(0, 1)
matrice[i][j] = {'etat' : etat, 'strategie' : matrice_strat[i][j], 'annees_de_prison' : 0,\ matrice[i][j] = {'x' : i, 'y' : j, 'etat' : etat, 'strategie' : matrice_strat[i][j], 'annees_de_prison' : 0,\
'historique_strategies' : [matrice_strat[i][j]], 'historique_etats' : [etat]} 'historique_strategies' : [matrice_strat[i][j]], 'historique_etats' : [etat]}
return matrice return matrice
@ -350,6 +368,8 @@ def matrice_init_pourcents_choisis():
def strat_toujours_nier(joueur, adversaire): def strat_toujours_nier(joueur, adversaire):
""" """
Joueur^2 -> int
Index: 0 Index: 0
Toujours nier (coopération) Toujours nier (coopération)
@ -358,30 +378,29 @@ def strat_toujours_nier(joueur, adversaire):
def strat_toujours_avouer(joueur, adversaire): def strat_toujours_avouer(joueur, adversaire):
""" """
Joueur^2 -> int
Index: 1 Index: 1
Toujours avouer (trahir) Toujours avouer (trahir)
""" """
return 1 #1 : traître return 1 #1 : traître
def strat_meilleur_gain(joueur, adversaire): def strat_altern(joueur, adversaire):
""" """
Joueur^2 -> int
Index: 2 Index: 2
Le joueur adopte l'état de l'adversaire ayant obtenu le meilleur gain (= le moins d'années de prison) Le joueur alterne entre nier et avouer
""" """
max_gain = joueur['annees_de_prison']
nveau_etat = joueur['etat'] return 1 - joueur['etat']
for i in range (-1,2):
for j in range (-1,2): #(i,j) sont les coordonnées de l'adversaire
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
def strat_precedent_adversaire(joueur, adversaire): def strat_precedent_adversaire(joueur, adversaire):
""" """
Joueur^2 -> int
Index: 3 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) Le joueur avoue/nie si durant la partie locale précédente, son adversaire avait avoué/nié (on utilise l'hisorique des états)
@ -390,6 +409,8 @@ def strat_precedent_adversaire(joueur, adversaire):
def strat_principal_adversaire(joueur, adversaire): def strat_principal_adversaire(joueur, adversaire):
""" """
Joueur^2 -> int
Index: 4 Index: 4
Le joueur avoue/nie si ladversaire avait majoritairement avoué/nié durant ses parties précédentes (on utilise l'hisorique des états) Le joueur avoue/nie si ladversaire avait majoritairement avoué/nié durant ses parties précédentes (on utilise l'hisorique des états)
@ -410,6 +431,28 @@ def strat_principal_adversaire(joueur, adversaire):
else: else:
return 0 return 0
def strat_meilleur_gain (joueur, adversaire):
"""
Joueur^2 -> int
Index : 5
Le joueur adopte l'état de l'adversaire ayant obtenu le meilleur gain (= le moins d'années de prison)
"""
max_gain = joueur['annees_de_prison']
nveau_etat = joueur['etat']
x = joueur['x']
y = joueur['y']
for i in range (-1,2):
for j in range (-1,2): #(i,j) sont les coordonnées de l'adversaire
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
############################################################################### ###############################################################################
############## ##############
@ -419,7 +462,6 @@ def init_complete():
""" """
Rajoute à ListeStrategies toutes les fonctions stratégies Rajoute à ListeStrategies toutes les fonctions stratégies
Rajoute à ListeGenGrille toutes les fonctions de génération de grille Rajoute à ListeGenGrille toutes les fonctions de génération de grille
Initialise la grille et StratsResultats
""" """
ListeGenGrille.append(matrice_init_meme_strat) # 0 ListeGenGrille.append(matrice_init_meme_strat) # 0
@ -430,7 +472,7 @@ def init_complete():
ListeStrategies.append(strat_toujours_nier) # 0 ListeStrategies.append(strat_toujours_nier) # 0
ListeStrategies.append(strat_toujours_avouer) # 1 ListeStrategies.append(strat_toujours_avouer) # 1
ListeStrategies.append(strat_meilleur_gain) # 2 ListeStrategies.append(strat_altern) # 2
ListeStrategies.append(strat_precedent_adversaire) # 3 ListeStrategies.append(strat_precedent_adversaire) # 3
ListeStrategies.append(strat_principal_adversaire) # 4 ListeStrategies.append(strat_principal_adversaire) # 4
@ -452,7 +494,6 @@ def simulation():
global Iteration global Iteration
global HistoriqueGrilles global HistoriqueGrilles
Iteration = 0 Iteration = 0
while Iteration <= MaxIterations: while Iteration <= MaxIterations:
@ -479,15 +520,14 @@ def simulation():
def matRecup(i, param): def matRecup(i, param):
""" """array*str-> array
array * str -> array Récupère la matrice avec seulement le paramètre stratégie pour chaque joueur , à litération i voulue"""
Récupère la matrice avec seulement le paramètre stratégie pour chaque joueur , à litération i voulue
"""
matR = np.random.randint(0,1,(TailleGrilleX,TailleGrilleY)) matR = np.random.randint(0,1,(TailleGrilleX,TailleGrilleY))
matrice = HistoriqueGrilles[i] matrice = HistoriqueGrilles[i]
for ligne in range (0,TailleGrilleX): #int ligne for ligne in range (0,TailleGrilleX): #int ligne
for colonne in range (0, TailleGrilleY): #int colonne for colonne in range (0, TailleGrilleY): #int colonne
matR[ligne][colonne]=matrice[ligne][colonne][param] matR[ligne][colonne]=matrice[ligne][colonne][param]
@ -496,7 +536,6 @@ def matRecup(i, param):
def afficher_strat_dynamique(): def afficher_strat_dynamique():
fig=plt.figure() fig=plt.figure()
fig.suptitle('Animation des stratégies') fig.suptitle('Animation des stratégies')
@ -514,13 +553,12 @@ def afficher_strat_dynamique():
img.set_array(matRecup(next_iteration , 'strategie')) img.set_array(matRecup(next_iteration , 'strategie'))
return [img] return [img]
anim = animation.FuncAnimation(fig, update, frames=range(MaxIterations), interval= Vitesse, repeat = False) anim = animation.FuncAnimation(fig, update, frames=range(MaxIterations), interval=500, repeat = False)
plt.show(block = True) plt.show(block = True)
def afficher_etat_dynamique(): def afficher_etat_dynamique():
fig=plt.figure() fig=plt.figure()
fig.suptitle('Animation des états') fig.suptitle('Animation des états')
@ -538,30 +576,40 @@ def afficher_etat_dynamique():
img.set_array(matRecup(next_iteration , 'etat')) img.set_array(matRecup(next_iteration , 'etat'))
return [img] return [img]
anim = animation.FuncAnimation(fig, update, frames=range(MaxIterations), interval= Vitesse, repeat = False) anim = animation.FuncAnimation(fig, update, frames=range(MaxIterations), interval=500, repeat = False)
plt.show(block = True) plt.show(block = True)
def affichage_strats_resultats_totaux(): def affichage_strats_resultats_totaux():
"""array->graph
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 #initialisation des paramètres
#list gain
gain=[] gain=[]
#list strat
stratUtili=[] stratUtili=[]
#nb_utilisations #nb_utilisations
utilisateurs=list() utilisateurs=list()
#uti[strat][iter] = nb #uti[strat][iter] = nb
#iterations #iteration
iteration=[] iteration=[]
for i in range(len(ListeStrategies)): for i in range(5):
stratUtili.append(StratsResultats[i][0])
if StratsResultats[i][0]==0:
gain.append(0) gain.append(0)
stratUtili.append(0)
for i in range(0,len(ListeStrategies)):
stratUtili[i]=StratsResultats[i][0]
if StratsResultats[i][0]==0:
gain[i]
else: else:
gain.append(StratsResultats[i][1]/StratsResultats[i][0]) gain[i]=StratsResultats[i][1]/StratsResultats[i][0]
utilisateurs.append([]) utilisateurs.append([])
for i in range(0,MaxIterations+1): for i in range(0,MaxIterations+1):
@ -602,21 +650,22 @@ def affichage_strats_resultats_totaux():
plt.legend() plt.legend()
init_complete()
simulation()
afficher_etat_dynamique()
affichage_strats_resultats_totaux()
# fonction de debug, ne pas utiliser
""" """
def _ext(M): def _ext(M):
K = np.ndarray((TailleGrilleX, TailleGrilleY)) K = np.ndarray((TailleGrilleX, TailleGrilleY))
for x in range(len(M)): for x in range(len(M)):
for y in range(len(M[0])): for y in range(len(M[0])):
K[x][y] = M[x][y]["etat"] K[x][y] = M[x][y]["strategie"]
return K return K
print(_ext(simulation()))
""" """
if __name__ == "__main__":
init_complete()
simulation()
afficher_strat_dynamique()