我是NetLogo的初学者,我想让一些乌龟(来自不同社会阶层的学生)与其他乌龟(学校)建立链接。我想让工人阶级的学生寻找成绩最好的学校,而这同时又不昂贵,并且没有达到允许的最大链接数。如果期望的学校达到了允许的最大链接数,我希望学生寻找成绩最高但未达到允许的最大链接数的下一所学校。
这是代码。我收到以下消息“ ANY?期望输入是一个代理集,但得到了乌龟(学校1)。”
breed [schools school]
breed [upperclass upperclass-student]
breed [workingclass workingclass-student]
upperclass-own [achievement enrolled? target]
workingclass-own [achievement enrolled? target]
schools-own [schoolachievement expensive? ]
to setup
clear-all
set-default-shape schools "house"
set-default-shape upperclass "person"
set-default-shape workingclass "person"
ask patches [ set pcolor 8 ]
create-schools num-of-schools [ setxy random-xcor random-ycor set schoolachievement random-normal 5 1
set expensive? one-of [ true false ] ]
create-upperclass num-of-upperclass [ set color white setxy random-xcor random-ycor set achievement
random-normal 5 1 ] ;Students from upper class have higher achievement
create-workingclass num-of-workingclass [ set color red setxy random-xcor random-ycor set achievement
random-normal 4 1 ]
end
to go
ask workingclass [
choose-school ]
end
to choose-school
if breed = workingclass [
set target one-of schools with-max [ schoolachievement ] with [ expensive? = false ] ]
if any? target with [ count link-neighbors < max-link-count ] [
create-link-with target ]
set enrolled? TRUE
end
答案 0 :(得分:1)
您的问题是座席和座席集之间的差异,这是一个细微的问题。 with-max
返回一个agentset-一组agent(在本例中为turtle)。该代理集可以有0个成员,1个成员,2个以上成员,但是即使是空的也可以是一个集合。但是,one-of
从代理集中选择一个代理,然后将其作为代理而不是代理集返回。也就是说,NetLogo知道one-of
返回的任何内容都必须是一个代理。此时,除非用于代理集的原语(例如any?
)也可以在单个代理上使用,否则它们将引发错误。
因此,回到您的代码。我喜欢先检查一下是否有可行的学校,然后再选择一所学校,这是我认为您想要做的事情的可读性。那应该是:
to choose-school
if breed = workingclass
[ set targets schools with-max [ schoolachievement ] with [ expensive? = false ]
set candidates targets with [ count link-neighbors < max-link-count ]
if any? candidates
[ create-link-with one-of candidates
set enrolled? TRUE
]
]
end
请注意,我还更改了目标,而不是目标,这是一种跟踪某物是代理还是代理集的方法。
您可以这样做并将其保留为代理的另一种方法是:
to choose-school
if breed = workingclass [
set target one-of schools with-max [ schoolachievement ] with [ expensive? = false ] ]
if target != nobody and [count link-neighbors] of target < max-link-count [
create-link-with target ]
set enrolled? TRUE
end
因此,您可以使用nobody
代替any?
,但您也不能在该行中使用with
,因为with
实际上是集合上的过滤器。 / p>
我还认为您存在包围问题-我假设您想将set enrolled? TRUE
放在括号内。我将其保留在第二个修订中,但在第一个错误中进行了更改(以及更改了括号位置约定以使代码块结构更可见)