元胞自动机学习笔记
?元胞自動機學習筆記
2021.7.19
一、簡介:
元胞自動機(cellular automata,CA):是一種時間,空間,狀態都離散,空間相互作用和時間因果關系為局部的網格動力學模型,具有模擬復雜系統時空演化過程的能力。?
二、構成:
?
- 元胞:可稱為單元或基元,是元胞自動機最基本的部分
- 元胞狀態:在最簡單情況下,元胞有兩種可能的狀態;較復雜情況下,具有多種狀態;元胞的狀態都按照元胞動力機的動力規則不斷更新。
- 元胞空間:元胞在空間分布上的集合
- 元胞鄰居:某一元胞狀態更新時所要搜索的空間域(能夠影響該元胞下一時刻狀態的元胞)
?
最常用的三種鄰居
- 邊界條件:理論上,元胞空間是無限的,實際應用中無法達到這一理想條件,為了給元胞空間邊界上的元胞擁有規則所需要的鄰居,就需要構建出一些虛擬鄰居,常用的鄰居邊界條件類型有:固定型,周期型,絕熱型和映射型。
- 元胞規則:根據元胞當前的狀態及鄰居的狀態來決定下一時刻該元胞的狀態,元胞自動機根據規則進行局部元胞間的相互作用而引起全局變化
元胞自動機的特性:
- 離散性:空間、時間及狀態都是離散的
- 同質性:服從相同的規律分布方式相同
- 并行性:元胞的狀態更新規則變化時同步進行的
- 高維度:元胞自動機時一類無窮維動力系統
初等元胞自動機:
初等元胞自動機只有這八種狀態
因為每種狀態的元胞的下一狀態都有兩種情況:0 or 1,每種情況對應一種規則,所以共有種規則
三、實例
實例1:奇偶規則
元胞有兩種狀態{ 0,1 };
鄰居之和為奇數,中心元胞變為1;
鄰居之和為偶數,中心元胞變為0;
MATLAB代碼實現:
clc;clear; n=200; %元胞空間大小 %元胞自動機的實現本質是矩陣的變化 Se=zeros(n); z=zeros(n); Se(n/2-2:n/2+2,n/2-2:n/2+2)=1; %設置初始狀態Ch=imagesc(Se) %用紅藍色顯示目前元胞狀態Ch=imagesc(cat(3,Se,z,z)) %用紅黑色顯示目前元胞狀態 axis square; %加方形邊框Sd=zeros(n+2); %邊界條件(上下左右各加一全為0的行/列)while(1)Sd(2:n+1,2:n+1)=Se; %相當于給Se加了一個全為0的框%邊界條件sum=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和sum都是矩陣Se=mod(sum,2); %判斷奇偶并賦值set(Ch,'cdata',cat(3,Se,z,z)) %控制性質(形狀、顏色)的變化 %矩陣的更新pause(0.03) %每隔0.03秒變一次end實例2:生命游戲
在一個正方形的棋盤中,每個小格有兩種狀態,“生”或“死”,每個小格有八個鄰居:
① 對于“生”的格子,若他的8個鄰居中有兩個或者三個為“生”,則該格繼續保持“生”,否則就變為“死”;
②對于“死”的格子,若他的8個鄰居中有3個“生”,則該格變為“生”,否則繼續保持“死”。
MATLAB代碼實現:
clc;clear; n=200; p=0.4 %初始化,以0.4"生"的概率生成 z=zeros(n); Se=rand(n)<p; Sd=zeros(n+2); Ph=imagesc(cat(3,Se,z,z)) axis square; while(1)Sd(2:n+1,2:n+1)=Se;sum=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);%元胞規則for i=1:nfor j=1:nif sum(i,j)==3||(sum(i,j)==2&&Se(i,j)==1)Se(i,j)=1;elseSe(i,j)=0;endendendset(Ph,'cdata',cat(3,Se,z,z)) %控制性質(形狀、顏色)的變化 %矩陣的更新pause(0.03) %每隔0.03秒變一次 end實例3:澳洲森林火災
在正方形網絡上,有三種狀態:樹,火,空地。
MATLAB代碼:
clc;clear; n=300; %定義森林矩陣的大小 Plight=5e-6; Pgrowth=1e-2; %定義閃電和生長的概率 UL=[n,1:n-1];DR=[2:n,1]; %定義上左、下右鄰居???(周期型)veg=zeros(n); %初始化森林矩陣 veg= 0:空地 1:著火 2:樹imh=imagesc(cat(3,veg,veg,veg)) axis square; for i=1:3000%計算所有格子著火的數量sum=(veg(UL,:)==1)+(veg(:,UL)==1)+(veg(:,DR)==1)+(veg(DR,:)==1);%根據規則更新森林矩陣:是否樹=是否著火的樹+是否新生的樹(0-1運算)veg=2*(veg==2)-((veg==2)&(sum>0|(rand(n,n)<Plight)))+2*((veg==0)&rand(n,n)<Pgrowth);set(imh,'cdata',cat(3,(veg==1),(veg==2),zeros(n)))pause(0.05);end? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
總結
- 上一篇: Vmware上安装RedHat Linu
- 下一篇: linux我如何查看一个脚本的路径,li