NetLogo统计同类型相邻海龟组成的簇的大小问题求助
NetLogo绿色海龟簇标记问题排查与修复
原有代码问题点
- 簇标记逻辑错误:逐个遍历绿海龟时只要发现block为0就生成新簇编号,没有按连通性合并同一簇的海龟,会导致同一个连通簇被分配多个编号
- 语法逻辑混乱:while条件中的嵌套调用主体不明确,
myself指代错误,in-radius的调用主体和筛选对象关系错位,无法正确筛选到当前簇相邻的未标记绿海龟 - 执行时序问题:原代码中标记逻辑在
ask turtles内部执行,海龟的标记操作会实时影响遍历逻辑,导致标记遗漏 - 原代码hatch逻辑缺少闭合方括号,运行前需要先补全语法漏洞
修复方案
首先删除rules过程中ask turtles块内的set block 0语句,将簇标记代码统一放在rules末尾、tick之前,代码如下:
; 每轮重新计算簇时先重置所有绿海龟的block值 ask turtles with [MHC = 1] [set block 0] let current-block 1 ; 循环处理所有未标记的绿海龟簇 while [any? turtles with [MHC = 1 and block = 0]] [ ; 取当前未标记簇的起点 let start one-of turtles with [MHC = 1 and block = 0] ask start [set block current-block] let current-cluster turtles with [block = current-block] ; 向外扩散标记同一簇的所有连通绿海龟 while [any? turtles with [ MHC = 1 and block = 0 and any? current-cluster in-radius 1 ]] [ ask turtles with [ MHC = 1 and block = 0 and any? current-cluster in-radius 1 ] [set block current-block] set current-cluster turtles with [block = current-block] ] set current-block current-block + 1 ] ; 按需添加簇大小统计代码 let cluster-size-list map [i -> count turtles with [block = i]] n-values (current-block - 1) [? + 1] print (word "当前绿海龟簇大小列表:" cluster-size-list)
优化说明
- 如果不需要每tick重新计算簇,可删除重置block的语句,仅在
set-up阶段初始化block为0即可,大幅提升运行性能 - 如果是严格网格的四邻接(不包含对角线)判断,可将
in-radius 1替换为any? current-cluster on neighbors,邻接判断更准确
内容的提问来源于stack exchange,提问作者James W
相关产品推荐
相关产品推荐

