【问题标题】:Order of the agents in agentset don't match代理集中代理的顺序不匹配
【发布时间】:2017-03-02 05:54:54
【问题描述】:

如果答案很明显,我有疑问并道歉。我创建了以下代码。非常简单明了:

patches-own [ tl ls ls2 ls3 ls4 tsl]
turtles-own [mysize]

to setup
  clear-all
  reset-ticks
  crt 5
  ask turtles [ set heading random 360 jump random 20 set mysize random-float 1]
  asd
  inspect patch 0 0
end

to asd
  let old sum [mysize] of turtles
  ask patches [ set tl other turtles
    set tsl [self] of tl
    set ls [distance myself] of tl 
    set ls2 [distance myself ^ 2] of tl
    set ls3 [(mysize) / old] of tl
    ]
  ;print tl

end

to initial
  set heading random 360 jump random 20 set mysize 1
end

to go
  inspect patch 0 0
  ask turtles [ fd 1 set mysize mysize + random-float 1]
  let qwe random-float 1
  print qwe
  if qwe < 0.2 and count turtles > 2 [ask one-of turtles [die]]
  if qwe > 0.8 [ ask one-of patches [sprout 1 [initial]]]
  asd
  tick
end

如您所见,我在代码中有一个检查功能,下面是快照:

我的问题是为什么lsls2 代理出现故障。 Agentset TSL 显示了海龟的顺序,因此基于该顺序创建的其他代理集不应该遵循相同的顺序。

【问题讨论】:

    标签: netlogo agentset


    【解决方案1】:

    除非您以某种方式对它们进行排序,否则 Netlogo 将以随机顺序查询代理集中的代理。在功能上,ask tl 遵循与ask turtles 相同的逻辑,从代理集中检索变量也是如此。例如,如果您使用命令中心多次尝试以下代码(在运行您的setupasd 之后),您会注意到每次查询的代理顺序都不相同。

    ask patch 0 0 [ print [distance myself] of tl ]

    所有这些都是说创建一个补丁的“tsl”列表是独立于你的其他列表的创建的。它不是一个有序列表,它是从代理集“tl”中随机调用的海龟的列表。获得代理集一致排序的一种方法是使用sort 原语之一。

    【讨论】:

    • 所以在那种情况下,如果我做一些操作,比如在其中一个代理集中找到具有最小值的海龟,使用min-one-of 是否所有代理集都没有类似的顺序或者 Netlogo 会给我结果正确吗?
    • 只要您正在查询代理集,它就应该返回正确的结果——类似于ask patch 0 0 [ ask min-one-of tl [distance myself ] [ set size 3 ] ]。另请注意,在您的示例屏幕截图中,只有“tl”是代理集,其余的是列表 - 您查询代理列表的方式与查询代理集的方式不同。
    • 既然你说只有tl is an agentset 和其他一切都是一个列表。如果我想在列表之一中找到具有min 值的乌龟,说ls 我不能使用lput 对吗?我可能能够获得列表中最小值的索引或position,但是当我引用位置来识别代理集中的海龟时,它会抛出错误。例如set tl other turtles set ls [distance myself ^ 2] of tl set index position (min ls) ls。到目前为止,它会起作用,但是当我使用lput item index tl 时。我会收到一个错误,要求提供一个列表而不是 agentset
    • 我可能没有正确理解你,但我认为你可以跳过一个步骤,只需使用sort-on 为每个补丁构建一个有序的海龟列表,按照你想要的任何记者排序。例如,如果你想要一个基于到补丁的距离的海龟列表,你可以使用ask patches [ set ls sort-on [ distance myself ] turtles ]。这将按照距补丁的距离升序创建海龟列表。要获得第一只海龟,请让该补丁请求列表中的 first 做某事 - 例如 ask patch 0 0 [ ask first ls [ set color red ] ]
    • 我的意思是如果我想找到哪只海龟最接近你在上一条评论中提到的补丁。如果说列表 ls 中的第一个海龟是turtle 7,那么我希望输出是(turtle 7)。我不想要值本身,而是列表中具有最低或最大值的海龟。由于初始引用 tl 是一个代理集,其余是列表,因此在使用 lput 查找海龟时会引发错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-13
    • 2019-05-19
    相关资源
    最近更新 更多