在 Netlogo 中找到给定颜色之前到下一个补丁的距离
Finding the distance to the next patch ahead of a given color in Netlogo
我正在尝试模拟捕食者在充满障碍的世界中捕食猎物。在无障碍世界中,捕食者进行随机游走,直到猎物落在一定的探测半径内(react-D),然后移向猎物进行捕获。我想可能有几种方法来处理阻挡视线的障碍物,但我最初的努力是沿着以下几条线:
ifelse any? prey in-radius react-D
[let target min-one-of prey in-radius react-D [distance myself]
face target
...move towards target if it's closer than the nearest obstacle (blue patch) ahead
]
[continue to random walk, avoiding obstacles
]
ifelse 的第一个条件可能需要另一个 ifelse。在任何情况下,我认为我只需要前面最近的蓝色补丁的距离来与目标距离进行比较,但我不清楚如何从 patch-ahead
中获得它。
如果我能把所有这些都放在第一个 ifelse 的测试中会更好,但是像下面这样的东西不允许不阻挡猎物视线的补丁:
ifelse any? prey in-radius react-D and min-one-of (patches in-radius react-D with [pcolor = blue])[distance myself] > min-one-of (prey in-radius react-D) [distance myself]
视线实际上在 NetLogo 中建模非常棘手。目前,我通过创建一个乌龟(不可见的,称为爬虫的独立品种)来实现这一点,代理正在寻找并让爬虫以小步前进,检查它所在的补丁的颜色。这进入了一个 while 循环,爬虫在发现错误的颜色或到达目标距离时停止。爬虫必须采取小步,因为越过补丁的角落仍然会阻止它,这是分辨率(爬虫步有多小)与效率之间的权衡。
你几乎可以肯定地通过创建一个 patch-set
作为 patches
的并集与 patch-ahead
的多个距离(如 0.1、0.2、.... 和然后检查 any?
那个补丁集
我目前的解决方案,给所有障碍物补丁patches-own [ ob ]
值1,然后使用while来检测前方的障碍物:
to detect-ahead
let dist 1
let last-patch patch-here
while [dist <= react-D] [
let p patch-ahead dist
if p != last-patch and [ob] of p = 1 [
ask p [ sprout-markers 1 [ set color yellow ] ]
set last-patch p
]
set dist dist + 1
]
end
那么应该只是比较min-one-of
标记代理集和目标的情况。正如 JenB 所说,显然较小的增量会更好。
我正在尝试模拟捕食者在充满障碍的世界中捕食猎物。在无障碍世界中,捕食者进行随机游走,直到猎物落在一定的探测半径内(react-D),然后移向猎物进行捕获。我想可能有几种方法来处理阻挡视线的障碍物,但我最初的努力是沿着以下几条线:
ifelse any? prey in-radius react-D
[let target min-one-of prey in-radius react-D [distance myself]
face target
...move towards target if it's closer than the nearest obstacle (blue patch) ahead
]
[continue to random walk, avoiding obstacles
]
ifelse 的第一个条件可能需要另一个 ifelse。在任何情况下,我认为我只需要前面最近的蓝色补丁的距离来与目标距离进行比较,但我不清楚如何从 patch-ahead
中获得它。
如果我能把所有这些都放在第一个 ifelse 的测试中会更好,但是像下面这样的东西不允许不阻挡猎物视线的补丁:
ifelse any? prey in-radius react-D and min-one-of (patches in-radius react-D with [pcolor = blue])[distance myself] > min-one-of (prey in-radius react-D) [distance myself]
视线实际上在 NetLogo 中建模非常棘手。目前,我通过创建一个乌龟(不可见的,称为爬虫的独立品种)来实现这一点,代理正在寻找并让爬虫以小步前进,检查它所在的补丁的颜色。这进入了一个 while 循环,爬虫在发现错误的颜色或到达目标距离时停止。爬虫必须采取小步,因为越过补丁的角落仍然会阻止它,这是分辨率(爬虫步有多小)与效率之间的权衡。
你几乎可以肯定地通过创建一个 patch-set
作为 patches
的并集与 patch-ahead
的多个距离(如 0.1、0.2、.... 和然后检查 any?
那个补丁集
我目前的解决方案,给所有障碍物补丁patches-own [ ob ]
值1,然后使用while来检测前方的障碍物:
to detect-ahead
let dist 1
let last-patch patch-here
while [dist <= react-D] [
let p patch-ahead dist
if p != last-patch and [ob] of p = 1 [
ask p [ sprout-markers 1 [ set color yellow ] ]
set last-patch p
]
set dist dist + 1
]
end
那么应该只是比较min-one-of
标记代理集和目标的情况。正如 JenB 所说,显然较小的增量会更好。