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

