我正在制作一个学校项目,我们必须实施A *算法来解决8-puzzle问题。在创建节点并将其添加到队列时,没有问题,但是当我创建第二个节点并尝试将其添加到队列中时,它不能同时对它们进行比较,以检查它是否具有最低的f -cost。
private class Node implements Comparable<Node>{
private Node parent;
private int distance;
private int moves;
private Board board;
public Node(Node parent, Board board, int moves) {
this.parent = parent;
this.board = board;
this.moves = moves;
distance = board.manhattan();
}
@Override
public int compareTo(Node node) {
return this.moves + this.distance - node.moves - node.distance;
}
}
这是我创建Node的类。 现在,当试图测试它是否有效时,我创建了一个slamm JUnit测试,看看它是否可行,但是我得到的错误是我的Node类无法转换为类似的。 以下是我尝试运行的测试代码:
import java.util.PriorityQueue;
import org.junit.Test;
public class UnitTests {
private PriorityQueue<Node> closedPQ = new PriorityQueue<Node>();
@Test
public void pqTest() {
int N = 3, counter = 1;
int[][] tiles = new int[N][N];
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
tiles[i][j] = counter++;
}
}
tiles[2][2] = 0;
tiles[1][1] = 6;
tiles[1][2] = 5;
Board initial = new Board(tiles);
tiles[1][1] = 5;
tiles[1][2] = 6;
Board initial2 = new Board(tiles);
System.out.println(initial.manhattan());
System.out.println(initial2.manhattan());
closedPQ.add(new Node(null, initial, 0));
closedPQ.add(new Node(null, initial2, 0));
Node n = closedPQ.remove();
System.out.println(n.distance);
}
}
首先,你只需要制作一个新的电路板,然后更换一些nubers以获得不同的成本。我得到的错误是当我尝试将第二个节点添加到PQ时。任何人都知道如何解决这个问题?我希望在删除操作时将具有最小fost的节点返回给我。这是我添加到队列中的第二个节点,因为它的manhatten-score为0,而第一个节点的主板的manhatten-score为0。
我得到的失败追踪是:
java.lang.ClassCastException: gna.UnitTests$Node cannot be cast to java.lang.Comparable
at java.util.PriorityQueue.siftUpComparable(Unknown Source)
at java.util.PriorityQueue.siftUp(Unknown Source)
at java.util.PriorityQueue.offer(Unknown Source)
at java.util.PriorityQueue.add(Unknown Source)
at gna.UnitTests.pqTest(UnitTests.java:100)