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

Como implementar o jogo da minoria?

0 votos
167 visitas
perguntada Set 9, 2015 em Sistemas Complexos por danielcajueiro (5,786 pontos)  
Compartilhe

1 Resposta

0 votos
respondida Set 9, 2015 por danielcajueiro (5,786 pontos)  

A implementação do jogo da minoria é baseada no artigo do Challet, D. and Zhang, Y. C. Emergence of cooperation and organization on an evolutionary game. Physica A 246, p. 407--418, 1997 e pode ser dividido etapas:

a) Inicialização da matriz de estratégias e recompensas associada as estratégias e inicialização da informação global

b) Escolha da melhor estratégia dos Agentes: Loop para a escolha da melhor estratégia (Essa escolha se baseia na estratégia disponível para cada agente, na pontuação de cada estratégia e no estado)

c) Mercado: Soma as escolhas dos agentes e encontra o lado vencedor (ir ou não ir ao bar)

d) Aprendizado: Pontuação das melhores estratégias (isto é, aquelas que foram bem sucedidas na etapa anterior)

e) Atualização da informação global: Note que a informação global só precisa guardar a informação das últimas \(M\) semanas.

Veja abaixo como isso é feito em Python:

import matplotlib.pyplot as plt
import numpy as np
import random

def updateMatrizRecompensa(matrizDeRecompensas,matrizDeEstrategia,estado,mercado):
    [N,s,numeroEstadosPossiveis]=np.shape(matrizDeEstrategia)
    for i in range(N):
        for j in range(s):
            if(mercado*matrizDeEstrategia[i,j,estado]<0):
                matrizDeRecompensas[i,j]=matrizDeRecompensas[i,j]+1
    return matrizDeRecompensas            

def updateEstado(vetorInformacao,noticia):
    m=np.size(vetorInformacao)
    for i in range(m-1):
        vetorInformacao[i]=vetorInformacao[i+1]
    vetorInformacao[m-1]=noticia    
    return vetorInformacao

def informaEstado(vetorInformacao):
    m=np.size(vetorInformacao)
    estado=0
    for i in range(m):
        estado=estado+np.power(2,m-i-1)*vetorInformacao[i]
    return estado

def escolheMelhorEstrategia(matrizDeRecompensas,agente):
    melhorEstrategia=0
    [N,s]=np.shape(matrizDeRecompensas)
    valorMelhorEstrategia=matrizDeRecompensas[agente,0]
    for i in range(1,s):
        if(matrizDeRecompensas[agente,i]>valorMelhorEstrategia):
            melhorEstrategia=i
            valorMelhorEstrategia=matrizDeRecompensas[agente,i]
    return melhorEstrategia

def jogoDaMinoria(N,T,m,s):
    mercadoOutput=np.empty([T])
    demandaOutput=np.empty([T])
    numeroEstadosPossiveis=np.power(2,m)
    matrizDeRecompensas=np.empty([N,s])
    matrizDeEstrategia=np.empty([N,s,numeroEstadosPossiveis])
    vetorInformacao=np.empty([m])
    #Inicializacao do vetor de Informacao
    for i in range(m):
        w=np.random.uniform(0,1,1)
        if(w>= 0.5):
            vetorInformacao[i]=1
        else:    
            vetorInformacao[i]=0
    # Inicializacao da matriz de recompensas
    for i in range(N):
        for j in range(s):
            matrizDeRecompensas[i,j]=0
    # Inicializacao da matriz de estrategias
    for i in range(N):
        for j in range(s):
            for k in range(numeroEstadosPossiveis):
                w=np.random.uniform(0,1,1)
                if(w>= 0.5):
                    matrizDeEstrategia[i,j,k]=1
                else:    
                    matrizDeEstrategia[i,j,k]=-1
    for t in range(T):
        estado=informaEstado(vetorInformacao)
        mercado=0
        demanda=0
        for i in range(N):
            if(t==0):
                melhorEstrategia=random.randrange(0,s)
            else:
                melhorEstrategia=escolheMelhorEstrategia(matrizDeRecompensas,i)
            mercado=mercado+matrizDeEstrategia[i,melhorEstrategia,estado]
            if(matrizDeEstrategia[i,melhorEstrategia,estado]==1):
                demanda=demanda+1
        mercadoOutput[t]=mercado
        demandaOutput[t]=demanda


        matrizDeRecompensas=updateMatrizRecompensa(matrizDeRecompensas,matrizDeEstrategia,estado,mercado)        

        if(mercado>0):
            vetorInformacao=updateEstado(vetorInformacao,1)
        else:
            vetorInformacao=updateEstado(vetorInformacao,0)
    sigma2=np.var(mercadoOutput)     

    return sigma2,demandaOutput

if __name__ == '__main__':

  M=12 #Tamanho da memoria considerada
  N=101 # Numero de agentes
  s=2 # Numero de estrategias
  T=2000 # Duracao do jogo



  dataSigma=np.empty([M])
  dataMem=np.empty([M])  
  demandaData=np.empty([T,M])
  cont=-1  
  for m in range(1,M+1):
      print "m",m
      cont=cont+1
      [sigma2,demanda]=jogoDaMinoria(N,T,m,s)
      dataSigma[cont]=sigma2/N
      dataMem[cont]=float(np.power(2,m))/N
      demandaData[:,cont]=demanda.T

  fig1 = plt.figure()
  ax1 = fig1.add_subplot(111)
  ax1.loglog(dataMem,dataSigma,'ro-',basex=2,basey=2)
  plt.xlabel('Memoria')
  plt.ylabel('Ineficiencia do Sistema')

  fig2 = plt.figure()
  ax2 = fig2.add_subplot(111)
  ax2.plot(demandaData[T/2:T,5])
  plt.title('Jogo da Minoria com populacao de 101 agentes')
  plt.xlabel('Tempo')
  plt.ylabel('Demanda')
  plt.axis([0, 100, 30, 70])

  Usando esse código, geramos as seguintes figuras

Minority Game

Minority Game

...