java - 人工智能: Graph search and A* implementation with Manhattan Heuristic

标签 java artificial-intelligence graph-algorithm a-star heuristics

This is my project佛罗伦萨大学人工智能类(class)。我必须解决一个经典游戏:带有 8 和 15 格的滑动拼图。 这是我对通用图搜索算法的实现:

public abstract class GraphSearch implements SearchAlgorithm {

protected Queue<Node> fringe;
protected HashSet<Node> closedList;

public GraphSearch() {
    fringe = createFringe();
    closedList = new HashSet<Node>(100);
}

protected abstract Queue<Node> createFringe();

public int getNodeExpanded() {
    return closedList.size();
}

@Override
public Solution search(Puzzle puzzle) {
    fringe.add(new Node(puzzle.getInitialState(), null, null));
    while (!fringe.isEmpty()) {
        Node selectedNode = fringe.poll();
        if (puzzle.getGoalTest().isGoalState(selectedNode.getState())) {
            return new Solution(selectedNode, getNodeExpanded());
        }
        closedList.add(selectedNode);
        LinkedList<Node> expansion = selectedNode.expandNode();
        for (Node n : expansion) {
            if (!closedList.contains(n) && !fringe.contains(n))
                fringe.add(n);
        }
    }
    return new Solution(null, getNodeExpanded());
}

}

这是我的 A* 代码:

public class AStar extends GraphSearch implements InformedSearch {

private Heuristic heuristic;

public AStar(Heuristic heuristic) {
    setHeuristic(heuristic);
}

public Heuristic getHeuristic() {
    return heuristic;
}

@Override
public void setHeuristic(Heuristic heuristic) {
    this.heuristic = heuristic;
}

@Override
protected Queue<Node> createFringe() {
    return new PriorityQueue<Node>(1000, new Comparator<Node>() {

        @Override
        public int compare(Node o1, Node o2) {
            o1.setH(heuristic.h(o1));
            o2.setH(heuristic.h(o2));
            o1.setF(o1.getG() + o1.getH());
            o2.setF(o2.getG() + o2.getH());
            if (o1.getF() < o2.getF())
                return -1;
            if (o1.getF() > o2.getF())
                return 1;
            return 0;
        }
    });
}

}

这是我的曼哈顿启发式代码:

    @Override
public int h(Node n) {
    int distance = 0;
    ArrayList<Integer> board = n.getState().getBoard();
    int[][] multiBoard = new int[N][N];
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            multiBoard[i][j] = board.get(i * N + j);
        }
    }
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            int value = multiBoard[i][j];
            if (multiBoard[i][j] != 0) {
                int targetX = (value - 1) / N;
                int targetY = (value - 1) % N;
                distance += Math.abs(i - targetX) + Math.abs(j - targetY);
            }
        }
    }
    return distance;
}

现在,代码可以工作并找到谜题的解决方案(谜题状态是一个 N*N 值的数组,GoalState 是 [1, 2, 3, 4, 5, 6, 7, 8, 9 ,0] (对于N=3),空白单元格= 0),但是与其他程序(相同的算法和相同的启发式)比较结果,我的程序扩展了不同数量的节点。我认为一般图搜索存在问题......有什么想法吗? :D 谢谢!!!

最佳答案

您的启发式计算是错误的。假设 9 位于棋盘的索引 4 处。您将其 rowRight 值计算为 3 而不是 2。这将导致算法性能不佳。您的行右计算应该是:

int rowRight = (valueFound - 1)/N;

关于java - 人工智能: Graph search and A* implementation with Manhattan Heuristic,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16664676/

相关文章:

java - 数组改组不起作用

artificial-intelligence - 弹性反向传播中的错误?

c# - Tarjan 算法的非递归版本

Java - 使用这个

java - 从四叉树中提取元素

neural-network - 如何在无监督学习中使用 Encog NEAT 网络?

machine-learning - 如何克服 CNN 中的过度拟合 - 标准方法不起作用

algorithm - D* 精简版 : how to compare and sort that paired keys?

algorithm - 将一组顶点连接成一个最优加权图

java - 使用 x==Y 或 (x-y)==0 控制 if 条件的问题