元胞自动机-附代码注释
元胞自動機(Cellular Automata CA)是一種時空離散的局部動力學模型,是研究復雜系統的一種典型方法,適用于空間復雜系統的時空動態模擬研究。
 元胞自動機不是由嚴格定義的物理方程或函數確定,而是用一系列模型構造的規則構成。滿足這些規則的模型都可算作是元胞自動機模型。故元胞自動機是一類模型的總稱,或者說是一個方法框架。
 在CA模型中,散布在規則格網(Lattice Grid)中的每一元胞(Cell)取有限的離散狀態,遵循同樣的作用規則,依據確定的局部規則作同步更新。大量元胞通過簡單的相互作用而構成動態系統的演化。
元胞自動機的組成部分有元胞、元胞空間、鄰居及規則四部分。
 簡單講,元胞自動機可以視為由一個元胞空間和定義于該空間的變換函數所組成。
元胞自動機的元胞
元胞是元胞自動機的最基本組成部分。它分布在離散的一維、二維或多維歐幾里德空間的晶格點上。
 狀態,狀態可以是{0,1}的二進制形式,或是整數形式的離散集。嚴格意義上,元胞只能有一個狀態變量,但在實際應用中,往往將其進行擴展。
元胞自動機的元胞空間
元胞空間元胞所分布在的空間網點集合就是元胞空間。
 對于一維元胞自動機,元胞空間劃分只有一種。而高維的元胞自動機,元胞空間的劃分則可能有多種形式。對于常見的二維自動機,元胞空間通常可按三角形、四邊形或六邊形三種網格排列。
- 三角網格:擁有較少的鄰居數目,這在某些時候很有用。缺點是計算機的表達與顯示不方便。
 - 四邊形網格 (最常用):直觀簡單,特別適合于計算機環境下進行表達顯示。
 - 六邊形網格:能較好的模擬各向同性的現象,因此,模型能更加自然而真實。其缺點同正三角網格一樣,在表達顯示上較為困難和復雜。
 
