Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # NB :
- # 0 : colombe
- # 1 : faucon
- # 2: perroquet
- # 3 : grue
- # 4 : corbeau
- #A FINIR : PB DE DIVISION PAR ZERO + grafik
- from random import *
- import numpy as np
- from pylab import *
- def pioche_xadv2(tab,xadv1): #on prend bien l'indice de l'adv1 pour verifier qu'il soit different de l'indice de l'adv2
- r=randrange(0,len(tab))
- while (r==xadv1):
- r=randrange(0,len(tab)+1)
- return r
- def premier_sang(adv1,adv2): # Simulation du premier combat
- signal=0
- gain1=0
- gain2=0
- comp1=0
- comp2=0
- if (adv2<adv1):#pour réduire le nombre d'itération
- adv2,adv1=adv1,adv2
- signal=1
- if adv1==0: #COLOMBE
- if adv2==0 or adv2==2 or adv2==4: # vs COLOMBE ou PERROQUET ou CORBEAU
- gain1=R/2
- gain2=R/2
- comp1=0
- comp2=0
- elif adv2==1: # vs FAUCON
- gain1=0
- gain2=R
- comp1=0
- comp2=1
- elif adv2==3: # vs GRUE
- z=randrange(0,2) #choix si la grue va être gentille ou méchante
- if z==0: #si gentille
- gain1=R/2
- gain2=R/2
- comp1=0
- comp2=0
- elif z==1: #si méchante
- gain1=0
- gain2=R
- comp1=0
- comp2=1
- elif adv1==1: #FAUCON
- if adv2==2 or adv2==4 : # vs PERROQUET ou CORBEAU
- gain1=R
- gain2=0
- comp1=1
- comp2=0
- elif adv2==1: # vs FAUCON
- x=randrange(0,101)
- y=randrange(0,101)
- if x>y:
- gain1=R-C
- gain2=-C
- else :
- gain1=-C
- gain2=R-C
- comp1=1
- comp2=1
- elif adv2==3: # vs GRUE
- z=randrange(0,2) #choix si la grue va être gentille ou méchante
- if z==0: #si gentille
- gain1=R
- gain2=0
- comp1=1
- comp2=0
- elif z==1: #si méchante
- x=randrange(0,101)
- y=randrange(0,101)
- if x>y:
- gain1=R-C
- gain2=-C
- else :
- gain1=-C
- gain2=R-C
- comp1=1
- comp2=1
- elif adv1==3: #GRUE
- if adv2==3: # vs GRUE
- z=randrange(0,2) #on décide de si la grue1 va être gentille ou méchante au tour actuel
- v=randrange(0,2) #on décide de si la grue2 va être gentille ou méchante au tour actuel
- if z==0 and v==0 : #elles sont gentilles alors partage
- gain1=R/2
- gain2=R/2
- comp1=0
- comp2=0
- elif z==0 and v==1 : #la grue2 est méchante et la grue1 est gentille
- gain1=0
- gain2=R
- comp1=0
- comp2=1
- elif z==1 and v==0 :#la grue1 est méchante et la grue deux est gentille
- gain1=R
- gain2=0
- comp1=1
- comp2=0
- elif z==1 and v==1 :#elles vont être toutes les deux méchantes alors combat
- x=randrange(0,101)
- y=randrange(0,101)
- if x>y:
- gain1=R-C
- gain2=-C
- else :
- gain1=-C
- gain2=R-C
- comp1=1
- comp2=1
- elif adv2==4: # vs CORBEAU
- z=randrange(0,2) #choix si la grue va être gentille ou méchante
- if z==0: # la grue est gentille
- gain1=R/2
- gain2=R/2
- comp1=0
- comp2=0
- elif z==1: # la grue est méchante
- gain1=R
- gain2=0
- comp1=1
- comp2=0
- elif adv1==4: #CORBEAU
- if adv2==4: # vs CORBEAU
- gain1=R/2
- gain2=R/2
- comp1=0
- comp2=0
- if signal==1: #si il y a eu changement alors remise en ordre
- gain1,gain2,comp1,comp2=gain2,gain1,comp2,comp1
- return (gain1,comp1,gain2,comp2)
- def bilan_gen(tab,Tcol,Tfau,Tper,Tgrue,Tcor,seuil,prop,ind):
- som=0
- Tcol.append(0)
- Tfau.append(0)
- Tper.append(0)
- Tgrue.append(0)
- Tcor.append(0)
- for i in tab:
- if ((i[0]==0)and(i[1]>=seuil)): #colombe
- Tcol[-1]+=i[1]
- som+=i[1]
- elif ((i[0]==1)and(i[1]>=seuil)): #faucon
- Tfau[-1]+=i[1]
- som+=i[1]
- elif ((i[0]==2)and(i[1]>=seuil)): #perroquet
- Tper[-1]+=i[1]
- som+=i[1]
- elif ((i[0]==3)and(i[1]>=seuil)): #grue
- Tgrue[-1]+=i[1]
- som+=i[1]
- elif ((i[0]==4)and(i[1]>=seuil)): #corbeau
- Tcor[-1]+=i[1]
- som+=i[1]
- if (som==0):
- som+=1
- #maintenant on remplit le tableau des proportions pour la generation suivante
- prop[0]=int((Tcol[-1]/som)*ind)
- prop[1]=int((Tfau[-1]/som)*ind)
- prop[2]=int((Tper[-1]/som)*ind)
- prop[3]=int((Tgrue[-1]/som)*ind)
- prop[4]=int((Tcor[-1]/som)*ind)
- return (Tcol,Tfau,Tper,Tgrue,Tcor,prop)
- def crea_gen(prop,tab):
- tab=[]
- for espece in range(5):
- for nombre in range(int(prop[espece])):
- tab.append([espece,0])
- return tab
- def simuCombat2(adv1,comp1,adv2,comp2):
- # R : valeur de la ressource convoitée
- # C : coût d'un combat
- # adv1, adv2: nombres binaires, 0 pour colombe, 1 pour faucon, 2 pour perroquet, 3 pour grue et 4 pour corbeau
- #comp1 et comp2 : comportement au combat precedent de adv1 et adv2
- signal=0
- gain1=0
- gain2=0
- comp1=0
- comp2=0
- if (adv2<adv1): #pour réduire le nombre d'itération
- adv2,adv1=adv1,adv2
- signal=1
- if (adv1==0):
- if adv2==0: #COLOMBE vs COLOMBE
- gain1=R/2
- gain2=R/2
- elif adv2==1:#COLOMBE vs FAUCON
- gain1=0
- gain2=R
- elif adv2==2: #COLOMBE vs PERROQUET
- gain1=R/2
- gain2=R/2
- elif adv2==3:#COLOMBE vs GRUE
- x=randrange(0,2)
- if x==0 :
- gain1=R/2
- gain2=R/2
- elif x==1 :
- gain1=0
- gain2=R
- elif adv2==4 : #COLOMBE vs CORBEAU
- gain1=0
- gain2=R
- elif (adv1==1):
- if adv2==1 or adv2==2 : #FAUCON vs FAUCON/FAUCON vs PERROQUET
- x=randrange(0,2)
- if x==0:
- gain1=R-C
- gain2=-C
- else :
- gain1=-C
- gain2=R-C
- elif adv2==3: #FAUCON vs GRUE
- z=randrange(0,2) #choix si la grue va être méchante ou gentile au tour actuel
- if z==0 : #grue gentille
- gain1=R
- gain2=0
- elif z==1 : #grue méchante donc combat
- x=randrange(0,2)
- if x==0: #Aléatoire (P=1/2)
- gain1=R-C
- gain2=-C
- else :
- gain1=-C
- gain2=R-C
- elif adv2==4: #FAUCON vs CORBEAU
- gain1=R
- gain2=0
- elif adv1==2:
- if adv2==2: #PERROQUET vs PERROQUET
- gain1=R/2
- gain2=R/2
- if adv2==3: #PERROQUET vs GRUE
- if comp2==0 : #si au tour d'avant la grue a été gentille alors le perroquet le sera au tour actuel
- z=randrange(0,2) #on décide de si la grue va être gentille ou méchante au tour actuel
- if z==1 : #la grue va être méchante
- gain1=0
- gain2=R
- comp2=1
- elif z==0 : #sinon elle est gentille
- gain1=R/2
- gain2=R/2
- elif comp2==1 : #la grue a été méchante au tour d'avant donc le perroquet va l'être au tour actuel
- z=randrange(0,2) #on décide de si la grue va être gentille ou méchante au tour actuel
- if z==1 : #la grue va être méchante donc il y a combat
- x=randrange(0,101)
- y=randrange(0,101)
- if x>y:
- gain1=R-C
- gain2=-C
- else :
- gain1=-C
- gain2=R-C
- elif z==0: #la grue va être gentille donc elle perd contre le perroquet
- gain1=R
- gain2=0
- comp2=0
- if adv2==4: #PERROQUET vs CORBEAU
- if comp1==0 and comp2==0 : #si les deux ont été gentil au tour d'avant, le perroquet va être gentil au tour actuel et le corbeau va être méchant
- gain1=0
- gain2=R
- comp2=1
- elif comp1==0 and comp2==1 : #si le perroquet a été gentil au tour d'avant et le corbeau méchant alors il y a combat
- x=randrange(0,101)
- y=randrange(0,101)
- if x>y:
- gain1=R-C
- gain2=-C
- else :
- gain1=-C
- gain2=R-C
- comp1=1
- elif comp1==1 and comp2==0 : #si le perroquet a été méchant au tour d'avant et le corbeau gentil alors il y a partage
- gain1=R/2
- gain2=R/2
- comp1=0
- elif comp1==1 and comp2==1 : #si les deux étaient méchants au tour d'avant alors le perroquet va être le seul méchant au tour actuel
- gain1=R
- gain2=0
- comp2=0
- elif adv1==3:
- if adv2==3: #GRUE vs GRUE
- z=randrange(0,2) #on décide de si la grue1 va être gentille ou méchante au tour actuel
- v=randrange(0,2) #on décide de si la grue2 va être gentille ou méchante au tour actuel
- if z==0 and v==0 : #elles sont gentilles alors partage
- gain1=R/2
- gain2=R/2
- elif z==0 and v==1 : #la grue2 est méchante et la grue1 est gentille
- gain1=0
- gain2=R
- elif z==1 and v==0 :#la grue1 est méchante et la grue deux est gentille
- gain1=R
- gain2=0
- elif z==1 and v==1 :#elles vont être toutes les deux méchantes alors combat
- x=randrange(0,101)
- y=randrange(0,101)
- if x>y:
- gain1=R-C
- gain2=-C
- else :
- gain1=-C
- gain2=R-C
- elif adv2==4: #GRUE vs CORBEAU
- z=randrange(0,2) #on décide si la grue va être gentille ou méchante au tour actuel
- if comp1==0 : #si la grue a été gentille au tour d'avant alors le corbeau sera méchant
- if z==0:#si la grue va être gentille
- gain1=0
- gain2=R
- elif z==1: #si la grue va être méchante alors combat
- x=randrange(0,101)
- y=randrange(0,101)
- if x>y:
- gain1=R-C
- gain2=-C
- else :
- gain1=-C
- gain2=R-C
- comp1=1
- elif comp1==1 : #si la grue a été méchante au tour d'avant alors le corbeau va être gentil
- if z==0: #la grue va être gentille alors partage
- gain1=R/2
- gain2=R/2
- comp1=0
- elif z==1 : #la grue est méchante
- gain1=R
- gain2=0
- elif adv1==4:
- if adv2==4:#CORBEAU vs CORBEAU
- if comp1==0 and comp2==0: #si ils étaient tous les deux gentils au tour d'avant alors combat
- x=randrange(0,101)
- y=randrange(0,101)
- if x>y:
- gain1=R-C
- gain2=-C
- else :
- gain1=-C
- gain2=R-C
- comp1=1
- comp2=1
- #il n'y aura pas la possibilité de trouver un corbeau gentil contre un corbeau méchant
- elif comp1==1 and comp2==1 : #si ils étaient tous les deux méchants au tour d'avant alors partage
- gain1=R/2
- gain2=R/2
- comp1=0
- comp2=0
- if signal==1: #si il y a eu changement alors remise en ordre
- gain1,gain2,comp1,comp2=gain2,gain1,comp2,comp1
- return (gain1,comp1,gain2,comp2)
- if __name__ == '__main__':
- R=10
- C=50
- tab=[]
- nbgen=20
- seuil=3
- rounds=30
- ind=500
- prop=[0.5*ind,0.5*ind,0*ind,0*ind,0*ind] #Tcol,Tfau,Tper,Tgrue,Tcor
- Tcol=[]
- Tfau=[]
- Tcor=[]
- Tgrue=[]
- Tper=[]
- prop_finale=[]
- propcol=[]
- propfau=[]
- propgrue=[]
- propper=[]
- propcor=[]
- for nbgen in range(nbgen):
- tab=crea_gen(prop,tab)
- for xadv1 in range (len(tab)):
- xadv2=pioche_xadv2(tab,xadv1)
- adv1=tab[xadv1][0]
- adv2=tab[xadv2][0]
- resultat_combat=premier_sang(adv1,adv2)
- tab[xadv1][1]=resultat_combat[0]
- tab[xadv2][1]=resultat_combat[2]
- for round in range (rounds):
- resultat_combat=simuCombat2(adv1,resultat_combat[1],adv2,resultat_combat[3])
- tab[xadv1][1]=resultat_combat[0]
- tab[xadv2][1]=resultat_combat[2]
- bilan=bilan_gen(tab,Tcol,Tfau,Tper,Tgrue,Tcor,seuil,prop,ind)
- propcol.append(bilan[5][0])
- propfau.append(bilan[5][1])
- propgrue.append(bilan[5][3])
- propcor.append(bilan[5][4])
- propper.append(bilan[5][2])
- X=linspace(1,len(propcol),len(propcol))
- figure(figsize=(10,5))
- plot(X,propcol,label="Colombes")
- plot(X,propfau,label="Faucons")
- plot(X,propgrue,label="Grues")
- plot(X,propcor,label="Corbeaux")
- plot(X,propper,label="Perroquets")
- legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)
- show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement