NetLogo中at-points调用patches列表报无效点错误如何修复
问题根因
报错来自两个核心写法错误:
at-points原语只接受坐标二元组(即[pxcor, pycor]格式的数值对)构成的列表作为入参,但你的memory里存的是patch代理对象本身,不是坐标数值对,入参格式从根上就不匹配。- 运算优先级逻辑错误:
with是代理集专用的筛选方法,不能直接作用在列表类型的memory上。你写的memory with [pcolor = white]会被NetLogo优先执行,相当于直接对列表做代理集筛选,返回的结果完全不是at-points需要的合法点列表,自然触发报错。
正确修复代码
因为你已经在memory里直接存了途经的patch代理,完全没必要绕路用at-points做坐标转代理的操作,直接用列表筛选语法过滤出pcolor为white的patch,再执行自定义操作即可:
; 单海龟场景直接执行即可 ask one-of turtles [ ; 从当前海龟的memory列表里筛出白色patch ask filter [patch_p -> [pcolor = white] of patch_p] memory [ do-something ] ] ; 多海龟场景下,每只海龟处理自己的记忆路径时放到ask turtles块中 ask turtles [ ask filter [patch_p -> [pcolor = white] of patch_p] memory [ do-something ] ]
如果后续你调整了memory的存储逻辑,改成存坐标对而非patch代理,再使用at-points写法即可,参考代码如下:
; 适配memory存储坐标对的场景 ask one-of turtles [ let valid-points filter [ coord -> [pcolor = white] of patch (item 0 coord) (item 1 coord) ] memory ask patches at-points valid-points [ do-something ] ]
内容的提问来源于stack exchange,提问作者Javier Sandoval
相关产品推荐
相关产品推荐

