我想在我的A *实现中使用strategy pattern来模块化启发式,但是在分离它时遇到了一些麻烦。我尝试使用Comparator
初始化我的优先级队列,该public AStarSearch(Graph g, AStarHeuristic heuristic) {
this.heuristic = heuristic;
this.open = new PriorityQueue<Node>(10, new Comparator<Node>(){
@Override
public int compare(Node n1, Node n2) {
int fScoreOne = n1.getTotalPathWeight() + heuristic.calculate(n1, open);
int fScoreTwo = n1.getTotalPathWeight() + heuristic.calculate(n1, open);
if (fScoreOne < fScoreTwo)
return 1;
else if (fScoreOne > fScoreTwo)
return -1;
return 0;
}
});
}
以下列方式使用我的启发式方法:
public interface AStarHeuristic {
public int calculate(Node curr, Queue<Node> open);
}
但我得到:“不能引用非最终变量启发式内部和内部类在不同方法中定义。”
我在加权完整图上运行它,计划使用基本启发式向开放集中最近的节点移动(我没有目标节点,只有一组需要访问的节点)。当然,为了找到开放集中节点的最小权重边缘,我需要开放节点的列表/队列和当前节点(有一个边缘列表),所以我按如下方式创建了Heuristic接口:
{{1}}
如何将我的heurisitc分开,以便在运行时将其用于对我的队列进行排序?
答案 0 :(得分:2)
这里的问题是你正在创建一个匿名内部类,并且正在尝试引用调用函数中的局部变量(这里是heuristic
)。为此,Java要求将变量标记为final
。如果您尝试将方法更改为
public AStarSearch(Graph g, final AStarHeuristic heuristic) {
// ... Same as before ...
}
问题应该消失。
希望这有帮助!