1

我想使用策略模式来模块化我的 A* 实现中的启发式,但在分离它时遇到了一些麻烦。我尝试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);
}

我怎样才能分离出我的启发式,以便它可以用来在运行时对我的队列进行排序?

4

1 回答 1

2

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

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

这个问题应该消失。

希望这可以帮助!

于 2013-05-06T03:49:08.977 回答