我现在用Java编写Basic Theta *路径规划算法的实现。我有一个名为Vertex
的类,它实际上是空间中的3D点(location
),指向另一个顶点(parent
)的指针,一个到目标顶点的直接距离的浮点数( distanceToGoalVertex
)和沿着从顶点到起始顶点(distanceToStartVertex
的路径的距离的浮点数,通过跟随连续的父指针并计算总距离来找到。
在另一个课程中,我在有障碍的环境中操纵顶点,以找到从起始顶点到目标顶点的路径。名为open
的数据结构用于保存已标记为展开但尚未展开的顶点。扩展顶点意味着查看8个周围顶点(在网格上)并将它们添加到open
。这里的问题是,当我展开顶点时,我将得到一个顶点集合,其中此集合中的至少一个顶点在展开时将返回原始顶点。这将导致无限循环,因此是不可接受的。为了解决这个问题,我需要一种方法来仅向open
添加之前未访问过的顶点。问题是我不能依赖equals()
Vertex
distanceToStartVertex
方法,因为open
随着到达起始点的路径的增长而随每次迭代而变化。似乎唯一的选择是使用顶点的位置。
最终我需要一个PriorityQueue
的集合,它允许我使用比较器(我已经做过,没有问题)对元素进行排序,并且可以完全基于位置拒绝重复。数据结构还需要具有返回元素的方法,从而最小化比较器。我已经考虑过扩展{{1}}并覆盖添加元素的方法,以便在添加之前检查所有元素的位置,但这看起来效率非常低。我应该如何以不会影响效率的方式制作数据结构?
答案 0 :(得分:0)
对于TreeSet
,您的问题似乎非常理想,除了条件
请注意,如果要正确实现Set接口,则由set维护的排序(无论是否提供显式比较器)必须与equals一致。 (有关与equals一致的精确定义,请参阅Comparable或Comparator。)这是因为Set接口是根据equals操作定义的,但TreeSet实例使用compareTo(或compare)方法执行所有元素比较,因此从集合的角度来看,通过这种方法被认为相等的元素是相等的。
这意味着您仅根据位置排除方法的条件不起作用。
一种选择是围绕TreeMap
创建一个瘦包装类。
public class VertexSet {
private TreeMap<Location, Vertex> treeMap; //todo: instantiate w/ comparator in constructor
public void add(Vertex v){
treeMap.putIfAbsent(v.getLocation(), v);
}
public Vertex pop() {
treeMap.get(treeMap.firstKey());
}
}
此解决方案:
Comparator
订单Location
)不存在,只会添加到地图中,以避免重复