Netlogo 为缓冲区中的多边形指定路径成本的步骤

Netlogo 为缓冲区中的多边形指定路径成本的步骤,netlogo,Netlogo,我想在有狼的多边形(例如多边形A)和位于狼周围3公里半径内的所有多边形之间建立成本最低的路径,并找到成本最低的多边形(另请参见。然后,狼向该多边形移动(例如多边形B).从多边形B等重复该过程 to-report path-cost ask wolves [ set my-list-of-polygons-in-buffer ( [plabel] of patches in-radius 3 ) set my-list-of-polygons-in-buffer remove-duplicat

我想在有狼的多边形(例如多边形A)和位于狼周围3公里半径内的所有多边形之间建立成本最低的路径,并找到成本最低的多边形(另请参见。然后,狼向该多边形移动(例如多边形B).从多边形B等重复该过程

to-report path-cost
ask wolves [ 
set my-list-of-polygons-in-buffer ( [plabel] of patches in-radius 3 ) 
set my-list-of-polygons-in-buffer remove-duplicates my-list-of-polygons-in-buffer 
set my-list-of-polygons-in-buffer remove [plabel] of patch-here my-list-of-polygons-in-buffer 
set my-list-of-polygons-in-buffer remove "" my-list-of-polygons-in-buffer 

foreach my-list-of-polygons-in-buffer [ 
let ID-polygon-in-buffer ?
ask patches with [plabel = ID-polygon-in-buffer] [ 
set path-cost calculate-LCP [my-ID-polygon] of myself ID-polygon-in-buffer] ] ]

report [plabel] of (min-one-of patches [path-cost])
end
1) 从多边形A开始,代码起作用,因为只有缓冲区中的多边形具有路径开销。但是从多边形B来看,有一个问题。代码在位于多边形A缓冲区和多边形B缓冲区的多边形中查找成本最低的多边形。代码必须仅查找位于多边形B缓冲区的多边形中成本最低的多边形。如何解决此问题?在从多边形B计算路径成本之前,是否必须重置每个多边形面片的状态变量“路径成本”

 ask patches [
  set path-cost 0 ]
2) 如果三个狼群的缓冲区中都包含同一个多边形,那么路径成本将如何分配给每个面片多边形的状态变量“路径成本”,即,同一个多边形是否可能有3 x成本值

3) 在下图中,为什么最低成本路径不遵循直线?成本最低的路径采用面片对角线,而不是较短的面片边

非常感谢你的帮助

  • 如果一次只有一只狼在计算成本,那么就没有问题了。一个wolf完成后,不再需要该wolf的路径成本值,因此下一个wolf可以覆盖它们。对吗?如果它不好-如果你需要保留信息供以后使用-那么我建议使用链接来存储它;这是在NetLogo中存储多对多信息的常用方法

  • 你的问题1和2是关于同一个问题,但这是完全不同的。请一次问一个问题。在任何情况下,在我看来,我们都不可能用我们掌握的信息为您调试它。应用标准调试技术


  • 我将以相反的方式回答你们的问题

    3) 正如赛斯所提到的,这是一个单独的问题。也就是说,答案是这样的。默认情况下,所有链接的成本相同。也就是说,对角链接的成本与水平链接相同。因此,没有理由选择水平链接而不是对角链接。成本实际上是一样的。可以使用链接权重来解决此问题。只需创建一个新的链接变量(
    成本
    或其他),将其设置为链接的长度,然后使用该变量请求最短加权路径

    2) 不是真的。您可以将
    path cost
    设置为包含不同狼群的值的列表,但我不建议这样做。我不认为使用补丁变量是正确的方法

    1) 您必须将路径成本设置为0,但有更好的方法。此外,您的过程只返回最后一次wolf运行的最小成本路径(因为wolf一直覆盖补丁变量)

    首先,我认为您实际上希望
    path cost
    成为一个wolf过程(我还将它命名为
    least cost polygon
    ,因为它实际上报告了一个多边形)。也就是说,它只是给出了一个狼最近的多边形。因此,这里有一个简化版本,它可以做到这一点,并且不在任何补丁变量中存储任何内容(从而避免冲突,因为没有任何内容被覆盖):


    谢谢你,布莱恩!3) 我已经用成本值对链接进行了加权
    询问链接[设置两端的链接成本和[补丁成本]
    。是否可以通过使用两个加权因子,即节点成本(或补丁成本)和节点之间的距离(或链路长度),使用函数
    nw:weighted distance to
    ?谢谢你的帮助。你可以做
    询问链接[设置链接成本链接长度*两端的总和[补丁成本]
    。谢谢你,布莱恩!1) 是否可以为每个wolf定义一个包含两个子列表的列表作为变量?这是我的想法,但我不知道它是否正确。例如,多边形ID位于第一个子列表中,在第二个子列表中,存在与每个多边形ID相关联的路径成本。然后,我在第二个子列表中找到最低成本,并使用第一个子列表中的函数“position”,找到与此成本相关联的多边形ID。最后,狼以最低的代价向多边形移动。通过这种方式,我不使用patch变量,也许我可以解决问题1和问题2。你可以这样做,但这对我来说太复杂了。如果出于某种原因,您确实需要存储距离,那么这就是存储距离的方法。但据我所知,你不需要储存任何东西。我提供的代码应该解决1和2。正如Bryan所写,您的路径成本不包括链接的长度,因此,长链接的权重也为1.0,而不是1.41(2的平方根),谢谢Seth!2) 我认为有几只狼在同时计算成本。对不起,我不熟悉用于在Netlogo中存储若干信息的链接。模型库中有没有一个例子可以帮助我更好地理解这个链接的使用?谢谢你的帮助。你确定几只狼同时在计算成本,还是你这么认为?在继续实质性地使模型复杂化之前,您应该确定。在NetLogo中,
    询问狼群[…]
    并不意味着所有狼群都同时这么做;它们一次一只。我如何同时计算每只狼的成本?到目前为止,我用一个wolf测试了我的模型,以验证我的代码是正确的并且可以工作。我正在测试几只狼。我不明白为什么要用
    问狼[…]
    计算一只狼的成本?谢谢你的帮助。NetLogo中没有“同时”这样的东西。一次只能执行一个代理。看见
    to-report least-cost-polygon
      [ plabel ] of min-one-of patches in-radius 3 with [ plabel != [plabel] of myself ] [
        calculate-LCP [ my-ID-polygon ] of myself
      ]
    end