资讯详情

资讯详情

用 Unity ML-Agents 做城市绿地规划:强化学习实战完整指南

用 Unity ML-Agents 做城市绿地规划强化学习实战完整指南【免费下载链接】ml-agentsThe Unity Machine Learning Agents Toolkit (ML-Agents) is an open-source project that enables games and simulations to serve as environments for training intelligent agents using deep reinforcement learning and imitation learning.项目地址: https://gitcode.com/gh_mirrors/ml/ml-agents规划会上最常见的僵局是生态部门要覆盖率财政要控成本居住区要门口见绿三方各拿一套 Excel谁也说服不了谁。Unity ML-AgentsML-Agents把这种多方权衡换了一种解法——在 Unity 里搭一座虚拟城市让强化学习智能体反复试错自己找到绿地分布的折中方案。这篇文章按给城市招聘一支 AI 规划团队的思路讲清环境、智能体、KPI 与训练四件事怎么落地。规划团队的「办公场地」在 Unity 里搭一座虚拟城市把城市变成一块块「网格拼图」先划地盘。取 10 km × 10 km 的矩形按 10 m × 10 m 切分得到 2 万个地块。每个地块是一个独立的决策单元属性挂在组件或 ScriptableObject 里用 Prefab 批量铺设地形与建筑比手工摆 2 万个物件快得多。ML-Agents 自带的 GridWorld 示例就是网格 智能体的最小原型绿地场景可以照着改造。地块属性建议按下表设计全部量化后才能进观测向量属性说明类型与取值坡度决定能否落地建设0–30°float土壤渗透率影响雨水下渗与植被存活0–100%float地价等级成本项的核心输入1–10 级int人口密度可达性需求侧0–500 人/公顷int建筑高度遮挡与生态价值折减0–100 mint道路等级绿地与廊道的连通性主干道 / 次干道 / 支路枚举让城市「会变」动态环境参数静态地图只够跑一次演示。真正训练时环境要能变否则智能体只会背答案。ML-Agents 提供了EnvironmentParameters类训练器通过 gRPC 侧信道把参数值推进来C# 侧用GetWithDefault读取——这是 EnvironmentParameters 源码 公开的全部接口面。三个典型参数人口密度因子需求侧强度、最大坡度可建门槛、地价系数成本压力。它们不进配置文件写死而是由训练端的课程学习按进度下发城市难度随训练推进逐档上调。读法上注意一个细节RegisterCallback可以在参数变化时立即响应比如重建场景而GetWithDefault适合每帧按需取值两者别混用。「员工」登场定义 AI 规划师智能体继承自AgentAgent.cs生命周期是收集观测 → 策略网络出动作 → 回调OnActionReceived执行并给分。AI 能「看」到什么、能「做」什么观测侧挂两类传感器。GridSensorComponent负责空间感知它按DetectableTags检查周围 N×N 个格子里各有什么——邻近地块是绿地、建筑还是道路感知结果直接编码成网格图像用法可参考 Grid Sensor 文档 对应的说明页。VectorSensorComponent负责属性数据当前地块的地价、人口、坡度等标量。两者拼起来智能体看到的就是一个带地形上下文的地块档案。动作侧只留 3 个离散动作通过ActionSpec.MakeDiscrete(3)声明0 保持现状1 规划为绿地2 规划为生态廊道。保持现状必须是合法动作之一否则智能体被迫每步都动手会学到疯狂改规划的坏习惯。观测收集的核心写法// 伪代码Agent 子类中的观测收集CollectObservations 为真实虚函数 public override void CollectObservations(VectorSensor sensor) { sensor.AddObservation(terrain.slope); // 本地块坡度 sensor.AddObservation(cell.populationDensity); // 本地块人口密度 sensor.AddObservation(cell.landPriceLevel); // 本地块地价等级 sensor.AddObservation(envParams.GetWithDefault(price_factor, 1.0f)); // 全局地价系数 }「团队作战」多智能体协同单智能体管 2 万地块不现实按行政区把城市切成 4×4 共 16 个片区每片一个GreenSpaceAgent。协同靠SimpleMultiAgentGroup源码把各片区智能体RegisterAgent进同一个组再用SetGroupReward/AddGroupReward发集体奖励。关键在奖励设计集体奖励取全局生态连通分——当某个片区把廊道修到边界、与邻区绿地接上时整组智能体一起拿分。这样占满自己地盘就不再是最优解留白给廊道是集体理性算出来的结果而不是靠规则硬约束。EndGroupEpisode则用于全部片区规划完成、方案定稿时统一收局。「KPI 体系」设计奖励函数奖励函数就是给 AI 定 KPI每步动作后打一个分训练器PPO沿着高分方向调整策略。KPI 定歪了智能体会精确地学歪——这比算法本身更值得花时间。三大考核项生态、可达性、成本总奖励是三项加权权重和为 1R 0.4 × 生态效益 0.3 × 可达性 0.3 × 成本效率在OnActionReceived里落地SetReward、EndEpisode均为Agent真实公开方法// 伪代码OnActionReceived(ActionBuffers actions) 中的奖励计算 int action actions.DiscreteActions[0]; // 0 保持 / 1 绿地 / 2 廊道 ApplyToCell(action); // 执行本步规划 float eco ScoreEcology(); // 生态项碳汇连通性 float acc ScoreAccessibility(); // 可达性项重力模型 float cost ScoreCost(); // 成本项反比于地价 SetReward(0.4f * eco 0.3f * acc 0.3f * cost); // 加权计分 if (AllCellsFinalized()) EndEpisode(); // 全城定稿则收局注意 3 个动作本身没有完成规划的终态语义终局由所有地块都已确定去向这一外部条件触发避免智能体无限拖延。每一项怎么算可达性用重力模型对每个居住区求人口加权、距离衰减的求和。// 伪代码可达性打分重力模型 float ScoreAccessibility() { float s 0f; foreach (var h in districts) // 片区内各居住区 { float d Distance(h.pos, greenCentroid); // 到最近绿地的距离 s h.pop / (1f (d / 1000f) * (d / 1000f)); // 距离平方衰减 } return Mathf.Clamp01(s / baseline); // 对基线归一到 0~1 }碳汇按面积 × 植被密度 × 单位固碳系数估算并截断到 0~1生态项内再按 0.6/0.4 混合碳汇与廊道连通性连通性用绿地四邻中同为绿地的边数 / 总边数近似。成本项最简单1 - (地价等级 - 1) / 9地价越低得分越高天然把智能体往低成本地块推。热岛缓解、生物多样性先不进奖励——它们在验收阶段当体检指标看不进训练目标防止奖励函数塞项过多导致训练信号互相打架。「训练营」PPO 训练与课程学习训练配置要点PPO 是 ML-Agents 默认训练器配置集中在一个 YAML 里仓库自带的 3DBall 配置 是很好的起点。绿地场景的推荐取值超参数取值作用batch_size128每次策略更新的样本数buffer_size10240经验回放缓冲容量learning_rate0.0003初始学习率linear 衰减gamma0.99折扣因子让远期生态收益算得进time_horizon64单个回合的最大步数max_steps5000000总训练步数hidden_units / num_layers512 / 3策略网络容量启动就一条命令mlagents-learn指向 YAML详见 训练文档。难度分级上分三阶段课程学习一步到位的难度会让前期奖励信号全是噪声。ML-Agents 的课程学习写在配置的environment_parameters段格式说明每个参数一条 Lesson 链用progress度量配threshold: 0.2 / 0.6切三档min_lesson_length: 100防止关卡抖动。三个阶段的设定阶段人口密度因子最大坡度地价系数第一关0.3低需求、好规划10°1.0第二关0.6均匀采样 ±0.15 扰动12°1.2第三关0.9真实压力15°1.5第二关故意用sampler_type: uniform而不是定值逼智能体适应参数在同档内漂移泛化到第三关时更稳。C# 侧只需要读参数// 伪代码场景按课程阶段重建RegisterCallback 为真实 API void OnPopulation(float v) RebuildDistricts(popFactor: v); void Awake() { envParams.RegisterCallback(population_density, OnPopulation); // 人口因子→重建居住区 envParams.RegisterCallback(max_slope, OnSlopeLimit); // 坡度上限→过滤可建地块 envParams.RegisterCallback(price_factor, OnPrice); // 地价系数→刷新成本项 }「绩效考核」从数据到决策一套评估指标训练收敛不等于方案合格验收要另拉一张指标表训练信号之外的项放在这里考核指标评估方法目标值绿地覆盖率绿地地块数 / 总地块数≥ 25%碳汇增量方案固碳量 − 现状固碳量≥ 20% 提升500 m 服务覆盖率步行 500 m 内有绿地的居住人口占比≥ 80%可达性指数重力模型求和对基线归一≥ 0.8单位成本效率生态得分 / 归一化总投入≥ 1.5结果怎么「看得见」数字进表之前先进眼睛。着色方案绿地地块深绿、生态廊道浅绿、保留现状灰白一块材质切换讲清全局统计面板只留四个关键字段——总绿地面积、覆盖率、平均可达距离、成本估算规划师扫一眼就能判断方案是否值得深看。传统方案 vs AI 方案以一个 15 km²、10 万人口的新区试点为例同一套指标下两条路线的相对得分传统方案归一为基线维度传统经验方案AI 优化方案生态效益0.721.00社会公平可达性均衡度0.650.92经济可行性成本效率0.831.35方案迭代速度3 轮比选耗时0.400.95专家经验利用定性判断1.000.60AI 方案的领先集中在前四项它能在 2 万个地块上同时权衡三方诉求而人脑的并行权衡能力有限。但最后一行要诚实写——规范符合性、历史文保这类定性判断AI 目前只能作为约束条件输入替代不了规划师。边界与未来技术上还差哪些三条硬边界。一是泛化虚拟城市的属性是合成数据接真实城市要打通 GIS 数据源且换城市形态后超参大概率要重调。二是开销可达性打分每步要对片区 × 居住区求和2 万地块规模下建议增量更新只重算受影响的片区或居住区降采样。三是动态适应训练时的城市是静态快照而真实城市在生长需要周期性重训或把城市生长本身建模成环境参数。别忘了「人」的部分权重 0.4/0.3/0.3 不是中立的数学选择而是生态优先还是成本优先的价值判断公示方案时应连同权重一起公开。人口数据只应聚合到街区级进观测原始个体定位数据不该出现在训练管线里。公示期的居民反馈可以回收成新的奖励约束比如某社区反对改绿直接 mask 掉对应地块的动作人机协作的闭环比AI 出方案、人盖章更有用。结语把绿地规划的多目标试错交给强化学习规划师从反复比选中解放出来专心做价值判断和公众沟通。下一步值得做的是把城市从一次性棋盘变成可持续运营的训练环境让 AI 规划团队随城市一起迭代。【免费下载链接】ml-agentsThe Unity Machine Learning Agents Toolkit (ML-Agents) is an open-source project that enables games and simulations to serve as environments for training intelligent agents using deep reinforcement learning and imitation learning.项目地址: https://gitcode.com/gh_mirrors/ml/ml-agents创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →