我正在NetLogo上研究动物运动模型。我创建了六个不同的代理集,其中包含位于圆锥体16 60中的补丁(在计算下一个代理集之前,请我的海龟将rt设为60)。然后,我要求每个代理集计算加权索引的总和(0-1之间的补丁变量)并将其值保存到全局变量中。因此,现在我给每只乌龟都指定了六个区域,并提供了一个值,该值代表乌龟整个代理集的资源值。我试图让我的海龟识别出哪个加权加权指数总和最高的agentset,然后移到其中的随机补丁。我遇到了问题,因为代表加权总和索引的全局变量未附加到代理集的位置,因此我不知道如何继续进行此步骤。我唯一的想法是制作一条复杂的ifelse链,在该链中,我让海龟比较总和并面对与该值相对应的agentset,但这似乎很长。任何有关如何解决此问题或使我的问题更清晰的想法或建议,将不胜感激!
我尝试制作一个列表并要求with-max,但是同样,这将最大和报告为一个数字,而不是它所属的代理集。
; This code gets called in my go procedure as ask bears []
;I am first creating the agentsets
set heading 0
set n-patches patches in-cone 16 60
rt 60
set ne-patches patches in-cone 16 60
rt 60
set se-patches patches in-cone 16 60
rt 60
set s-patches patches in-cone 16 60
rt 60
set sw-patches patches in-cone 16 60
rt 60
set nw-patches patches in-cone 16 60
; Now I'm adding the index value for all patches within each agentset
set n-sum sum [weighted-index] of n-patches
set ne-sum sum [weighted-index] of ne-patches
set se-sum sum [weighted-index] of se-patches
set s-sum sum [weighted-index] of s-patches
set sw-sum sum [weighted-index] of sw-patches
set nw-sum sum [weighted-index] of nw-patches
; Lost after this
答案 0 :(得分:1)
首先,不需要使用全局变量,只需使用let
创建一个临时局部变量即可。
这是一个棘手的棘手问题,因为您不能使用任何在代理集中找到最大值的内置基元,而列表基元不具备此功能。
我写了一个独立的模型来演示您想要什么。它使用pcolor
作为值而不是加权索引,并且我选择了随着数字增加而变深的颜色。
to testme
clear-all
ask patches [ set pcolor one-of [ 28 54 110 ] ]
create-turtles 3
[ setxy random-xcor random-ycor
set color white
]
ask turtles
[ set heading 0
let n-patches patches in-cone 16 60
rt 60
let ne-patches patches in-cone 16 60
rt 60
let se-patches patches in-cone 16 60
rt 60
let s-patches patches in-cone 16 60
rt 60
let sw-patches patches in-cone 16 60
rt 60
let nw-patches patches in-cone 16 60
let directions-list shuffle (list n-patches ne-patches se-patches s-patches sw-patches nw-patches)
print directions-list
let sums-list map [ thisDir -> sum [pcolor] of thisDir ] directions-list
print sums-list
let max-sums max sums-list
print max-sums
let chosen position max-sums sums-list
print chosen
face one-of item chosen directions-list
]
end
您可以使用to-report
过程来简化六个代理集的计算,但是我没有这样做,因为我想使用您的代码来保持可读性
这可以打印出内容,以便您查看它在做什么。注意,shuffle
是为了确保在2个或更多的碰巧总数相同的情况下进行随机选择。请记住,NetLogo列表的索引为0,因此position
将返回0到5,而不是1到6。
它的作用是将代理集放入列表中,计算列表中每个项目的和值(使用map
),然后将这些和以相同顺序放入新列表中。然后,它搜索该新列表的最大值,找到该最大值的位置,使用该位置从第一个列表中提取正确的代理集,然后面对该代理集内的随机补丁。