NetLogo入门求助:GO函数无法实现差异化颜色地块火势蔓延
NetLogo火势蔓延代码修复方案
问题分析
你的代码主要存在逻辑错误和语法错误,导致go函数无法正常运行,不同颜色地块的火势蔓延逻辑失效:
- 地块颜色赋值逻辑混乱,颜色会互相覆盖,导致实际分布不符合预期
go过程中neighbors4的用法错误,代码块括号不匹配,循环逻辑混乱- 火势蔓延的触发逻辑错误,没有正确针对不同颜色的邻居地块设置概率
修正后的完整代码
globals [ initial-trees burned-trees ] breed [fires fire] to setup clear-all set-default-shape turtles "square" ; 修正颜色赋值逻辑:用互斥条件确保每个地块只有一种颜色 ask patches with [(random-float 100) < density] [ let rand random 100 if rand < 25 [ set pcolor yellow ; 25%概率为黄色 ] else if rand < 75 [ set pcolor blue ; 50%概率为蓝色 ] else [ set pcolor green ; 25%概率为绿色 ] ] ; 点燃最左侧一列的地块 ask patches with [pxcor = min-pxcor] [ ignite ] set initial-trees count patches with [pcolor = green] set burned-trees 0 reset-ticks end to ignite ; 仅对未燃烧的地块执行点火操作 if pcolor != black [ sprout-fires 1 [ set color red ] set pcolor black set burned-trees burned-trees + 1 ] end to go ; 打印当前各颜色地块数量(用于调试) print "黄色地块数量: " count patches with [pcolor = yellow] print "蓝色地块数量: " count patches with [pcolor = blue] print "绿色地块数量: " count patches with [pcolor = green] ; 没有火势时停止运行 if not any? fires [ stop ] ; 遍历每个火势,处理邻居地块的蔓延 ask fires [ ; 询问当前火势所在的地块,遍历其4方向邻居 ask patch-here [ ask neighbors4 [ ; 绿色地块:50%概率蔓延 if pcolor = green and random 100 < 50 [ ignite ] ; 蓝色地块:可自定义概率,示例为30% if pcolor = blue and random 100 < 30 [ ignite ] ; 黄色地块:可自定义概率,示例为10% if pcolor = yellow and random 100 < 10 [ ignite ] ] ] ; 当前火势完成蔓延后销毁,避免重复处理 die ] tick end
关键修改说明
地块颜色赋值修正:
用if-else互斥条件替代原代码的连续if,确保每个地块只会被设置为一种颜色,黄色、蓝色、绿色的占比分别为25%、50%、25%,符合你的初始需求。火势蔓延逻辑修正:
- 让每个
fire询问自己所在的patch,遍历其4方向邻居,针对不同颜色的邻居地块设置独立的蔓延概率 - 添加
die指令销毁已完成蔓延的fire,避免重复触发蔓延逻辑 - 在
ignite中增加pcolor != black的判断,防止同一地块被重复点燃
- 让每个
语法与结构修正:
- 修复
neighbors4的用法,用ask neighbors4遍历邻居地块 - 调整
tick的位置,确保每次go循环结束后时间步正确增加 - 整理代码块的括号配对,保证逻辑结构清晰
- 修复
内容的提问来源于stack exchange,提问作者Eduardo Dorado
相关产品推荐
相关产品推荐

