【问题标题】:PathFinding Algorithm: How to handle changing Weights Efficiently寻路算法:如何有效地处理权重变化
【发布时间】:2009-04-02 23:48:01
【问题描述】:

所以,我有一个简单的寻路算法,它预先计算到几个目标端点的最短路径,每个目标端点都有不同的权重。这在某种程度上相当于在一个端点和每个端点之间有一个节点,尽管那里的边具有不同的权重。它使用的算法是一种简单的传播算法,在 1d 中看起来是这样的(| 表示墙,- 表示空间):

  • 5 - - - 3 | - - - 2 - - - - 2
  • 5 4 - - 3 | - - - 2 - - - - 2 : Handled distance 5 nodes
  • 5 4 3 - 3 | - - - 2 - - - - 2 : Handled distance 4 nodes
  • 5 4 3 2 3 | - - - 2 - - - - 2 : Handled distance 3 nodes
  • 5 4 3 2 3 | - - 1 2 1 - - 1 2 : Handled distance 2 nodes
  • Done. Any remaining rooms are unreachable.

所以,假设我有一个像这样的预先计算的寻路解决方案,其中只有 5 个是目标:

- - - - | 5 4 3 2 1 -

如果我把墙改成房间。重新计算很简单。只需重新处理所有距离节点(但忽略已经存在的节点)。但是,我无法找到一种有效的方法来处理如果 4 变成一堵墙该怎么办。显然结果是这样的:

- - - - | 5 | - - - -

但是,在 2d 解决方案中,我不确定如何有效地处理 4。很容易存储 4 依赖于 5,因此需要重新计算,但我如何安全地确定它的新依赖项和值?我宁愿避免重新计算整个数组。

一个总比没有好的解决方案是(大致)仅重新计算曼哈顿距离为 5 与 5 之间的数组元素,并维护源信息。 这基本上意味着将算法重新应用于选定区域但是我可以做得更好吗?

【问题讨论】:

    标签: language-agnostic path-finding


    【解决方案1】:

    嗯。我想出的一个解决方案是: 保留从每个节点最快可达的节点列表。如果一个节点变成了一堵墙,检查它可以从哪个节点到达并获取相应的列表。然后使用标准算法重新检查所有这些节点。当到达新距离较小的节点时,将其标记为需要重新测试。

    获取所有未标记的标记节点的邻居,并在它们上重新应用算法,忽略此技术命中的任何标记节点。如果重新应用的算法增加了标记节点的值,则使用新值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-02
      • 2020-08-25
      • 2012-11-18
      • 1970-01-01
      • 2013-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多