瘟疫建模前期调研之一——初等细胞自动机

目录

  • 原理简介
  • 作品展示
  • 代码演示

一、原理简介

作用概括:初等细胞自动机在瘟疫模拟中的作用:构建随时间推移发生状态转移的系统,弄清楚它的原理,可以有助于实现疫情的每一段时间内的传播的演示效果。(通过初等细胞自动机中的“代”来确定下一时间的状态)

(1)网格: 初等细胞自动机中的网格是一维的,每个网格表示的是每一个细胞。
在这里插入图片描述
(2)状态集: 状态集用于表示每个细胞的状态(细胞是生是死?健康or不健康?)最简单的状态集是0或1
在这里插入图片描述
(3)邻居: 邻居指的是和指定细胞相邻的细胞,一维空间中,当前细胞的邻居就是它的左右两边的两个细胞(注意边缘的细胞的邻居细胞仅有一个).邻居可以用来表示其他的细胞的状态和当前细胞之间的状态的一种关系,我们考虑的不再是一个个体,而是相互关联的一种群体。
在这里插入图片描述
实现流程图:

在这里插入图片描述

二、作品展示

1.图片展示(二维、三维)

在这里插入图片描述

在这里插入图片描述

2.视频展示

细胞自动机编程——交互媒体课小作业

3.GIF动态图片展示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、代码演示

1.平台介绍

采用的是JavaScrpit编写的代码,与Three.js结合使用在空间中绘制三维图形

2.创建初等细胞自动机类
  • 程序构建的思路

在这里插入图片描述

  • 程序各模块分析

(1)计算下一代的函数: 在二维的初等细胞自动机中,每一代是用一行细胞表示的,下一行的细胞表示的是,在上一代中经过一些变化规则,而衍生出来的下一代。所以在这个函数中我们还将使用规则函数。规则,可以根据之前讲到过的邻居细胞之间的关系进行创建。
(2)重置函数: 重置函数是当细胞衍生出很多代,到达了边界时,重新创建新的第一组新生细胞。那么,为什么细胞会到达边界呢?这个边界其实是人为设定的边界。是由于细胞的代数可以是无穷的,但是我们并不想一直这样看着它演变下去,所以我们就人为地给它设定,到了多少代地时候就不能继续再衍生变化下去了。

  • 程序代码展示
var log = console.log.bind(console);
var width=20;
var w=1;
var height=20;
var ruleset=[0,1,0,1,1,0,1,0];
var cell;
var container;
var camera, scene, renderer;
var group;
var winWth = window.innerWidth, winHgt = window.innerHeight;
var cubeLine;
var dy=1;
var bigbox=20;
//***********************************细胞自动机原型+构造函数***********************************
function CA(r){
    this.ruleset=r;//规则集合
    this.cellsarr=new Array(width/w);//创建细胞数组
    this.cellLength=this.cellsarr.length;
    this.generation=0;
    this.colorbox=0xff0000;
    this.restart();
}
//重置函数
CA.prototype.restart = function(){
    for(var i=0;i<this.cellLength;i++){
        this.cellsarr[i]=0;
    }
    this.colorbox='#'+ Math.random().toString(16).substr(-6);
    this.cellsarr[this.cellLength/2]=1;
};
//计算下一代的函数
CA.prototype.generate = function() {
    var nextgener=new Array(this.cellLength);//记录新的一代
    for(var i=1;i<this.cellLength-1;i++){
        var left=this.cellsarr[i-1];
        var center=this.cellsarr[i];
        var right=this.cellsarr[i+1];
        nextgener[i]=this.rules(left,right,center);
    }
    this.cellsarr=nextgener;//改变细胞状态
    this.generation++;//增加代数
};
//计算下一代同位置上的状态的规则函数
CA.prototype.rules = function(left,center,right){
    if (left ===1 && center === 1 && right === 1) return this.ruleset[0];
    if (left ===1 && center === 1 && right === 0) return this.ruleset[1];
    if (left ===1 && center === 0 && right === 1) return this.ruleset[2];
    if (left ===1 && center === 0 && right === 0) return this.ruleset[3];
    if (left ===0 && center === 1 && right === 1) return this.ruleset[4];
    if (left ===0 && center === 1 && right === 0) return this.ruleset[5];
    if (left ===0 && center === 0 && right === 1) return this.ruleset[6];
    if (left ===0 && center === 0 && right === 0) return this.ruleset[7];
    return 0;//如果是边缘的话
};
//确定是否结束:达到了边缘
CA.prototype.finishside = function(){
    if(this.generation>height/w-1){
        return true;
    }else{
        return false;
    }
};
//重置规则数组
CA.prototype.randomRule = function(){
    for(var i=1;i<this.ruleset.length;i++){
        ruleset[i]=Math.round(Math.random());//生成0或1的整数
        console.log(ruleset[i]);
    }
};







  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值