MATLAB演示元胞自動機算法

一、元胞自動機理論

元胞自動機與格子理論是一個非常好的模型,許多複雜的問題都可以通過它來建立模型,下面就簡要介紹一下。

元胞自動機

實質上是定義在一個具有離散、有限狀態元胞組成的元胞空間上,並按照一定的局部規則,在離散的時間維度上演化的動力學系統。

元胞

元胞又可稱爲單元、細胞,是元胞自動機的最基本的組成部分。

元胞具有以下特點:

  1. 元胞自動機最基本的單元。
  2. 元胞有記憶貯存狀態的功能。
  3. 所有元胞狀態都按照元胞規則不斷更新。

演化規則

中心元胞的下一個狀態由中心元胞的當前狀態和其鄰居當前狀態按照一定的規則確定。

 

二、森林火災的演示

下面就用MATLAB來演示森林火災,以便更好地理解元胞自動機理論。

森林火災的元胞自動機模型有三種狀態:空位,燃燒着的樹木及樹木。則某元胞下一時刻狀態由該時刻本身的狀態和周圍四個鄰居的狀態以一定的規則確定,規則如下:

  • 如果某樹木元胞的4個鄰居有燃燒着的,那麼該元胞下一時刻的狀態是燃燒着的。
  • 一個燃燒着的元胞在下一時刻變成空位。
  • 所有樹木元胞以一個低概率開始燃燒(模擬閃電引起的火災)
  • 所有空元胞以一個低概率變成樹木(以模擬新的樹木的生長)
n = 300;     %元胞矩陣大小
Plight = .000005; Pgrowth = .01;
UL = [n 1:n-1];
DR = [2:n 1];
veg = zeros(n,n);        %初始化
% The value of veg:
% empty == 0  
% burning == 1
% green == 2
imh = image(cat(3,veg,veg,veg));
for i = 1:3000
    sum = (veg(UL,:) == 1) + (veg(:,UL) == 1) + (veg(DR,:) == 1) + (veg(:,DR) == 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)) )
    drawnow
    pause(0.01)
end

運行的結果如下,可以通過調整閃電和樹木生長的概率來觀察不同的結果。

 

如果你覺得有幫助,不妨點個贊哦~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章