我一直在使用 NetLogo 开发基于疏散代理的模型,我想让一些代理遵循多线形状。
作为上下文,我有一个带有节点和边缘的城市网络(基本上是一个图),我预先计算了从节点到出口节点(我项目中的避难所)的最短路径,但到目前为止它适用于直线(单行)。
基本上我现在所做的是,对于每个代理,我设置其下一个节点,朝向它,然后将其移动一定距离,如下所示:
set next_node (something something)
set heading towards next_node
fd distance
我现在想做的是设置下一个节点,但代理沿着非直线(多线)边缘从节点 A 移动到节点 B。
有什么办法可以做到这一点吗?
PS:随着更多上下文,每个代理都有自己的速度,每次更新都会更新,甚至取决于前面的代理。
这在某种程度上取决于您如何处理非直线(多线)边缘。我建议您查看鼠标记录示例(请参阅 Netlogo 模型库),其中他们使用落笔保存路径列表中节点之间的坐标。然后海龟移动到列表中的下一个坐标。通过这种方式,您可以确保尽管路径沿与终点位置相反的方向移动,但您仍将继续沿着路线行驶。
或者,您可以通过将图形上传为图片来使用类似的东西,其中路径的 pcolor 与非路径补丁不同。比使用类似的东西:
turtles-own [
target
reached-target?
visited-patches]
to setup
create-turtles 1 [
set visited-patches (list patch-here)
set reached-target true
]
end
to go
set-speed
move
end
to set-new-target
end
to move
ask turtles [
repeat my-speed [
if reached-target? [
set-new-target
set reached-target? false
]
;; Select next location of next step the patch with road color that you haven't stepped on before (visited-patches) and that is closed to target location
let location-next-step min-one-of patches with [pcolor = red and member? self [visited-patches] of myself = false] [distance [target] of myself]
face location-next-step
set visited-patches visited-patches lput patch-here visited-patches
if length visited-patches > 2 [set visited-patches but-first visited-patches]
;; clean up recently visited patches.
move-to location-next-step
if target = patch-here? [
set reached-target? true
set visited-patches (list patch-here)
]
]
]