【元胞自动机】基于matlab界面聚合元胞自动机模拟【含Matlab源码 2004期】
一、元胞自動機(jī)簡介
1 元胞自動機(jī)發(fā)展歷程
最初的元胞自動機(jī)是由馮 · 諾依曼在 1950 年代為模擬生物 細(xì)胞的自我復(fù)制而提出的. 但是并未受到學(xué)術(shù)界重視.
1970 年, 劍橋大學(xué)的約翰 · 何頓 · 康威設(shè)計了一個電腦游戲 “生命游戲” 后, 元胞自動機(jī)才吸引了科學(xué)家們的注意.
1983 年 S.Wolfram 發(fā)表了一系列論文. 對初等元胞機(jī) 256 種 規(guī)則所產(chǎn)生的模型進(jìn)行了深入研究, 并用熵來描述其演化行 為, 將細(xì)胞自動機(jī)分為平穩(wěn)型, 周期型, 混沌型和復(fù)雜型.
2 對元胞自動機(jī)的初步認(rèn)識
元胞自動機(jī)(CA)是一種用來仿真局部規(guī)則和局部聯(lián)系的方法。典型的元胞自動機(jī)是定義在網(wǎng)格上的,每一個點(diǎn)上的網(wǎng)格代表一個元胞與一種有限的狀態(tài)。變化規(guī)則適用于每一個元胞并且同時進(jìn)行。典型的變化規(guī)則,決定于元胞的狀態(tài),以及其( 4 或 8 )鄰居的狀態(tài)。
3 元胞的變化規(guī)則&元胞狀態(tài)
典型的變化規(guī)則,決定于元胞的狀態(tài),以及其( 4 或 8 )鄰居的狀態(tài)。
4 元胞自動機(jī)的應(yīng)用
元胞自動機(jī)已被應(yīng)用于物理模擬,生物模擬等領(lǐng)域。
5 元胞自動機(jī)的matlab編程
結(jié)合以上,我們可以理解元胞自動機(jī)仿真需要理解三點(diǎn)。一是元胞,在matlab中可以理解為矩陣中的一點(diǎn)或多點(diǎn)組成的方形塊,一般我們用矩陣中的一點(diǎn)代表一個元胞。二是變化規(guī)則,元胞的變化規(guī)則決定元胞下一刻的狀態(tài)。三是元胞的狀態(tài),元胞的狀態(tài)是自定義的,通常是對立的狀態(tài),比如生物的存活狀態(tài)或死亡狀態(tài),紅燈或綠燈,該點(diǎn)有障礙物或者沒有障礙物等等。
6 一維元胞自動機(jī)——交通規(guī)則
定義:
6.1 元胞分布于一維線性網(wǎng)格上.
6.2 元胞僅具有車和空兩種狀態(tài).
7 二維元胞自動機(jī)——生命游戲
定義:
7.1 元胞分布于二維方型網(wǎng)格上.
7.2 元胞僅具有生和死兩種狀態(tài).
元胞狀態(tài)由周圍八鄰居決定.
規(guī)則:
骷髏:死亡;笑臉:生存
周圍有三個笑臉,則中間變?yōu)樾δ?br /> 少于兩個笑臉或者多于三個,中間則變死亡。
8 什么是元胞自動機(jī)
離散的系統(tǒng): 元胞是定義在有限的時間和空間上的, 并且元 胞的狀態(tài)是有限.
動力學(xué)系統(tǒng): 元胞自動機(jī)的舉止行為具有動力學(xué)特征.
簡單與復(fù)雜: 元胞自動機(jī)用簡單規(guī)則控制相互作用的元胞 模擬復(fù)雜世界.
9 構(gòu)成要素
(1)元胞 (Cell)
元胞是元胞自動機(jī)基本單元:
狀態(tài): 每一個元胞都有記憶貯存狀態(tài)的功能.
離散: 簡單情況下, 元胞只有兩種可能狀態(tài); 較復(fù)雜情況下, 元胞具有多種狀態(tài).
更新: 元胞的狀態(tài)都安照動力規(guī)則不斷更新.
(2)網(wǎng)格 (Lattice)
不同維網(wǎng)格
常用二維網(wǎng)格
(3)鄰居 (Neighborhood)
(4)邊界 (Boundary)
反射型:以自己作為邊界的狀態(tài)
吸收型:不管邊界(車開到邊界就消失)
(5)規(guī)則(狀態(tài)轉(zhuǎn)移函數(shù))
定義:根據(jù)元胞當(dāng)前狀態(tài)及其鄰居狀況確定下一時刻該元胞狀態(tài)的動力學(xué)函數(shù), 簡單講, 就是一個狀態(tài)轉(zhuǎn)移函數(shù).
分類 :
總和型: 某元胞下時刻的狀態(tài)取決于且僅取決于它所有鄰居 的當(dāng)前狀態(tài)以及自身的當(dāng)前狀態(tài).
合法型: 總和型規(guī)則屬于合法型規(guī)則. 但如果把元胞自動機(jī) 的規(guī)則限制為總和型, 會使元胞自動機(jī)具有局限性.
(6)森林火災(zāi)
綠色:樹木;紅色:火;黑色:空地。
三種狀態(tài)循環(huán)轉(zhuǎn)化:
樹:周圍有火或者被閃電擊中就變成火。
空地:以概率p變?yōu)闃淠?br /> 理性分析:紅為火;灰為空地;綠是樹
元胞三種狀態(tài)的密度和為1
火轉(zhuǎn)化為空地的密度等于空地轉(zhuǎn)換為樹的密度(新長出來的樹等于燒沒的樹)
f是閃電的概率:遠(yuǎn)遠(yuǎn)小于樹生成的概率;T s m a x T_{smax}T smax
?是一大群樹被火燒的時間尺度
程序?qū)崿F(xiàn)
周期性邊界條件
購進(jìn)啊
其中的數(shù)字為編號
構(gòu)建鄰居矩陣
上面矩陣中的數(shù)字編號,對應(yīng)原矩陣相同位置編號的上鄰居編號,一 一對應(yīng)
同樣道理:
(7)交通概念
車距和密度
流量方程
守恒方程
時空軌跡(橫軸是空間縱軸為時間)
紅線橫線與藍(lán)色交點(diǎn)表示每個時間車的位置。
如果是豎線則表示車子在該位置對應(yīng)的時間
宏觀連續(xù)模型:
最常用的規(guī)則:
紅色條表示速度是滿的。
1 加速規(guī)則:不能超過v m a x ( 2 格 / s ) v_{max}(2格/s)v
max(2格/s)
2 防止碰撞:不能超過車距
理論分析:
結(jié)果分析: 密度與流量
第一個圖:橫坐標(biāo)是歸一化后的密度,縱坐標(biāo)是車流量。第二個圖:理論值與CA的結(jié)果
結(jié)果分析: 時空軌跡
中間的深色區(qū)域是交通堵塞的區(qū)域。
二、案例及部分源代碼
1 案例
figure 1:wolfram的184號規(guī)則
這個規(guī)則可以讓元胞模擬出交通流的感覺,為什么說是感覺呢,因為大家好像看到了一個方塊或者說叫一個小車,在向前行進(jìn),但是并沒有模擬出交通流中的很多現(xiàn)象。隨后就有NaSch規(guī)則被提出來了,這個規(guī)則可以說是所有元胞交通流模型的鼻祖,后面很多規(guī)則都是從這個規(guī)則中進(jìn)化而來的。而我們今天討論的靠右行駛的雙車道模型也是根據(jù)NaSch模型改進(jìn)而來的,簡單討論一下NaSch模型,然后進(jìn)一步引出本文要講解的靠右行駛模型。
NaSch規(guī)則:
(1)加速,
(2)減速,
(3)以概率p隨機(jī)慢化速度,
(4)行進(jìn),
可以看到,NaSch規(guī)則就僅僅只有簡單的四條,但是卻模擬出了交通流的最基本的東西,從其時空圖就可以看出來:
figure 2:Density=0.15,Vmax=5
figure 2是元胞長度為1000,時間步為500時候得出的時空圖。這里還有相應(yīng)的包括流量密度圖和速度密度圖等基本圖也可以得出來。
接下來離我們的靠右行駛模型又進(jìn)了一步,在這之前,我們再介紹一下基于NaSch的雙車道模型STNS,有了雙車道模型,靠右行駛模型便不再是難事。
STNS規(guī)則:
可以從STNS的規(guī)則中看到,為了實現(xiàn)雙車道的CA交通流模型,我們實質(zhì)對NaSch模型的改動僅僅是添加了一條換道規(guī)則,而換道規(guī)則看起來又是那么容易理解和合乎現(xiàn)實條件。這就是CA的魅力,通過稍微改動規(guī)則,就可以實現(xiàn)一些我們想要的結(jié)果,后面我們將用靠右行駛模型來詮釋這個。當(dāng)然規(guī)則也是CA的噩夢,我們通常情況下并不知道什么時候該用CA的什么規(guī)則。
現(xiàn)在我將再引進(jìn)一條規(guī)則,在此規(guī)則下CA就可以實現(xiàn)2014MCM比賽中靠右行駛規(guī)則,同時可以預(yù)料到,再修改一些規(guī)則,仍然可以完整實現(xiàn)2014MCM比賽A題中的任何一個問題,但是這里對此不予以討論。
Keep-Right Rule:
至此,靠右行駛規(guī)則用元胞自動機(jī)實現(xiàn)完畢。下面是用Matlab實現(xiàn)的仿真模擬圖:
2 案例及部分源代碼
2.1案例
2.2 部分源代碼
%% -------------------------------------------------------- clc;clear; %主函數(shù) % writerObj=VideoWriter('cellautoma.avi'); % writerObj.FrameRate=2;%幀速率 % open(writerObj); number=uicontrol('style','text','string','1','fontsize',12,'position',[100,400,50,20]); %% 構(gòu)成元胞 %0為膜孔空隙,1為哌嗪分子,2為水分子,3為TMC分子,4為油相溶劑分子,5為基膜,6為聚酰胺 m1=22;m2=5;m3=53; %各區(qū)域深度 n=50; %模擬時的寬度 water=2*ones(m1*n,1); %水相 membr=zeros(m2*n,1); %界面層 oil=4*ones(m3*n,1); %油相 active=zeros(m1+m2+m3,n); %PA活性設(shè)置 c1=0.2;c2=0.50;c3=0.02; %各個區(qū)域單體所占的百分比 membr(ceil(rand(ceil(m2*n*c2),1)*m2*n))=5; membr=reshape(membr,m2,n); %含有基膜的界面矩陣 water(ceil(rand(ceil((m1*n+m2*n*(1-c2))*c1),1)*m1*n))=1; water=reshape(water,m1,n); %含有單體的水相矩陣 oil(ceil(rand(ceil(m3*n*c3),1)*m3*n))=3; oil=reshape(oil,m3,n); %含有單體的油相矩陣 allmatrix=[water;membr;oil];%組合 %% 處理邊界 simulation=zeros(m1+m2+m3+2,n+2); %多加了一層外層邊界 simulation([1 m1+m2+m3+2],:)=-1*ones(2,n+2);%上下層邊界元胞賦值為-1 simulation(:,1)=[-1;allmatrix(:,end);-1]; simulation(:,n+2)=[-1;allmatrix(:,1);-1]; %左右層采取周期性原則,模擬無限寬流體 simulation(2:m1+m2+m3+1,2:n+1)=allmatrix; w_pip=0.8; %pip不形成團(tuán)簇的概率 w_TMC=0.6; %TMC不形成團(tuán)簇的概率 %% 元胞鄰居 %調(diào)用neighbor函數(shù),將鄰居存儲到每個元胞對應(yīng)的元胞數(shù)組中 [rm,rn]=size(simulation); nextcell=cell(rm,rn); for i=1:rmfor j=1:rnlist=neighbor(i,j,simulation);nextcell{i,j}=list;end end %% 團(tuán)簇元胞 grouppip=cell(rm,rn); %%定義哌嗪團(tuán)簇元胞 for i=1:rmfor j=1:rngrouppip{i,j}=zeros(1,2);end end groupTMC=cell(rm,rn); %%定義TMC團(tuán)簇元胞 for i=1:rmfor j=1:rngroupTMC{i,j}=zeros(1,2);end end %% 制定元胞規(guī)則 num=0;%迭代次數(shù) imh=matrixplot(simulation(2:m1+m2+m3+1,1:n+2)); while num<=98%tempmatrix = simulation; %定義新的矩陣變量暫時保存當(dāng)前畫面for i=1:rmfor j=1:rnswitch simulation(i,j)case -1 %邊界元胞,不作處理case 0 %膜孔元胞,不作處理case 1 %哌嗪元胞if ismember(simulation(i,j),grouppip{i,j})continue;elseif ismember(3,nextcell{i,j}) %若元胞上面鄰居含有元胞3,則結(jié)合生成6direction=find(nextcell{i,j}==3);randindex=randperm(length(direction));resultindex=direction(randindex(1)); %假設(shè)水分子運(yùn)動為布朗運(yùn)動[swapi,swapj]=judgedirection(resultindex,i,j,rn);simulation(i,j)=6; %哌嗪位被PA替代simulation(swapi,swapj)=4; %TMC位被油相溶劑替代active(i,j)=2; %假設(shè)pa只反應(yīng)兩次elseif ismember(0,nextcell{i,j}) || ismember(2,nextcell{i,j}) || ismember(4,nextcell{i,j})direction=union(find(nextcell{i,j}==0),union(find(nextcell{i,j}==2),find(nextcell{i,j}==4))); %尋找四個方向中含有元胞0,1,2,4的方向p_max=1;p_min=0.5; %概率變化范圍if i<=m1 %若哌嗪在水相p_i=p_max-(i-1)*(p_max-p_min)/m1;resultindex=choosedirection(direction,2,p_i);%resultindex=2;elseif i>m1+m2 %若哌嗪在油相p_i=p_min+(i-m1-m2)*(p_max-p_min)/m3;resultindex=choosedirection(direction,1,p_i);else %若哌嗪在界面中,等概率擴(kuò)散%p_i=p_max-(i-1)*(p_max-p_min)/m1;resultindex=choosedirection(direction,2,1);%resultindex=2;end%由于界面聚合,水相哌嗪在界面處移動概率最小,兩邊概率最大,概率隨著行數(shù)逐漸變化,依據(jù)概率選擇最佳方向[swapi,swapj]=judgedirection(resultindex,i,j,rn); %獲得選定方向元胞的行列號if simulation(swapi,swapj)==0 %如果擴(kuò)散到膜孔,膜孔元胞置為哌嗪元胞,哌嗪元胞變成水分子元胞simulation(swapi,swapj)=1;simulation(i,j)=2;elseif simulation(swapi,swapj)==4if swapi<=m1+m2continue;elseif swapi>m1+m2+min(size(find(simulation==1)),size(find(simulation==3)))/n+1 %哌嗪只能活躍于油相的表層,該層為期望膜厚度continue;endelsetemp=simulation(i,j); %交換元胞狀態(tài)simulation(i,j)=simulation(swapi,swapj);simulation(swapi,swapj)=temp;endelseif ismember(1,nextcell{i,j}) %若鄰居有自身,則依玻爾茲曼因子可能形成團(tuán)簇if rand>=w_pip && i>2 && i<rm-1 && j>2 && j<rn-1 %彈性碰撞direction=find(nextcell{i,j}==1);randindex=randperm(length(direction));resultindex=direction(randindex(1)); %假設(shè)水分子運(yùn)動為布朗運(yùn)動[swapi,swapj]=judgedirection(resultindex,i,j,rn);temp=simulation(2*i-swapi,2*j-swapj); %交換元胞狀態(tài)simulation(2*i-swapi,2*j-swapj)=simulation(i,j);simulation(i,j)=temp;else %形成團(tuán)簇grouppip{i,j}=[simulation(i,j),simulation(swapi,swapj)];endendendcase 2 %水分子元胞if ismember(0,nextcell{i,j}) %若水分子擴(kuò)散到膜孔direction=find(nextcell{i,j}==0);randindex=randperm(length(direction));resultindex=direction(randindex(1)); %假設(shè)水分子運(yùn)動為布朗運(yùn)動[swapi,swapj]=judgedirection(resultindex,i,j,rn);if simulation(swapi,swapj)==0simulation(swapi,swapj)=2;endend三、運(yùn)行結(jié)果
四、matlab版本及參考文獻(xiàn)
1 matlab版本
2014a
2 參考文獻(xiàn)
[1] 包子陽,余繼周,楊杉.智能優(yōu)化算法及其MATLAB實例(第2版)[M].電子工業(yè)出版社,2016.
[2]張巖,吳水根.MATLAB優(yōu)化算法源代碼[M].清華大學(xué)出版社,2017.
[3]【數(shù)學(xué)建模】元胞自動機(jī).博主:二進(jìn)制 人工智能
總結(jié)
以上是生活随笔為你收集整理的【元胞自动机】基于matlab界面聚合元胞自动机模拟【含Matlab源码 2004期】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 第三方模块之 MySQL数
- 下一篇: 最全常用正则表达式大全