NetLogo中如何让智能体遵循多线形状?

问题描述 投票:0回答:1

我一直在使用 NetLogo 开发基于疏散代理的模型,我想让一些代理遵循多线形状。

作为上下文,我有一个带有节点和边缘的城市网络(基本上是一个图),我预先计算了从节点到出口节点(我项目中的避难所)的最短路径,但到目前为止它适用于直线(单行)。

基本上我现在所做的是,对于每个代理,我设置其下一个节点,朝向它,然后将其移动一定距离,如下所示:

set next_node (something something)
set heading towards next_node
fd distance

我现在想做的是设置下一个节点,但代理沿着非直线(多线)边缘从节点 A 移动到节点 B。

有什么办法可以做到这一点吗?

an urban network example where an edge is not straight

PS:随着更多上下文,每个代理都有自己的速度,每次更新都会更新,甚至取决于前面的代理。

netlogo
1个回答
0
投票

这在某种程度上取决于您如何处理非直线(多线)边缘。我建议您查看鼠标记录示例(请参阅 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)
      ]
    ]  
 ]
© www.soinside.com 2019 - 2024. All rights reserved.