如何在NetLogo中按Patch ID约束设置海龟随机XY坐标
解决NetLogo中Patch与海龟变量上下文冲突的问题
我来帮你搞定这个变量访问的问题~你遇到的错误核心是变量的上下文不匹配:tID是海龟专属的变量,但你在Patch的执行上下文(也就是ask patches的代码块里)尝试去调用它,NetLogo自然找不到这个变量啦。
修正思路
在sprout的代码块里,当前的执行主体是刚孵化出来的海龟,我们可以通过myself关键字直接引用孵化它的那个Patch,这样就能安全获取到对应的ID,再基于这个ID去选择同组的Patch。
修正后的代码
patches-own [ID centroid? pop] turtles-own [tID] ask patches with [ID >= 1] [ sprout (pop * 0.1) [ ; 用myself获取孵化自己的Patch的ID,赋值给tID记录归属 set tID [ID] of myself ; 随机选择同ID的任意Patch并移动过去 move-to one-of patches with [ID = tID] ] ]
代码说明
[ID] of myself:myself在这里代表孵化当前海龟的那个Patch,通过这个表达式,海龟能直接拿到所属Patch的ID,完全避开了跨上下文访问变量的问题。move-to one-of patches with [ID = tID]:此时执行主体是海龟,能正常访问Patch的ID变量,所以可以筛选出所有同ID的Patch,随机选一个移动过去,完美实现你要的“海龟在对应ID的Patch范围内随机分布、不越界”的需求。
可选优化(针对大量Patch场景)
如果你的Patch数量非常多,每次筛选patches with [ID = tID]会有点影响效率,你可以提前把每个ID对应的Patch集合存起来:
globals [id-patch-map] to setup ; 初始化映射表,key是ID,value是对应Patch的列表 set id-patch-map table:make ask patches with [ID >= 1] [ if not table:has-key? id-patch-map ID [ table:put id-patch-map ID [] ] table:put id-patch-map ID lput self table:get id-patch-map ID ] ; 孵化海龟的代码改成这样 ask patches with [ID >= 1] [ sprout (pop * 0.1) [ set tID [ID] of myself ; 直接从预存的列表里选Patch,更快 move-to one-of table:get id-patch-map tID ] ] end
这样就能让代码在大数据量下运行更流畅啦~
内容的提问来源于stack exchange,提问作者Agnes de Araujo
相关产品推荐
相关产品推荐

