45 lines
1.3 KiB
Java
45 lines
1.3 KiB
Java
package Assignments.A1.solving_algorithms;
|
|
|
|
import Assignments.A1.models.Board;
|
|
import Assignments.A1.models.BoardNode;
|
|
import Assignments.A1.models.Move;
|
|
|
|
import java.util.Comparator;
|
|
import java.util.HashSet;
|
|
import java.util.List;
|
|
import java.util.PriorityQueue;
|
|
|
|
public class AStar {
|
|
private final Board solved = new Board();
|
|
private final HashSet<Board> visited = new HashSet<>();
|
|
|
|
public Board traverse(Board root) {
|
|
PriorityQueue<BoardNode> boards = new PriorityQueue<>(new UCSPriority());
|
|
boards.add(new BoardNode(root, null));
|
|
BoardNode node = null;
|
|
Board current = new Board(root);
|
|
while (!current.equals(solved)) {
|
|
node = boards.poll();
|
|
current = node.board;
|
|
if (visited.contains(node.board)) {
|
|
continue;
|
|
}
|
|
visited.add(node.board);
|
|
List<Move> children = node.board.getMoves();
|
|
for (Move move : children) {
|
|
Board child = new Board(node.board);
|
|
child.swap(move);
|
|
boards.add(new BoardNode(child, node));
|
|
}
|
|
}
|
|
return node.board;
|
|
}
|
|
}
|
|
|
|
class AStarPriority implements Comparator<BoardNode> {
|
|
@Override
|
|
public int compare(BoardNode o1, BoardNode o2) {
|
|
return Integer.compare(o2.cost, o1.cost);
|
|
}
|
|
}
|