交通流元胞自动机模拟仿真 matlab源码_元胞自动机中的时间反演
1.引言——生命游戲
1970年,英國(guó)數(shù)學(xué)家約翰·何頓·康威提出了生命游戲(Life Game)。生命游戲本質(zhì)是一個(gè)元胞自動(dòng)機(jī)模型,每個(gè)元胞可以看作是一個(gè)細(xì)胞,細(xì)胞的產(chǎn)生、繁衍和死亡擁有3條演化規(guī)則。
1. 如果一個(gè)細(xì)胞周圍有3個(gè)細(xì)胞為生(一個(gè)細(xì)胞周圍共有8個(gè)細(xì)胞),則該細(xì)胞為生(即該細(xì)胞若原先為死,則轉(zhuǎn)為生,若原先為生,則保持不變) 。
2. 如果一個(gè)細(xì)胞周圍有2個(gè)細(xì)胞為生,則該細(xì)胞的生死狀態(tài)保持不變;
3. 在其它情況下,該細(xì)胞為死(即該細(xì)胞若原先為生,則轉(zhuǎn)為死,若原先為死,則保持不變)
元胞空間在給定的初始狀態(tài)下,根據(jù)以上3條規(guī)則,可以演化出千奇百怪的二維生命形式。在游戲的進(jìn)行中,雜亂無序的細(xì)胞會(huì)逐漸演化出各種精致、有形的結(jié)構(gòu);這些結(jié)構(gòu)往往有很好的對(duì)稱性,而且每一代都在變化形狀。一些形狀已經(jīng)鎖定,不會(huì)逐代變化。有時(shí),一些已經(jīng)成形的結(jié)構(gòu)會(huì)因?yàn)橐恍o序細(xì)胞的“入侵”而被破壞。但是形狀和秩序經(jīng)常能從雜亂中產(chǎn)生出來。
Matlab上的生命游戲代碼如下。
%名稱:生命游戲 %作者:Lu Jiancheng clear%清除變量 clc%清屏 %創(chuàng)建GUI界面 h=figure(1); set(h,'Name','Life Game','Position',[500,100,600, 600]);%[左側(cè)位置,下側(cè)位置,寬度,高度] axe=axes('Parent', h); %set(axe,'Box','on','Position',[50,50,300,300]);% txt=uicontrol('parent', h,'Style','text', 'string','Life Game', 'fontsize',12, 'position',[100,750,300,25]); runbutton=uicontrol('parent',h,'Style','pushbutton','string','run','callback','runflag=1;','position',[100,650,50,25]); stopbutton=uicontrol('parent',h,'Style','pushbutton','string','stop','callback','runflag=0;','position',[200,650,50,25]); stepbutton=uicontrol('parent',h,'Style','pushbutton','string','step','callback','runflag=0;step=1;','position',[300,650,50,25]); stepwin = uicontrol('parent', h,'Style','text', 'string','0', 'fontsize',12, 'position',[400,800,100,20]); %生命游戲代碼 %參數(shù) Random=1;%選擇初始化方式 maxtime=300; p=0.3; n=128; %cells=zeros(n,n);%建立一個(gè)平面矩陣 %幾種特定的初始狀態(tài) % % initial_cells=[ 0 0 1; % 1 0 1; % 0 1 1]; % initial_cells=[ 0 1 0; % 1 1 1; % 0 1 0]; initial_cells=[0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0;0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0;1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0;0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0;0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0;0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0;0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1;0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1;0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0;0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0;0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0;1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0;0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]; if Random %初始化部分for i=1:nfor j=1:nif rand()<pcells(i,j)=1;endendend else %裝載特殊圖形%cells(10:25,10:25)=initial_cells;cells=initial_cells;%cells(49:51,49:51)=initial_cells;[n,~] = size(initial_cells); end %演化部分 pic=imshow(initial_cells,'Parent', axe,'XData',[0,100],'YData',[0,100]);%繪圖 t=0; runflag=1; upside=0; downside=0; leftside=0; rightside=0; step=0; while(t<maxtime)while(t<maxtime&&(runflag==1||step==1))%演化規(guī)則nextcells=cells;for i=1:nfor j=1:n%周期性邊界處理if(i==n)downside=1;upside=i-1;elseif(i==1)downside=i+1;upside=i-1+n;elsedownside=i+1;upside=i-1;endif(j==n)rightside=1;leftside=j-1;elseif(j==1)rightside=j+1;leftside=j-1+n;elserightside=j+1;leftside=j-1;end%邊界處理結(jié)束Sum=cells(upside,leftside)+cells(upside,j)+cells(upside,rightside)+cells(i,leftside)+cells(i,rightside)+cells(downside,leftside)+cells(downside,j)+cells(downside,rightside); if(Sum==3)nextcells(i,j)=1;elseif Sum~=2nextcells(i,j)=0;end endendcells=nextcells;%演化規(guī)則結(jié)束pic=imshow(cells,'Parent', axe,'XData',[0,100],'YData',[0,100]);%繪圖t=t+1;%時(shí)間前進(jìn)1sset(stepwin,'string',t)step=0;pause(0.1);endpause(0.1); end運(yùn)行這段代碼,隨機(jī)初始化元胞空間,可以看到演化過程中逐漸出現(xiàn)有規(guī)律的形狀。
當(dāng)演化時(shí)間為300步時(shí)的圖像2.時(shí)間反演
時(shí)間反演的原始思路是這樣。假設(shè)演化時(shí)間為100 step,每一步時(shí)都對(duì)元胞空間的狀態(tài)進(jìn)行一次快照,保存下來。然后從時(shí)間步100開始,一直到第1步。每次載入那一步的元胞空間,如同倒放膠片一樣。這樣從觀察者看來,生命游戲中的時(shí)間就好像在倒流。
原始思路有需要保存每一時(shí)間步的演化狀態(tài),才能實(shí)現(xiàn)時(shí)間的反轉(zhuǎn)。這樣將會(huì)消耗大量的內(nèi)存空間。這樣我們自然會(huì)想到,能不能在不利用額外內(nèi)存空間,而只利用元胞自動(dòng)機(jī)本身的元胞空間,就可以實(shí)現(xiàn)時(shí)間反演?
思路可以是這樣的,可以提出基于生命游戲現(xiàn)有的元胞演化規(guī)則的逆規(guī)則,然后只要將時(shí)間步反過來進(jìn)行演化,就可以實(shí)現(xiàn)時(shí)間反演的現(xiàn)象。
那么存不存在逆規(guī)則呢?生命游戲的逆規(guī)則可能比較難以推導(dǎo),甚至某些情況下是不存在的。
假設(shè)在時(shí)刻t元胞空間內(nèi)只有一個(gè)細(xì)胞,按照生命游戲的三條規(guī)則,時(shí)刻t+1元胞空間內(nèi)將空無一物,沒有一個(gè)細(xì)胞。這樣即使存在逆規(guī)則,也無法實(shí)現(xiàn)時(shí)間反演,因?yàn)槿魏我粋€(gè)空元胞都可能在上一個(gè)時(shí)刻是活細(xì)胞。
3.物理系統(tǒng)
那么存不存在逆規(guī)則呢?生命游戲的逆規(guī)則可能比較難以推導(dǎo),甚至某些情況下是不存在的。但下面這個(gè)假設(shè)的物理系統(tǒng)的逆規(guī)則還是比較好推導(dǎo)的。
該假設(shè)的物理系統(tǒng)是這樣。
1. 元胞可以看作是一個(gè)有質(zhì)量的點(diǎn),空白表示質(zhì)量為0,否則質(zhì)量為1。
2. 質(zhì)點(diǎn)之間存在吸引力F,F的大小和質(zhì)點(diǎn)之間的距離成反比。
3. 質(zhì)點(diǎn)存在速度,決定質(zhì)點(diǎn)的移動(dòng)方向和每一時(shí)間步的移動(dòng)距離。
4. 作用力F會(huì)產(chǎn)生加速度,加速度決定速度的變化方向和每一時(shí)間步的變化大小。
這樣一個(gè)元胞自動(dòng)機(jī)系統(tǒng)的演化情況如下圖所示。
該系統(tǒng)內(nèi)有兩個(gè)質(zhì)點(diǎn),有沿x方向的初始速度,其Matlab仿真代碼如下。
p1=[1,100]; %位置(x,y) v1=[1,0]; %速度(x,y) p2=[1,1]; %位置(x,y) v2=[1,0]; %速度(x,y) x = [1]; y1 = [100] ; y2 = [1] ; dt = 1; T =[1]; V1L=[0]; V2L=[0]; A1L=[0]; A2L=[0]; for t =2:1:100F =100/(max(p1(2) - p2(2),3.0))^2;a1 = F*sign(p2(2) - p1(2));a2 = F*sign(p1(2) - p2(2));A1L = [A1L,a1];A2L = [A2L,a2];v1(2) = v1(2) +a1*dt;v2(2) = v2(2) +a2*dt;V1L = [V1L,v1(2)];V2L = [V2L,v2(2)];p1 = p1 + v1*dt;p2 = p2 + v2*dt;x = [x,p1(1)];y1 = [y1,p1(2)];y2 = [y2,p2(2)];T = [T,t]; end plot(x,[y1;y2]);運(yùn)行這段代碼可以看到兩個(gè)質(zhì)點(diǎn)的位置隨著時(shí)間的變化。
在這樣的一個(gè)系統(tǒng)里只要將時(shí)間步改為-1,就可以實(shí)現(xiàn)時(shí)間的反演,而不用采用逆規(guī)則。反演的圖像如下,在前100時(shí)間步正向演化,在101時(shí)間步到200時(shí)間步逆向演化。
可以用以下的代碼實(shí)現(xiàn)。
dt = -1; for t =101:1:200F =100/(max(p1(2) - p2(2),3.0))^2;a1 = F*sign(p2(2) - p1(2));a2 = F*sign(p1(2) - p2(2));v1(2) = v1(2) +a1*dt;v2(2) = v2(2) +a2*dt;p1 = p1 + v1*dt;p2 = p2 + v2*dt;x = [x,p1(1)];y1 = [y1,p1(2)];y2 = [y2,p2(2)];T = [T,t]; End基于規(guī)則反演的圖像4.結(jié)論
在元胞自動(dòng)機(jī)可以實(shí)現(xiàn)一些物理系統(tǒng),實(shí)現(xiàn)基于逆規(guī)則的時(shí)間反演。這種逆規(guī)則甚至可以和原來的規(guī)則相同,只需要改變時(shí)間步長(zhǎng)為負(fù)值即可。而生命游戲這種系統(tǒng),則無法實(shí)現(xiàn)基于逆規(guī)則的時(shí)間反演。
基于逆規(guī)則的反演是不需要快照方式,不用記錄每一時(shí)間步的狀態(tài),更符合真實(shí)物理實(shí)際的情形。如果這種逆規(guī)則等同于原規(guī)則,我們可以認(rèn)為該系統(tǒng)的物理規(guī)則具有時(shí)間對(duì)稱性。
總結(jié)
以上是生活随笔為你收集整理的交通流元胞自动机模拟仿真 matlab源码_元胞自动机中的时间反演的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php传递字符串给python,用PHP
- 下一篇: android stackview,An