复杂网络实验4:一维元胞自动机(matlab)

article/2025/10/24 2:49:13

一.思路

一维元胞自动机

一维元胞自动机的意思是,当前元胞的状态,只能被左右元胞的状态影响,而不能被上下元胞影响(能上下就是二维了)

为什么普通一维元胞自动机(只有当前元胞和左右两个邻居)规则有256个?

        如上图所示,假如第一个版本有12个元胞(这个数目可以在代码开头设置),为了让每个元胞都有邻居,可以把这12个元胞头尾相连,如上图所示,一个版本就是1行,下一个版本就是下一行。而为了得到下一行的版本,我们需要规则(rule)来确定元胞下次是变白还是变黑。

       在上图中,1号元胞的下一个版本是由自身(2)还有左右邻居(a和2)所决定,也就是说是这三个元胞的状态决定了这个元胞(1号元胞)下一个版本的状态,那么规则就可以定8个,2的3次方。另外,每个规则可以决定该规则决定下一时刻该元胞是黑的还是白的,有两种方案。也就是说,最后有256种策略,2的8次方。

     这样我们就大致知道,这个一维元胞自动机到底是个什么东西了。

 

juge函数

用来判断当前三元组是否在rule中是1,是1就返回1,不是1就返回0

这就是juge函数传入的两个参数,左边那个是 1 1 0 ,也就是黑黑白,预迭代的是中间这个1,边上两个是他的邻居

右边那个对应rule30,也就是 0 0 0 1 1 1 1 0 的规则。也就是在这些规则下,我下一步迭代能到1

直观上看,我们知道,左边这样的状态在右边找不到,那么下一步就是迭代到0

具体算法实现思路如下:

通过把左边这个行数组扩大到右边这个矩阵的规模,然后相减,得到结果矩阵A

那么如果我们能在A矩阵中找到一行是 0 0 0的 ,那就能迭代到1,不然就迭代到0

显然右边没有

在程序中,可以先把A中所有元素取绝对值,再转置,原因如下

matlab中有个sum函数,可以得到每一列的和,先给A取绝对值,不然 1 -1 0这样的相加也是0

abs(A)',这里的'是转置的意思,先函数abs(取绝对值函数)发生作用,然后转置

