前言

探索元胞自动机用于城市规划,是由于前不久在CSDN上看到相关案例后大开眼界,兴趣使然,想对家乡做一个城市发展预测,遂在巨人的肩膀上做一些探索与更正。文章末尾有这些案例的链接,感谢并致敬这些先行者。

背景

概念

元胞自动机(cellular automata,CA) 是一种时间、空间、状态都离散,空间相互作用和时间因果关系为局部的网格动力学模型,具有模拟复杂系统时空演化过程的能力。

不同于一般的动力学模型,元胞自动机不是由严格定义的物理方程或函数确定,而是用一系列模型构造的规则构成。凡是满足这些规则的模型都可以算作是元胞自动机模型。因此,元胞自动机是一类模型的总称,或者说是一个方法框架。其特点是时间、空间、状态都离散,每个变量只取有限多个状态,且其状态改变的规则在时间和空间上都是局部的。

城市模型

1950s~1960s

静态、均衡、宏观

1980s+

动态、微观

环境

Windows7 x64

MATLAB R2016a

特点

i)简单、直观

ii)离散

iii)灵活、开发

iv)易与GIS、遥感数据处理系统结合

用法

输入

图像

f(x)

CA for city planning

输出

城市规模仿真模拟结果

参数

针对程序中的可修改参数给出释义。

1)扩散因子

代码:

diffuseFactor=0.2; % 扩散因子

影响城市化过程中,元胞的扩散速率

输入

扩散因子数值

输出

定义扩散因子

Tip

输入应为正数,接受>1的数值

2)繁殖因子

代码:

proliferateFactor=0.2; % 繁殖因子

影响城市化过程中,元胞的繁殖速率

输入

繁殖因子数值

输出

定义繁殖因子

Tip

输入应为正数,接受>1的数值

3)传播因子

代码:

propagateFactor=0.2; % 传播因子

影响城市化过程中,元胞的传播速率

输入

传播因子数值

输出

定义传播因子

Tip

输入应为正数,接受>1的数值

4)城市化因子

代码:

Urbanization=0.0004; % 城市化因子

影响城市化速率

输入

城市化因子数值

输出

定义城市化因子

Tip

输入应为正数,接受>1的数值,但数值过大会导致求解失真,下图为城市化因子为2,迭代次数为3的结果,是不正确的结果。

城市化因子为2

代码

使用的图片

i)莆田市地图

莆田市地图

ii)经过二值化处理的莆田市地图

莆田市地图二值化结果

1)CityCA.m

clear;close all

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%% Author: Myoontyee.Chen

%% Data:20181227

%% License:BSD 3.0

%% CA - City Planning

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%% 图像预处理

I=imread('city.png');

level=graythresh(I); % 图像灰度处理

bw=im2bw(I,level); % 图像二值化处理

I=bw;

cells=double(I);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%% button定义

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

'string','Run',...

'fontsize',12,...

'position',[100,400,50,20],...

'callback','runModel=1;');

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

'string','Stop',...

'fontsize',12,...

'position',[300,400,50,20],...

'callback','stopModel=1;');

Iterations=uicontrol('style','text',...

'string','1',...

'fontsize',12,...

'position',[20,400,50,20]);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%% Initialization参数初始化

cells(33,44)=2;

cells(88,31)=2;

cells(33,80)=2;

%% 可修改参数

diffuseFactor=0.2; % 扩散因子

proliferateFactor=0.2; % 繁殖因子

propagateFactor=0.2; % 传播因子

Urbanization=0.0004; % 城市化因子

%% 建议默认参数

sch=[];skz=[];t=1;

[x,y]=size(cells);

runModel=0;

stopModel=0;

stop=0;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%% 法则定义

while (stop==0)

%% 按下Run

if(runModel==1)

for i=2:x-1

for j=2:y-1

if(cells(i,j)~=1)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%% 自然增长

if(cells(i,j)==0)

