【发布时间】:2017-03-11 19:44:56
【问题描述】:
【问题讨论】:
标签: netlogo patch identifier
【问题讨论】:
标签: netlogo patch identifier
如果您不关心示例中的特定“螺旋”序列,您可以使用 Luck 解决方案的变体,该解决方案利用 NetLogo 的默认补丁排序顺序:
patches-own [ id ]
to setup
clear-all
(foreach (sort patches) (range count patches) [ [p n] ->
ask p [ set id n ]
])
ask patches [ set plabel id ]
end
或者您可以使用sort-by 指定的稍微不同的排序顺序。
话虽如此,我不知道您的要求是什么,但我会质疑为补丁提供特定 ID 的想法。 NetLogo 中的大多数事情都可以在不参考代理 id 的情况下完成。 who 编号本身是非常古老的 NetLogo 版本的遗物,几乎不应该在现代代码中使用。
如果要引用特定补丁,请通过其坐标引用它,例如:patch -2 4。
如果您想存储补丁以供将来参考,请存储对补丁本身的引用,而不是某种 id。例如:ask turtles [ set my-patch one-of patches ]。
【讨论】:
一个补丁没有who,因为那是一个只有海龟的变量;补丁有坐标。但是,您可以为补丁提供自己的 ID 号并使用它。如果您只需要一个 5 x 5 的世界(如您的图片所示),您可以在 Netlogo 代码中完成您想要的。例如,看下面的代码(注意我改变了世界设置to those seen here)。但是,如果您想要一个有更多补丁的世界,我建议您从文件中读取您想要的补丁值。
globals [
idlist
ordered_patches
]
patches-own [
id
]
to setup
set idlist [ 9 10 11 12 13 24 1 2 3 14 23 8 0 4 15 22 7 6 5 16 21 20 19 18 17 ]
set ordered_patches sort patches
end
to assign-ids
( foreach ordered_patches idlist [
[ o_patch _id ] ->
ask o_patch [
set id _id
]
]
)
ask patches [
set plabel id
]
end
【讨论】:
foreach 原语的语法在版本 5 和 6 之间略有不同,如果您使用的版本比我旧,这可能是导致错误的原因。或者如果没有使用与我上面相同的世界设置,它们可能会发生)。我建议阅读foreach 上的Netlogo dictionary entry,以了解-> 在上面的代码中所做的事情——它还有助于澄清“o_patch”和“_id”只是foreach 的临时变量。
foreach 中使用的任何列表的长度必须相同。所以在这个例子中,我们要求一个有序的补丁列表(其中 25 个)将它们的 id 设置为“idlist”,它也是一个包含 25 个项目的列表。因此,使用此代码,您必须确保 idlist 中的 id 数量与世界上的补丁数量相同。由于您的世界设置 (xmin = -2, xmax = 2, ymin = -2, ymax = 2) 提供了一个包含 25 个补丁的世界,因此代码有效。