再通过 sum(abs(A)')' 给每一列求和,再转置回来,得到一个列向量

再通过find函数找到这个列向量中为0的下标序列

狗=find(sum(abs(A)')')==0)

然后通过size函数,size(狗,1)就是得到狗的行数,如果狗中有为0的元素,那么就得到一个大于1的数字猫

再通过logical()函数,logical(猫)的意思就是,猫如果是0,返回0,不是0就返回1(负数也算),以达到最后的判断

1.需要确定的参数

lineLength,即第一个版本的元胞数量

rule,即规则,wolfram最钟爱rule30,也就是说rule设置成 0 0 0 1 1 1 1 0

binaryTable, 01234567..的排列方式

注:wolfram钟爱的rule30 设置成0 0 0 1 1 1 1 0 ,顺序是按正常的二进制从右往左,从小到大的顺序

也就对应着76543210这样的顺序,程序内也默认这样的顺序

这里的数字的解释是二进制的解释,比如7就是111,就是3个格子都是黑色

6就是110,就是当前元胞是黑的,左边邻居是黑的,右边邻居是白的

0 - 7每个数组代表一种 3个元胞的组合 然后rule 确定的就是0 1也就是黑白

2.初始元胞序列最中间两个元胞赋1,其余全0

3.进入版本迭代,一个版本算一行

#1.先对预迭代版本的元胞序列进行首尾连接

#2.取得所有的3元组,3个一行的形式保存在矩阵中

#3.用juge函数判断,生成下一个迭代版本,然后用下一个版本生成下下个版本

二.代码+解析

1.第一部分,参数确认,初始化数据

function cellularAutomato
%以下是3个需要调整的内容,包括一行的长度,规则,规则对应的01234567或者76543210的顺序
lineLength=100;                           //初始元胞序列长度设置成100,可调整
rule=[0 0 0 1 1 1 1 0];                   //据说是wolfram最喜欢的rule30,要对应上面 7-0的排列 (可以自己设置256种规则)
binaryTable=[1 1 1;1 1 0;1 0 1;1 0 0;0 1 1;0 1 0;0 0 1;0 0 0]
%binaryTable=[0 0 0;0 0 1;0 1 0;0 1 1;1 0 0;1 0 1;1 1 0;1 1 1]      //给出两种0-7的序列排列方式,默认使用上面一种

onePosition=find(rule==1);                                         //通过find函数找到rule中的1的下标

initial=zeros(1,lineLength);                                              //初始化最初的100个元胞,全0
initial([floor(lineLength/2),floor(lineLength/2)+1])=1;      //把中间两个元胞设置为1

lenInitial=length(initial);                                              //初始化元胞数组长度

L=floor(lineLength/2);                                                 //迭代数目L,元胞总数的一半
currentGeneration=initial;                                           //当前迭代版本
spaceTimeDiagrams=initial;                                      //最终产生灰度图像的矩阵先放入最初的那一行

2.第二部分,进入版本迭代

for i=1:L
    currentGeneration=[currentGeneration(end),currentGeneration,currentGeneration(1)];          //首尾相连
    currentGeneration
    nextGeneration=[];
    
    r=1;
    len=2*r+1;                                     //这里由于底下的规则设置都是针对两个邻居和自己,一共三个,所以也可以直接赋3
    sequence=[];                                 //当前行每3个元素为一组存储在这里
    
    for j=1:lenInitial
        sequence=[sequence;currentGeneration(j:j+len-1)];     //把三元组按3个一行,100列的方式存储其中
    end
    
    for j=1:lenInitial                                                              //每个元胞判断下一次的迭代
        if judge(sequence(j,:),binaryTable(onePosition,:))
            nextGeneration=[nextGeneration,1];
        else
            nextGeneration=[nextGeneration,0];        
        end
    end
    nextGeneration
    currentGeneration=nextGeneration;
    spaceTimeDiagrams=[spaceTimeDiagrams;nextGeneration];          //把下一次版本添加到矩阵的下一行
end
    figure;
    subplot(1,2,1),imshow(spaceTimeDiagrams)           //subplot(1,2,1)表示把当前窗口分成1行两列,画在第一列
    subplot(1,2,2),imshow(~spaceTimeDiagrams)         //黑白相反再画一次
end
function value=judge(now_three_element,A)                     //juge判断函数
mySize=size(A,1);
p=now_three_element;
validate_matrix=ones(mySize,1)*p-A;                                              //矩阵相减
value= logical(size(find(sum(abs(validate_matrix)')'==0),1));          //在上面介绍过
end

 

三.源码

function cellularAutomato
%以下是3个需要调整的内容,包括一行的长度,规则,规则对应的01234567或者76543210的顺序
lineLength=100;
rule=[0 0 0 1 1 1 1 0];  %据说是wolfram最喜欢的rule30,要对应上面 7-0的排列
binaryTable=[1 1 1;1 1 0;1 0 1;1 0 0;0 1 1;0 1 0;0 0 1;0 0 0]
%binaryTable=[0 0 0;0 0 1;0 1 0;0 1 1;1 0 0;1 0 1;1 1 0;1 1 1]onePosition=find(rule==1); initial=zeros(1,lineLength);
initial([floor(lineLength/2),floor(lineLength/2)+1])=1;lenInitial=length(initial);L=floor(lineLength/2);
currentGeneration=initial;
spaceTimeDiagrams=initial;for i=1:LcurrentGeneration=[currentGeneration(end),currentGeneration,currentGeneration(1)];currentGenerationnextGeneration=[];r=1;len=2*r+1;    %这里由于底下的规则设置都是针对两个邻居和自己,一共三个,所以也可以直接赋3sequence=[];  %对当前行每3个元素存储在这里for j=1:lenInitialjsequence=[sequence;currentGeneration(j:j+len-1)];endfor j=1:lenInitialif judge(sequence(j,:),binaryTable(onePosition,:))nextGeneration=[nextGeneration,1];elsenextGeneration=[nextGeneration,0];        endendnextGenerationcurrentGeneration=nextGeneration;spaceTimeDiagrams=[spaceTimeDiagrams;nextGeneration];
endfigure;subplot(1,2,1),imshow(spaceTimeDiagrams)subplot(1,2,2),imshow(~spaceTimeDiagrams)
end
function value=judge(now_three_element,A)   
mySize=size(A,1);
p=now_three_element;
validate_matrix=ones(mySize,1)*p-A;
value= logical(size(find(sum(abs(validate_matrix)')'==0),1));
end

 

四.小结

以下是wolfram最钟爱的rule30


http://chatgpt.dhexx.cn/article/uvP9Rd18.shtml

相关文章

Matlab和C/C++元胞数组cell相关操作总结

元胞数组cell 1 Matlab中元胞数组cell的操作1.1 数组与元胞数字相互转换:mat2cell、cell2mat1.1.1 mat2cell使用形式实例一:划分数组并以元胞数组形式返回子数组实例二:按行划分数组 1.1.2 cell2mat使用形式实例一:将元胞数组转换…

Windows访问Macbook共享文件夹

1.条件:macbook与windows在同一局域网内 2.设置MacBook共享文件夹 (1).左上角系统偏好设置 (2)点击文件共享 (3).选择共享文件目录 (4).选择该目录使用的用户 (5).设置共享权限权限 3.windows访问共享文件: (1).winr (2).输入:192.168.0.100是MacB…

win11本机和虚拟机共享文件夹

本来想在本机win11系统上装一个Oracle数据库,可是一直停在数据库安装向导进不去,果断选择在虚拟机中装一个win10试试是不是win11系统的问题,在装完系统之后发现,win10的本机和虚拟机共享1文件夹的方式和之前不一样,然后…

VirtualBox 共享文件夹 挂载点设置

step 1 主机设置 选中虚拟机->设置->共享文件夹,做如下设置: 建议选中“自动挂载”和“固定分配”。 step 2 虚机设置 step 1设置好后,打开虚机,进入文件浏览器,即可看到挂载的目录: 同时&#xff0…

Mac 共享文件夹

1. Go to System Preferences -> Sharing 2. 勾选左边栏 File Sharing, 选择要共享的文件夹,用户以及用户权限 3. 点击 Option,选择用户,点击Done 转载于:https://www.cnblogs.com/chou-er/p/6795062.html

windows10 访问 Mac 共享文件夹

起初想要用 mac 访问windows的共享文件夹,但是连不通。网上的资料良莠不齐,踩了很多坑,最后发现是windows机器没有本地共享安全策略,因为我的电脑是windows10 家庭版。 所以想办法共享 mac 中的文件给 windows 机器。 在这里记录…

服务器上文件夹没有共享,服务器没有共享文件夹

服务器没有共享文件夹 内容精选 换一换 本节操作介绍本地MacOS系统主机通过安装“Microsoft Remote Desktop for Mac”工具向Windows云服务器传输文件的操作步骤。本地主机已安装Microsoft Remote Desktop for Mac或其他Mac OS系统适用的远程连接工具。下载Microsoft Remote De…

Mac访问共享文件夹

这里以我要访问一台 Windows 电脑上的一个 AirPlay 文件夹为例,从下图中可以看到已经共享了此目录。 先在 Mac 系统中打开 Finder 应用,如图所示 打开 Finder 窗口以后,请按键盘上的 commandK 组合键,如图所示 随后我们在框框中输…

苹果系统 怎么找到共享计算机,Mac电脑怎么访问共享文件夹

如果你是一位Mac电脑用户,想要访问身边的Windows 系统共享,应该怎么操作呢?这里学习啦小编简单介绍下操作方法。 Mac电脑访问共享文件夹的方法 这里以我要访问一台 Windows 电脑上的一个 AirPlay 文件夹为例,从下图中可以看到已经共享了此目…

mac连接服务器共享文件夹,教大家Mac访问Windows共享文件夹的方法

今天小编来给大家针对这个教大家Mac访问Windows共享文件夹的方法的问题来进行一个介绍,毕竟当下也是有诸多的小伙伴对于教大家Mac访问Windows共享文件夹的方法这个问题非常的重视的,下面大家可以看下具体的详情 第一步:在先Windows中新建文件…

vm用c语言进入共享文件夹,如何在Vmware虚拟机中访问MAC共享文件夹

我们有时需要在MAC电脑上完成一些Windows系统中才能做的事,但是用户们又不想安装Windows系统,因此,安装Vmware虚拟机就成为了这类用户们的最佳选择。不过我们怎么才能在Vmware虚拟机中访问MAC共享文件夹呢? 具体操作步骤&#xff…

mac怎么访问服务器文件夹,Mac OS X共享文件夹的访问

设置好Mac系统的文件共享功能后,同一网段的计算机就可以通过局域网访问此Mac系统了。下面,分别介绍如何通过Mac系统与Windows系统访问Mac电脑中的共享文件夹。 一、Mac系统访问Mac共享文件夹 1. 通过“前往”>“网络”命令访问局域网中的Mac电脑 首先…

mac操作系统如何访问共享计算机,windows电脑怎么访问苹果电脑共享文件夹

在一个局域网之中,我们可以通过设置共享的方法,让其他电脑来访问本机共享文件夹,从而实现数据快速传输。那么windows电脑怎么访问苹果电脑的共享文件夹呢?下面就跟小编一起来学习下windows系统访问mac系统共享文件步骤。 一、所需…

Mac VMware Fusion设置共享文件夹

我们首先点击小扳手按钮,接着点击共享按钮。 根据自身情况配置一个共享文件夹 在mnt/目录下创建一个名为 hgfs的目录(记得创建目录,否则会报错)。

mac共享文件android,Mac如何访问安卓系统共享文件夹的方法

Mac系统与安卓系统的差异导致了很多网友都无法完成两个系统间互相访问共享文件夹的操作,对办公等造成了很多的困扰,那么到底Mac系统如何访问WIN系统的共享文件夹呢?今天学习啦小编就为大家带来了Mac如何访问安卓系统共享文件夹的解决方法,希…

ubuntu服务器创建共享文件夹,ubuntu共享文件夹

ubuntu共享文件夹 内容精选 换一换 NFS(NetworkFileSystem)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像…

mac文件共享连不上服务器,mac服务器文件夹共享权限设置

mac服务器文件夹共享权限设置 内容精选 换一换 该任务指导用户使用Loader将数据从SFTP服务器导入到Hive。创建或获取该任务中创建Loader作业的业务用户和密码。确保用户已授权访问作业中指定的Hive表的权限。获取SFTP服务器使用的用户和密码,且该用户具备SFTP服务器…

mac登录共享文件夹服务器,Mac如何访问Windows共享文件夹

苹果Mac OS X与Windows是两个不同的操作系统,那么Mac如何访问Windows共享文件夹呢?就让学习啦小编来告诉大家Mac访问Windows共享文件夹的方法吧,希望可以帮助到大家。 Mac访问Windows共享文件夹方法 第一步:在先Windows中新建文件夹e:\iOS&a…

Mac共享文件夹

转载自:http://jingyan.baidu.com/article/48206aeafd122a216bd6b34b.html Mac如何共享文件夹 | 浏览:5975 | 更新:2014-07-30 22:32 1 2 3 4 5 6 7 分步阅读 使用 Mac 电脑的小伙伴难免会与身边的朋友要通过网络共享一些数据资源&#xff0c…

windows共享文件夹给mac

一、Windows : windows建立个共享文件夹。文件夹右键——属性——共享——高级共享。权限给到最大(读写)。 【高级共享】这里打勾: 【共享】这里设置访问权限: 命令行打印:ipconfig 查看网路 IP 二、Mac …