【问题标题】:A*_search_algorithm implementation in javajava中的A*_search_algorithm实现
【发布时间】:2017-01-03 06:23:19
【问题描述】:

我尝试实现 A*_search_algorithm 但在运行时 搜索方法返回 null 我看到如果一个 curr 节点只有一个已经访问过它的邻居从循环中退出 我需要添加哪个条件来修复算法??

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;
}

}

【问题讨论】:

    标签: java search a-star breadth-first-search


    【解决方案1】:

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

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

    作为附加说明,此代码实际上并未实现 A* 算法,而是 Dijkstra 算法,因为您没有包含估计从节点到目标的成本的启发式算法。

    【讨论】:

    • 谢谢。有一条路。在开放列表比较器中定义的启发式。我会检查你提供什么。
    • 问题出在 getAllPossibleStates() 谢谢!
    猜你喜欢
    • 2011-06-05
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-12
    相关资源
    最近更新 更多