1.引言——生命游戏

1970年,英国数学家约翰·何顿·康威提出了生命游戏(Life Game)。生命游戏本质是一个元胞自动机模型,每个元胞可以看作是一个细胞,细胞的产生、繁衍和死亡拥有3条演化规则。

1. 如果一个细胞周围有3个细胞为生(一个细胞周围共有8个细胞),则该细胞为生(即该细胞若原先为死,则转为生,若原先为生,则保持不变) 。

2. 如果一个细胞周围有2个细胞为生,则该细胞的生死状态保持不变;

3. 在其它情况下,该细胞为死(即该细胞若原先为生,则转为死,若原先为死,则保持不变)

元胞空间在给定的初始状态下,根据以上3条规则,可以演化出千奇百怪的二维生命形式。在游戏的进行中,杂乱无序的细胞会逐渐演化出各种精致、有形的结构;这些结构往往有很好的对称性,而且每一代都在变化形状。一些形状已经锁定,不会逐代变化。有时,一些已经成形的结构会因为一些无序细胞的“入侵”而被破坏。但是形状和秩序经常能从杂乱中产生出来。

Matlab上的生命游戏代码如下。

%名称:生命游戏
%作者:Lu Jiancheng
clear%清除变量
clc%清屏
%创建GUI界面
h=figure(1);
set(h,'Name','Life Game','Position',[500,100,600, 600]);%[左侧位置,下侧位置,宽度,高度]
axe=axes('Parent', h);
%set(axe,'Box','on','Position',[50,50,300,300]);%
txt=uicontrol('parent', h,'Style','text', 'string','Life Game', 'fontsize',12, 'position',[100,750,300,25]);
runbutton=uicontrol('parent',h,'Style','pushbutton','string','run','callback','runflag=1;','position',[100,650,50,25]);
stopbutton=uicontrol('parent',h,'Style','pushbutton','string','stop','callback','runflag=0;','position',[200,650,50,25]);
stepbutton=uicontrol('parent',h,'Style','pushbutton','string','step','callback','runflag=0;step=1;','position',[300,650,50,25]);
stepwin = uicontrol('parent', h,'Style','text', 'string','0', 'fontsize',12, 'position',[400,800,100,20]);
%生命游戏代码
%参数
Random=1;%选择初始化方式
maxtime=300;
p=0.3;
n=128;
%cells=zeros(n,n);%建立一个平面矩阵
%几种特定的初始状态
%
% initial_cells=[ 0 0 1;
%                     1 0 1;
%                     0 1 1];
%  initial_cells=[ 0 1 0;
%                      1 1 1;
%                      0 1 0];
initial_cells=[0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0;0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0;1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0;0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0;0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0;0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0;0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1;0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1;0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0;0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0;0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0;1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0;0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0];
if Random
%初始化部分for i=1:nfor j=1:nif rand()<pcells(i,j)=1;endendend
else %装载特殊图形%cells(10:25,10:25)=initial_cells;cells=initial_cells;%cells(49:51,49:51)=initial_cells;[n,~] = size(initial_cells);
end
%演化部分
pic=imshow(initial_cells,'Parent', axe,'XData',[0,100],'YData',[0,100]);%绘图
t=0;
runflag=1;
upside=0;
downside=0;
leftside=0;
rightside=0;
step=0;
while(t<maxtime)while(t<maxtime&&(runflag==1||step==1))%演化规则nextcells=cells;for i=1:nfor j=1:n%周期性边界处理if(i==n)downside=1;upside=i-1;elseif(i==1)downside=i+1;upside=i-1+n;elsedownside=i+1;upside=i-1;endif(j==n)rightside=1;leftside=j-1;elseif(j==1)rightside=j+1;leftside=j-1+n;elserightside=j+1;leftside=j-1;end%边界处理结束Sum=cells(upside,leftside)+cells(upside,j)+cells(upside,rightside)+cells(i,leftside)+cells(i,rightside)+cells(downside,leftside)+cells(downside,j)+cells(downside,rightside);                      if(Sum==3)nextcells(i,j)=1;elseif Sum~=2nextcells(i,j)=0;end  endendcells=nextcells;%演化规则结束pic=imshow(cells,'Parent', axe,'XData',[0,100],'YData',[0,100]);%绘图t=t+1;%时间前进1sset(stepwin,'string',t)step=0;pause(0.1);endpause(0.1);
end

运行这段代码,随机初始化元胞空间,可以看到演化过程中逐渐出现有规律的形状。

当演化时间为300步时的图像

2.时间反演

