Last active
December 21, 2018 22:43
-
-
Save Uiuran/8949711 to your computer and use it in GitHub Desktop.
Simula automata neural de Kinouchi-Copelli
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import networkx as nx | |
import numpy as np | |
import matplotlib.pyplot as plt | |
from matplotlib import rc | |
def kc( ativos0, num_estados, rede, tempo): | |
firstN = set(); | |
ativos = set(); | |
ativos.add(ativos0); | |
firstN.add(ativos0); | |
deterministicos = set(); | |
N = len(rede); | |
for instante in tempo: | |
# print " Tempo "+str(instante)+"\n"; | |
# print " Ativos"+str(ativos)+"\n"; | |
deterministicos.update(ativos); | |
# print " Transicao deterministica "+str(deterministicos)+"\n"; | |
ptrans = primeirosVizinhosAtivos( ativos, rede); | |
# print " Rede "+str(rede.edge)+"\n"; | |
lt = len(ptrans); | |
transicoes = np.random.rand(lt); | |
c = 0; | |
# print " sorteados "+str(transicoes)+"\n"+" 1-p "+str(ptrans)+"\n"; | |
for t in ptrans: | |
if transicoes[c] < (1.0-ptrans[t]): | |
rede[t]['estado'] = rede[t]['estado'] + 1; | |
ativos.add(t); | |
c = c + 1; | |
else: | |
c = c + 1; | |
for b in deterministicos.copy(): | |
rede[b]['estado'] = np.mod( rede[b]['estado'] + 1, num_estados); | |
if rede[b]['estado'] == 0: | |
deterministicos.remove(b); | |
if rede[b]['estado'] != 1: | |
ativos.remove(b); | |
# print " Rede "+str(rede.edge)+"\n"; | |
Num = len(ativos); | |
if Num == 0: | |
break; | |
firstN.update(ativos); | |
return (len(firstN),instante); | |
## Selecao de probabilidade, primeira tentativa produtorio_ativos(1-p). probabilidade de nao chegar nenhum sinal aos vizinhos, a probabilidade de chegar pelo menos um sinal eh 1-p_vizinhos ## | |
def primeirosVizinhosAtivos(ativos, net): | |
p_vizinhos = {}; | |
for i in ativos: | |
for j in net[i]: | |
if j in p_vizinhos: | |
p_vizinhos[j] = p_vizinhos[j]*(1.0 - net[i][j]['P']); | |
else: | |
if j != 'estado' and j != 'input': | |
if net[j]['estado'] == 0: | |
p_vizinhos[j] = net[i]['input']*(1-net[i][j]['P']); | |
# for i in p_vizinhos: | |
# l = len(p_vizinhos[i]); | |
# prod = 1.0; | |
# print "\n Neighb_num "+str(p_vizinhos)+" \n" | |
# for j in range(l): | |
# prod = prod*(1.0-p_vizinhos[i][j]); | |
# p_vizinhos[i] = 1 - net[i]['input']*prod; | |
# print "\n Quiescent transition P "+str(p_vizinhos)+" \n"; | |
return p_vizinhos; | |
def shrink(a): | |
a = list(a); | |
a.sort(); | |
for el in a: | |
while a.count(el) > 1: | |
a.remove(el); | |
return np.array(a); | |
def allIndex(rede, a, diverse = False): | |
N = len(rede); | |
indexes = []; | |
if diverse: | |
for i in range(N): | |
if rede[i]['estado'] != a: | |
indexes.append(i); | |
return indexes; | |
else: | |
for i in range(N): | |
if rede[i]['estado'] == a: | |
indexes.append(i); | |
return indexes; | |
def associarEstadosRede(rede, estados): | |
for i in range(len(rede)): | |
rede[i]['estado'] = estados[i]; | |
def associarEstimuloExterno(rede, individuos, taxa): | |
for i in range(len(rede)): | |
rede[i]['input'] = 1.0; | |
for member in individuos: | |
rede[individuos.pop()]['input'] = np.exp(-taxa); | |
def associarProbabilidades(rede0, pmax): | |
for edge in rede0.edge: | |
for a in rede0.edge[ edge ].items(): | |
if a[0] == (edge-1): | |
rede0.edge[ edge ][ a[0] ][ 'P' ] = rede0.edge[ edge -1][ edge ][ 'P' ]; | |
else: | |
rede0.edge[ edge ][ a[0] ][ 'P' ] = np.random.uniform(0, pmax); | |
def histogram(data,bins, minimum = -7.5, maximum = 7.5): | |
binsize = (maximum - minimum)/float(bins); | |
binxpos = [minimum + binsize*j for j in np.arange(bins)]; | |
binypos = []; | |
data.sort(); | |
for i in range(bins): | |
s = data.searchsorted([minimum + i*binsize,minimum + (i+1)*binsize]); | |
binguys = data[s[0]:s[1]]; | |
binypos.append(binguys.size); | |
norm = float(binsize*data.size) #float(sum(binypos)); | |
binypos = [j/norm for j in binypos]; | |
plt.bar(binxpos,binypos,binsize,color='red'); | |
numero_estados = 2; | |
N = 100000; | |
k_mean = 10.0; | |
# Calcula <k> = np.mean(rede0.degree(rede0).values()); | |
tempot = np.linspace(0, 9999, 10000); | |
pmax = 2.*0.8/k_mean; | |
e0 = np.zeros(N); | |
estimulo = 0.0; | |
## Condicao inicial aleatoria | |
# e0 = np.random.randint(0, numero_estados, N); | |
## Para o caso de haver individuo com entradas externas do tipo processo de Poisson | |
#inp = np.random.randint(0, N, N/10); | |
#inp = shrink(inp); | |
S_ize = []; | |
T_ime = []; | |
for i in range(100000): | |
rede0 = nx.generators.gnm_random_graph(N, N*k_mean/2); | |
associarProbabilidades(rede0, pmax); | |
associarEstadosRede(rede0, e0); | |
associarEstimuloExterno(rede0, set(), 2.0); | |
inicial = np.random.randint(0,N); | |
rede0[inicial]['estado'] = 1.0; | |
(a,b) = kc(inicial ,numero_estados, rede0, tempot); | |
S_ize.append(a); | |
T_ime.append(b); | |
print "\n"; | |
print i; | |
S_ize.sort() | |
T_ime.sort() | |
l1 = S_ize.count(1); | |
l2 = T_ime.count(0); | |
for i in range(l1): | |
S_ize.pop(0); | |
for i in range(l2): | |
T_ime.pop(0); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment