元胞自动机-森林火灾模拟

2023-05-16

引入:

    元胞自动机,英文名及缩写:cellular automata,CA。最初是由冯诺依曼在二十世纪五十年代为模拟生物自保的自我复制而提出的,但是当时并未受到重视。后来才逐渐发展起来,著名的“生命游戏”就是其一个应用案例。但今天想和大家分享的案例并不是生命游戏,而是来自近期课程实验中的内容:根据元胞自动机原理编程实现“森林火灾模拟”。


正文:

首先还是从元胞自动机的基本理论说起吧,先谈一下什么是元胞自动机。

元胞自动机的定义

    ①物理学定义: 元胞自动机是定义在一个由离散、有限状态的元胞 组成的元胞空间上,按照一定的局部规则,在离散时 间维度上演化的动力学系统。
    ①数学定义:设d表示空间维数,k表示元胞的状态,并在一个有限集合S中取值,r表示元胞的邻居半径。Z是整数集,表示一维空间,t表示时间。元胞自动机的动态演化就是在时间上状态组合的变化,可记为:

F:S(t)Z->S(t+1)Z

可以看到,上述定义中提到了以下几个关键词:*元胞、元胞空间、邻域、规则*。下面结合一张图片来堆对其进行简单解释。

元胞自动机-二维元胞空间
(1)元胞:是元胞自动机的基本单元,每一个元胞都有记忆存储的功能,并且元胞自动机系统中的所有元宝都按照动力规则不断更新。简单来说,元胞就类似上述棋盘图片中的棋子,而每个元胞的记忆则用于描述与棋子自身的位置与颜色。
(2)元胞空间:是指元宝分布的空间网格的集合,分为一维、二维、三维元胞空间,比如上述图片中的棋盘空间就是一个二维元胞空间。当然,此次模拟的森林火灾对应的也是一个二维元胞空间。
元胞和元胞空间用于表示系统的静态成分,就是说:仅仅只有这两者,是无法支撑元胞自动机的正常运行的,为此,我们需要引入系统的动态组分,即下面要介绍的演化规则。
(3)邻域:元胞自动机的演化规则是定义在局部范围内的,即:一个元胞在(t+1)时刻的状态决定于该元胞在 t 时刻本身的状态和它的邻居元胞的状态。
二维空间中的邻域常见的有:VonNeumann邻居、Moore邻居、扩展Moore邻居等。
此次要用到的就是VonNeumann邻域。
二维元胞空间邻居
(4)规则:元胞自动机根据规则进行局部元胞间的相互作用,而引起全局变化,规则支配着元胞自动机的整个动力学行为。即:根据元胞当前状态及其邻居状态确定下一时刻该元胞状态。



森林火灾模拟问题规则定义与分析

    好了,有了上面的基本概念,我们先来做一下分析。上面我们提到,此次森林火灾模拟是针对二维元胞空间,为元胞的动态演变定义局部演变规则,最终实现元胞的自动演变。

森林火灾模拟问题简析:
可将森林视为元胞自动机模型中的二维元胞空间,而森林中的树木视为元胞空间中(x,y)坐标处的一个元胞,具备一定的状态;下面来看一下该系统中元胞的运动规则:

※设计森林火灾的模拟的规则—— 森林灾模拟时元胞有3个不同的状态(分别为状态0:空位;状态2:燃烧着的树木;状态1:树木),采用的邻域为VonNeumann邻居。 演化规则如下:
(1)若某树木元胞的4个邻居中有燃烧着的,那么该元胞下一时刻的状态是燃烧;
(2)一个燃烧着的元胞,在下一时刻变成空位;
(3)所有树木元胞(状态为1)以一个低概率开始燃烧(模拟闪电造成森林火灾);
(4)所有空位元胞以一个低概率变为树木(模拟新树木的生长)。

森林火灾模拟邻域及规则阐述
①邻域:规定使用VonNeumann邻居,那么一个位置在(x,y)处的元胞的邻域范围Δ中其他元胞坐标为:
【1】(x-1,y);【2】(x,y-1);【3】(x,y+1);【4】(x+1,y)
②规则:对应一个元宝的邻域范围Δ,若:
【1】第一条规则:搜寻邻域空间Δ的四个元胞状态,若有1个为燃烧状态'2',则:(x,y)位置的元宝状态在下一刻状态也变为:燃烧'2';
【2】第二条规则:若(x,y)中心元胞位置处状态为:燃烧状态,则下一刻变为:空地’0‘;<>br 【3】第三条规则:给定一个低概率使状态为1的未燃烧树木元胞下一刻开始燃烧,状态2;
【4】第四条规则:若(x,y)中心元胞位置处状态为:空地,则下一刻在一定的给定概率条件下变为:树木’1‘;

