我正在使用Netlogo,我想建立一个场景,让我的乌龟不能移动到之前的补丁,也不能移动到前一个补丁(即补丁在t-1和在t-2)。
我已经设置了如下所示的内容。我们的想法是设置当前乌龟已经访问过的邻居的patch_attractive为零,因此无法选择它们。我想我只是在努力克服正确的语法。有问题的行是以“set prior_visited_patches”
开头的行patches-own [patch_attractiveness]
turtles-own [previous2_patches]
to setup
create-turtles 100 [
set previous2_patches (list patch-here)
]
end
to go
tick
ask turtles [
let previous_patchset patch-set previous2_patches
let previously_visited_neighbors neighbors with [member? self previous_patchset]
ask previously_visited_neighbours [
set patch_attractiveness 0
]
face max-one-of neighbors [patch_attractiveness]
fd 1
]
set previous2_patches lput patch-here previous2_patches
if (ticks > 1) [
set previous2_patches remove-item 0 previous2_patches
]
end
现在的代码似乎选择了t-2补丁,但也没有选择t-1补丁。有人有什么好主意吗?我假设“自我”可能不是正确的召唤
非常感谢
答案 0 :(得分:1)
好的,我认为这可以做你想要的。
patches-own [patch-attractiveness]
turtles-own [previous2-patches]
to setup
clear-all
create-turtles 100
[ setxy random-xcor random-ycor
set previous2-patches (list patch-here patch-here)
]
ask patches [ set patch-attractiveness random 50 ]
reset-ticks
end
to go
ask turtles
[ let candidates viable-neighbours neighbors previous2-patches
if any? candidates
[ face max-one-of candidates [patch-attractiveness]
forward 1
set previous2-patches (list patch-here item 0 previous2-patches)
]
]
end
to-report viable-neighbours [ set-of-patches delete-list ]
let viable set-of-patches
foreach delete-list
[ x -> if member? x viable [ ask x [ set viable other viable ] ] ]
report viable
end
首先,我将变量名称更改为连字符而不是下划线。对不起,连字符在NetLogo中很常见,在我出错之前我没有意识到你使用了下划线。
我做了一些简化。由于评论,我废弃了关于将吸引力设置为0的东西。我还简化了设置,以便排除补丁的起始列表只是当前补丁的两个副本(这意味着您不需要if ticks > 1
测试)。我还从当前补丁和现有列表中的相关项创建了新列表 - 您的输入和删除更正确但由于列表只有两个项目,因此更容易阅读。如果您想增加要排除的补丁的内存,则应该保留lput / remove结构。
重要的一点是新程序。你传递了一个agentset(在你的情况下是neighbors
)和一个要排除的代理列表(在你的情况下是turtle变量previous2-patches),它返回一个没有exclusions的agentset。它通过运行列表来完成并且,如果它在代理集中,则使用other
原语删除它。