TI/Skrypty z zajęć/9

Z Brain-wiki
# -*- coding: utf-8 -*-
"""
Created on Wed Apr 29 11:31:12 2020

@author: Tomek
"""

'''
W tym zadaniu napiszemy automat komórkowy, który będzie bardzo uproszczonym modelem sterty piachu. 
Automat działa na prostokątnej tablicy (przyjmijmy 100 na 100). Początkowo, każda z komórek przyjmuje 
losową wartość ze zbioru [0,1,2,3]. Dynamika modelu jest następująca:
1. Losowo wybieramy jedną komórkę w tablicy i zwiększamy przechowywaną tam liczbę o jeden.
2. Mówimy że układ jest niestabilny, gdy gdziekolwiek w tablicy znajduje się wartość 4.
3. Jeżeli układ jest niestabilny, losowo wybieramy jedną z komórek z wartością 4. 
    Zmieniamy jej wartość na 0, natomiast wartości sąsiadujących komórek (czterech, lub mniej jeżeli jesteśmy przy brzegu) 
    zwiększamy o jeden.
4. Powtarzamy punkt 3 aż do momentu gdy układ jest stabilny (nie jest niestabilny). 
    Liczymy ile razy trzeba było powtórzyć punkt 3 aby dojść do punktu 4 i zapisujemy tę liczbę (N) w oddzielnej liście.
Powtarzamy punkty 1-4 tysiąc razy. Zadanie polega na wykreśleniu histogramu z tysiąca liczb N odpowiadających kolejnym powtórzeniom. 
Wykonaj animację ostatnich stu powtórzeń punktów 1-4.
'''

import numpy as np
import pylab as py
import matplotlib.pyplot as plt
import matplotlib.animation as animation


Nx = 50+2
Ny = 50+2

tab = np.random.randint(4, size = (Nx,Ny))

def zerujBrzegi():
    global tab
    tab[0,:] = 0
    tab[-1,:] = 0
    tab[:,0] = 0
    tab[:,-1] = 0
zerujBrzegi()
Nki = []
klatki = []

for i in range(1000):
    #punkt 1
    x = np.random.randint(1,Nx-1)
    y = np.random.randint(1,Ny-1)
    tab[x,y] +=1
    #punkt 3
    N = 0 #licznik powt
    while np.sum(tab>3):
        N += 1
        ktory = np.random.randint(np.sum(tab>3))
        punkty = np.nonzero(tab>3)
        x = punkty[0][ktory]
        y = punkty[1][ktory]
        tab[x,y] -= 4
        tab[x+1,y] += 1
        tab[x-1,y] += 1
        tab[x,y+1] += 1
        tab[x,y-1] += 1
        zerujBrzegi()
        if (i>900):
            klatki.append(np.copy(tab))
    Nki.append(N)
print(len(klatki))

#print(Nki)
#py.hist(Nki)

fig = plt.figure( figsize=(8,8) )
im = plt.imshow(tab, cmap="Greys")
def animuj(i):
    im.set_array(klatki[i])
    return [im] #magia tutaj!!!!
ani = animation.FuncAnimation(fig, animuj, frames = len(klatki), interval = 100)
plt.show()