元胞自动机
一個一個的格子看做是一個個的元胞,他們按照自己的規則自動進行狀態改變就是元胞自動機。
定義:是一種時間、空間、狀態都離散,空間相互作用和時間因果關系為局部的網格動力學模型,具有模擬復雜系統時空演化過程的能力。
元胞自動機由元胞、元胞空間、元胞鄰居、元胞規則組成。
元胞可以稱為單元或基元,是元胞自動機最基本的部分。每個元胞有一個狀態,比如說將元胞看做人,擁有生和死兩種狀態,元胞的狀態按照規則不斷進行更新。元胞空間就是元胞在空間分布撒上的集合,元胞空間的類型根據其形狀命名。
用的最多的還是正方形,因為代碼實現簡單。
鄰居:某一元狀態更新時所要搜索的空間域。也就是能夠影響該元胞的其他元胞,如果不能產生影響就不是鄰居。
?常見的有這三種鄰居類型,橙色的為綠色的鄰居。
邊界條件:理論上,元胞空間是無限的,實際應用中無法達到這一理想條件,為了讓元胞空間邊界上的元胞擁有規則所需要的鄰居,就需要構造出一些虛擬的鄰居,構造的過程就用到了邊界條件。常用的鄰居邊界條件類型有:固定型、周期型、絕熱型、映射型。
固定型:邊界元胞的數值想給多少就給多少。下圖中令左下角3的左鄰居為2。
?周期型:相當于首位相連。第一個做最后一個的鄰居。
?絕熱型:自己是多少,鄰居就是多少。
?映射型:將數據對稱過去。比如下圖將左下角的3右鄰居映射到左邊。
規則:根據元胞當前狀態及鄰居的狀態來決定下一時刻該元胞狀態。元胞自動機根據規則進行局部元胞間的相互作用從而引起全局的變化。
元胞特征:①離散型:空間、時間(隔一段時間檢查一遍狀態)、狀態都是離散的。②同質性:服從相同的規律,分布方式也是相同的。③并行性:元胞的狀態更新規則變化是同步進行的。④高緯度:元胞自動機可以有很多維。
初等元胞自動機:一維元胞自動機的元胞鄰居半徑為1,元胞有且只有兩種狀態(只有0和1)。因此一個元胞加上其鄰居狀態就有了8種狀態:
根據不同的變化規則,每種情況的中心元胞都會變成0或者1,即有兩種情況。
代碼應用到的函數:
imagesc(C)?將數組?C?中的數據顯示為一個圖像,該圖像使用顏色圖中的全部顏色。C?的每個元素指定圖像的一個像素的顏色。生成的圖像是一個?m×n?像素網格,其中?m?和?n?分別是?C中的行數和列數。這些元素的行索引和列索引確定了對應像素的中心
axis square;產生正方形的坐標系
matlab中set語句用于給某對象的屬性進行賦值。具體到set(A,'CData',B): A代表一個對象,'CData'是對象A的其中一個屬性,B是準備賦給'CData'的值
A([5,1:4],:)將A的第5行、第1到4行的所有列按順序組合成一個新的數組,相當于將第5行放在第一行
C = cat(dim,A,B)?沿維度?dim?將?B?串聯到?A?的末尾。
drawnow用于刷新屏幕
| image是最基本的圖像顯示函數。在MATLAB中用到的所有顯示圖像的函數都顯式或者不顯式地調用了這個函數。 imagesc是把圖像矩陣中的值縮放到一個它認為合適的范圍再使用image。這樣使得圖像矩陣中的值過小/過大/過集中時,仍然可以看到一個視覺效果還可以的圖像。而對這樣的矩陣直接用image則不行。 |
實例:
一、 奇偶規則:元胞只有兩種狀態(0和1),馮諾依曼型鄰居之和為奇數,則中心元胞變為1,若鄰居之和為偶數,則中心元胞變為0。?
clc,clear n = 200; Se = zeros(n); Se(1:4,1:4) = 1; Ch = imagesc(Se);%可視化 axis square; Sd = zeros(n+2); while(1)Sd(2:n+1,2:n+1) = Se;%相當于給Se矩陣加了一個全0邊框,變為Sdsum = Sd(1:n,2:n+1)+Sd(3:n+2,2:n+1)+Sd(2:n+1,1:n)+Sd(2:n+1,3:n+2);%對鄰居求和Se = mod(sum,2);%滿足變換規則set(Ch,'cdata',Se);pause(0.03); end二、森林火災:元胞有三種狀態(樹、火、空地),樹變為火有兩種情況(馮諾依曼型鄰居有一個是火,則中心元胞為火,或者被閃電擊中變為火),火一段時間后會變為空地,空地有一定幾率長出樹。
clc,clear n = 300;%定義森林的大小 Plight = 5e-6;Pgrowth = 1e-2;%定義閃電和生長的概率 UL = [n,1:n-1];%用來實現左和上鄰居 DR = [2:n,1];%用來實現右和下鄰居 veg = zeros(n);%初始化森林的矩陣 imh = image(cat(3,veg,veg,veg));%可視化森林,cat用以改變顏色 %veg 空地時為0.著火為1,樹為2 while(1)sum = (veg(UL,:)==1)+(veg(:,UL)==1)+(veg(:,DR)==1)+(veg(DR,:)==1);%判斷中心元胞周圍是否有著火veg = 2*(veg==2) - ((veg==2)&(sum>0 | (rand(n)<Plight))) + 2*((veg==0)&rand(n)<Pgrowth);set(imh,'cdata',cat(3,(veg==1),(veg==2),zeros(n)));drawnow; endps:cat將不同顏色層疊加,產生新的顏色。
總結
- 上一篇: ssh 免密_Linux下配置SSH免密
- 下一篇: Flask 第三方组件之 Migrate