【发布时间】:2023-03-15 07:54:02
【问题描述】:
从How to speed up least-cost path model at large spatial extents 开始,我尝试在 Netlogo 中编写 A* 算法,以在大空间范围内增加我的最低成本路径模型。这是我的代码:
to findPath [ID-start-node ID-end-node]
let currentNodesInList [ ]
let current-node node ID-start-node
let end-node node ID-end-node
ask current-node [ set color red]
ask end-node [ set color red]
set currentNodesInList lput current-node currentNodesInList
while [not member? end-node currentNodesInList] [
ask current-node [
foreach sort nodes-on neighbors [
ask ? [set f-value [link-cost] of link ([who] of current-node) ([who] of ?) + distance end-node] ]
let next-current-node min-one-of [nodes-on neighbors] of current-node [f-value]
ask link ([who] of current-node) ([who] of next-current-node) [set color red]
set current-node next-current-node
set currentNodesInList lput current-node currentNodesInList] ]
end
当 ID-start-node 和 ID-end-node 在景观中接近时,代码似乎可以工作。但是,当 ID-start-node 和 ID-end-node 之间的距离较大时,路径不会到达 ID-end-node(见下图;但有时,代码可以工作)。
图中ID-start-node和ID-end-node用红色开始表示,路径用红色绘制。
非常感谢您的帮助。
【问题讨论】:
-
只是一个小的编码提示:几乎没有必要或最好使用 who 号码来查找内容。几乎每次你使用 who 号码来做某事时,都有更好的方法。所以例如
link ([who] of current-node) ([who] of ?)可以缩短为[link-with current-node] of ?。 -
至于您的实际问题,我试过了,但仅通过查看您的代码我无法发现错误。除了应用标准调试技术之外,不确定还有什么建议,例如将打印语句添加到您的代码中,以便它告诉您更多关于它在做什么。然后尝试找出最开始出错的地方。
-
非常感谢赛斯。我认为路径没有到达结束节点,因为路径会返回(每次都向后退一步)。所以我不确定 f.value
[link-cost] of link ([who] of current-node) ([who] of ?) + distance end-node的计算是否正确? f.value 是否等于 A* 算法中起始节点与其邻居节点之间的链接成本 + 起始节点和结束节点之间的距离?非常感谢您的帮助。 -
这听起来像是一个很好的问题,您可以使用 NetLogo 本身进行调查。您可以通过在代码中添加
show或print语句并查看数字是否符合您的意图来提出问题。