在 Netlogo 中协助 Node/link 导航

Assistance with Node/link navigation in Netlogo

我是 netlogo 的新手,正在开发一个包含平面图的模型,在该平面图中,代理人基本上撤离建筑物,避开障碍物等。我已经设置了我的模型,以便在建筑物内的每个补丁上都有一个节点发芽,并通过修改我在 Luke C 在这里找到的一个示例我已经将代理程序编程为 select 通往出口的路径。

然而,我遇到的问题是,每个滴答声只有一个代理移动。有什么办法可以改变这个吗?因此,例如,代理将每刻向前移动 1 个补丁,以这种方式在代理之间循环?我知道一个以上的代理不能在每个滴答声中移动。提前致谢!

这是代码

extensions [ nw ]

breed [nodes node]
breed [evacuees evacuee]
breed [leaders leader]
breed [cells cell]


evacuees-own [panic calm speed fear direction enterthenetwork]
leaders-own [calm speed ]


to setup
ca
clear-all
set-default-shape turtles "person";
import-pcolors "foreal2.png"

set-default-shape nodes "circle"


ask patches with [ pcolor = white ] [

sprout-nodes 1 [
  set size 0.5
  set shape "circle"
  set color green
  ]
 ]

ask nodes [
create-links-with turtles-on neighbors4 [
  set color green
]
]

ask n-of evacnum nodes [
hatch 1 [
  set size 10
  set color green
  set breed evacuees
  set shape "person"
]
]

ask n-of 2 evacuees [
set color blue
]


ask patch 146 199
[

  sprout-cells 1 [
    set size 1.5
    set shape "box"
    set color yellow
  ]
 ]

  reset-ticks
  end

to avoid-walls
let front-patches patches in-cone 2 75
if [pcolor] of one-of front-patches = black [set heading heading - -120]
end



to go

let ready-evacuees evacuees with [ color = green ]


let evac-proxies turtle-set map [ i -> [nodes-on patch-here] of i ] sort 
ready-evacuees



ask one-of cells [


let node-proxy one-of nodes-on neighbors4


ask node-proxy [

  let my-evac-proxy min-one-of evac-proxies [length ( nw:turtles-on-path- 
to myself) ]

  ask my-evac-proxy [

    let path-to-follow nw:turtles-on-path-to myself


   ask turtle-set path-to-follow [
     set color orange
    ]

    let ready-evacuee one-of evacuees-here with [ color = green ]
    ask ready-evacuee[
      set color yellow
    ]

    ask ready-evacuee [
      foreach path-to-follow [
        n ->
        face n
        move-to n


        wait 0.1
      ]
    ]
   ]
  ]
  ]
 end

不幸的是,这不是简单地更改一些代码以使其工作的简单解决方法。您似乎有一个基本的概念问题。在代码级别,您正在使用 wait 0.1 立即停止所有发生的事情,并且您没有任何命令 tick 来提前时间。

从概念上讲,您需要将开始时存在的事物与随时间发生的事物分开。您已完成此操作,将您的模型正常分解为 setupgo 过程。但是在时间进程中,您需要将 tick 想象成代表某个特定时间量(比方说 10 秒)。在 10 秒的时间内发生了什么——你所有的撤离人员都移动到下一个节点,或者至少移动到它或其他任何地方。

作为第一个近似值:

  1. ask 替换你的 ask one-of 类型结构(这将指示他们全部这样做)。
  2. 删除wait指令
  3. 添加 tick 作为 go 过程中的最后一个命令(以推进时钟)

那么每次按下“开始”按钮时,它都会随时间移动。您可以通过选中 'forever' 框来编辑 go 按钮以重复 运行 go 过程。

这是一个完整的模型,可以为您提供一个起点。它包括向疏散点移动并使用 min-n-of(如 min-one-of)找到可以移动的地方。您将需要使用速度滑块(顶部中间)来减慢速度以查看行为。

要构建您的模型,请尝试进行较小的更改并让它们起作用,然后再添加下一个元素。例如,在你整理好运动之前,你不应该考虑墙壁。目前还不清楚所有不同品种的用途。

breed [nodes node]

breed [evacuees evacuee]
evacuees-own
[ target
]

to setup
  clear-all
  create-evacuees 100
  [ setxy random-xcor random-ycor
    set shape "person"
    set color blue
  ]
  create-nodes 20
  [ setxy random-xcor random-ycor
    set shape "circle"
    set color red
  ]
  ask evacuees
  [ set target one-of min-n-of 5 nodes [distance myself]
    face target
  ]
  reset-ticks
end

to go
  move
end

to move
  ask evacuees
  [ forward 0.25
    if distance target < 0.2
    [ set target one-of min-n-of 5 nodes [distance myself]
    ]
    face target
  ]
end