时间反演的原始思路是这样。假设演化时间为100 step,每一步时都对元胞空间的状态进行一次快照,保存下来。然后从时间步100开始,一直到第1步。每次载入那一步的元胞空间,如同倒放胶片一样。这样从观察者看来,生命游戏中的时间就好像在倒流。

原始思路有需要保存每一时间步的演化状态,才能实现时间的反转。这样将会消耗大量的内存空间。这样我们自然会想到,能不能在不利用额外内存空间,而只利用元胞自动机本身的元胞空间,就可以实现时间反演?

思路可以是这样的,可以提出基于生命游戏现有的元胞演化规则的逆规则,然后只要将时间步反过来进行演化,就可以实现时间反演的现象。

那么存不存在逆规则呢?生命游戏的逆规则可能比较难以推导,甚至某些情况下是不存在的。

假设在时刻t元胞空间内只有一个细胞,按照生命游戏的三条规则,时刻t+1元胞空间内将空无一物,没有一个细胞。这样即使存在逆规则,也无法实现时间反演,因为任何一个空元胞都可能在上一个时刻是活细胞。

3.物理系统

那么存不存在逆规则呢?生命游戏的逆规则可能比较难以推导,甚至某些情况下是不存在的。但下面这个假设的物理系统的逆规则还是比较好推导的。

该假设的物理系统是这样。

1. 元胞可以看作是一个有质量的点,空白表示质量为0,否则质量为1。

2. 质点之间存在吸引力F,F的大小和质点之间的距离成反比。

3. 质点存在速度,决定质点的移动方向和每一时间步的移动距离。

4. 作用力F会产生加速度,加速度决定速度的变化方向和每一时间步的变化大小。

这样一个元胞自动机系统的演化情况如下图所示。

该系统内有两个质点,有沿x方向的初始速度,其Matlab仿真代码如下。

p1=[1,100];  %位置(x,y)
v1=[1,0];    %速度(x,y)
p2=[1,1];  %位置(x,y)
v2=[1,0];    %速度(x,y)
x = [1];
y1 = [100] ;
y2 = [1] ;
dt = 1;
T =[1];
V1L=[0];
V2L=[0];
A1L=[0];
A2L=[0];
for t =2:1:100F =100/(max(p1(2) - p2(2),3.0))^2;a1 = F*sign(p2(2) - p1(2));a2 = F*sign(p1(2) - p2(2));A1L = [A1L,a1];A2L = [A2L,a2];v1(2) = v1(2) +a1*dt;v2(2) = v2(2) +a2*dt;V1L = [V1L,v1(2)];V2L = [V2L,v2(2)];p1 = p1 + v1*dt;p2 = p2 + v2*dt;x = [x,p1(1)];y1 = [y1,p1(2)];y2 = [y2,p2(2)];T = [T,t];
end
plot(x,[y1;y2]);

运行这段代码可以看到两个质点的位置随着时间的变化。

在这样的一个系统里只要将时间步改为-1,就可以实现时间的反演,而不用采用逆规则。反演的图像如下,在前100时间步正向演化,在101时间步到200时间步逆向演化。

可以用以下的代码实现。

dt = -1;
for t =101:1:200F =100/(max(p1(2) - p2(2),3.0))^2;a1 = F*sign(p2(2) - p1(2));a2 = F*sign(p1(2) - p2(2));v1(2) = v1(2) +a1*dt;v2(2) = v2(2) +a2*dt;p1 = p1 + v1*dt;p2 = p2 + v2*dt;x = [x,p1(1)];y1 = [y1,p1(2)];y2 = [y2,p2(2)];T = [T,t];
End

基于规则反演的图像

4.结论

在元胞自动机可以实现一些物理系统,实现基于逆规则的时间反演。这种逆规则甚至可以和原来的规则相同,只需要改变时间步长为负值即可。而生命游戏这种系统,则无法实现基于逆规则的时间反演。

基于逆规则的反演是不需要快照方式,不用记录每一时间步的状态,更符合真实物理实际的情形。如果这种逆规则等同于原规则,我们可以认为该系统的物理规则具有时间对称性。

