【发布时间】: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