Nahajate se tukaj

Igra življenja

Začetni položaj

Primer celičnih avtomatov na področju modeliranja organizmov je preizkušal John Conway že pred več kot pol stoletja in predstavlja enega preprostejših primerov simulacij s podanimi enostavnimi ppravili za vsako celico. Proces ni stohastičen ampak predpisuje za vsako celico determinističen način obnašanja, ki vključuje naslednja tri pravila za vsako celico:

  1. Če ima celica natanko dva živa soseda, potem ohranja svoje stanje (se nič ne spremeni)
  2. Če ima celica natanko tri žive sosede potem tudi ona postane živa.
  3. Sicer je mrtva, oziroma postane mrtva.

Sosedi celice so vse najbližje celice (8 sosedov, tudi v diagonalah). Na robovih lahko ohranimo periodičnost oziroma povezanost robov. Prestop v naslednjo generavijo se zgodi v trenutku (tick). Spreminjanje stanja celic imenujemo življenje.

Napišite program, ki simulira to življenje. Izris lahko uporabite poljuben. ASCII izpis (* ali X)  je možen za manjša območja. Za večja pa je bolje uporabiti PGM/PBM format. Izpisujte tudi število živih celic v sistemu ter število sprememb posameznega stanja (umrlih, rojenih). Začetno stanje naj bo križ iz celic preko sredine. Program paralelizirajte s porazdelitvijo prostora (matrike). 

# -*- coding: utf-8 -*- conway.py
import numpy as np
import pylab as pl

def update(board):
    # Število sosedov celice
    neighbours = np.zeros(board.shape)
    neighbours[1:, 1:] += board[:-1, :-1]
    neighbours[1:, :-1] += board[:-1, 1:]
    neighbours[:-1, 1:] += board[1:, :-1]
    neighbours[:-1, :-1] += board[1:, 1:]
    neighbours[:-1, :] += board[1:, :]
    neighbours[1:, :] += board[:-1, :]
    neighbours[:, :-1] += board[:, 1:]
    neighbours[:, 1:] += board[:, :-1]

    new_board = np.where(neighbours < 2, 0, board)
    new_board = np.where(neighbours > 3, 0, new_board)
    new_board = np.where(neighbours == 3, 1, new_board)

    return new_board

# inicializacija deske
board = np.zeros((32, 32), int)
board[15,:] = 1
board[:,15] = 1

#board[:] = np.random.rand(32,32).round(0)

pl.ion()
pl.imshow(board, cmap = pl.cm.prism)
pl.savefig('conway_initial.png')
for iter in range(30):
    board = update(board)
    pl.imshow(board, cmap = pl.cm.prism)
    pl.draw()

pl.ioff()
pl.show()