我有一个程序可以设置许多不同品种的海龟。每个品种都需要有一只头龟和一只跟随龟。我已将这些作为全局变量分配,因为它们在代码中进一步下降了很多。
我需要将这些变量分配给品种中的海龟,然后创建从领导者到追随者的链接。界面中有很多条件决定了创建了多少和哪些品种,因此我无法通过龟号进行分配。
我收到错误(并非所有时间)&#t; turtle无法与自己联系'我认为当他们覆盖第一个set命令并将相同的乌龟分配给两个变量时,就会发生这种情况。有没有人知道我可以放入的条件允许它每次都设置而没有错误。 (我试过if语句,is-turtle?,one-of other,other)
breed [flinks flink] ;; linked turtles that will turn away from sources
globals [
flink-leader
flink-followers]
to set-up
clear-all
setup-turtles
reset-ticks
end
to setup-turtles
create-flinks 2 [
set flink-leader one-of flinks
set flink-followers one-of other flinks
ask flink-followers [create-link-with flink-leader]
ask flink-followers [set color pink]
ask flink-leader [
setxy 10 4]
ask flink-followers [
setxy 19.5 4]
]
end
to go
fd 1
end
答案 0 :(得分:2)
有很多不同的方法可以解决这个问题。这是一个不会远离你提供的代码 的那个:
to setup-turtles
create-flinks 2
set flink-leader one-of flinks
ask flink-leader [
set flink-followers one-of other flinks
setxy 10 4
]
ask flink-followers [
create-link-with flink-leader
setxy 19.5 4
set color pink
]
end
请注意,您对使用other
确保关注者与领导者不同的直觉是正确的。
要了解发生了什么,您需要掌握NetLogo中“上下文”的概念。一些原语(如ask
,of
和create-turtles
)是“上下文切换”:其中一个参数是代码块([
和{{1}之间的部分}}在特定乌龟的上下文中运行 。其他原语取决于运行代码的上下文:例如,名为]
的原语将报告给定代理程序集中的所有代理程序,除了正在运行该程序段的上下文中的代理程序。
在您的版本中,您将大部分代码包含在为other
提供的代码块中。这意味着代码块对于创建的每个乌龟运行一次。因此,您对create-flinks
,set flink-leader
等的调用都会运行两次,每次都在不同的乌龟环境中运行。你能看出那是怎么弄乱的吗?
在NetLogo中跟踪不同的上下文一开始可能很有挑战性(set flink-followers
/ self
之间的频繁混淆),但是一旦你得到它,它应该变得容易,自然。
最后一点作为附录。你说:
我无法通过乌龟编号分配
好!永远不要用龟号分配任何东西!它导致脆弱,容易出错,更复杂,不太通用,非网络代码。如果您认为需要在代码中的任何位置使用龟号,请在此处提出另一个问题。有人最有可能建议采用更好的方法。
¹好吧,几乎永远不会。