繁体   English   中英

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

[英]How to modularize heuristic in A* (run-time heuristic)

我想使用策略模式对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);
}

如何分离出heurisitc,以便可以在运行时对Queue进行排序?

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

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

问题应该消失了。

希望这可以帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM