具有网络扩展的最低成本路径

时间:2013-11-27 16:00:28

标签: netlogo

我想绘制一个多边形(由几个补丁组成)之间的最低成本路径,其中有一只狼,所有多边形位于狼周围6的半径范围内。这是我的代码:

步骤1:我按如下方式构建了一个网络,以便在Netlogo中使用网络扩展:

wolves-own [my-cost-of-path my-path] 
patches-own [polygon night-cost LCP-distance-between-polygons]
turtles-own [cost-of-turtle]
links-own [cost-of-link]

to create-network

ask patches [ 
if not any? turtles-here [ 
 sprout 1 [ 
  set shape "dot" 
  set color white
  set size 0.5 ] ] ] 

ask turtles [ 
 set cost-of-turtle [night-cost] of patch-here 
 create-links-with turtles-on neighbors ]  

ask links [ set cost-of-link sum [night-cost] of both-ends ]

end

步骤2:我将功能“最低成本路径”定义如下:

to-report least-cost-path [ID-polygon] 
let my-cost-of-path -1 

ask wolves [ 
foreach sort turtles-on patches with [plabel = ID-polygon] [  
  let turtle-on-polygon ? 
  nw:set-snapshot turtles links

 ask turtles-here [ let cost nw:weighted-distance-to turtle-on-polygon "cost-of-link"
    if my-cost-of-path = -1 or cost < my-cost-of-path [
      set my-cost-of-path cost
      set my-path nw:weighted-path-to turtle-on-polygon "cost-of-link" ] ] ]

foreach my-path [
  ask ? [ set color red
    set thickness 0.2 ] ] ]

report my-cost-of-path

end 

步骤3:我使用“最低成本路径”功能在狼和围绕狼的半径为6的所有多边形之间建立路径:

ask wolves [      
 ask patches in-radius 8 [ 
 let list-ID-polygon-in-buffer ( [plabel] of patches in-radius 8 ) 
 set list-ID-polygon-in-buffer remove-duplicates list-ID-polygon-in-buffer 
 set list-ID-polygon-in-buffer remove [plabel] of patch-here list-ID-polygon-in-buffer 
 set list-ID-polygon-in-buffer remove "" list-ID-polygon-in-buffer 

  foreach list-ID-polygon-in-buffer [ 
   let ID-polygon-in-buffer ? 
    ask patches with [plabel = ID-polygon-in-buffer] [ 
     set LCP-distance-between-polygons least-cost-path ID-polygon-in-buffer ] ] ] ]

使用此代码,我有两个问题:

1)步骤2中的变量“cost”为FALSE / TRUE。相反,“成本”必须是一个数字。因此,我有一条错误消息:&lt;运算符只能用于两个数字。

2)在步骤2中,变量“my-cost-of-path”和“my-path”必须特定于狼:狼自己[my-cost-of-path my-path]。我有一条错误消息,因为在我的代码中,“my-cost-of-path”和“my-path”并不特定于海龟(这些变量位于“ask turtles-here”)。

非常感谢你的帮助。

1 个答案:

答案 0 :(得分:3)

关于1):

如果没有路径,则

nw:weighted-distance-to报告false

如果没有路径,因为您的网络似乎已完全连接?好吧,问题是你不是只处理你的网络中的海龟:你要求狼ask turtles-here寻找一些路径。但狼本身包含在turtles-here中,狼没有连接到网络!

你也许可以逃脱ask other turtles-here,但你必须确保同一个补丁上没有其他狼。

要做的最好的事情可能是为网络中的节点创建一个单独的品种。如果您有一个名为nodes的品种,您可以说ask nodes-here,这样可以很好地解决您的问题。

关于2):

您发布的代码无法编译,因为您尝试在let my-cost-of-path -1报告者的顶部least-cost-path,但my-cost-of-path已经是wolf变量。你的代码让我很困惑,所以我无法给你一个完整的解决方案。

您的least-cost-path记者是应该对局部变量还是狼变量进行操作?如果需要局部变量,则应具有不同的名称。另一方面,如果你想直接对你的狼变量进行操作,least-cost-path成为一名记者可能没什么意义(最后你肯定无法报告my-cost-of-path它)。你可能需要稍微重组一下......

相关问题