一、簡介
元胞自動機(CA)是一種用來仿真區域規則和區域聯系的方法,典型的元胞自動機是定義在網格上的,每一個點上的網格代表一個元胞與一種有限的狀態,變化規則適用于每一個元胞并且同時進行,典型的變化規則,決定于元胞的狀態,以及其( 4 或 8 )鄰居的狀態,
1 對元胞自動機的初步認識
元胞自動機(CA)是一種用來仿真區域規則和區域聯系的方法,典型的元
胞自動機是定義在網格上的,每一個點上的網格代表一個元胞與一種有限的狀
態,變化規則適用于每一個元胞并且同時進行,
2 元胞的變化規則&元胞狀態
典型的變化規則,決定于元胞的狀態,以及其( 4 或 8 )鄰居的狀態,
3 元胞自動機的應用
元胞自動機已被應用于物理模擬,生物模擬等領域,
4 元胞自動機的matlab編程
結合以上,我們可以理解元胞自動機仿真需要理解三點,一是元胞,在matlab中可以理解為矩陣中的一點或多點組成的方形塊,一般我們用矩陣中的一點代表一個元胞,二是變化規則,元胞的變化規則決定元胞下一刻的狀態,三是元胞的狀態,元胞的狀態是自定義的,通常是對立的狀態,比如生物的存活狀態或死亡狀態,紅燈或綠燈,該點有障礙物或者沒有障礙物等等,
二、源代碼
% iterations = 迭代次數即計算次數 100
% B = 收費站的個數 定義的了是12個
% L = 車道數 6
% Arrival = 平均車流量
% plazalength = 收費區長度 101 但是這個是什么意思呢
% Service = 服務率 0.8
% dt = 時間步長
% plaza = 收費區矩陣
% 1 = 有車, 0 =為空, -1 = 禁止, -3 = 收費站
% v = 速度矩陣
% vmax = 最大速度
% time = 時間矩陣
% t_h = 時間因素
% departurescount = 在一次計算中流出的車數
% departurestime = 流出的車經過收費區所花費的時間
% influx = 進車矢量
% outflux = 出車矢量
% timecost = 所有車輛花費的時間
% h = 句柄
clear;clc;
iterations = 100; % 迭代次數即計算次數
B = 12; % 收費站的個數
L = 6; % 車道數
Arrival=4; % 平均車流量
plazalength = 101; % 收費區長度
[plaza, v, time] = create_plaza(B, L, plazalength);%子函式1構建收費區矩陣
h = show_plaza(plaza, NaN, 0.01);%子函式2將收費區矩陣轉換為圖片(NaN任意值)
Service = 0.8; % 服務率
dt = 0.2; % 時間步長
t_h = 1; % 時間因素
vmax = 5; % 最大速度
influx=[];%不同
outflux=[];%不同
% 1 = 有車, 0 = 為空, -1 = 禁止, -3 = 收費站
% v = 速度矩陣
% time = 時間矩陣
% vmax = 最大速度
Service = 0.8; % 服務率 exp(-Service*dt)
dt = 0.2; %時長
probac = 0.7;% 加速概率
probdc = 1;% 減速的可能性
probrd = 0.3;% 隨機減速的可能性
t_h = 1; % 時間因素
[L,W] = size(plaza);% 構建(i,j)位置的距離矩陣
gap = zeros(L,W);
f = find(plaza==1);%找到收費區中有車的位置并記錄
for k=f'
[i,j] = ind2sub([L,W], k);%將矩陣中k位置,用[i,j]表示
d = plaza(i+1:end, j);%距離
gap(k) = min( find([d~=0;1]) )-1;%找到k車前方最近(min)的不為零的元胞,測距;find([d~=0;1]查
end
gap(end,:) = 0;%最后一行距離為0
%% 速度更新規則
% 1 加速:間隔大于速度
k = find((gap(f) > v(f)*t_h) & (v(f) + 1 <= vmax) & (rand(size(f)) <= probac));%gap(f)到前面車的距離
v(f(k)) = v(f(k)) + 1;
% 2 排除碰撞
k = find((v(f)*t_h > gap(f)) & (rand(size(f)) <= probdc));
v(f(k)) = gap(f(k))/t_h;
% 3 隨機減速
k = find(rand(size(f)) <= probrd);
v(f(k)) = max(v(f(k)) - 1,0);
% 進出收費站
%% 收費亭
function [plaza, v, time, departurescount, departurestime] = clear_boundary(plaza, v, time)
% clear_boundary 最后一行車的移動
% plaza = 收費區矩陣
% 1 = 有車,0=為空,-1 = 禁止, -3 = 收費站
% v = 速度矩陣
% time = 時間矩陣
departurescount = 0;%出口離去車輛數
departurestime = [];%離去車輛時刻
[a,b] = size(plaza);
booth_row = ceil(L/2);%找到收費區的位置
for i = 2:W-1
if (plaza(booth_row,i) ~= 1)%如果該收費站沒車
if (plaza(booth_row-1,i) == 1)%如果收費站之前有車
v(booth_row - 1 ,i) = 1;%該車速度為1
end
三、運行結果

四、備注
完整代碼或者代寫添加QQ1564658423
往期回顧>>>>>>
【元胞自動機】基于matlab元胞自動機之雙車道交通流模型含靠右行駛【含Matlab原始碼 231期】
【元胞自動機】基于matlab元胞自動機之晶體生長【含Matlab原始碼 232期】
【元胞自動機】基于matlab元胞自動機求解城市小區開放對周邊道路通行的影響研究【含Matlab原始碼 233期】
【元胞自動機】基于matlab元胞自動機之影像處理【含Matlab原始碼 234期 】
【元胞自動機】基于matlab元胞自動機之森林大火【含Matlab原始碼 235期】
【元胞自動機】基于matlab元胞自動機模擬HIV傳染【含Matlab原始碼 236期】
【元胞自動機】基于matlab元胞自動機之地鐵火災疏散模型【含Matlab原始碼 246期】
【元胞自動機】基于matlab 二維元胞自動機規則模擬交通流【含Mtlab原始碼 355期】
【元胞自動機】基于matlab模擬交通事故道路通行量【含Matlab原始碼 356期】
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/262111.html
標籤:其他
上一篇:zemax光學系統設計
