NetLogo中如何限制agent固定停留在指定patches区域?
解决方案
现有代码问题
- 初始化时两类agent随机生成在全地图,没有限制出生区域
- 仅设置了
continent属性,但未在移动逻辑中基于该属性添加边界拦截规则 - 绿种群的
shape属性被重复赋值,后写的set shape "person"会覆盖前面的set shape "green person" - 代码末尾存在未闭合的注释符号,会导致编译报错
修复步骤
1. 修正agent初始化逻辑,限制出生区域
直接固定两类种群的出生范围,无需根据生成位置判断continent属性:
to setup_agents clear-turtles ; 生成蓝种群,仅在左侧蓝色区域(pxcor < 0)生成 create-humans blue_population [ ; 固定x坐标为负,避免出生在绿色区域 setxy (- random (abs min-pxcor)) random-ycor set continent 2 set virus? false set dead false set antibodies 0 set color yellow set size 10 set shape "blue person" ] ; 生成绿种群,仅在右侧绿色区域(pxcor > 0)生成 create-humans green_population [ ; 固定x坐标为正,避免出生在蓝色区域 setxy random max-pxcor random-ycor set continent 1 set color yellow set size 10 set shape "green person" set virus? false set dead false set antibodies 0 ] end
2. 给移动逻辑添加边界限制规则
核心逻辑是每次移动前判断目标地块是否属于自身允许活动的区域,不符合就取消移动或调整方向,示例go过程代码如下:
to go ask humans [ if not dead [ ; 原本的移动逻辑示例:随机小幅度转向 right random 10 left random 10 ; 获取前方1步的目标地块 let target-patch patch-ahead 1 ; 校验目标地块是否符合活动范围要求 if (continent = 2 and [pxcor] of target-patch < 0) or (continent = 1 and [pxcor] of target-patch > 0) [ fd 1 ] ; 越界时掉头,也可自定义其他调整方向的逻辑 if (continent = 2 and [pxcor] of target-patch >= 0) or (continent = 1 and [pxcor] of target-patch <= 0) [ rt 180 ] ] ] tick end
可选优化
如果不需要保留continent属性,也可以直接通过agent的shape、自定义种群标签,或者直接校验目标地块的pcolor实现限制,逻辑和上述校验规则一致。
内容的提问来源于stack exchange,提问作者ArbaazM
相关产品推荐
相关产品推荐

