繁体   English   中英

Java中的A * _search_algorithm实现

[英]A*_search_algorithm implementation in java

我试图实现一个A * _search_algorithm,但是在运行时搜索方法retutern null时,我看到如果一个curr节点只有一个已经访问过它的邻居,那么从循环中退出该条件,我需要添加此条件来修复alg?

public Solution search(Searchable s) {

    final StateT start = s.getInitialState();
    final StateT goal = s.getGoalState();

    initPriority(goal);
    start.setCost(0);
    openList.add(start);
    double tempCost;
    while (!(openList.isEmpty())) {
        StateT curr = openList.poll();
        numOfSteps++;

        if (curr.equals(goal))
            return backTrace(curr);

        closedState.add(curr);

        ArrayList<StateT> successors = s.getAllPossibleStates(curr);
        for (StateT stateT : successors) {
        }
        for (StateT successor : successors) {

            tempCost = curr.getCost() + s.dist_between(curr, successor);

            if (closedState.contains(successor))
                continue;

            if (!(openList.contains(successor)))
                openList.add(successor);

            else if (tempCost >= successor.getCost())
                continue;
            successor.setCameFrom(curr);
            successor.setCost(tempCost);
            openList.remove(successor);
            openList.add(successor);
        }// for         
        for (StateT stateT : openList) {
            System.out.println("op:  "+stateT.getState());              
        }
        System.out.println("end");
    }
    return null;
}//

public abstract void initPriority(final StateT goal);


public Solution backTrace(StateT current) {

    Solution solution = new Solution();

    while(current != null){

        solution.getPath().add(current);
        current = (StateT) current.getCameFrom();
    }

    return solution;
}

}

乍一看,该实现在我看来应该是正确的,因为它应该找到一个存在的路径。 这是假设您未提供代码的任何方法(例如getAllPossibleStates() )都已正确实现。

您所描述的情况(以前已经访问过节点的所有可能邻居)的情况不需要进行任何其他处理。 如果这导致您的openList空运行并导致返回null,则仅意味着不存在路径。 您确定测试中存在从起点到目标的路径吗?

另外需要注意的是,该代码实际上并未实现A *算法,而是Dijkstra的算法,因为您没有包括一种启发式算法,该算法可以估算从节点到目标的成本。

暂无
暂无

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

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