【元胞自动机】基于matlab元胞自动机交通流模拟仿真【含Matlab源码 1252期】
一、元胞自動機簡介
1 元胞自動機發(fā)展歷程
最初的元胞自動機是由馮 · 諾依曼在 1950 年代為模擬生物 細胞的自我復制而提出的. 但是并未受到學術界重視.
1970 年, 劍橋大學的約翰 · 何頓 · 康威設計了一個電腦游戲 “生命游戲” 后, 元胞自動機才吸引了科學家們的注意.
1983 年 S.Wolfram 發(fā)表了一系列論文. 對初等元胞機 256 種 規(guī)則所產生的模型進行了深入研究, 并用熵來描述其演化行 為, 將細胞自動機分為平穩(wěn)型, 周期型, 混沌型和復雜型.
2 對元胞自動機的初步認識
元胞自動機(CA)是一種用來仿真局部規(guī)則和局部聯(lián)系的方法。典型的元胞自動機是定義在網(wǎng)格上的,每一個點上的網(wǎng)格代表一個元胞與一種有限的狀態(tài)。變化規(guī)則適用于每一個元胞并且同時進行。典型的變化規(guī)則,決定于元胞的狀態(tài),以及其( 4 或 8 )鄰居的狀態(tài)。
3 元胞的變化規(guī)則&元胞狀態(tài)
典型的變化規(guī)則,決定于元胞的狀態(tài),以及其( 4 或 8 )鄰居的狀態(tài)。
4 元胞自動機的應用
元胞自動機已被應用于物理模擬,生物模擬等領域。
5 元胞自動機的matlab編程
結合以上,我們可以理解元胞自動機仿真需要理解三點。一是元胞,在matlab中可以理解為矩陣中的一點或多點組成的方形塊,一般我們用矩陣中的一點代表一個元胞。二是變化規(guī)則,元胞的變化規(guī)則決定元胞下一刻的狀態(tài)。三是元胞的狀態(tài),元胞的狀態(tài)是自定義的,通常是對立的狀態(tài),比如生物的存活狀態(tài)或死亡狀態(tài),紅燈或綠燈,該點有障礙物或者沒有障礙物等等。
6 一維元胞自動機——交通規(guī)則
定義:
6.1 元胞分布于一維線性網(wǎng)格上.
6.2 元胞僅具有車和空兩種狀態(tài).
7 二維元胞自動機——生命游戲
定義:
7.1 元胞分布于二維方型網(wǎng)格上.
7.2 元胞僅具有生和死兩種狀態(tài).
元胞狀態(tài)由周圍八鄰居決定.
規(guī)則:
骷髏:死亡;笑臉:生存
周圍有三個笑臉,則中間變?yōu)樾δ?br /> 少于兩個笑臉或者多于三個,中間則變死亡。
8 什么是元胞自動機
離散的系統(tǒng): 元胞是定義在有限的時間和空間上的, 并且元 胞的狀態(tài)是有限.
動力學系統(tǒng): 元胞自動機的舉止行為具有動力學特征.
簡單與復雜: 元胞自動機用簡單規(guī)則控制相互作用的元胞 模擬復雜世界.
9 構成要素
(1)元胞 (Cell)
元胞是元胞自動機基本單元:
狀態(tài): 每一個元胞都有記憶貯存狀態(tài)的功能.
離散: 簡單情況下, 元胞只有兩種可能狀態(tài); 較復雜情況下, 元胞具有多種狀態(tài).
更新: 元胞的狀態(tài)都安照動力規(guī)則不斷更新.
(2)網(wǎng)格 (Lattice)
不同維網(wǎng)格
常用二維網(wǎng)格
(3)鄰居 (Neighborhood)
(4)邊界 (Boundary)
反射型:以自己作為邊界的狀態(tài)
吸收型:不管邊界(車開到邊界就消失)
(5)規(guī)則(狀態(tài)轉移函數(shù))
定義:根據(jù)元胞當前狀態(tài)及其鄰居狀況確定下一時刻該元胞狀態(tài)的動力學函數(shù), 簡單講, 就是一個狀態(tài)轉移函數(shù).
分類 :
總和型: 某元胞下時刻的狀態(tài)取決于且僅取決于它所有鄰居 的當前狀態(tài)以及自身的當前狀態(tài).
合法型: 總和型規(guī)則屬于合法型規(guī)則. 但如果把元胞自動機 的規(guī)則限制為總和型, 會使元胞自動機具有局限性.
(6)森林火災
綠色:樹木;紅色:火;黑色:空地。
三種狀態(tài)循環(huán)轉化:
樹:周圍有火或者被閃電擊中就變成火。
空地:以概率p變?yōu)闃淠?br /> 理性分析:紅為火;灰為空地;綠是樹
元胞三種狀態(tài)的密度和為1
火轉化為空地的密度等于空地轉換為樹的密度(新長出來的樹等于燒沒的樹)
f是閃電的概率:遠遠小于樹生成的概率;T s m a x T_{smax}T smax
?是一大群樹被火燒的時間尺度
程序實現(xiàn)
周期性邊界條件
購進啊
其中的數(shù)字為編號
構建鄰居矩陣
上面矩陣中的數(shù)字編號,對應原矩陣相同位置編號的上鄰居編號,一 一對應
同樣道理:
(7)交通概念
車距和密度
流量方程
守恒方程
時空軌跡(橫軸是空間縱軸為時間)
紅線橫線與藍色交點表示每個時間車的位置。
如果是豎線則表示車子在該位置對應的時間
宏觀連續(xù)模型:
最常用的規(guī)則:
紅色條表示速度是滿的。
1 加速規(guī)則:不能超過v m a x ( 2 格 / s ) v_{max}(2格/s)v
max(2格/s)
2 防止碰撞:不能超過車距
理論分析:
結果分析: 密度與流量
第一個圖:橫坐標是歸一化后的密度,縱坐標是車流量。第二個圖:理論值與CA的結果
結果分析: 時空軌跡
中間的深色區(qū)域是交通堵塞的區(qū)域。
二、部分源代碼
clear; figure('position',[50 132 900 400],'doublebuffer','on') W = []; for j=0:7; B = 6+j; %number booths L = 6; %number lanes in highway before and after plaza T = 1; % # hrs to simulate global plazalength; plazalength = 101; plaza = create_plaza(B,L); set(gcf,'resize','off') PLAZA=rot90(plaza); PLAZAA=0.8*ones(40,101,3); PLAZA(PLAZA==1)=2; PLAZA(PLAZA==0)=1; PLAZA(PLAZA==2)=0; PLAZA(PLAZA~=0&PLAZA~=1)=0.8; PLAZAA(20-ceil(B/2):21+ceil(B/2),:,1)=PLAZA; PLAZAA(20-ceil(B/2):21+ceil(B/2),:,2)=PLAZA; PLAZAA(20-ceil(B/2):21+ceil(B/2),:,3)=PLAZA; H=image(PLAZAA); axis off entry_vector = create_entry(T,L); waiting_time = 0; output = 0; for i = 1:T*1440 plaza = move_forward(plaza); %move cars forward plaza = new_cars(B, L, plaza, entry_vector(1,i)); %allow new cars to enter plaza = switch_lanes(plaza); %allow lane changes waiting_time = waiting_time + compute_wait(plaza); %compute waiting time during timestep i output = output + compute_output(plaza); plaza = clear_boundary(plaza); PLAZA=rot90(plaza); PLAZA(PLAZA==1)=2; PLAZA(PLAZA==0)=1; PLAZA(PLAZA==2)=0; PLAZA(PLAZA~=0&PLAZA~=1)=0.8; PLAZAA(20-ceil(B/2):21+ceil(B/2),:,1)=PLAZA; PLAZAA(20-ceil(B/2):21+ceil(B/2),:,2)=PLAZA; PLAZAA(20-ceil(B/2):21+ceil(B/2),:,3)=PLAZA; plaza50=PLAZAA(:,50,1);plaza50(plaza50==1)=0;PLAZAA(:,50,2)=plaza50;PLAZAA(:,50,3)=plaza50; set(H,'CData',PLAZAA); set(gcf,'position',[50 132 900 400]) pause(0.01) end plaza; W=[W waiting_time] end function new = move_forward(old) new = old; %create new plaza looking same as old [L, W] = size(new); %get its dimensions prob = .7; delay = 3; %%%DOWNSTREAM OF TOLL BOOTHS %%% for i = (L-1):-1:((L - 1)/2 + 1)for j = 1:Wif new(i,j) == 1if new(i+1, j) ~= 0new(i,j) = -2;endif new(i+1, j) == 0if prob >= randnew(i,j) = 0;new(i+1, j) = 1;endendendend end %%AT TOLL BOOTHS %% for i = (L-1)/2for j = 1:Wif new(i,j) > 0if new(i,j) == delaynew(i,j) = 0;new(i+1,j) = 1;endif new(i,j) ~= delayif new(i,j) ~= 0new(i,j) = new(i,j) + 1;endendendend end %% UPSTREAM OF TOLL BOOTHS %% for i = (L-1):-1:1for j = 1:Wif new(i,j) == 1if new(i+1, j) ~= 0new(i,j) = -2;endif new(i+1, j) == 0if prob >= randnew(i,j) = 0;new(i+1, j) = 1;endendendend end function plaza = clear_boundary(input) plaza = input; [a,b] = size(plaza); for i = 1:b if plaza(a,i) > 0 plaza(a,i) = 0; end end function count = compute_output(plaza) count = 0; [a, b] = size(plaza); for j = 1:b count = count + (plaza(a,j) > 0); end function new = switch_lanes(old) new = old; prob = 0.8; x = rand; y = rand; [L,W] = size(new); for i = (L-1):-1:1for j = 2:(W-1)if new(i,j) == -2if x < prob %chance turn will be madeif y > 0.5 %will attempt leftif new(i, j-1) == 0new(i, j-1) = 1;new(i, j) = 0;elseif new(i, j+1) == 0new(i, j+1) = 1;new(i,j) = 0;elseif new(i,j) == -2new(i,j) = 1;endendif y <= 0.5 %will attempt rightif new(i, j+1) == 0new(i, j-1) = 1;new(i,j) = 0;elseif new(i,j) == -2new(i,j) = 1;endendendif x >= probnew(i,j) = 1;endendend end三、運行結果
四、matlab版本及參考文獻
1 matlab版本
2014a
2 參考文獻
[1] 包子陽,余繼周,楊杉.智能優(yōu)化算法及其MATLAB實例(第2版)[M].電子工業(yè)出版社,2016.
[2]張巖,吳水根.MATLAB優(yōu)化算法源代碼[M].清華大學出版社,2017.
[3]【數(shù)學建模】元胞自動機.博主:二進制 人工智能
總結
以上是生活随笔為你收集整理的【元胞自动机】基于matlab元胞自动机交通流模拟仿真【含Matlab源码 1252期】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java uuid 线程安全_java
- 下一篇: Diango博客--12.开发 Djan