NetLogo如何同时指定ID最小与第二小的海龟?
解决NetLogo中选中ID最小和第二小海龟的问题
嘿,我来帮你搞定这个问题!你之前写的ask min-one-of turtles [who + 1]确实有问题——这个命令是找**who + 1值最小**的海龟,而who + 1最小的其实就是who本身最小的那只,所以和你第一个min-one-of turtles [who]选中的是同一只,自然达不到选中第二小ID海龟的效果。
下面给你两种靠谱的实现方法,按需选择:
方法一:通过筛选海龟集合实现
先找到最小的who值,再从剩下的海龟里找最小的who,逻辑清晰,适合新手理解:
globals [ nb-white nb-red ] to setup clear-all reset-ticks end to go ask patch 0 0 [sprout 1] ; 先处理ID最小的海龟 let smallest-who min [who] of turtles ask turtle smallest-who [set color white] ; 处理ID第二小的海龟:先排除最小ID的海龟,再找剩下的里最小的 let second-smallest-turtles turtles with [who != smallest-who] if not empty? second-smallest-turtles [ ; 确保有至少两只海龟才执行 let second-smallest-who min [who] of second-smallest-turtles ask turtle second-smallest-who [set color red] ] ; 统计颜色对应的海龟数量(对应你的globals变量) set nb-white count turtles with [color = white] set nb-red count turtles with [color = red] tick end
方法二:通过排序海龟集合实现
利用NetLogo的sort命令,默认会按海龟的who值升序排列,直接取前两个元素即可,代码更简洁:
globals [ nb-white nb-red ] to setup clear-all reset-ticks end to go ask patch 0 0 [sprout 1] let sorted-turtles sort turtles ; 按who升序排列海龟列表 ; 给最小ID的海龟设白色 if length sorted-turtles >= 1 [ ask first sorted-turtles [set color white] ] ; 给第二小ID的海龟设红色 if length sorted-turtles >= 2 [ ask item 1 sorted-turtles [set color red] ] ; 更新统计变量 set nb-white count turtles with [color = white] set nb-red count turtles with [color = red] tick end
关键注意点
- 一定要加海龟数量判断(比如
if length sorted-turtles >= 2),避免当海龟数量不足2只时出现报错; min-one-of命令的参数是汇报值,你之前用who +1相当于给每只海龟计算了一个新值,再找这个新值最小的,这和你要的“第二小ID”完全不是一回事,以后使用min-one-of/max-one-of时要注意这一点哦。
内容的提问来源于stack exchange,提问作者goodgest
相关产品推荐
相关产品推荐

