我在种犬时有些麻烦。
具体来说,我有三个品种,sellers, buyers
和cars
。
品种之间的关系如下:
if breed = buyers [
hatch-cars 1
[ set attribute_1 random-float 1
...]
]
if breed = sellers [
hatch-cars 1
[set attribute_2 random-float 1
...]
我想绘制的是根据品种而定的汽车,以便有两条不同的线,一条用于买主,一条用于卖主。 我尝试过
ask cars with [breed = buyers ][plotxy attribute_1 ticks]
ask cars with [breed = sellers ] [plotxy attribute_2 ticks]
但是它没有显示任何内容,并且我还没有收到任何错误消息。 然后,我尝试了
ask cars [plotxy attribute_1 ticks]
ask cars [plotxy attribute_2 ticks]
几乎可以。但是,它还标出了其他要点:似乎它考虑了所有品种,buyers
,sellers
和cars
。
如果我写
if breed = buyers [ask cars [plotxy attribute_1 ticks]]
if breed = sellers [ask cars [plotxy attribute_2 ticks]]
我收到以下错误消息: You can't use BREED in an observer context, because BREED is turtle/link-only
。
如何解决此问题?
谢谢您的帮助。
答案 0 :(得分:2)
让我们先来看看为什么您的第一次尝试没有画出任何东西的原因:
ask cars with [breed = buyers ][plotxy attribute_1 ticks]
ask cars with [breed = sellers ] [plotxy attribute_2 ticks]
在NetLogo中声明一个品种时,它将创建一个与该品种同名的特殊代理集。如果您写:
breed [ buyers buyer ]
breed [ sellers seller ]
breed [ cars car ]
NetLogo创建三个特殊代理集:buyers
,sellers
和cars
。这些代理集中的每个仅包含来自相应品种的海龟。还有一个特殊的turtles
代理集,其中包含模型中的所有 all 乌龟,无论它们的种类如何。
除此之外,所有海龟都有一个breed
变量,这些变量引用它们所属的品种代理集。每只乌龟都可以是“未育种”的,并以turtles
作为其breed
变量的值,也可以属于一个(但不超过一个)品种,并以该品种的agentset作为其{{ 1}}变量。
关于breed
变量的一件事是您通常不需要使用它。编写:
breed
具有与书写相同的效果:
ask turtles with [ breed = cars ] [ do-something ]
除了ask cars [ do-something ]
版本比ask cars
版本要快(且可读性强)之外。
我们现在可以看到ask turtles with ...
怎么了吗?根据定义,所有汽车都将ask cars with [breed = buyers ]
作为其cars
变量的值,因此breed
条件将始终为false。这就是为什么该语句什么都不做的原因。 (而且也没有理由给您错误消息。这就像在没有红海龟的情况下要求breed = buyers
做某事:什么也没有发生,但是问没有错。)
现在让我们看看您的第二次尝试:
turtles with [ color = red ]
您说的是“似乎它考虑了所有品种”,但是鉴于我们对品种的工作原理的了解,您应该能够看到它有什么问题,事实并非如此。据我所知,它应该可以工作。
我的猜测是您在某个地方创造了多余的汽车而没有意识到。也许这是另外一回事。我们真的无法用您提供的信息来告诉您。
(一个小小的注解:习惯将刻度线放在ask cars [plotxy attribute_1 ticks]
ask cars [plotxy attribute_2 ticks]
轴上,但是您将它们绘制在x
轴上。)
最后,您最后一次尝试是:
y
我们已经看到if breed = buyers [ask cars [plotxy attribute_1 ticks]]
if breed = sellers [ask cars [plotxy attribute_2 ticks]]
是乌龟变量,因此只能在特定乌龟的上下文中访问它,因此这就是为什么您收到有关在观察者上下文中尝试使用它的警告的原因(即,尝试在乌龟环境之外使用它)。
总而言之,我无法直接解决您的问题,但是我希望对品种如何工作有更好的了解将有助于您找出问题所在。
也许要澄清的最后一件事就是说:
breed
不会在新孵化的汽车与ask one-of sellers [ hatch-cars 1 ]
品种之间建立任何类型的关系。这辆车不知道它是被卖方孵化的。除非您将此信息保存在另一个变量的某个位置,否则无法查询NetLogo的“卖方已经孵化的所有汽车”。但是如何执行此操作是另一个问题(如果需要,欢迎您在此站点上提问)。