news 2026/1/2 15:07:58

基于元胞自动机法模拟城镇开发边界增长及枝晶生长的C++程序开发

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于元胞自动机法模拟城镇开发边界增长及枝晶生长的C++程序开发

元胞自动机机模拟城镇开发边界(UGB)增长 确定其组成的主要元素:元胞、元胞空间、元胞状态、元胞邻域及转变规则 分析模拟城市空间结构;确定模型的参数:繁殖参数、扩散参数、传播参数及受规划约束参数,C++程序,基于元胞自动机法模拟枝晶生长,能实现任意角度(偏心正方算法),同时采用LBM考虑了对流作用对枝晶生长的影响。

最近在搞元胞自动机模拟城市开发边界增长的项目,发现这玩意儿用来玩空间演化真是绝了。先说说城镇开发边界(UGB)模拟的核心要素吧,核心就五个零件:元胞(每个地块)、空间布局(二维网格)、状态(空地/建成区)、邻域关系(周围八个格子)和转变规则(怎么从空地变楼房)。

这里有个骚操作——用四组参数控制城市扩张:

  1. 繁殖参数(生娃速度):空地变建筑的概率
  2. 扩散参数(感染力度):周边建成区对空地的辐射影响
  3. 传播参数(连片效应):建筑群自发扩张的惯性
  4. 规划约束(城管力度):政府规划强制保留的空地比例

咱们可以这么玩代码:

struct Cell { int state; // 0=空地 1=建筑 float plan_constraint; // 规划约束值 }; void simulateGrowth(vector<vector<Cell>>& grid, float spawn, float spread) { // 邻域扫描实现扩散效应 for(auto& row : grid) { for(auto& cell : row) { if(cell.state == 0 && cell.plan_constraint < 0.2) { float neighborEffect = countNeighbors(cell) * spread; if(rand()/(float)RAND_MAX < spawn + neighborEffect) { cell.state = 1; } } } } }

这段代码的精髓在于把规划约束做成了每个元胞的自带属性,这样不同地块可以设置不同级别的开发限制。比如河道边设置0.8的高约束值,直接锁死开发可能。

突然想到之前用同个框架模拟金属枝晶生长,发现城市扩张和晶体生长居然能用一套底层逻辑。这里有个黑科技——偏心正方算法,用来突破传统四邻域/八邻域的限制:

vector<Point> getEccentricNeighbors(Point center, float angle) { // 根据输入角度生成偏移量 vector<Point> offsets; for(int i=0; i<4; ++i) { float theta = angle + i*M_PI/2; offsets.push({round(cos(theta)), round(sin(theta))}); } return offsets; }

这算法妙在通过旋转基础偏移量实现任意生长方向。比如设置45度角,就能得到斜向传播的枝晶结构,模拟不同冷却速率下的晶体形态。

但单纯用元胞自动机模拟流体对枝晶的影响不够带感,于是又整合了LBM(格子玻尔兹曼方法):

class LBM_Solver { vector<float> f[9]; // 九个方向的分布函数 void stream() { // 对流传播步骤 for(int i=0; i<9; ++i){ f[i] = shiftField(f[i], directions[i]); } } void applyFluidEffect(Cell& cell) { // 流体速度影响枝晶生长方向 cell.growthDirection += fluidVelocity * 0.1; } };

这里骚的地方在于把流体速度场和元胞生长方向耦合,实现了熔融金属流动导致枝晶偏转的效果。调试时发现把流体影响系数设到0.15时,枝晶分叉角度和实验照片基本吻合。

搞完这两个项目突然悟了:无论是城市扩张还是晶体生长,本质都是受限扩散过程。规划约束参数就像金属溶液中的杂质,繁殖参数相当于过冷度,不同领域的物理现象在数学层面上居然能相互映射。这种跨学科联动的快感,可能就是建模最上头的部分吧。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/16 18:59:30

项目中绝对位置和相对位置的具体应用解析

这个通常用于有外部库或者文件输入时&#xff0c;使用相对路径可避免代码复制到别的PC端没法使用的情况基础概念&#xff1a;路径分隔符的作用​在文件系统中&#xff0c;路径用于定位文件或目录的位置。反斜杠 \ 是 Windows 系统中的路径分隔符&#xff0c;而正斜杠 / 通常用于…

作者头像 李华
网站建设 2025/12/16 18:57:17

Doris笔记

Doris常用命令&#xff1a; 查看doris 某用户最大连接数 show property for 用户名 like max_user_connections设置单个用户并发数连接&#xff08;立即生效&#xff09; SET PROPERTY FOR 用户名 max_user_connections 500;设置全局的最大并发数连接&#xff08;所有用户的…

作者头像 李华
网站建设 2025/12/16 18:56:27

ThinkingEngine的首个AI原生能力来了!

移动互联网的普及与社交媒体的蓬勃发展&#xff0c;让用户发声的渠道愈发多元且直接。从国内外主流媒体与社区&#xff0c;到企业社群、客户群等私域场景&#xff0c;这些来自用户自发的、实时的对话&#xff0c;往往直接反映了市场对产品的真实感受、未被满足的潜在需求以及正…

作者头像 李华
网站建设 2025/12/16 18:56:07

解决 macOS 26.1 The application “xxxx” can’t be opened. 问题

报错如下&#xff1a; “xxx.app” is damaged and can’t be opened. You should move it to the Trash.The application “Charles” can’t be opened.非 M 系列芯片可以通过下面的命令解决&#xff1a; sudo xattr -rd com.apple.quarantine /Applications/xxx.app M 芯片解…

作者头像 李华
网站建设 2025/12/16 18:56:06

NSQ 在 Golang 项目中的监控与管理方法

NSQ 在 Golang 项目中的监控与管理方法 关键词&#xff1a;NSQ、消息队列、Golang、监控指标、故障排查、动态扩缩容、云原生 摘要&#xff1a;本文以“快递中转站”为类比&#xff0c;用通俗易懂的语言讲解 NSQ 消息队列的核心组件与监控管理逻辑。结合 Golang 项目实战&#…

作者头像 李华