2014美国数学建模竞赛 MCM A题 元胞自动机完整代码 下载本文

内容发布更新时间 : 2024/5/18 8:51:03星期一 下面是文章的全部内容请认真阅读。

2014美赛相关MATLAB程序(基于NS模型) 主程序:NaSch_3.m程序代码 % 单车道最大速度

3个元胞开口边界条件加速减速随机慢化 clfclear all

%build the GUI

Tfine the plot button

plotbutton=uicontrol('style','pushbutton',...

'string','Run', ...'fontsize',12, ...'position',[100,400,50,20], ... 'callback', 'run=1;');Tfine the stop button

erasebutton=uicontrol('style','pushbutton',... 'string','Stop', ... 'fontsize',12, ...

'position',[200,400,50,20], ... 'callback','freeze=1;'); Tfine 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]); ê setup

n=100;%数据初始化

z=zeros(1,n);%元胞个数

z=roadstart(z,5);%

道路状态初始化,路段上随机分布5辆 cells=z;vmax=3;%最大速度

v=speedstart(cells,vmax);%速度初始化 x=1;%记录速度和车辆位置

memor_cells=zeros(3600,n); memor_v=zeros(3600,n);

imh=imshow(cells);%初始化图像白色有车,黑色空元胞 set(imh, 'erasemode', 'none')axis equalaxis tight

stop=0; %wait for a quit button push

run=0; %wait for a drawfreeze=0; %wait for a freeze(冻结) while (stop==0) if(run==1)

%边界条件处理,搜素首末车,控制进出,使用开口条件 a=searchleadcar(cells); b=searchlastcar(cells);

[cells,v]=border_control(cells,a,b,v,vmax);i=searchleadcar(cells);%

搜索首车位置 for j=1:i if i-j+1==n

[z,v]=leadcarupdate(z,v);

1

continue; else

%======================================加速、减速、随机慢化 if cells(i-j+1)==0;%判断当前位置是否非空 continue;

else v(i-j+1)=min(v(i-j+1)+1,vmax);%加速 %=================================减速 k=searchfrontcar((i-j+1),cells);%搜素前方首个非空元胞位置 if k==0;%确定于前车之间的元胞数 d=n-(i-j+1);

else d=k-(i-j+1)-1; end

v(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; end

end end

cells=z;

memor_cells(x,:)=cells;%记录速度和车辆位置 memor_v(x,:)=v; x=x+1;

set(imh,'cdata',cells)%更新图像 %update the step number diaplay pause(0.2);

stepnumber = 1 + str2num(get(number,'string')); set(number,'string',num2str(stepnumber)) end

if (freeze==1) run = 0; freeze = 0; end drawnow end

///////////////////////////////////////////////////////////////////////

函数:border_control.m程序代码 Function[new_matrix_cells,new_v]=border_control(matrix_cells,a,b,v,vmax) %边界条件,开口边界,控制车辆出入

%出口边界,若头车在道路边界,则以一定该路0.9离去 n=length(matrix_cells); if a==n

2

rand('state',sum(100*clock)*rand(1));%?¨ò????ú??×ó p_1=rand(1);%产生随机概率

if p_1<=1 %如果随机概率小于0.9,则车辆离开路段,否则不离口 matrix_cells(n)=0; v(n)=0; endend

%入口边界,泊松分布到达,1s内平均到达车辆数为q,t为1s if b>vmax t=1; q=0.25;

x=1; p=(q*t)^x*exp(-q*t)/prod(x);%1s内有1辆车到达的概率 rand('state',sum(100*clock)*rand(1)); p_2=rand(1); if p_2<=p

m=min(b-vmax,vmax); matrix_cells(m)=1; v(m)=m;

endendnew_matrix_cells=matrix_cells;

new_v=v;

///////////////////////////////////////////////////////////////////////

函数:leadcarrupdate.m程序代码 function [new_matrix_cells,new_v]=leadcarupdate(matrix_cells,v) %第一辆车更新规则

n=length(matrix_cells);

if v(n)~=0matrix_cells(n)=0; v(n)=0;

endnew_matrix_cells=matrix_cells;

new_v=v;

///////////////////////////////////////////////////////////////////////

函数:randslow.m程序代码 function [new_v]=randslow(v) p=0.3;%慢化概率

rand('state',sum(100*clock)*rand(1));%?¨ò????ú??×ó p_rand=rand;%产生随机概率 if p_rand<=p v=max(v-1,0); end

new_v=v;

///////////////////////////////////////////////////////////////////////

3