在 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
来提前时间。
从概念上讲,您需要将开始时存在的事物与随时间发生的事物分开。您已完成此操作,将您的模型正常分解为 setup
和 go
过程。但是在时间进程中,您需要将 tick
想象成代表某个特定时间量(比方说 10 秒)。在 10 秒的时间内发生了什么——你所有的撤离人员都移动到下一个节点,或者至少移动到它或其他任何地方。
作为第一个近似值:
- 用
ask
替换你的 ask one-of
类型结构(这将指示他们全部这样做)。
- 删除
wait
指令
- 添加
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
我是 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
来提前时间。
从概念上讲,您需要将开始时存在的事物与随时间发生的事物分开。您已完成此操作,将您的模型正常分解为 setup
和 go
过程。但是在时间进程中,您需要将 tick
想象成代表某个特定时间量(比方说 10 秒)。在 10 秒的时间内发生了什么——你所有的撤离人员都移动到下一个节点,或者至少移动到它或其他任何地方。
作为第一个近似值:
- 用
ask
替换你的ask one-of
类型结构(这将指示他们全部这样做)。 - 删除
wait
指令 - 添加
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