cg-Cad

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]

AC2.LSP
  ...
    ((= 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

AC2.LSP

Lisp »Tips 'n Tricks

Ultimo Aggiornamento_Last Update: 1 Maggio 2004