我想绘制一个多边形(由几个补丁组成)之间的最低成本路径,其中有一只狼,所有多边形位于狼周围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”)。
非常感谢你的帮助。
答案 0 :(得分:3)
nw:weighted-distance-to
报告false
。
如果没有路径,因为您的网络似乎已完全连接?好吧,问题是你不是只处理你的网络中的海龟:你要求狼ask turtles-here
寻找一些路径。但狼本身包含在turtles-here
中,狼没有连接到网络!
你也许可以逃脱ask other turtles-here
,但你必须确保同一个补丁上没有其他狼。
要做的最好的事情可能是为网络中的节点创建一个单独的品种。如果您有一个名为nodes
的品种,您可以说ask nodes-here
,这样可以很好地解决您的问题。
您发布的代码无法编译,因为您尝试在let my-cost-of-path -1
报告者的顶部least-cost-path
,但my-cost-of-path
已经是wolf
变量。你的代码让我很困惑,所以我无法给你一个完整的解决方案。
您的least-cost-path
记者是应该对局部变量还是狼变量进行操作?如果需要局部变量,则应具有不同的名称。另一方面,如果你想直接对你的狼变量进行操作,least-cost-path
成为一名记者可能没什么意义(最后你肯定无法报告my-cost-of-path
它)。你可能需要稍微重组一下......