森林火灾模拟问题求解步骤及其图形库:


求解步骤
基于上述分析,将该问题的求解步骤描述为:
①初始化格网矩阵,作为元胞空间来存放元胞群体;
②初始化占据网格总数一定比例的元宝群体,用于表述状态为1的正常树木;
③绘制元胞群体到图形界面上,用绿色标识状态为1的正常树木;用黑色表示状态为0的空地;用红色标识状态为2的燃烧中的树木;
④根据规则获取元胞的下一时刻状态;
⑤计算新生树木中发生火灾的个体数目。预先给出新生状态为1的树木发生火灾的概率,在此前提条件下计算并获取随机发生火灾后的元胞状态;
⑥重新绘制元胞群体到屏幕上。
⑦循环执行④-⑥,中间可以使其休眠1.5s,以便于观察结果的变化过程。
每个过程都被定义成一个函数,见后面代码部分有详细注释。
图形库介绍

编程过程中用到了EasyX图形库。
EasyX 是针对 C++ 的一个轻量级图形库,可以帮助 C 语言初学者快速上手图形和游戏编程。提供了绘图函数、鼠标与键盘事件响应函数、以及资源文件读取函数等。同时针对绘图部分也提供了批量绘图函数,解决了窗体刷新过程中出现的窗口闪烁的问题,这在下面的代码部分都有体现。


森林火灾模拟问题-代码[C语言]:

先贴个运行结果截图

在这里插入图片描述

#include<stdio.h>
#include<stdlib.h>
#include<graphics.h>
#include <time.h>
#include <math.h>

//定义树木状态->四邻域
#define no_tree 0	//空位
#define burning 2	//燃烧
#define nor_tree 1	//树木

//定义窗体尺寸
#define WIDTH 600	//宽度
#define HEIGHT 600	//高度
#define treeSize 4	//树木尺寸
#define treeNum	150	//树木数量
#define Row		150	//行数
#define Col		150	//列数
#define burning_rate	 0.0001//初始燃烧概率:0.01%
#define proTree_rate     0.02//空地长出新树木的概率:10%
#define unsafe_rate		 0.00005//在生长出新树木期间再次失火的概率:0.005%
#define N 10000

//定义位置结构体
struct POS
{
	int x;
	int y;
};

void InitBoard();//初始化布局网格
void InitTree(int treeState_Matrix[treeNum][treeNum]);//初始化树木种群
void drawTree(int treeState_Matrix[treeNum][treeNum]);//绘制树木种群
void InitRandTreePos();//生成单个火源初始位置
void getNextTreeState(int treeState_Matrix[treeNum][treeNum]);//获取森林树木的下一时刻状态
int GetArea_Tree(int i, int j); //检测VonNeumann邻域内是否存在燃烧树木
int isRight(float state);//产生一个随机数,用于判断树木下一时刻是否会燃烧/长出新树木
void burn_again();//在长出新树木时再次失火

/*
演化规则如下:
	(1)若某树木元胞的4个邻居中有燃烧着的,那么该元胞下一时刻的状态是燃烧;
	(2)一个燃烧着的元胞,在下一时刻变成空位;
	(3)所有树木元胞(状态为2)以一个低概率开始燃烧(模拟闪电造成森林火灾);
	(4)所有空位元胞以一个低概率变为树木(模拟新树木的生长)。
*/

int treeState_Matrix[treeNum][treeNum];//树木状态矩阵

//主函数:程序入口
int main(int args,char* argv)
{
	initgraph(WIDTH, HEIGHT,SHOWCONSOLE);//初始化窗体:500*500
	HWND hwnd = GetHWnd();//获取窗体句柄
	SetWindowText(hwnd,_T("林森火灾模拟"));//设置窗体标题
	SetWindowPos(hwnd, NULL, 600, 200, HEIGHT, WIDTH, 0);//设置窗体位置
	//1、初始化网格布局
	InitBoard();
	srand((int)time(NULL));//随机数种子
	//2、初始化数目状态矩阵
	InitTree(treeState_Matrix);
	//3、绘制树木
	drawTree(treeState_Matrix);
	//4、初始化燃烧树木的位置
	InitRandTreePos();
	//5、绘制森林-树木
	drawTree(treeState_Matrix);
	
	//开启批量绘图模式
	BeginBatchDraw();
	while (true)//进入循环迭代
	{
		//6、获取下一时刻的树木状态矩阵
		getNextTreeState(treeState_Matrix);
		//7、仍然有可能产生新的火源
		burn_again();
		//8、重新绘制森林-树木
		drawTree(treeState_Matrix);
		//显示绘图结果
		FlushBatchDraw(); // 显示绘制 
		//停顿0.5s
		Sleep(500);
	}
	EndBatchDraw();//结束批量绘图模式
	closegraph();//关闭设备窗口
	return 0;
}