在理論上,元胞空間的邊界條件在各個維向上是無限延展的,但實際應用過程中,無法在計算機上實現這一理想條件。
元胞自動機的鄰居
在數學上,它通??梢员硎緸橐粋€多維的整數矩陣。
 鄰居、元胞和元胞空間只表示了系統的靜態成分,為了將動態引入系統,必須加入演化(規則。這些規則是定義在局部空間范圍內的,即一個元胞下一時刻的狀態決定于本身的狀態和它的鄰居無胞的狀態。因此,在指定規則之前,必須定義一定的鄰居規則,明確哪些元胞屬于該元胞的鄰居。
 一維元胞自動機中,通常以半徑r來確定鄰居,距離一個元胞r內的所有元胞都屬于該元胞的鄰居。
 二維元胞自動機的鄰居定義較為復雜,但通常有以下幾種(以正方形網格為例)
 
元胞自動機的規則
規則根據元胞當前狀態及其鄰居狀況確定下一時刻該元胞狀態的動力學函數。簡單講,就是狀態轉移函數。這個函數構造了一種簡單的離散的時間和空間范圍的局部物理成分。狀態的變化可以由狀態轉移函數表示。t時刻的鄰居狀態組合時間元胞自動機是一個動態系統,它在時間維上的變化是離散的,即時間t是一個整數值,而且連續且等間距。在轉換函數中,一個元胞在t+1時刻的狀態只直接決定于t時刻的該元胞及其鄰居的狀態。
元胞自動機的特性
把一個空間劃分成網絡,每一個點表示一個元胞,它們的狀態賦值,在網格中用顏色的變化來表示,在事先設定的規則下,元胞的演化就用網格顏色的變化來描述,這樣的模型就是元胞自動機。
 通過對元胞自動機這些網絡中的格點的不同定義,以及初始條件的不同,可以模擬出不同的現象和過程。
 離散性:元胞自動機是高度離散的。它不僅僅空間離散時間離散,而且在函數值,即元胞的狀態值也是離散的。
 動力學演化的同步性:元胞自動機具有利用簡單的,局部規則的和離散的方法,描述復雜的,全部的和連續系統的能力。
 相互作用的局部性:元胞自動機的規則是局部的,而動力學行為規則是全局的,在模擬的過程中,具體的演化過程也是局部的,即僅同周圍的元胞有關系。
 時間、空間、狀態都離散,每個變量只取有限多個狀態,且其狀態改變的規則在時間和空間上都是局部的。
元胞自動機的應用思想
復雜系統又稱為非線性系統。如城市的發展與演化、城市人流與交通流以及交通堵塞的形成、自然環境下的動物的空間分布、河網的形成、疾病的傳播等。
 傳統的自頂向下的分析方法是把系統分割成幾個部分,對每一個部分逐個進行研究。而目前提出來的分析復雜動態系統的思想:自底向上的研究方法。
元胞自動機的演化行為的統計特征
Wolfram將元胞自動機的演化行為歸納為四大類:
 平穩型(homogeneous) :自任何初始狀態開始經過一定時間演化后,經過若干步運算便停留在一個固定的狀態。
 周期型(periodic):經過一定時間演化后,在幾種狀態之間周期循環。
 混沌型(chaos):自任何初始狀態開始,經過一定時間演化后,處于一種完全無序隨機的狀態,幾乎找不到任何規律。
 復雜型(edge of chaos):在演化的過程中可能產生復雜的結構,這種結構既不是完全的隨機混亂,又沒有固定的周期和狀態。
 固定點->周期->復雜->混沌
其實元胞自動機更多的是相當于一種思想、一種框架,通過設置一套規則,將時間離散化后,對元胞進行規則下的隨時間的演化。
至今元胞自動機已經有了非常廣泛的應用,典型應用如交通流模型、人員疏散模型、森林火災模型、傳染病模型、土地利用演化模型、城市發展擴張、交通狀況模擬、博物館逃生模擬等等。
森林火災模擬
%% 森林火災 m = 300; n = 300; % 表示森林的矩陣行列 m x nPlight = 5e-6; % 閃電概率 Pgrowth = 1e-2; % 生長概率% 鄰居方位 d 和點燃概率 p d = {[1,0], [0,1], [-1,0], [0,-1]}; p = [ 1, 1, 1, 1];% % 改進元胞自動機 % d = {[1,0], [0,1], [-1,0], [0,-1], [1,1], [-1,1], [-1,-1], [1,-1]}; % p = [ones(1,4), ones(1,4)*(sqrt(1/2)-1/2)];% % 考慮風的情況 % d = {[1,0], [0,1], [-1,0], [0,-1], [1,1], [-1,1], [-1,-1], [1,-1], [0,-2]}; % p = [ 0.80, 0.30, 0.80, 1.00, 0.12, 0.12, 0.30, 0.30, 0.8];% 空=0, 火=1, 樹=2 E = 0; F = 1; T = 2;S = T * (rand(m, n) < 0.5);imh = image(cat(3, S==F, S==T, zeros(m,n))); axis image;for t = 1:3000% 計算鄰居中能傳播著火的個數sum = zeros(size(S));for j = 1:length(d) % 計算四個方向的著火鄰居sum = sum + p(j) * (circshift(S,d{j}) == F);endisE = (S==E); isF = (S==F); isT = (S==T); % 找出三種不同的狀態ignite = rand(m,n) < sum | (rand(m,n) < Plight); % 著火條件% 規則 1: 著火Rule1 = T * (isT & ~ignite) + F * (isT & ignite);% 規則 2: 燒盡Rule2 = F*isF - F*isF;% 規則 3: 新生Rule3 = T * (isE & rand(m,n) < Pgrowth);S = Rule1 + Rule2 + Rule3;set(imh, 'cdata', cat(3, isF, isT, zeros(m,n)))drawnow end生命游戲模擬
%% 生命游戲 %% 界面控制 startbutton = uicontrol('style','pushbutton','string','start','fontsize',12,'position',[100,400,50,20],'callback','start=1;'); freezebutton = uicontrol('style','pushbutton','string','freeze','fontsize',12,'position',[320,400,50,20],'callback','freeze=1;'); quitebutton = uicontrol('style','pushbutton','string','quit','fontsize',12,'position',[400,400,50,20],'callback','stop=1;close;'); number = uicontrol('style','text','string','1','fontsize',12,'position',[20,400,50,20]); freeze_at_text = uicontrol('style','text','string','freeze at:','fontsize',12,'position',[180,400,80,20],'callback','start=1;'); freeze_at = uicontrol('style','edit','string','1000','fontsize',12,'position',[250,400,50,20]); %% 初始化設置 n = 400; % 元胞數目 z = zeros(n, n); cells = (rand(n, n)) < 0.6; % 初始值隨機分布 big_matrix = zeros(n+2, n+2); % 增補矩陣 big_matrix(2:end-1, 2:end-1) = cells; imh = image(cat(3,z, z, cells)); % 建立圖像句柄 figure(gcf); set(gcf, 'doublebuffer', 'on'); % 開啟雙緩沖 %% 主循環 start = 0; stop = 0; freeze = 0; while stop == 0if findobj == 0 % 用來監視窗口是否已經被關閉 防止報錯break;endif start == 1z = zeros(n, n);sum = sum_neighbour(big_matrix); % 計算鄰居狀態和z(cells == 1 & (sum == 2 | sum == 3)) = 1; % 按規則更新狀態z(cells == 0 & sum == 3) = 1;big_matrix(2:end-1,2:end-1) = z; % 將新狀態填充回增補矩陣cells = z; % 將狀態更新set(imh, 'cdata', cat(3, zeros(n,n), zeros(n,n), cells)); % 畫圖stepnumber = 1 + str2double(get(number, 'string')); % 更新計數set(number, 'string', num2str(stepnumber));endif (freeze == 1 || stepnumber == str2double(get(freeze_at, 'string'))) % 判斷是否暫停start = 0;freeze = 0;enddrawnow % 更新繪圖 end %% 計算鄰居和函數 function [A] = sum_neighbour(B) % 元胞自動機 計算周圍鄰居的狀態和A = B(1:end-2,1:end-2)+B(1:end-2,2:end-1)+B(1:end-2,3:end)+B(2:end-1,1:end-2)+B(2:end-1,3:end)+B(3:end,1:end-2)+B(3:end,2:end-1)+B(3:end,3:end); end總結
以上是生活随笔為你收集整理的元胞自动机-附代码注释的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 源支付源码客户端+云端+监控+协议三网免
 - 下一篇: android预览界面编译出错,Andr