【元胞自动机】基于matlab元胞自动机单车道交通流(时空图)【含Matlab源码 1681期】
一、元胞自動機簡介
1 元胞自動機發展歷程
最初的元胞自動機是由馮 · 諾依曼在 1950 年代為模擬生物 細胞的自我復制而提出的. 但是并未受到學術界重視.
1970 年, 劍橋大學的約翰 · 何頓 · 康威設計了一個電腦游戲 “生命游戲” 后, 元胞自動機才吸引了科學家們的注意.
1983 年 S.Wolfram 發表了一系列論文. 對初等元胞機 256 種 規則所產生的模型進行了深入研究, 并用熵來描述其演化行 為, 將細胞自動機分為平穩型, 周期型, 混沌型和復雜型.
2 對元胞自動機的初步認識
元胞自動機(CA)是一種用來仿真局部規則和局部聯系的方法。典型的元胞自動機是定義在網格上的,每一個點上的網格代表一個元胞與一種有限的狀態。變化規則適用于每一個元胞并且同時進行。典型的變化規則,決定于元胞的狀態,以及其( 4 或 8 )鄰居的狀態。
3 元胞的變化規則&元胞狀態
典型的變化規則,決定于元胞的狀態,以及其( 4 或 8 )鄰居的狀態。
4 元胞自動機的應用
元胞自動機已被應用于物理模擬,生物模擬等領域。
5 元胞自動機的matlab編程
結合以上,我們可以理解元胞自動機仿真需要理解三點。一是元胞,在matlab中可以理解為矩陣中的一點或多點組成的方形塊,一般我們用矩陣中的一點代表一個元胞。二是變化規則,元胞的變化規則決定元胞下一刻的狀態。三是元胞的狀態,元胞的狀態是自定義的,通常是對立的狀態,比如生物的存活狀態或死亡狀態,紅燈或綠燈,該點有障礙物或者沒有障礙物等等。
6 一維元胞自動機——交通規則
定義:
6.1 元胞分布于一維線性網格上.
6.2 元胞僅具有車和空兩種狀態.
7 二維元胞自動機——生命游戲
定義:
7.1 元胞分布于二維方型網格上.
7.2 元胞僅具有生和死兩種狀態.
元胞狀態由周圍八鄰居決定.
規則:
骷髏:死亡;笑臉:生存
周圍有三個笑臉,則中間變為笑臉
少于兩個笑臉或者多于三個,中間則變死亡。
8 什么是元胞自動機
離散的系統: 元胞是定義在有限的時間和空間上的, 并且元 胞的狀態是有限.
動力學系統: 元胞自動機的舉止行為具有動力學特征.
簡單與復雜: 元胞自動機用簡單規則控制相互作用的元胞 模擬復雜世界.
9 構成要素
(1)元胞 (Cell)
元胞是元胞自動機基本單元:
狀態: 每一個元胞都有記憶貯存狀態的功能.
離散: 簡單情況下, 元胞只有兩種可能狀態; 較復雜情況下, 元胞具有多種狀態.
更新: 元胞的狀態都安照動力規則不斷更新.
(2)網格 (Lattice)
不同維網格
常用二維網格
(3)鄰居 (Neighborhood)
(4)邊界 (Boundary)
反射型:以自己作為邊界的狀態
吸收型:不管邊界(車開到邊界就消失)
(5)規則(狀態轉移函數)
定義:根據元胞當前狀態及其鄰居狀況確定下一時刻該元胞狀態的動力學函數, 簡單講, 就是一個狀態轉移函數.
分類 :
總和型: 某元胞下時刻的狀態取決于且僅取決于它所有鄰居 的當前狀態以及自身的當前狀態.
合法型: 總和型規則屬于合法型規則. 但如果把元胞自動機 的規則限制為總和型, 會使元胞自動機具有局限性.
(6)森林火災
綠色:樹木;紅色:火;黑色:空地。
三種狀態循環轉化:
樹:周圍有火或者被閃電擊中就變成火。
空地:以概率p變為樹木
理性分析:紅為火;灰為空地;綠是樹
元胞三種狀態的密度和為1
火轉化為空地的密度等于空地轉換為樹的密度(新長出來的樹等于燒沒的樹)
f是閃電的概率:遠遠小于樹生成的概率;T s m a x T_{smax}T smax
?是一大群樹被火燒的時間尺度
程序實現
周期性邊界條件
購進啊
其中的數字為編號
構建鄰居矩陣
上面矩陣中的數字編號,對應原矩陣相同位置編號的上鄰居編號,一 一對應
同樣道理:
(7)交通概念
車距和密度
流量方程
守恒方程
時空軌跡(橫軸是空間縱軸為時間)
紅線橫線與藍色交點表示每個時間車的位置。
如果是豎線則表示車子在該位置對應的時間
宏觀連續模型:
最常用的規則:
紅色條表示速度是滿的。
1 加速規則:不能超過v m a x ( 2 格 / s ) v_{max}(2格/s)v
max(2格/s)
2 防止碰撞:不能超過車距
理論分析:
結果分析: 密度與流量
第一個圖:橫坐標是歸一化后的密度,縱坐標是車流量。第二個圖:理論值與CA的結果
結果分析: 時空軌跡
中間的深色區域是交通堵塞的區域。
二、案例及部分源代碼
1 案例
figure 1:wolfram的184號規則
這個規則可以讓元胞模擬出交通流的感覺,為什么說是感覺呢,因為大家好像看到了一個方塊或者說叫一個小車,在向前行進,但是并沒有模擬出交通流中的很多現象。隨后就有NaSch規則被提出來了,這個規則可以說是所有元胞交通流模型的鼻祖,后面很多規則都是從這個規則中進化而來的。而我們今天討論的靠右行駛的雙車道模型也是根據NaSch模型改進而來的,簡單討論一下NaSch模型,然后進一步引出本文要講解的靠右行駛模型。
NaSch規則:
(1)加速,
(2)減速,
(3)以概率p隨機慢化速度,
(4)行進,
可以看到,NaSch規則就僅僅只有簡單的四條,但是卻模擬出了交通流的最基本的東西,從其時空圖就可以看出來:
figure 2:Density=0.15,Vmax=5
figure 2是元胞長度為1000,時間步為500時候得出的時空圖。這里還有相應的包括流量密度圖和速度密度圖等基本圖也可以得出來。
接下來離我們的靠右行駛模型又進了一步,在這之前,我們再介紹一下基于NaSch的雙車道模型STNS,有了雙車道模型,靠右行駛模型便不再是難事。
STNS規則:
可以從STNS的規則中看到,為了實現雙車道的CA交通流模型,我們實質對NaSch模型的改動僅僅是添加了一條換道規則,而換道規則看起來又是那么容易理解和合乎現實條件。這就是CA的魅力,通過稍微改動規則,就可以實現一些我們想要的結果,后面我們將用靠右行駛模型來詮釋這個。當然規則也是CA的噩夢,我們通常情況下并不知道什么時候該用CA的什么規則。
現在我將再引進一條規則,在此規則下CA就可以實現2014MCM比賽中靠右行駛規則,同時可以預料到,再修改一些規則,仍然可以完整實現2014MCM比賽A題中的任何一個問題,但是這里對此不予以討論。
Keep-Right Rule:
至此,靠右行駛規則用元胞自動機實現完畢。下面是用Matlab實現的仿真模擬圖:
2 案例及部分源代碼
2.1案例
2.2 部分源代碼
clc clear; %build the GUI %define the plot button plotbutton=uicontrol('style','pushbutton','string','Run', 'fontsize',12,'position',[100,400,50,20],'callback','run=1;'); %define the stop button erasebutton=uicontrol('style','pushbutton','string','Stop','fontsize',12,'position',[200,400,50,20],'callback','freeze=1;'); %define the Quit button quitbutton=uicontrol('style','pushbutton','string','Quit','fontsize',12,'position',[300,400,50,20],'callback','stop=1;close;'); number=uicontrol('style','text','string','1','fontsize',12,'position',[20,400,50,20]); %CAsetup n=1000; %數據初始化 z=zeros(1,n); %元胞個數 z=roadstart(z,200); %道路狀態初始化,路段上隨機分布200輛 cells=z; vmax=5; %最大速度 v=speedstart(cells,vmax); %速度初始化x=1; %記錄速度和車輛位置 x=1; memor_cells=zeros(3600,n); memor_v=zeros(3600,n); imh=imshow(cells); %初始化圖像白色有車,黑色空元胞 set(imh,'erasemode','none') axis equal axis tight stop=0; %wait for a quit button push run=0; %wait for a draw freeze=0; %wait for a freeze (凍結) while (stop==0 && x<1102) if(run==1)%邊界條件處理,搜素首末車,控制進出,使用開口條件a=searchleadcar(cells);b=searchlastcar(cells); % [cells,v]=border_control(cells,a,b,v,vmax);i=searchleadcar(cells); %搜索首車位置for j=1:iif (i-j+1==n)[z,v]=leadcarupdate(z,v);continue;else%==========================加速、減速、隨機慢化if cells(i-j+1)==0 %判斷當前位置是否非空continue;elsev(i-j+1)=min(v(i-j+1)+1,vmax); %加速%=======================減速k=searchfrontcar((i-j+1),cells); %搜素前方首個非空元胞位置if(k==0) %確定與前車之間的元胞數d=n-(i-j+1);elsed=k-(i-j+1)-1;endv(i-j+1)=min(v(i-j+1),d);%減速%隨機慢化v(i-j+1)=randslow(v(i-j+1));new_v=v(i-j+1); %更新車輛位置z(i-j+1)=0;z(i-j+1+new_v)=1;%更新速度v(i-j+1)=0;v(i-j+1+new_v)=new_v;endendendcells=z;memor_cells(x,:)=cells; %記錄速度和車輛位置memor_v(x,:)=v;x=x+1;set(imh,'cdata',cells) %更新圖像%update the step number diaplay pause(0.0001); stepnumber=1+str2num(get(number,'string')); set(number,'string',num2str(stepnumber)) end if (freeze==1) run=0; freeze=0; end drawnow end figure(2) for l=1:1:200 for k=500:1:1000 if memor_cells(l,k)>0plot(k,l,'k.'); hold on; end end end xlabel('空間位置'); ylabel('時間(s)'); title('時空圖');for i=1:1:500density(i)=sum(memor_cells(i,:)>0)/1000;flow(i)=sum(memor_v(i,:))/1000;endfigure(3)plot(density,flow,'k.');title('流量密度圖')xlabel('density')ylabel('flow')% 函數: speedstart.m程序代碼三、運行結果
四、matlab版本及參考文獻
1 matlab版本
2014a
2 參考文獻
[1] 包子陽,余繼周,楊杉.智能優化算法及其MATLAB實例(第2版)[M].電子工業出版社,2016.
[2]張巖,吳水根.MATLAB優化算法源代碼[M].清華大學出版社,2017.
[3]【數學建模】元胞自動機.博主:二進制 人工智能
總結
以上是生活随笔為你收集整理的【元胞自动机】基于matlab元胞自动机单车道交通流(时空图)【含Matlab源码 1681期】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机操作系统指导书,《计算机操作系统》
- 下一篇: 用计算机弹可惜不是你,可惜不是你 还是幸