/*1、初始化布局网格*/
void InitBoard()
{
	setlinecolor(RGB(0, 0, 0));//黑色线条
	for (int i = 0; i < treeNum; i++)
	{
		line(0, i*treeSize, WIDTH, i*treeSize);
		line(i*treeSize, 0, i*treeSize, HEIGHT);
	}
}


/*2、初始化树木种群*/
void InitTree(int treeState_Matrix[treeNum][treeNum])
{
	int i, j,count=0;
	float randVal;
	for ( i = 0; i < Row;i++)
	{
		for (j = 0; j < Col;j++)
		{
			//随机概率大于0.4,生成树木:状态2
			randVal = rand() % (N + 1) / (float)(N + 1);
			if (randVal>=0.40)
			{
				 treeState_Matrix[i][j] = 1;//[i,j]表示ROW*COL规格的网格处对应的一个树木:产生树木
				 count++;
 			}
 			else
  			{	
 				treeState_Matrix[i][j] = 0;//否则为空位
 			}//end if
		}//end for内循环
	}//end for外循环
	printf("初始化正常树木状态矩阵完毕-%d\n",count);
}

/*3、绘制树木种群*/
void drawTree(int treeState_Matrix[treeNum][treeNum])
{
	int i, j;
	for (i = 0; i < Row; i++)
	{
		for (j = 0; j < Col; j++)
		{
			if (treeState_Matrix[i][j]==1)//正常树木:状态1
			{
				setfillcolor(RGB(0, 255, 0));//设置填充颜色:绿色
				fillrectangle(i*treeSize, j*treeSize,
					i*treeSize + treeSize, j*treeSize + treeSize);
			}else if (treeState_Matrix[i][j]==2)//燃烧的树木:状态2
			{
				setfillcolor(RGB(255,0,0));//设置填充颜色:红色
				fillrectangle(i*treeSize, j*treeSize,
					i*treeSize + treeSize, j*treeSize + treeSize);
			}
			else if (treeState_Matrix[i][j]==0)//空地:状态0
			{
				setfillcolor(RGB(0,0,0));//设置填充颜色:黑色
				fillrectangle(i*treeSize, j*treeSize,
					i*treeSize + treeSize, j*treeSize + treeSize);
			}
		}
	}
}

/*4、生成初始燃烧位置,概率:buring_rate*/
void InitRandTreePos()
{
	int i, j, count = 0;
	float randVal;
	for (i = 0; i < Row; i++)
	{
		for (j = 0; j < Col; j++)
		{
			if (treeState_Matrix[i][j]==1)
			{
				//随机概率大于0.4,生成树木:状态2
				randVal = rand() % (N + 1) / (float)(N + 1);
				if (randVal < burning_rate)
				{
					treeState_Matrix[i][j] = 2;//[i,j]表示ROW*COL规格的网格处对应的一个树木:产生树木
					count++;
				}//end if
			}
		}//end for内循环
	}//end for外循环
	printf("初始化燃烧树木状态矩阵完毕-%d\n",count);
}

/*5、获取森林树木的下一时刻状态*/
void getNextTreeState(int treeState_Matrix[treeNum][treeNum])
{
	int i, j,state=0;
	for (i = 1; i < Row-1; i++)
	{
		for (j = 1; j < Col-1; j++)
		{
			state = treeState_Matrix[i][j];//记录当前树木状态
			if (state==1)//如果为正常树木:1
			{
				if (GetArea_Tree(i, j))//判断下一刻是否会被引燃,如果返回1[表示VonNeumann邻域内存在燃烧树木]
				{
					treeState_Matrix[i][j] = 2;
				}
			}//end if-1
			else if (state==2)//如果为燃烧树木:2
			{
				treeState_Matrix[i][j] = 0;//下一刻变为空地
			}//end if-2
			else if (state==0)//如果为空地
			{
				if (isRight(proTree_rate))//判断是否有新树木的产生
				{
					treeState_Matrix[i][j] = 1;
				}
			}//end if-3
		}//end if-内
	}//end for-外
	printf("下一时刻状态获取完毕\n");
}

