我正在尝试添加不允许代理人越过道路的条件。道路补丁设置为红色。我似乎无法弄清楚如何使这种情况起作用。如果道路在前方,我最终希望代理商回头。到目前为止,这是我的净徽标代码。
to go
ask turtles [
move
]
tick
if ticks >= 60 [stop]
end
to move
ifelse random-float 1 < q
[
ifelse random-float 1 < w
[uphill veg-suitability]
[uphill pelev]
]
[
move-to one-of neighbors
ldd-normal
]
ifelse [pcolor] of patch-ahead 1 = red
[lt random-float 180]
[fd 1]
end
to ldd-normal
let ldd-distance (ldd-scale)
fd ldd-distance
end
我认为您的移动程序的逻辑有些混乱。首先,您有一个随机的机会转到具有较高关注变量值的色块(带有uphill
原语),或者,如果随机抽取失败,它将移至随机邻居。如果您不希望其移动到红色补丁上,则需要测试所选补丁是否为红色,但是您只需要移动它就无需检查。
移动了乌龟后,然后检查patch-ahead
的颜色。您在这里的问题是patch-ahead
取决于乌龟所面对的方向,而这与它一直在移动的方向无关。您要么使它转弯(尽管可能转弯不够),要么继续前进。因此它实际上从未移开。
我无法给您实际的答案,因为我不知道您的逻辑应该是什么。但是您可以看一下类似的结构:
move-to one-of neighbors with [pcolor != red]
或者,如果红色补丁足够多,有可能没有任何非红色邻居(如果您尝试移动到一个红色邻居,则可能会导致错误,可以使用:
let okay-patches neighbors with [pcolor != red]
if any? okay-patches [move-to one-of okay-patches]
[另一种选择是,您仅打算face
,而不是移至代码的第一部分中的补丁,然后测试它是否面对红色补丁,然后转为红色补丁。