簡單二維元胞自動機 MATLAB實現


  20世紀50年代,烏爾姆和馮·諾依曼(對此人真是崇拜的五體投地)為了研究機器人自我復制的可能性,提出了一種叫做元胞自動機(Cellular Automaton,CA)的算法。該算法采用局相互作用規則,最終產生整體的自復制構型(和蒙特卡羅法簡直就是完全兩種不同的哲學思想,竟然和同一個人有關)。元胞自動機已經成為研究復雜系統行為的一個理論框架(蒙特卡洛法也是!!),也是人工智能的雛形(alpha GO 也用到了一種蒙特卡洛樹搜索的技術!!!)。

  原本打算每天晚上抽出點時間研究一個分形圖形的,可惜時間管理太差,沒能堅持,但學習分形學確實讓人收獲頗豐!而且一維元胞自動機大一時C語言簡單實現過。所以,實現二維的也沒有太大難度。但就實現速度和代碼質量而言,已經深刻認識到了自己內力(算法)太淺薄,寫的就是白菜代碼。

  規則

    設有axa的網格(a為奇數),中間點設為1,其他點設為0;則此網格共有q/2層,設k為層數k=1~a/2;進行如下循環:

  1.設k層中任一點(Xi, Yi),則判斷其八個鄰居的現有狀態;其和為奇數則(Xi,Yi)為1,否則為0;

  2.對第k層中(Xi, Yi)= 1的點着色;

  3.k = k + 1;返回步驟1.

  代碼

 1 % 二維元胞自動機
 2 % 2016-4-8
 3 % zhaoyu
 4 % 規則,先把中間點置為1,每一時間步對每一點,如果周圍
 5 % 八個點和為偶數,則變為0,為奇數則變為 1
 6 
 7 % 顏色控制
 8 Map = [1 1 1; 0 0 0];
 9 colormap(Map);
10 % 設置網格大小
11 S = 121;
12 L = zeros(S);
13 % 把中間一個數設置為 1 作為元胞種子
14 M = (S+1)/2;
15 L(M, M) = 1;
16 Temp = L;
17 imagesc(L);
18 
19 % 計算層數
20 Layer = (S-1)/2 + 1;
21 
22 for t=2:Layer
23     for x=M-t+1:M+t-1
24        if x==M-t+1 || x==M+t-1
25            
26           for y=M-t+1:M+t-1
27             SUM = 0;
28             for m=-1:1
29                for n=-1:1
30                   if x+m>0 && x+m<=S && y+n>0 && y+n<=S
31                      SUM = SUM + L(x+m, y+n); 
32                   end
33                end
34             end
35             SUM = SUM - L(x, y);
36             Temp(x, y) = mod(SUM, 2);
37           end
38           
39        else
40             y = M-t+1;
41             SUM = 0;
42             for m=-1:1
43                for n=-1:1
44                   if x+m>0 && x+m<=S && y+n>0 && y+n<=S
45                      SUM = SUM + L(x+m, y+n); 
46                   end
47                end
48             end
49             SUM = SUM - L(x, y);
50             Temp(x, y) = mod(SUM, 2);
51             
52             y = M+t-1;
53             SUM = 0;
54             for m=-1:1
55                for n=-1:1
56                   if x+m>0 && x+m<=S && y+n>0 && y+n<=S
57                      SUM = SUM + L(x+m, y+n); 
58                   end
59                end
60             end
61             SUM = SUM - L(x, y);
62             Temp(x, y) = mod(SUM, 2);
63        end
64     end
65     L = Temp;
66     imagesc(L);
67     % 速度控制
68     pause(0.2);
69 end

  生成圖形

 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM