交通流元胞自动机模拟仿真 matlab源码_元胞自动机中的时间反演
1.引言——生命游戲
1970年,英國數學家約翰·何頓·康威提出了生命游戲(Life Game)。生命游戲本質是一個元胞自動機模型,每個元胞可以看作是一個細胞,細胞的產生、繁衍和死亡擁有3條演化規則。
1. 如果一個細胞周圍有3個細胞為生(一個細胞周圍共有8個細胞),則該細胞為生(即該細胞若原先為死,則轉為生,若原先為生,則保持不變) 。
2. 如果一個細胞周圍有2個細胞為生,則該細胞的生死狀態保持不變;
3. 在其它情況下,該細胞為死(即該細胞若原先為生,則轉為死,若原先為死,則保持不變)
元胞空間在給定的初始狀態下,根據以上3條規則,可以演化出千奇百怪的二維生命形式。在游戲的進行中,雜亂無序的細胞會逐漸演化出各種精致、有形的結構;這些結構往往有很好的對稱性,而且每一代都在變化形狀。一些形狀已經鎖定,不會逐代變化。有時,一些已經成形的結構會因為一些無序細胞的“入侵”而被破壞。但是形狀和秩序經常能從雜亂中產生出來。
Matlab上的生命游戲代碼如下。
%名稱:生命游戲 %作者:Lu Jiancheng clear%清除變量 clc%清屏 %創建GUI界面 h=figure(1); set(h,'Name','Life Game','Position',[500,100,600, 600]);%[左側位置,下側位置,寬度,高度] 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]); %生命游戲代碼 %參數 Random=1;%選擇初始化方式 maxtime=300; p=0.3; n=128; %cells=zeros(n,n);%建立一個平面矩陣 %幾種特定的初始狀態 % % 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))%演化規則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%邊界處理結束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;%演化規則結束pic=imshow(cells,'Parent', axe,'XData',[0,100],'YData',[0,100]);%繪圖t=t+1;%時間前進1sset(stepwin,'string',t)step=0;pause(0.1);endpause(0.1); end運行這段代碼,隨機初始化元胞空間,可以看到演化過程中逐漸出現有規律的形狀。
當演化時間為300步時的圖像2.時間反演
時間反演的原始思路是這樣。假設演化時間為100 step,每一步時都對元胞空間的狀態進行一次快照,保存下來。然后從時間步100開始,一直到第1步。每次載入那一步的元胞空間,如同倒放膠片一樣。這樣從觀察者看來,生命游戲中的時間就好像在倒流。
原始思路有需要保存每一時間步的演化狀態,才能實現時間的反轉。這樣將會消耗大量的內存空間。這樣我們自然會想到,能不能在不利用額外內存空間,而只利用元胞自動機本身的元胞空間,就可以實現時間反演?
思路可以是這樣的,可以提出基于生命游戲現有的元胞演化規則的逆規則,然后只要將時間步反過來進行演化,就可以實現時間反演的現象。
那么存不存在逆規則呢?生命游戲的逆規則可能比較難以推導,甚至某些情況下是不存在的。
假設在時刻t元胞空間內只有一個細胞,按照生命游戲的三條規則,時刻t+1元胞空間內將空無一物,沒有一個細胞。這樣即使存在逆規則,也無法實現時間反演,因為任何一個空元胞都可能在上一個時刻是活細胞。
3.物理系統
那么存不存在逆規則呢?生命游戲的逆規則可能比較難以推導,甚至某些情況下是不存在的。但下面這個假設的物理系統的逆規則還是比較好推導的。
該假設的物理系統是這樣。
1. 元胞可以看作是一個有質量的點,空白表示質量為0,否則質量為1。
2. 質點之間存在吸引力F,F的大小和質點之間的距離成反比。
3. 質點存在速度,決定質點的移動方向和每一時間步的移動距離。
4. 作用力F會產生加速度,加速度決定速度的變化方向和每一時間步的變化大小。
這樣一個元胞自動機系統的演化情況如下圖所示。
該系統內有兩個質點,有沿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]);運行這段代碼可以看到兩個質點的位置隨著時間的變化。
在這樣的一個系統里只要將時間步改為-1,就可以實現時間的反演,而不用采用逆規則。反演的圖像如下,在前100時間步正向演化,在101時間步到200時間步逆向演化。
可以用以下的代碼實現。
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基于規則反演的圖像4.結論
在元胞自動機可以實現一些物理系統,實現基于逆規則的時間反演。這種逆規則甚至可以和原來的規則相同,只需要改變時間步長為負值即可。而生命游戲這種系統,則無法實現基于逆規則的時間反演。
基于逆規則的反演是不需要快照方式,不用記錄每一時間步的狀態,更符合真實物理實際的情形。如果這種逆規則等同于原規則,我們可以認為該系統的物理規則具有時間對稱性。
總結
以上是生活随笔為你收集整理的交通流元胞自动机模拟仿真 matlab源码_元胞自动机中的时间反演的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php传递字符串给python,用PHP
- 下一篇: android stackview,An