Lisp »Tips 'n Tricks
»Automi »1 »2 »3
Automi cellulari a una dimensione (2)
AC2 disegna dall'alto verso il basso l'evoluzione di n automi cellulari a una dimensione nel corso di x generazioni, sotto forma di una serie di righe formate da punti casuali.
Ogni automa è condizionato dalla presenza (o assenza) di automi nelle 4 celle vicine a destra e a sinistra. Ogni cella ha valore 1 o 0. Si somma il contenuto della cella in esame con il contenuto delle 4 celle a destra e delle 4 celle a sinistra e si procede secondo la regola:
9 8 7 6 5 4 3 2 1 0
0 0 1 0 0 1 1 0 0 0
|
;|
AC2.lsp (C) 2004 by Claudio Piccini.
1 Maggio 2004 (versione 1.0)
www.cg-cad.com
Disegna automi cellulari
a una dimensione
|;
;|
Genera un numero casuale da 0 a 100.
Il seme e' inizializzato con la variabile DATE
in questo modo la serie di numeri casuali
e' diversa per ogni sessione del gioco.
|;
(defun rn ( / m b c)
(if (not sd) (setq sd (getvar "DATE")))
(setq m 65521 b 15937 c 33503 sd
(rem (+ (* b sd) c) m)
)
(setq sd (* (/ sd m) 101))
)
;|
trasforma il numero casuale
(0.0,100.0)->(0,1)
|;
(defun rand ( / sx)
(setq sx (rn))
(if (<= (fix sx) 50)
(setq sx 0)
(setq sx 1)
)
)
;|
inizializza la lista lnc con
valori casuali 0,1
|;
(defun f1 (na / i)
(setq i 0)
(while (< i na)
(setq lnc (append lnc (list (rand))))
(setq i (1+ i))
)
(setq lnc lnc)
)
;|
(contaVicini) conta i vicini di e=(nth i L)
Restituisce la somma
somma = e+(e-4)+(e-3)+(e-2)+(e-1)+
+(e+1)+(e+2)+(e+3)+(e+4)
|;
(defun contaVicini (n L lung / somma)
(setq somma 0)
;|
controlla se il valore di n-4 e n+4
oltrepassa i limiti della lista L
|;
(if (and (>= (- n 4) 0)(< (+ n 4) lung))
(progn
(setq somma (+
(nth n L)
(nth (- n 1) L)
(nth (- n 2) L)
(nth (- n 3) L)
(nth (- n 4) L)
(nth (+ n 1) L)
(nth (+ n 2) L)
(nth (+ n 3) L)
(nth (+ n 4) L)
)
)
)
(progn
(cond
((= n 0)
(setq somma (+
(nth 0 L)
(nth 1 L)
(nth 2 L)
(nth 3 L)
(nth 4 L)
(nth (- lung 1) L)
(nth (- lung 2) L)
(nth (- lung 3) L)
(nth (- lung 4) L)
)
)
)
((= n 1)
(setq somma (+
(nth 1 L)
(nth 0 L)
(nth (- lung 1) L)
(nth (- lung 2) L)
(nth (- lung 3) L)
(nth 2 L)
(nth 3 L)
(nth 4 L)
(nth 5 L)
)
)
)
((= n 2)
(setq somma (+
(nth 2 L)
(nth 1 L)
(nth 0 L)
(nth (- lung 1) L)
(nth (- lung 2) L)
(nth 3 L)
(nth 4 L)
(nth 5 L)
(nth 6 L)
)
)
)
((= n 3)
(setq somma (+
(nth 3 L)
(nth 2 L)
(nth 1 L)
(nth 0 L)
(nth (- lung 1) L)
(nth 4 L)
(nth 5 L)
(nth 6 L)
(nth 7 L)
)
)
)
((= n (- lung 1))
(setq somma (+
(nth n L)
(nth (- n 1) L)
(nth (- n 2) L)
(nth (- n 3) L)
(nth (- n 4) L)
(nth 0 L)
(nth 1 L)
(nth 2 L)
(nth 3 L)
)
)
)
((= n (- lung 2))
(setq somma (+
(nth n L)
(nth (+ n 1) L)
(nth 0 L)
(nth 1 L)
(nth 2 L)
(nth (- n 1) L)
(nth (- n 2) L)
(nth (- n 3) L)
(nth (- n 4) L)
)
)
)
((= n (- lung 3))
(setq somma (+
(nth n L)
(nth (+ n 1) L)
(nth (+ n 2) L)
(nth 0 L)
(nth 1 L)
(nth (- n 1) L)
(nth (- n 2) L)
(nth (- n 3) L)
(nth (- n 4) L)
)
)
)
((= n (- lung 4))
(setq somma (+
(nth n L)
(nth (+ n 1) L)
(nth (+ n 2) L)
(nth (+ n 3) L)
(nth 0 L)
(nth (- n 1) L)
(nth (- n 2) L)
(nth (- n 3) L)
(nth (- n 4) L)
)
)
)
)
)
)
(setq somma somma)
)
(defun disegna_step (lnc y / x )
(setq x 0)
(while (< x (length lnc))
(if (= (nth x lnc) 1)
(command "_point" (list x y))
)
(setq x (1+ x))
)
)
(defun c:ac2 ( / snapp sd
na itera i j y
lnc lnc2 lung_lista
)
(setvar "cmdecho" 0)
(setq snapp (getvar "osmode"))
(command "_osnap" "_non")
(while
(progn
(setq na (getint "\nNumero automi? "))
(if (> na 8) nil T)
)
)
(initget (+ 2 4))
(setq itera (getint "\nIterazioni? [100] "))
(if (= itera nil)(setq itera 100))
;|
inizializza la lista lnc
con numeri casuali: 0,1
|;
(setq lnc (f1 na))
(princ "\nstep 0")
(disegna_step lnc 0)
(setq lung_lista (length lnc))
(setq i 1)
(setq y -1)
(while (<= i itera)
(setq j 0)
(while (< j lung_lista)
(setq somma (contaVicini j lnc lung_lista))
(cond
((= somma 0)
(setq lnc2 (append lnc2 (list 0)))
)
((= somma 1)
(setq lnc2 (append lnc2 (list 0)))
)
((= somma 2)
(setq lnc2 (append lnc2 (list 0)))
)
((= somma 3)
(setq lnc2 (append lnc2 (list 1)))
)
((= somma 4)
(setq lnc2 (append lnc2 (list 1)))
)
((= somma 5)
(setq lnc2 (append lnc2 (list 0)))
)
((= somma 6)
(setq lnc2 (append lnc2 (list 0)))
)
((= somma 7)
(setq lnc2 (append lnc2 (list 1)))
)
((= somma 8)
(setq lnc2 (append lnc2 (list 0)))
)
((= somma 9)
(setq lnc2 (append lnc2 (list 0)))
)
)
(setq j (1+ j))
)
(princ "\nstep ")
(princ i)
(setq lnc lnc2)
(setq lnc2 nil)
(disegna_step lnc y)
(setq y (1- y))
(setq i (1+ i))
)
(setvar "osmode" snapp)
(command "_redraw")
(setvar "cmdecho" 1)
(princ)
)
;;;eof
|
Test del lisp
Command: ac2
Numero automi? 300
Iterazioni? [100]
...
((= somma 6)
(if (<= (fix (rn)) 20)
(setq lnc2 (append lnc2 (list 1)))
(setq lnc2 (append lnc2 (list 0)))
)
)
((= somma 7)
(setq lnc2 (append lnc2 (list 1)))
)
((= somma 8)
(if (<= (fix (rn)) 20)
(setq lnc2 (append lnc2 (list 1)))
(setq lnc2 (append lnc2 (list 0)))
)
)
((= somma 9)
(if (<= (fix (rn)) 20)
(setq lnc2 (append lnc2 (list 1)))
(setq lnc2 (append lnc2 (list 0)))
)
)
)
(setq j (1+ j))
)
(princ "\nstep ")
(princ i)
(setq lnc lnc2)
(setq lnc2 nil)
(if (<= (fix (rn)) 20)
(setq lnc (reverse lnc))
)
(disegna_step lnc y)
...
|
Command: ac2
Numero automi? 400
Iterazioni? [100] 200
Lisp »Tips 'n Tricks
Ultimo Aggiornamento_Last Update: 1 Maggio 2004
|