Primeira vez aqui? Seja bem vindo e cheque o FAQ!
x

Como implementar o Torneio de Robert Axelrod para comparar estratégias para jogar o dilema do prisoneiro repetido?

0 votos
28 visitas

1 Resposta

0 votos
respondida Set 25, 2015 por danielcajueiro (5,186 pontos)  

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:

A imagem será apresentada aqui.

...