NetLogo:从到特定补丁的距离创建变量

NetLogo: Creating Variable from Distance to Specific Patch

我在 Netlogo 中遇到了一个问题,它为代理提供了到所选水块的距离变量(以块为单位)。 代理人应该根据他们与水的距离采取行动。 我希望代理找到最近的 water = true 的补丁,计算到该补丁的距离并将该特定距离保存在变量中,如果代理移动,该变量可能会改变。

所以我的处理方式如下:

turtles-own
[
next-river-patch
distance-to-river
]

to go
ask turtles
                                            ;find closest patch that has water = true
                                            ;calculate distance to that patch and save it in the turtles-own variable "distance-to-river"
    set next-river-patch (min-one-of patches in-radius 100 with [water = true] [distance myself])
    set distance-to-river distance next-river-patch
    
    
                                           ;check whether there is water in peception radius 
                                           ;and whether directed walk is initiated
    ifelse random-float 1 > water-directedness 
   and
    patches with [water = true] in-radius 300 = true

    [walk-directed]
    [walk-undirected]
    
    tick
    
end 


to walk-directed
                                            ;deviation of random normal is smaller, the further from next 1st order river and is raised by a high pioneering rate
                                            ;with half the distance of the perception radius of 300 resulting in a deviation of 45 degrees and 
                                            ;a pioneering rate of 0.5 leading to no influence onto the final deivation and a pioneering rate of 1 doubling the deviation. 
 let deviation 90 * ( 1 - distance-to-river / 300) * ( 2 * pioneering-along-rivers)
  
  face min-one-of patches with [ water  = true][distance myself]
   rt random-normal 0 (1 * deviation)
  fd 1
end

to walk-undirected
 ask turtles [
  
  rt random-normal 0 (2.25 * descision-randomness * 100)
    fd 1
    
                                            ;it turns into a cumulated normal direction (with the chance of moving straight ahead being highest) and the standard 
                                            ;deviation being defined by the descision-randomness-slider, with default being 45° and max being 225°
  ]
  
end

所以我遇到的问题是行

"设置下一条河流补丁(半径为 100 的最小补丁之一 [water = true] [distance myself])"

returns 一个变量包含 下一块水的坐标。无论如何,我不想要坐标,而是到那个补丁的距离,这样我就可以在我的累积方向上使用它。 设置到河流的距离 next-river-patch 不起作用。

有人知道为什么会这样吗?我对 NetLogo 比较陌生,所以答案可能看起来很明显。

非常感谢!

P.S.:另一个可能与我的模型无关的问题是,代理在每次滴答之前转了几十次,而不是每个代理在前进 1 之前转了一个转。 所以如果你碰巧通过查看代码看到了解决方案,我也将永远感激不已。

最简单的问题优先:

为什么有些海龟每刻移动不止一次?

walk-undirected被海龟调用,它确实ask turtles。所以每只乌龟都在做每只乌龟这样的动作。它应该像其他程序一样,只是执行该操作,没有 ask.

补丁......=真

这是一个错误。您正在将 patches with ... 生成的代理集与布尔值 true 进行比较。代理集永远不可能为真或为假。代理集可以为空,也可以包含一个或多个代理。 any? 报告器用于确定代理集是否有 any 成员。

主要问题

看起来你已经在做你要求的事情了。以 set nearest-river-patch 开头的行获取最近的水域,而 set distance-to-river 行计算到该域的距离。并不是说如果半径 100 内没有任何水,下一个河流补丁将是 nobody.

我没有看到任何可以为您提供坐标的信息(作为列表?)。也许尝试一些括号以确保以正确的顺序评估记者:

set next-river-patch (min-one-of ((patches in-radius 100) with [water = true]) [distance myself])

您也可以使用 with-min

set next-river-patch one-of ( ( ( patches in-radius 100 ) with [ water = true ] ) with-min [distance myself] )

否则,请更正其他错误,看看会发生什么。