Uma implementação simples é apresentada em Python abaixo. Entretanto, talvez uma melhor implementação poderia considerar uma estrutura baseada em orientação a objeto. Se tiver tempo futuro ou talvez outra pessoa poderia incluir essa implementação.
import numpy as np
import matplotlib.pyplot as plt
def allD():
return -1
def allC():
return 1
def aleatoria():
if(np.random.random()>0.5):
action=1
else:
action=-1
return action
def titForTat(primeiroLance,ultimoLance):
if(primeiroLance):
action=1
else:
if(ultimoLance==1):
action=1
else:
action=-1
return action
def matrizPayoffs(acaoEstrategia1,acaoEstrategia2):
if((acaoEstrategia1==1)and(acaoEstrategia2==1)):
payoffEstrategia1=3
payoffEstrategia2=3
if((acaoEstrategia1==1)and(acaoEstrategia2==-1)):
payoffEstrategia1=0
payoffEstrategia2=5
if((acaoEstrategia1==-1)and(acaoEstrategia2==1)):
payoffEstrategia1=5
payoffEstrategia2=0
if((acaoEstrategia1==-1)and(acaoEstrategia2==-1)):
payoffEstrategia1=1
payoffEstrategia2=1
return payoffEstrategia1,payoffEstrategia2
def estrategias(nome,primeiroLance,ultimoLance):
return {
'allD': allD(),
'allC': allC(),
'aleatoria': aleatoria(),
'titForTat': titForTat(primeiroLance,ultimoLance),
}[nome]
def torneio(T,fatorDeDesconto,vetorDeEstrategias):
tamanhoVetorDeEstrategias=np.size(vetorDeEstrategias)
numeroDeJogos=tamanhoVetorDeEstrategias+(tamanhoVetorDeEstrategias*(tamanhoVetorDeEstrategias-1))/2
payoffs=np.empty([numeroDeJogos,2])
payoffTotal=np.zeros([tamanhoVetorDeEstrategias])
cont=-1
for i in range(0,tamanhoVetorDeEstrategias):
for j in range(i,tamanhoVetorDeEstrategias):
payoffAgregadoEstrategia1=0
payoffAgregadoEstrategia2=0
cont=cont+1
ultimoLanceEstrategia1=0
ultimoLanceEstrategia2=0
for t in range(T):
if(t==0):
primeiroLance=True
else:
primeiroLance=False
lanceEstrategia1=estrategias(vetorDeEstrategias[i],primeiroLance,ultimoLanceEstrategia2)
lanceEstrategia2=estrategias(vetorDeEstrategias[j],primeiroLance,ultimoLanceEstrategia1)
[payoffEstrategia1,payoffEstrategia2]=matrizPayoffs(lanceEstrategia1,lanceEstrategia2)
payoffAgregadoEstrategia1=payoffAgregadoEstrategia1+np.power(fatorDeDesconto,t)*payoffEstrategia1
payoffAgregadoEstrategia2=payoffAgregadoEstrategia2+np.power(fatorDeDesconto,t)*payoffEstrategia2
ultimoLanceEstrategia1=lanceEstrategia1
ultimoLanceEstrategia2=lanceEstrategia2
payoffTotal[i]=payoffTotal[i]+payoffEstrategia1
payoffTotal[j]=payoffTotal[j]+payoffEstrategia2
payoffs[cont,0]=payoffAgregadoEstrategia1
payoffs[cont,1]=payoffAgregadoEstrategia2
return payoffs,payoffTotal
if __name__ == '__main__':
T=10000
fatorDeDesconto=0.99
tipoDeJogo='sequencial'
vetorDeEstrategias=(['allD','allC','aleatoria','titForTat'])
[payoffs,payoffTotal]=torneio(T,fatorDeDesconto,vetorDeEstrategias)
resultadosPayoff=plt.figure()
x=np.array([1,2,3,4,5,6,7,8,9,10])
ax = plt.subplot(111)
dist=0.2
ax.bar(x-dist, payoffs[:,0],width=0.3,color='b',align='center')
ax.bar(x+dist, payoffs[:,1],width=0.3,color='r',align='center')
plt.rcParams['xtick.labelsize'] = 8
ax.set_ylabel('Payoffs')
ax.set_title('Payoffs das Estrategias')
ax.set_xticks(x)
ax.set_xticklabels( ('allD x allD','allD x allC', 'allD x rand', 'allD x titForTat', 'allC x allC', 'allC x Rand', 'allC x tit','rand x rand','rand x Tit','tit x tit') )
print vetorDeEstrategias
print payoffTotal
A figura abaixo foi gerada com essa implementação:
