從wiki上搜到的Cellular_automaton定義如下:
細(xì)胞自動機(jī)由單元格的規(guī)則網(wǎng)格組成,每個單元格處于有限數(shù)量的狀態(tài)之一中涤躲,諸如開和關(guān)(與耦合的地圖網(wǎng)格相反)檬某。網(wǎng)格可以是任何有限數(shù)量的維度迹炼。對于每個單元格,稱為其鄰域的一組單元格相對于指定的單元格被定義造垛。通過為每個單元分配狀態(tài)來選擇初始狀態(tài)(時間t= 0)。一個新的一代晰搀,創(chuàng)建(前進(jìn)噸由1)五辽,根據(jù)一些固定規(guī)則(通常數(shù)學(xué)函數(shù))根據(jù)單元格的當(dāng)前狀態(tài)和其鄰域中單元格的狀態(tài)來確定每個單元格的新狀態(tài)。通常外恕,更新單元狀態(tài)的規(guī)則對于每個單元是相同的杆逗,并且不隨時間改變,并且同時應(yīng)用于整個網(wǎng)格鳞疲,盡管已知例外罪郊,諸如隨機(jī)單元自動機(jī)和異步單元自動機(jī)。
NaSch模型建立的初衷尚洽,是為了解決自敏感性交通流車輛擁堵的特點(diǎn),采用184規(guī)則
184號元胞自動機(jī)定義如下:
車輛行駛規(guī)則為:黑色元胞表示被一輛車占據(jù)
白色表示無車,若前方各自有車,則停止悔橄。若前方為空則前進(jìn)一格,第t時刻到t_1時刻車輛元胞的變化圖解如下
上圖僅顯示了t時刻到t+1時刻車輛元胞的變化過程,現(xiàn)在我們將變化過程逐步分解,稱之為演化規(guī)則
從第t時刻車輛的位置至t+1時刻車輛的演化過程如下:
a)加速過程:Vn->(Vn+1,Vmax)
b)安全剎車過程:Vn->(Vn-1,dn-1)
c)隨機(jī)變化過程Vn ->max (Vn-1,0)
d)位置更新:Xn ->Xn+Vn
dn =Xn+1 -Xn -L(L為車輛長度)
到這里腺毫,各位新人可能看的還是一臉懵逼癣疟,結(jié)合國賽中實(shí)現(xiàn)的三車道換道規(guī)則,下面我們依次解釋一下各個演化規(guī)則的意義
1)加速:司機(jī)總期望以最大的速度行駛
2)安全剎車:為避免與前車發(fā)生碰撞
3)隨機(jī)慢化(即車輛行駛時不確定因素)
- 過度剎車
- 道路條件變化
- 心里因素
- 延遲因素
4)位置:車輛前進(jìn)
當(dāng)Vmax=2時
我們引入下面四個參數(shù)潮酒,表示單位時間內(nèi)交通流通過橫斷面流量
probc; % 車輛的密度
B; %單位時間內(nèi)車流所占用的道路寬度
probslow; % 隨機(jī)慢化的概率
Dsafe; % 表示換道事車至少與后面車距離多少個單位才算安全
下面,start making program
模型建立:
close all;
B=3; %The number of the lanes
plazalength=50; %The length of the simulating highways
h=NaN; %h is the handle of the image
[plaza,v]=create_plaza(B,plazalength);
h=show_plaza(plaza,h,0.1);
iterations=1000; % 迭代次數(shù)
probc=0.1; % 車輛的密度
probv=[0.1 1]; % 兩種車流的密度分布
probslow=0.3; % 隨機(jī)慢化的概率
Dsafe=1; % 表示換道車至少與后面車距離多少個單位才算安全
VTypes=[1,2]; %道路上一共有幾種最大速度不同的車輛,速度是什么
[plaza,v,vmax]=new_cars(plaza,v,probc,probv,VTypes);%一開始就在車道上布置車輛睛挚,做周期循環(huán)駕駛,也方便觀察流量密度之間的關(guān)系
size(find(plaza==1))
PLAZA=rot90(plaza,2);
h=show_plaza(PLAZA,h,0.1);
from 模型 to 編程
之前有講過急黎,元胞自動機(jī)是一個動態(tài)生成過程
高速公路可以看成一個網(wǎng)格狀視圖,車輛上格子顏色產(chǎn)生變動時,就有車輛消失或生成在邊界(該元胞已經(jīng)死亡或者生存),我們需要在車輛不斷更新的狀態(tài)實(shí)時顯示在圖形界面上,
模型轉(zhuǎn)換的思想就淺顯易懂了,設(shè)置兩個車流扎狱,一個為正在更新的車流密度,一個為希望此時高速公路能達(dá)到的車流密度,其實(shí)我們只需要設(shè)置兩種車流的密度,因?yàn)樵诟戮浔倪^程中,車流的相對密度是相對不變的叁熔,詳細(xì)會在之后的create_plaza函數(shù)中說明
probv=[0.1 1]; % 兩種車流的密度分布
這就要涉及到matlab的GUI函數(shù)式編程思想,簡略介紹一下:所謂GUI就是一種用戶界面圖形化操作委乌,我們所使用qq,MSN的聊天界面就屬于GUI,但凡GUI都會有一個活動句柄,每當(dāng)我們要對窗體就行操作的時候,要更新窗體句柄的活動狀態(tài),通知窗體要對他進(jìn)行怎樣的改變荣回。
先設(shè)計(jì)句柄更新后的狀態(tài)遭贸,引入new_cars.m函數(shù)
該函數(shù)模型的車道變換規(guī)則如下:
(1) 如果vmax>gap,且gapleft≥gap,則從右車道變換至左車道心软。
(2) 如果 vmax
(3) 如果vback
如果vright>gapleft壕吹,則vright=gapleft(禁止右車道的車輛超過左車道車輛)著蛙。
old為正在進(jìn)行仿真的車流密度,entry為希望此時通過橫斷面的車流密度
function new = new_cars(B, L, old, entry)
new = old;
if entry > 0
if entry <= L
x = randperm(L);
y = ceil((B-L)/2+1);
for i = 1:entry
new(1, (y + x(i))) = 1;
end
end
if entry > L
y = ceil((B-L)/2+1);
for i = 1:L
new(1,(y + i)) = 1;
end
end
end