Netlogo 让海龟们面对一组总值最高的补丁

Netlogo 让海龟们面对一组总值最高的补丁,netlogo,Netlogo,我在NetLogo工作,制作一个动物运动模型。我已经创建了六个不同的agentset,其中包含cone 16 60中的补丁,要求我的海龟在计算下一个agentset之前达到rt 60。然后,我要求每个agentset计算0-1之间补丁变量的加权指数之和,并将该值保存到全局变量中。现在我给出了每只海龟周围的六个区域,以及一个代表整个代理集对海龟的资源价值的值。我试图让我的海龟们认识到哪个代理集的加权指数之和最高,并移动到其中的一个随机补丁。我遇到了一些问题,因为表示加权总指数的全局变量没有附加到a

我在NetLogo工作,制作一个动物运动模型。我已经创建了六个不同的agentset,其中包含cone 16 60中的补丁,要求我的海龟在计算下一个agentset之前达到rt 60。然后,我要求每个agentset计算0-1之间补丁变量的加权指数之和,并将该值保存到全局变量中。现在我给出了每只海龟周围的六个区域,以及一个代表整个代理集对海龟的资源价值的值。我试图让我的海龟们认识到哪个代理集的加权指数之和最高,并移动到其中的一个随机补丁。我遇到了一些问题,因为表示加权总指数的全局变量没有附加到agentset的位置,所以我不知道如何从这一步开始。我唯一的想法是做一个复杂的ifelse链,让海龟们比较求和值,然后面对对应于该值的代理集,但这看起来相当长。任何关于如何解决这个问题或使我的问题更清楚的想法或建议都将不胜感激

我曾尝试创建一个列表,并与max一起调用,但同样,这会将max sum报告为一个数字,而不是它所属的agentset

; 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

首先,不需要使用全局变量,只需使用let创建一个临时局部变量

这是一个非常棘手的问题,因为您无法使用任何在agentset中找到最大值的内置原语,而列表原语则不具备该功能

我已经编写了一个独立的模型来演示您想要的。它使用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
您可以使用报告过程来简化六个代理集的计算,但我没有这样做,因为我想使用您的代码来帮助保持可读性

这把东西打印出来,这样你就能看到它在做什么。请注意,如果2个或更多个碰巧有相同的总数,则随机选择是为了确保随机选择。请记住,NetLogo列表是0索引的,所以position将返回0到5,而不是1到6


它所做的是将agentsets放入一个列表,使用map计算列表中每个项目的总和值,并将这些总和按相同顺序放入一个新列表。然后它搜索新列表的最大值,找到最大值的位置,使用该位置从第一个列表中提取正确的agentset,然后在该agentset中面对一个随机补丁。

不确定为什么这被否决,非常清楚的问题Hi JenB,非常感谢您的回答。我修改了我的代码,请参见下面的内容,现在它似乎正在运行。我将增加更多的复杂性,这样你的建议就会派上用场。现在我的代码是:通过使用锥16 60中的面片的n-Sum[感知指数]求和来求和指数,对每个象限重复,要求海龟在计算之间转动60。然后使用最大和最大列表n-sum ne sum se sum s-sum sw sum nw sum查找最大值,然后使用ifelse n-sum=最大和[设置标题0移动]并对每个象限重复。