【问题标题】:Representing a map and running A* on it表示地图并在其上运行 A*
【发布时间】:2015-02-08 17:02:53
【问题描述】:

我的问题主要是关于地图表示的,我想听听您的意见。

有一张由一堆道路和它们之间的连接表示的地图 - 假设道路 A 在一个边缘连接到 B、C、D,但从 A 到 C 和 D 只能转弯。 假设我用一张图来表示这一点,其中每条道路都是一条边,每条道路的交汇点/终点都是一个顶点。

我想在这样的表示上运行 A* 或任何其他,但是......在图中从一个节点移动到另一个节点我严格需要知道我来自哪里......我的意思是 - 从哪个方向。我可以移动的下一个顶点取决于我拥有的开放转弯。

我可以保持我来自哪里,但我也希望它尽可能通用,简单的图形解决方案无法让我知道我来自哪里。

您能告诉我您将如何处理这个问题吗?

谢谢!

【问题讨论】:

  • 我猜你要么需要允许对图中的节点或边进行注释,要么有一个单独的数据结构将它们映射到注释(这里的注释只是路径权重和访问的标签)。
  • 你不能直接在堆栈上推送你来自哪里吗?
  • @ChiefTwoPencils 我可以做到,但我也想让它尽可能通用......
  • 堆栈是一个通用容器,我不确定通用性是堆栈的问题。例如,我们知道这就是您的“位置”在一组递归调用中的方式。
  • @ChiefTwoPencils 但是当我要求图表为我提供连接时,简单的图表实现并没有考虑到我来自哪里......所以即使我把这个信息保存在堆栈,我仍然需要为图表提供一些额外的信息

标签: java algorithm gis dijkstra a-star


【解决方案1】:

将每个节点表示为一堆节点,每个进入的道路一个。

让我们有下面的图表。

让我们使用以下规则:

  • 如果从 A 来到 B,那么我们只能转向 D
  • 如果从 C 来到 B,那么我们只能去 E
  • 如果从 A 来到 C,我们就可以同时去 B 和 D
  • 如果从 E 来到 C,那么我们只能去 B

比我们有以下等效图,现在每个节点都标有原始名称和传入路径:

这是允许在这种情况下对有向图使用任何标准算法的通用方式。对于某些算法,您可能需要创建假的源节点或初始节点和接收节点或目标节点来处理在此类图中它们可以表示为每个节点的多个节点,在当前情况下,如果我们从这个鼻子开始,我们可能需要一个额外的节点来描述行为,而不是来自其他一些,但通常它只是表示为经典图的原始结构。

此外,如果 A、D 或 E 始终具有相同的行为,我们实际上并不需要拆分它们。

【讨论】:

  • 你能详细说明一下吗?
  • 哦,我编辑了答案以添加更详细的信息,所以如果还不够,请询问。
猜你喜欢
  • 2018-09-02
  • 1970-01-01
  • 2023-02-14
  • 1970-01-01
  • 2015-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多