在 NetLogo 中构建和循环列表

Building and looping over list in NetLogo

我有以下代码,它将(希望)生成一个总长度为 pop 的列表,其中每个元素都是 1 - no-of-patches 中的一个数字。

to setup-agents
  ;; create list of patch values from 1 - no-of-patches
  let j 3
  let tmp random (no-of-patches - 1)
  set tmp tmp + 1
  let patch-designation list ((random no-of-patches) + 1) ((random no-of-patches) + 1)
  loop [
    ;; create a list
    set tmp random no-of-patches 
    set tmp tmp + 1 ;; so it's 1 - no-of-patches
    set patch-designation lput tmp patch-designation
    set j j + 1
    if j > total-pop [ stop ]
    show length patch-designation
  ]
  show length patch-designation

end

我有一些问题在本网站的个别问题中似乎不合适。 (1) 在网上我发现有人会定义一个列表,如set my-list [ 1 2 3 ]。但是,当我尝试 set patch-designation [] 创建一个空列表时,出现错误 ("Nothing named PATCH-DESIGNATION has been defined")。事实上,只要我使用 ,就会发生这种情况 set patch-designation [ 1 2 3 ] 产生相同的错误,即使它几乎与在线教程完全一样。 (2) 如果我在循环中包含 show length patch-designation ,我会在每次迭代中看到它更新。但是,如果我将它放在循环之外,我看不到任何输出。事实上,如果我在控制台中键入 show length patch-designation,它会显示没有这样的变量。这是为什么?

如果您看不出来,我是初学者 - 欢迎对剩余代码提出任何批评。

当我使用 let patch-designation [] 启动列表时,以下代码对我来说工作正常。但是请注意,我使用 let 而不是 set 因为我想声明它的存在并将值设置为空。这就是为什么您收到错误但您在提供的代码中使用了 let 和其他形式的列表启动。

to setup-agents
  let total-pop 100
  let no-of-patches count patches
  ;; create list of patch values from 1 - no-of-patches
  let j 3
  let tmp random (no-of-patches - 1)
  set tmp tmp + 1
  let patch-designation []
  loop [
    ;; create a list
    set tmp random no-of-patches 
    set tmp tmp + 1 ;; so it's 1 - no-of-patches
    set patch-designation lput tmp patch-designation
    set j j + 1
    if j > total-pop [ stop ]
    show length patch-designation
  ]
  show length patch-designation
end

更一般地说,我对代码有两条评论。如果你想要一个长度为 total-pop 的列表,其中包含从 1 到补丁数的随机生成的数字,这一行将做同样的事情:

let patch-designation n-values total-pop [1 + random count patches]

第一部分 let patch-designation 创建一个名为 patch-designation 的新变量。 n-values total-pop 表示您想要一个由 [] 中的表达式生成的大小为 total-pop 的列表。 [] 内部只是简单地调用随机数生成器,它获取从 0 到但不包括补丁数 (count patches) 的整数,然后加 1.

你没有得到输出的原因是因为 stop 命令退出了整个过程,而不仅仅是循环。

查字典:letsetloopn-values 以帮助您理解我的评论。

你没有说你为什么要创建这个列表。但是你称它为补丁指定,这个过程被称为设置代理,这让我认为你将使用你生成的数字作为你想要创建代理的补丁的某种标识符。如果这就是您正在做的事情,那么有更好的方法可以做到这一点。补丁已经有标识符,所以你不需要分配一个,而且几乎总是你应该使用代理集而不是列表。

例如,如果你想生成 100 只海龟,每只都在不同的补丁中,试试这个:

to setup-agents
  ask n-of 100 patches
  [ sprout 1
  ]
end

或者,如果你不想要不同补丁的限制,所以它们可以在同一个补丁中生成,试试这个:

to setup-agents
  repeat 100
  [ ask one-of patches
    [ sprout 1
    ]
  ]
end