如何在A *(运行时启发式)中模块化启发式

时间:2013-05-06 03:39:28

标签: java algorithm search

我想在我的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分开,以便在运行时将其用于对我的队列进行排序?

1 个答案:

答案 0 :(得分:2)

这里的问题是你正在创建一个匿名内部类,并且正在尝试引用调用函数中的局部变量(这里是heuristic)。为此,Java要求将变量标记为final。如果您尝试将方法更改为

public AStarSearch(Graph g, final AStarHeuristic heuristic) {
     // ... Same as before ...
}

问题应该消失。

希望这有帮助!