【问题标题】:OSM and A* AlgorithmOSM 和 A* 算法
【发布时间】:2013-05-28 12:15:24
【问题描述】:

我正在尝试编写一个程序,该程序使用 OSM 数据作为输入计算从 A 到 B 的最短路径(A* 算法)。该程序应该在 Android Java 中运行。 我使用来自 OSM 的数据并使用 osm_2po(将 OSM xml 文件转换为 sql 文件OSM2PO 的应用程序)将其转换为我的 PostGIS 数据库。 我的数据库有以下条目,据我理解,我需要其中的以下变量: source_id、target_id、x1、y1、x2、y2、成本和反向成本。 其中 source_id 是基于 OSM 数据的源节点的 id。 (长) 其中 target_id 是基于 OSM 数据的目标节点的 id。 (长) 其中x1,y1是源节点的坐标(经纬度)。 (漂浮) 其中x2,y2是目标节点的坐标(经纬度)。 (漂浮) 其中 cost 是从源到目标的生成成本。 (漂浮) 其中反向成本是从目标到源的生成成本(浮动)。 在我的 Java 程序中,我有一个数据类 Node,它将我的节点存储在以下结构中,用于存储我的数据库条目: 源、目标、成本、x、y、x2、y2 数据类节点本身可以​​存储x1,y1,x2,y2,boolvisited,sourcenode,targetnode,cost,g,h,f。 这将被存储两次。一次为 src -> 目标,反之亦然。 输入具有以下结构: 起始节点:源 = 0,目标 = 选定的起始点,所有其他变量都设置为 0。 目标节点:source = 选择的目标点,其他变量都设置为0。

我只有用户想要启动的节点,仅此而已。该算法应该找出下一个节点并分别展开它们。 我用于实现的伪代码来自德语维基百科Wikipedia。 openlist 是一个优先队列,而 closedlist 是一个 ArrayList。 在算法中我使用曼哈顿距离来计算 H。

我的问题/问题是: 我的数据结构适合这样的实现吗?或者我是否必须使用为节点存储所有前任和后继节点的结构? 我是否必须通过从数据库中获取数据来设置 h?如果是,我该如何计算 h?是从前一个节点到下一个节点的顶​​点成本吗?

【问题讨论】:

  • 你能“清理”一下你的帖子吗?阅读这么一大段文字需要付出相当大的代价。
  • 我不明白你的数据是什么格式的。既然它来自 GPS,也许 X 和 Y 表示经度和纬度?我需要更多地了解您的数据结构才能给出答案。
  • 我现在添加一些关于数据结构的信息。所以我希望它更容易理解。
  • 我不了解您的数据结构。每个节点应该有一个或多个可能的边到其他节点。你的数据结构没有这个。站在一个节点上,如何分辨哪些节点是电位?
  • 这是我的问题。我实际上正在寻找合适的数据结构,并想知道我的数据结构是否可用。如果不是我必须改变的。

标签: java data-structures routing a-star


【解决方案1】:

如果我理解正确,数据库中的每个条目都是一个图边——它有一个源点和一个目标点。我不知道“h”代表什么。

考虑将 Node 类重命名为“Edge”,因为它似乎代表两个节点之间的路径,而不是单个节点。您可以使用值为 -1、0、1 而不是布尔值的整数作为方向。 但是你的数据结构很好。

【讨论】:

  • 你没看错。 h 应该是 A* 的启发式。 f(x) = g(x)+h(x)。正如我在英文维基百科中看到的那样,应该将 h 设置为每个节点。但是我是否需要节点的第二个数据结构?
  • 对不起,我有点仓促。要使用伪代码算法,您需要节点。我将一个节点定义为 [long nodeId, float x, float y, List neighbours],将一个边定义为 [Node source, Node target, float cost, float reverseCost]。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-22
  • 1970-01-01
  • 2019-03-12
  • 2011-10-22
  • 1970-01-01
相关资源
最近更新 更多