/*6、在长出新树木时有一定概率再次失火*/
void burn_again()
{
	int i,j,state = 0;
	float randVal = rand() % (N + 1) / (float)(N + 1);
	if (randVal <= unsafe_rate)//在失火概率范围内
	{
		for (i = 1; i < Row - 1; i++)
		{
			for (j = 1; j < Col - 1; j++)
			{
				state = treeState_Matrix[i][j];//记录当前树木状态
				if (state==1)//正常树木
				{
					if (isRight(burning_rate))
					{
						treeState_Matrix[i][j] = 2;
					}
				}
			}
		}
	}
}

//检测VonNeumann邻域内是否存在燃烧树木
int GetArea_Tree(int i, int j)
{
	int sum = 0;
	if ((treeState_Matrix[i - 1][j] == 2) ||
		(treeState_Matrix[i][j - 1] == 2) ||
		(treeState_Matrix[i][j + 1] == 2) ||
		(treeState_Matrix[i + 1][j] == 2)
		)
	{
		return 1;
	}
	return 0;
}

//产生一个随机数,用于判断树木下一时刻是否会燃烧
int isRight(float state)
{
	float randVal = rand() % (N + 1) / (float)(N + 1);
	if (randVal <= proTree_rate)//在生长树木概率范围之内
	{
		return 1;
	}
	return 0;//不//在燃烧概率范围之内
}

