在 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 所说,显然较小的增量会更好。