有条件的网络邻居
Conditional network neighbours
我想 select 通过 link
属性而不是 turtle
属性过滤网络邻居。例如,这可能 select 仅根据友谊 link 的强度得分与最亲密的朋友建立联系。我可以通过为密友设置不同的 link
breeds
来做到这一点,但这需要根据需要或不需要的条件不断改变品种。
下面是一个带有布尔条件的例子。
links-own [flag?]
to testme
clear-all
ask patches [set pcolor white]
create-turtles 20
[ setxy 0.95 * random-xcor 0.95 * random-ycor
set color black
]
ask n-of 3 turtles [set color red]
repeat 40
[ ask one-of turtles
[ create-link-with one-of other turtles
[ set flag? random-float 1 < 0.4
set color ifelse-value flag? [red] [gray]
]
]
]
; colour-neighbours
colour-neighbours2
end
to colour-neighbours
ask turtles with [color = red ]
[ ask my-links with [flag?]
[ ask other-end [ set color blue ]
]
]
end
to colour-neighbours2
ask turtles with [color = red ]
[ ask turtle-set [ other-end ] of my-links with [flag?]
[ set color blue ]
]
end
我目前正在做与 colour-neighbors 相同的工作,但它涉及逐步处理多个上下文。 colour-neighbors2 版本在概念上更接近,因为它直接指代网络邻居。但是,由于 of
,我得到了一个邻居列表,然后我必须将其转换为代理集。
这是为了教学,虽然两者都有效,但与使用 link-neighbors
原语的无条件网络邻居相比,它们似乎非常复杂。也就是说,如果我不关心标志,我可以简单地说 ask link-neighbors [ set color blue ]
.
是否有更直接的方法来根据 link 属性识别网络邻居?
您已经涵盖了大多数可能性。另一种方法是:
to colour-neighbours3
foreach [ other-end ] of my-links with [ flag? ] [ t ->
ask t [ set color blue ]
]
end
我会避免使用 colour-neighbours2
,因为正如您所说,它需要从列表到代理集的转换。我认为您应该使用 colour-neighbours
还是 colour-neighbours3
是个人喜好问题。
只需添加一个 more-convoluted(更糟?)使用代理集的选项:
to colour-neighbours4
ask turtles with [ color = red ] [
let flag-links my-links with [flag?]
ask link-neighbors with [ any? my-links with [ member? self flag-links ] ] [
set color blue
]
]
end
我想 select 通过 link
属性而不是 turtle
属性过滤网络邻居。例如,这可能 select 仅根据友谊 link 的强度得分与最亲密的朋友建立联系。我可以通过为密友设置不同的 link
breeds
来做到这一点,但这需要根据需要或不需要的条件不断改变品种。
下面是一个带有布尔条件的例子。
links-own [flag?]
to testme
clear-all
ask patches [set pcolor white]
create-turtles 20
[ setxy 0.95 * random-xcor 0.95 * random-ycor
set color black
]
ask n-of 3 turtles [set color red]
repeat 40
[ ask one-of turtles
[ create-link-with one-of other turtles
[ set flag? random-float 1 < 0.4
set color ifelse-value flag? [red] [gray]
]
]
]
; colour-neighbours
colour-neighbours2
end
to colour-neighbours
ask turtles with [color = red ]
[ ask my-links with [flag?]
[ ask other-end [ set color blue ]
]
]
end
to colour-neighbours2
ask turtles with [color = red ]
[ ask turtle-set [ other-end ] of my-links with [flag?]
[ set color blue ]
]
end
我目前正在做与 colour-neighbors 相同的工作,但它涉及逐步处理多个上下文。 colour-neighbors2 版本在概念上更接近,因为它直接指代网络邻居。但是,由于 of
,我得到了一个邻居列表,然后我必须将其转换为代理集。
这是为了教学,虽然两者都有效,但与使用 link-neighbors
原语的无条件网络邻居相比,它们似乎非常复杂。也就是说,如果我不关心标志,我可以简单地说 ask link-neighbors [ set color blue ]
.
是否有更直接的方法来根据 link 属性识别网络邻居?
您已经涵盖了大多数可能性。另一种方法是:
to colour-neighbours3
foreach [ other-end ] of my-links with [ flag? ] [ t ->
ask t [ set color blue ]
]
end
我会避免使用 colour-neighbours2
,因为正如您所说,它需要从列表到代理集的转换。我认为您应该使用 colour-neighbours
还是 colour-neighbours3
是个人喜好问题。
只需添加一个 more-convoluted(更糟?)使用代理集的选项:
to colour-neighbours4
ask turtles with [ color = red ] [
let flag-links my-links with [flag?]
ask link-neighbors with [ any? my-links with [ member? self flag-links ] ] [
set color blue
]
]
end