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

?

?