如何在NetLogo中实现紧凑排列的1000只海龟创建?
更优的NetLogo海龟群组实现方案
嘿,你的C语言思路没问题,但NetLogo作为多主体建模工具,有更简洁、更符合其设计风格的写法,完全不用像C那样手动维护计数变量和嵌套循环~
先说说你现有代码的小问题
你的代码需要手动维护n变量来定位每个海龟,一旦海龟数量和循环逻辑不匹配(比如crt的数量和嵌套循环的次数不一致),就会出现索引越界的错误;而且嵌套while循环的写法比较繁琐,没有利用NetLogo的多主体特性。
方案一:利用海龟who编号直接计算坐标(最简洁)
NetLogo创建的海龟会自动获得唯一的who编号(从0开始递增),我们可以直接用这个编号来计算每个海龟的位置,一行代码就能完成创建+排列:
crt 1000 [ # 计算x坐标:1-100,每100个海龟换一行 let x-pos ((who mod 100) + 1) # 计算y坐标:1-10,每100个海龟递增一行 let y-pos ((who // 100) + 1) setxy x-pos y-pos ]
解释一下:
who mod 100会得到0-99的余数,加1后就是1-100的x轴位置,对应100列who // 100是整数除法,会得到0-9的商,加1后就是1-10的y轴位置,对应10行- 每个海龟会自动跳到对应的patch上,刚好形成10×100的紧凑矩形排列,彼此紧挨着相邻的patch
方案二:可配置行列数的通用写法
如果以后需要调整行列数量,把数值硬编码进去不够灵活,我们可以先定义变量,让代码更易维护:
let total-rows 10 let total-cols 100 crt (total-rows * total-cols) [ let col-index (who mod total-cols) let row-index (who // total-cols) setxy (col-index + 1) (row-index + 1) ]
这样只要修改total-rows和total-cols的数值,就能快速生成不同规模的矩形海龟群组。
额外优化:让海龟更紧凑(可选)
如果希望海龟在同一个patch内也更密集(比如多个海龟挤在同一个patch上),可以把坐标设置为小数,比如:
crt 1000 [ let x-pos ((who mod 100) + 0.5) let y-pos ((who // 100) + 0.5) setxy x-pos y-pos ]
不过按照你要求的10×100矩形排列,每个patch放一个海龟已经是最规整的紧凑布局啦。
内容的提问来源于stack exchange,提问作者Marco mosconi
相关产品推荐
相关产品推荐

