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

Modelo simplificado de criticalidade organizada

+1 voto
18 visitas
perguntada Jun 1, 2017 em Programação Computacional por danielcajueiro (5,186 pontos)  

Considere o modelo de criticalidade auto-organizada que pode ser
representado por uma lista \(z\) com \(n\) posições \([0,\cdots,n-1]\) que podem ser ocupadas por
números naturais menores que \(z_c=2\), que é um valor crítico. Esse modelo evolui da seguinte
forma:

a) No instante \(t=0\), \(z\) é iniciada com zeros.

b) Em cada instante de tempo, duas operações são consideradas:

ADIÇÃO: uma posição \(i\) da lista
é sorteada e faz \(z[i]=z[i]+1\).

RELAXAMENTO: Se \(z[i]\ge z_c\) então faz \(z[i]=z[i]-2\) e
\(z[i+1]=z[i+1]+1\) e \(z[i-1]=z[i-1]+1\). O relaxamento continua até que não haja mais nenhuma
posição do vetor com \(z[i]\ge 2\). No processo de relaxamento, os blocos que caem antes da posição
zero ou depois da posição \(n-1\) são perdidos.

Compartilhe

1 Resposta

+1 voto
respondida Jun 1, 2017 por Caue (226 pontos)  
selecionada Jun 1, 2017 por danielcajueiro
 
Melhor resposta

Foi implementado o método criticalidade, que recebe como parâmetros o valor crítico, o tamanho da lista e o número total de instantes.

Em cada instante é feita a atualização de uma posição aleatória da lista. Na atualização, ocorre a adição, seguida do relaxamento, conforme descrito no modelo.

import random


def criticalidade(z_critico, tamanho_lista=10, total_iteracoes=1000):
    z = [0 for _ in range(tamanho_lista)]

    def update(i):
        if 0 <= i < tamanho_lista:
            # Adição
            z[i] += 1
            # Relaxamento
            if z[i] >= z_critico:
                z[i] -= z_critico
                update(i + 1)
                update(i - 1)

    for _ in range(total_iteracoes):
        i = random.randrange(0, tamanho_lista)
        update(i)

    return z


print(criticalidade(2))
...