3

我正在尝试编写一个程序,该程序使用 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。(long) 其中 target_id 是基于 OSM 数据的目标节点的 id。(long) 其中x1,y1是源节点的坐标(经纬度)。(float) 其中x2,y2是目标节点的坐标(经纬度)。(浮动)其中成本是从源到目标的生成成本。(浮动)其中反向成本是从目标到源的生成成本(浮动)。在我的 Java 程序中,我有一个数据类 Node,它将我的节点存储在以下结构中,用于存储我的数据库条目:源、目标、成本、x、y、x2、y2 数据类节点本身可以​​存储x1,y1,x2,y2,boolvisited,sourcenode,targetnode,cost,g,h,f。这将被存储两次。一次为 src -> 目标,反之亦然。输入具有以下结构: 起始节点:源 = 0,目标 = 选定的起点,所有其他变量设置为 0。目标节点:源 = 选定的目标点,所有其他变量设置为 0。

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

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

4

1 回答 1

1

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

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

于 2013-05-28T13:42:09.020 回答