结尾:

    关于元胞自动机,再小补充一点copy过来的感受。元胞自动机不同于一般的动力学模型,因为元胞自动机不是由严格定义的物理方程或函数确定的,而是用一系列模型构造的规则构成。凡是满足这些规则的模型都可以算作是元胞自动机模型。
    因此,元胞自动机是更像一类模型的总称,或者说是一个方法框架。其特点是时间、空间、状态都离散,每个变量只取有限多个状态,且其状态改变的规则在时间和空间上都是局部的。而这些变量在局部时空上的改变,也正是由系统运行的核心规则所驱动的,在不同的时刻,展现出特定的表现型。穿插在这个森林火灾模拟案例中的这种编程思想,类似于时态GIS数据模型中的[基态修正模型](https://malagis.com/spatial-databases-103-temporal-gis-data-model.html)[感兴趣的朋友可以点击超链接看一下]。
    因为刚接触元胞自动机的基础知识,对其了解并不多,也只能套用之前学过的概念来对其进行理解,如果有出错的地方,请大家多多指教。另外,有关生命游戏和初等元胞自动机的内容有机会的话下次再和大家分享,谢谢!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

元胞自动机-森林火灾模拟 的相关文章

  • 【项目SpringBoot配置详解】

    x1f431 福利 想不想自定义spring Boot启动Logo 哪里改springboot的启动标志 xff1f spring boot启动总会显示这样的图标 xff0c 但是我想不一样 方法 xff1a 首先我们在resource目录
  • Android 中的 Lottie 动画入门

    增强应用程序的用户体验是任何开发人员的首要任务之一 与图像和文本描述相比 xff0c 为某些描述提供动画总是可以增强应用程序的用户体验 xff01 Lottie是用于移动应用程序的库之一 xff0c 有助于以更简单的方式提供动画 如何开始在
  • Java实现文件上传到本地(自定义保存路径)

    首先基于 springboot 实现的 xff0c 其他场景下可以引入相应的 jar 包后进行整合 首先写入一个方法 xff0c 方法的参数为传入的文件 xff0c 方法的返回值自定义 xff0c 这里返回类型为 String 返回文件的存
  • 关于Qt中使用QFile打开文件时遇到问题的分析

    项目场景 xff1a 在文件打开的时候 xff0c 使用QFile的QIODevice的不同模式 xff0c 会出现不同的表现 xff08 这是我一个同事当时遇到的问题 xff0c 现在拿来分析分析 xff0c 以下的所有事例代码均用于示范
  • vue+vue_cli3 + typeScript + echarts热力图

    vue 43 vue cli3 43 typeScript 43 echarts热力图 准备工作 准备工作 1 申请百度地图秘钥http lbsyun baidu com apiconsole key create 注 xff1a 如果是运
  • forEach循环 当满足条件时跳出当前循环

    forEach循环 当满足条件时跳出该循环 使用try catch try this menuData forEach item any 61 gt if toPath as string indexOf item url 61 61 61
  • vue3.0 学习笔记

    vue3学习笔记 vue3 0六大亮点vue3 0 如何变快的 xff1f vue3 0六大亮点 performance xff1a 性能比vue2 0快1 2 2倍tree shaking support xff1a 按需编译 xff0c
  • 从后台读取以文件流的形式加载图片

    span class token comment html span span class token operator lt span img span class token operator span src span class t
  • element-ui el-transfer添加拖拽排序功能

    html 部分 lt el card class 61 34 box card 34 gt lt el transfer render content 61 34 renderFunc 34 v model 61 34 value 34 d
  • Mac系统装android开发环境无法创建SD卡解决方案

    无法创建SD卡是小事 xff0c 但是引起的问题却是大事 xff0c 模拟器无SD卡则android项目无法正常生成R文件 xff0c 导致HelloWorld都无法跑起来 xff0c 头大 xff0c 折腾了几天 xff0c 终于找到原因
  • audio报错DOMException: play() failed because the user didn‘t interact with the document first

    chrome66版本之后禁掉了声音的自动播放 xff0c 这句报错提示 xff0c 调用play方法之前 xff0c 请先与页面进行交互 我们自己来封装一个可以自动播放的Audio xff0c 功能包含 xff1a 自动播放 暂停 循环播放
  • iview中Table的render用法大全

    1 日期格式化 xff08 yyyy MM dd hh mm s xff09 title 34 格式化时间 34 key 34 time 34 render h params 61 gt let temp 61 39 39 if param
  • Vue添加中间层--service层

    Vue添加中间层 service层 在单页面应用中 xff0c 为了方便代码的管理 xff0c 提高可读性 xff0c 还有一个原因就是 xff0c 在项目开发工程中 xff0c 前端人员与后端开发人员的进程是不同步的 xff0c 在不同步
  • Vue is not defined

    Vue is not defined 场景再现 xff1a 在Vue的自定义组件中 xff0c 想要调用在 static serverconfig json中配置的全局地址ApiUrl 在自定义组件中 console log Vue pro
  • Vue中进行pdf的预览下载 vue-pdf

    1 使用npm 下载vue pdf npm install span class token operator span save vue span class token operator span pdf 2 封装pdf组件 span
  • C# 的基本代码规范

    个人遵守的通用 C 代码规范 xff0c 其中参考了微软的代码规范 实际上在是使用一些框架开发时 例如 ASP NET Core 也应该遵循一定的模式规范 xff0c 但是本文只讨论一些比较通用的代码规范 文章将从下面的几个方面来谈论规范
  • ubuntu 文件夹消失怎么办

    点击文件夹 xff0c 然后摁F9
  • ffmpeg花屏解决(修改源码,丢弃不完整帧和解码错误帧)

    linux下模拟丢帧的命令 因为帧之间的参考关系 实测如果是1 几乎没有完好的帧 tc只能对发出的包做处理 但它还可以做延时抖动处理 sudo tc qdisc add dev enp0s31f6 root netem loss span
  • 使用SDF对ROS-Gazebo中模型进行编辑修改

    什么是SDF文件 SDF是一种XML格式 xff0c 能够描述机器人 静态和动态物体 照明 地形甚至物理学的各方面的信息 SDF可以精确描述机器人的各类性质 xff0c 除了传统的运动学特性之外 xff0c 还可以为机器人定义传感器 表面属
  • Ubuntu16.04桌面图标消失

    项目场景 xff1a 提示 xff1a 这里简述项目相关背景 xff1a 例如 xff1a Ubuntu16 04用了挺久 问题描述 xff1a 提示 xff1a 这里描述项目中遇到的问题 xff1a Ubuntu16 04重启后 xff0

随机推荐

  • uni-app 半屏地图拖拽滚动底部半屏,仿高德搜索拖拽

    lt template gt lt view class 61 34 event help details 34 gt lt view class 61 34 back last page 34 style 61 34 39 top 39
  • 1、 Seata快速开始

    一 seata服务搭建 第一步 xff1a 下载seata安装包 我们通过https github com alibaba spring cloud alibaba wiki E7 89 88 E6 9C AC E8 AF B4 E6 98
  • CSDN-markdown编辑器(含源码.md文件)

    说明 CSDN新版Markdown编辑器 20190412 这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题 xff0c 有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适
  • PS如何调整图片的大小

    快捷键Ctrl 43 Alt 43 i 一般会把纵横比勾选上
  • JAVA输入一个四位数的整数,要求编程将这个四位数中的个位,十位,百位,千位分别输出

    4 输入一个四位数的整数 xff0c 要求编程将这个四位数中的个位 xff0c 十位 xff0c 百位 xff0c 千位分别输出 1234 1 2 3 4 System out println 34 请输入四位数整数 xff1b 34 Sc
  • JAVA托运行李计算费用

    7 托运行李计算费用 xff1a 实验要求 xff1a xff08 1 xff09 货车在计算托运行李费用时以kg为单位计算费用 xff08 12元 kg xff09 xff0c 忽略重量中的小数部分 xff0c 即忽略不足1kg的部分 x
  • JAVA复制数组的三种方法

    public class test01 ArraysCopy public static void main String args 1 用for循环复制数组 int arr 61 1 2 3 4 5 6 7 8 9 int arr1 61
  • 如何把已安装的nodejs高版本降级为低版本

    windows如何把已安装的nodejs高版本降级为低版本 第一步 xff1a 先清空本地安装的node js版本 1 按健win 43 R弹出窗口 xff0c 键盘输入cmd 然后敲回车 xff08 或者鼠标直接点击电脑桌面最左下角的wi
  • SQL版本:多表连接查询(两张表为例)

    SQL版本 xff1a 数据准备 xff1a 创建一个数据库company CREATE DATABASE IF NOT EXISTS company 创建部门表 CREATE TABLE dept id INT PRIMARY KEY A
  • 【Redis 常用五大数据类型】

    常用五大数据类型 官方获取redis常见数据类型操作命令 xff1a http www redis cn commands html 1 Redis键 key keys 查看当前库所有key 匹配 xff1a keys 1 exists k
  • 【Mysql 基础知识】

    一 引言 1 1 现有的数据存储方式有哪些 xff1f Java程序存储数据 xff08 变量 对象 数组 集合 xff09 xff0c 数据保存在内存中 xff0c 属于瞬时状态存储 文件 xff08 File xff09 存储数据 xf
  • vue3 + vite + ts + setup , 第九练 自定义指令directive的使用,简单封装一个拖动指令

    除了 Vue 内置的一系列指令 比如 v model 或 v show 之外 xff0c Vue 还允许你注册自定义的指令 xff0c 一个自定义指令被定义为一个包含类似于组件的生命周期钩子的对象 钩子接收指令绑定到的元素 1 Vue3指令
  • MyBatis框架知识点总结

    一 引言 1 1 什么是框架 xff1f 框架 xff1a 框架使用你的 xff0c 而不是你在使用框架的 框架让我们提供什么信息 xff0c 配置信息 xff0c 数据库连接用户名密码等 xff0c 你必须提供 xff0c 还得按照框架要
  • AndroidStudio Unresolved reference

    在学习Kotlin过程中 xff0c 出现了两次在activity main xml中已注册id xff0c 但是在MainActivity kt中无法找到该Button的情况 后面发现是没有在build gradle中导入 39 koti
  • Spring学习(全)

    本文目录 1 Spring概述2 IOC 控制反转2 1 简单介绍2 2 Spring的第一个程序2 3 DI入门2 3 1 XML之set注入简单类型的set注入引用类型的set注入引用类型的自动注入autowire 2 3 2 XML之
  • Python3读写dbf文本

    Python3读写dbf文本 安装环境 pip install dbf 关于dbf的文档可以在一下网址了解dbf文档 https pythonhosted org dbf 还有github的地址 https github com ethan
  • minicom的usb串口的驱动以及识别

    fire 64 fire test lsmod grep usb usbserial 49152 1 pl2303 fire 64 fire test dmesg 383 172363 usb 2 1 4 new full speed US
  • ubuntu搭建http文件服务器

    搭建的过程 sudo apt install apache2 sudo apt install apache2 sudo apt install php sudo apt get install libapache2 mod php sud
  • ubuntu搭建http文件服务器

    搭建的过程 sudo apt install apache2 sudo apt install apache2 sudo apt install php sudo apt get install libapache2 mod php sud
  • 元胞自动机-森林火灾模拟

    引入 xff1a 元胞自动机 xff0c 英文名及缩写 xff1a cellular automata xff0c CA 最初是由冯诺依曼在二十世纪五十年代为模拟生物自保的自我复制而提出的 xff0c 但是当时并未受到重视 后来才逐渐发展起