交通流元胞自动机模拟仿真 matlab源码_元胞自动机中的时间反演相关推荐

  1. 【元胞自动机】基于元胞自动机模拟双车道交通流模型含靠右行驶matlab源码

    元胞自动机的初步理解 对元胞自动机的初步认识\ 元胞自动机(CA)是一种用来仿真局部规则和局部联系的方法.典型的元\ 胞自动机是定义在网格上的,每一个点上的网格代表一个元胞与一种有限的状\ 态.变化规 ...

  2. 【元胞自动机】元胞自动机单车道交通流(时空图)【含Matlab源码 1681期】

    ⛄一.元胞自动机简介 1 元胞自动机发展历程 最初的元胞自动机是由冯 · 诺依曼在 1950 年代为模拟生物 细胞的自我复制而提出的. 但是并未受到学术界重视. 1970 年, 剑桥大学的约翰 · 何 ...

  3. fama matlab源码_基于优化算法改造的Fama-French三因子模型

    基于光大证券金融工程研报<站在巨人的肩膀上,从牛基组合到牛股发现 --FOF 专题研究系列之十六 >中提及的Carhart四因子Alpha优化模型,本文在Fama-French三因子模型上 ...

  4. armax函数 matlab 源码_将可读性不强的MATLAB公式样式转为直观的LaTeX样式

    欢迎关注公众号:120701101. 将可读性不强的MATLAB公式样式转为直观的LaTeX样式 Contens 问题来源 解决办法 代码 演示代码 源码编辑器 问题来源 B站有个大神"图某 ...

  5. armax函数 matlab 源码_【源码】Kmeans聚类算法(超快速、简洁的设计方法)

    这是一种超快速MATLAB实现的kmeans聚类算法. This is a super duper fast implementation of the kmeans clustering algor ...

  6. 【元胞自动机】基于元胞自动机的人口疏散仿真matlab源码

    1 简介 为了消除礼堂的安全隐患,制定 行之有效的应急预案,有必要对礼堂人群疏散运动进行研究,掌握礼堂人群疏散的一般特点和规律.采用基于二维元胞自动机模型对某高校礼堂发生人群疏散运动进 行仿真,找出影 ...

  7. 【卡尔曼滤波】卡尔曼滤波在雷达目标跟踪中的应用仿真matlab源码

    1 模型 [摘要]目标跟踪问题的应用背景是雷达数据处理,即雷达在搜索到目标并记录目标的位置数据,对测量到的目标位置数据(称为点迹)进行处理,自动形成航迹,并对目标在下一时刻的位置进行预测.本文简要讨论 ...

  8. 【物理应用】大气湍流相位屏仿真matlab源码

    1大气湍流相位屏模型 2 部分代码 %% example_ft_sh_phase_screen.m 利用谐波方法产生随机相位屏的例子 clc; Dx = 2; % length of one side ...

  9. 【雷达通信】合成孔径雷达(SAR)的点目标仿真matlab源码

    *SAR原理简介* 用一个小天线作为单个辐射单元,将此单元沿一直线不断移动,在不同位置上接收同一地物的回波信号并进行相关解调压缩处理.一个小天线通过"运动"方式就合成一个等效&qu ...

最新文章

  1. 七夕节脱单“神助攻”!AI教你写情话
  2. 用时间戳判断两个时间是否在同一天和时区转换问题
  3. select_arg_from_python相关的测试程序
  4. “睡服”面试官系列第七篇之map数据结构(建议收藏学习)
  5. mpvue返回上一个页面_Mpvue+Vant-Weapp开发小程序遇坑之解决系列
  6. Soul网关源码阅读(十)自定义简单插件编写
  7. 【二分法】计蒜客:求方程的近似解
  8. 各种免费在线工具收集
  9. 电脑主板故障维修案例
  10. (附源码)ssmJavaEE无人机数据管理系统 毕业设计 111022
  11. 使用Elasticsearch和Kibana挖掘邮箱
  12. 电子学会 2020年6月 青少年软件编程Python编程等级考试一级真题解析(选择题+判断题+编程题)
  13. 2021最新微信域名检测后屏蔽举报源码
  14. 服务器选共享IP还是独立IP好
  15. 2022苹果AppStore应用商店上传与APP上传流程必看(基础篇)​
  16. Abaqus中C3D8R单元和C3D8I单元的区别
  17. mpich2无法单机冰雪时程序闪退_google play无法下载,无法登录,安装不了应用怎么办?...
  18. Python采集某宝数据,轻松解决这个价值千元的外包项目
  19. 【LOJ6197】法克(最长反链)
  20. 独立站SEO推广的正确打开方式

热门文章

  1. spring AspectJ的Execution表达式
  2. android与js交互
  3. ActionBarActivity设置全屏无标题
  4. 移动文件读/写指针----lseek
  5. [jstl] forEach标签使用
  6. Cmake确实应该用到的时候再学
  7. 同事用void把我给秀翻了!
  8. Linux内核奔溃分析
  9. 云数据中心网络遇到的问题_云数据中心面临安全问题,华为SDN解决方案有一个安全大脑...
  10. vs2019新建android生成app,VS2017 VS2019创建离线安装包