NetLogo中如何让rnd扩展返回的含重复agent的列表执行指定操作
问题描述
使用NetLogo的rnd扩展实现轮盘赌选择时,可通过如下代码随机选取num个agent,每个agent被选中的概率与它的weight值成正比,并要求选中的agent执行task:
ask rnd:weighted-n-of num turtles [weight] [task]
如果需要允许随机选中的agent重复,调用rnd:weighted-n-of-with-repeats方法时会遇到报错:该方法为了支持重复选中返回的是列表而非agentset,直接传入ask会抛出错误ASK expected this input to be an agent or agentset, but got a list instead.
解决方案
核心实现逻辑
使用foreach关键字遍历返回的agent列表,逐个调用ask执行指定逻辑即可,完全保留重复选中的记录。
NetLogo 5.x 版本代码示例
foreach rnd:weighted-n-of-with-repeats num turtles [weight] [ ask ? [ ;; 替换为实际需要执行的task逻辑,示例为向前移动1步 fd 1 ] ]
NetLogo 6.x 版本代码示例(推荐)
用命名参数语法提升可读性:
foreach rnd:weighted-n-of-with-repeats num turtles [weight] [ selected-agent -> ask selected-agent [ ;; 替换为实际需要执行的task逻辑 fd 1 ] ]
注意事项
- 同一个agent被选中多少次,就会执行多少次对应的task,完全符合带重复选择的需求
- 禁止将返回的agent列表转换为agentset使用,agentset会自动去重,无法满足重复选中的业务逻辑
内容的提问来源于stack exchange,提问作者Sam Hollon
相关产品推荐
相关产品推荐