if(rand

cells(i,j)=2;

end

if(aroundCenter(i,j,cells))

if(rand

cells(i,j)=2;

end

end

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%% 边界增长

if(cells(i,j)==2 && rand

if(existCase(i,j,cells))

m=1+3*rand;

switch m

case 1

ii=i-1;jj=j;

case 2

ii=i;jj=j-1;

case 3

ii=i;jj=j+1;

otherwise 4

ii=i+1;jj=j;

end

if(canCity(ii,jj,cells))

cells(ii,jj)=2;

end

end

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%% 新扩展中心型

if(cells(i,j)==2 && existCase(i,j,cells))

if(rand

if(canCity(i,j,cells))

cells(i,j)=3;

end

end

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

end

end

end

ch=0;kzch=0;

for i=1:x

for j=1:y

if(cells(i,j)==2) ch=ch+1;end

if(cells(i,j)==3) kzch=kzch+1;end

end

end

sch(t)=ch;skz(t)=kzch;

t=t+1;

[A,B]=size(cells);

Area(1:A,1:B,1)=zeros(A,B);

Area(1:A,1:B,2)=zeros(A,B);

Area(1:A,1:B,3)=zeros(A,B);

for i=1:A

for j=1:B

if cells(i,j)==1

Area(i,j,:)=[1,1,1]; % 黑色

elseif cells(i,j)==0

Area(i,j,:)= [255, 255, 255]; % 白色

elseif cells(i,j)==3

Area(i,j,:)= [255,0,0]; % 红色

elseif cells(i,j)==2

Area(i,j,:)= [255,177,0]; % 橙色

end

end

end

pause(0.0005);

Area=uint8(Area);

imagesc(Area);

axis equal;

axis tight;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%% 迭代次数记录

IterationNum=1+str2num(get(Iterations,'string'));

set(Iterations,'string',num2str(IterationNum));

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%% 按下Stop

if stopModel==1

runModel=0;

stopModel=0;

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%% 暂停并刷新图像

drawnow

end

2)existCase.m

function result= existCase(i,j,cells)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%% Author: Myoontyee.Chen

%% Data:20181227

%% License:BSD 3.0

%% existCase - Correspondence rule

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

a=0;

if(cells(i-1,j)==2) a=a+1; end

if(cells(i,j-1)==2) a=a+1;end

if(cells(i,j+1)==2) a=a+1;end

if(cells(i+1,j)==2) a=a+1;end

if(a>=2)

result=1;

else

result=0;

end

end

3)canCity.m

function result=canCity(i,j,cells)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%% Author: Myoontyee.Chen

%% Data:20181227

%% License:BSD 3.0

%% canCity - Correspondence rule

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

s=0

if(cells(i-1,j-1)==1) s=s+1;end

if(cells(i-1,j)==1) s=s+1;end

if(cells(i-1,j+1)==1) s=s+1;end

if(cells(i,j-1)==1) s=s+1;end

if(cells(i,j+1)==1) s=s+1;end

if(cells(i+1,j-1)==1) s=s+1;end

if(cells(i+1,j)==1) s=s+1;end

if(cells(i+1,j+1)==1) s=s+1;end

if(s>=4)

result=0;

else

result=1;

end

end

4)aroundCenter.m

function a=aroundCenter(i,j,cells)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%% Author: Myoontyee.Chen

%% Data:20181227

%% License:BSD 3.0

%% aroundCenter - Correspondence rule

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

a=0;

if(cells(i-1,j)==3) a=1; end

if(cells(i,j-1)==3) a=1;end

if(cells(i,j+1)==3) a=1;end

if(cells(i+1,j)==3) a=1;end

end

输出

城市发展模拟过程如下图:

迭代次数2

迭代次数671

其他

结果与真实情况相差较大,内部算法有待改善。

若你来自兰州,也可以用文件夹里的兰州地图跑一遍程序,是有意思的小例子。

参考

用matlab做元胞自动机预测,元胞自动机(Cellular Automata)与城市规划及其MATLAB实现——莆田市城市发展预测...相关推荐

  1. 元胞自动机(Cellular Automata)与城市规划及其MATLAB实现——莆田市城市发展预测

    github:https://github.com/Myoontyee/CA-city-planning-for-Putian-by-MATLAB 前言 探索元胞自动机用于城市规划,是由于前不久在CS ...

  2. MATLAB元胞自动机报告,元胞自动机概述与MATLAB实现

    什么是元胞自动机? 元胞自动机(cellular automata,CA) 是一种时间.空间.状态都离散,空间相互作用和时间因果关系为局部的网格动力学模型,具有模拟复杂系统时空演化过程的能力.它能构建 ...

  3. 【Matlab元胞自动机】元胞自动机大型商场人流疏散【含源码 665期】

    一.代码运行视频(哔哩哔哩) [Matlab元胞自动机]元胞自动机大型商场人流疏散[含源码 665期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1]贺琳,聂化 ...

  4. 【元胞自动机】元胞自动机城市规划【含Matlab源码 125期】

    ⛄一.案例简介(附课程报告) 城市规模设计 雄安新区占地总面积约为2000平方公里,涉及河北省雄县.容城.安新3个县及周边部分区域,地处北京.天津.保定腹地,通过ArcGIS地图软件搜索该区域并从中提 ...

  5. 元胞自动机(Cellular Automata)

    元胞自动机(Cellular Automata,简称CA,也有人译为细胞自动机.点格自动机.分子自动机或单元自动机).是一时间和空间都离散的动力系统.散布在规则格网 (Lattice Grid)中的每 ...

  6. 【Matlab】系统预定义变量——元胞数组与结构体

    [Matlab]系统预定义变量--元胞数组与结构体 往期回顾 前言 正文 一.元胞数组 1. 元胞数组操作函数 2. 代码实例 二.结构体 1. 结构体操作函数 2. 代码实例 总结 参考文献 往期回 ...

  7. 【matlab】元胞数组(由元胞数组创建元胞数组)

    元胞数组(由元胞数组创建元胞数组) 语法格式: 元胞数组名(指定索引)={元胞}: 我们来看一段代码:

  8. 开元研究之中国传统媒体发展预测

    开元研究 陈愈超 开元研究曾经发表过一篇文章,做过一个电视媒体将会雪崩的预测,最完整的文章链接:http://www.mediavalue.com.cn/333001.html,这篇文章在网络上引发巨 ...

  9. 怎么用MATLAB做周期性预测,时间序列预测时,数据具有周期性怎么办(用MATLAB做) , 什么是时间序列预测法?...

    3.3时间序列分析 3.3.1时间序列概述 1. 基本概念 1一般概念:系统中某一变量的观测值按时间顺序时间间隔相同排列成一个数值序列,展示研究对象在一定时期内的变动过程,从中寻找和分析事物的变化特征 ...

最新文章

  1. 第六届数学、计算机与生命科学交叉研究青年学者论坛 (大牛云集的生信会议,免注册费且提供午餐)...
  2. 如何读取电脑html信息,JavaScript 获取客户端计算机硬件及系统信息
  3. BZOJ4671: 异或图
  4. 代码是写给人看的,请C/C++过来的程序员们多学习软件工程
  5. 手把手教你薅羊毛,1 元体验业内领先AI技术!
  6. 前端学习(172):格式化文本
  7. 单目摄像头光学图像测距_自动驾驶汽车传感器技术解析——车载摄像头
  8. break后面的语句还执行吗_12.python之配合循环的四种语句
  9. 第二阶段冲刺第八天(6月7号)
  10. DotNET的GNU版开源实现DotGNU
  11. 速来围观:飞时达土石方计算软件FastTFT V15.2正式升级发布
  12. 场景管理:四叉树算法C++实现
  13. 神策数据:数字化营销助力鞋服企业转型
  14. 富格林金业:新手投资贵金属容易亏损的原因
  15. 十人面试就我通过,只因我答对了这题TCP协议为什么需要三次握手
  16. GooglePlay提审警告(com.google.android.gms:play-services-safetynet:17.0.0)
  17. java程序设计基础知识点_Java编程语言基础知识的要点
  18. STM32H743使用PA0,PA1作为ADC输入的坑!!
  19. oracle 裸金属,通过裸金属服务部署Oracle RAC (五)Oracle RAC的备份
  20. 数据库-SQL-相关使用

热门文章

  1. 【Tyvj1783】【codevs2418】【BZOJ1856】字符串,厉害的组合数与模型转换
  2. 如何维持手机电池寿命_手机电池不耐用,都怪这些充电坏毛病
  3. postman socket接口测试_基于postman测试接口(整套接口测试)
  4. php oracle 删除 数据,oracle怎么清空表数据
  5. Intel 64/x86_64/IA-32/x86处理器基本执行环境 (2) - 64位执行环境
  6. 采用MATLAB的DSP调试方法
  7. sas分组计数_SAS读书笔记:SQL
  8. ps制作20种特效文字_如何使用AE制作文字破碎动画?制作ae破碎文字特效教程分享...
  9. 整数存储方法和做题中部分数值方法
  10. javaweb开发1.环境配置(javaweb插件下载及tomact在eclips中配置)