NetLogo中计算agentset列表各集合平均坐标及簇间距离的方法
NetLogo 智能体簇坐标均值与簇间距离解决方案
首要问题:计算每个智能体簇的平均xcor/ycor
map mean [xcor] clusters报错的原因是[xcor]未绑定到具体的簇智能体集合——NetLogo默认在观察者上下文执行该 reporter,无法直接获取簇内智能体的坐标。
正确写法是使用匿名过程,针对每个簇单独计算内部智能体的坐标均值:
clear-all create-turtles 5 ask turtle 0 [ create-link-with turtle 1 ] ask turtle 0 [ create-link-with turtle 2 ] ask turtle 3 [ create-link-with turtle 4 ] let clusters nw:weak-component-clusters ; 生成智能体簇列表 ; 输出每个簇的智能体数量(原可行代码) print map count clusters ; 输出: [2 3] ; 计算每个簇的平均xcor let avg-x-coords map [ cluster -> mean [xcor] of cluster ] clusters print avg-x-coords ; 计算每个簇的平均ycor,逻辑完全一致 let avg-y-coords map [ cluster -> mean [ycor] of cluster ] clusters print avg-y-coords
匿名过程[ cluster -> mean [xcor] of cluster ]会遍历clusters列表中的每个智能体集合,对每个集合单独执行均值计算,从而得到正确的均值列表。
次要问题:计算簇间距离
NetLogo内置的distancexy函数可直接替代手动编写的两点距离公式,配合簇的中心坐标即可完成计算。
实现步骤:
- 生成每个簇的中心坐标列表(结合上述均值计算逻辑)
- 遍历簇对,调用
distancexy计算距离
示例代码:
; 生成每个簇的中心坐标(格式为 [[x1 y1] [x2 y2] ...]) let cluster-centers map [ cluster -> list (mean [xcor] of cluster) (mean [ycor] of cluster) ] clusters ; 计算所有簇对的距离(排除自身到自身的距离) foreach cluster-centers [ center1 -> foreach cluster-centers [ center2 -> if center1 != center2 [ let distance-between distancexy (item 0 center1) (item 1 center1) (item 0 center2) (item 1 center2) print (word "簇间距离: " distance-between) ] ] ]
若仅需计算特定簇间的距离,直接提取对应中心坐标传入distancexy即可,无需额外扩展。
内容的提问来源于stack exchange,提问作者Yaser Baqi
相关产品推荐
相关产品推荐

