Bugfix
- fixed heuristic for puzzle8 - fixed test
This commit is contained in:
@@ -26,8 +26,9 @@ public class Puzzle8 implements Iterable<Integer> {
|
|||||||
for(var i = 0; i < n; i++) index[p1.puzzle[i]] = i;
|
for(var i = 0; i < n; i++) index[p1.puzzle[i]] = i;
|
||||||
for(var i = 0; i < n; i++) {
|
for(var i = 0; i < n; i++) {
|
||||||
var curr = p2.puzzle[i];
|
var curr = p2.puzzle[i];
|
||||||
var i2 = index[curr];
|
if(curr == 0) continue;
|
||||||
|
|
||||||
|
var i2 = index[curr];
|
||||||
sum += Math.abs((i / LENGTH) - (i2 / LENGTH)) + Math.abs((i % LENGTH) - (i2 % LENGTH));
|
sum += Math.abs((i / LENGTH) - (i2 / LENGTH)) + Math.abs((i % LENGTH) - (i2 % LENGTH));
|
||||||
}
|
}
|
||||||
return sum;
|
return sum;
|
||||||
@@ -265,7 +266,7 @@ public class Puzzle8 implements Iterable<Integer> {
|
|||||||
public List<Move> solve(Puzzle8 goal) {
|
public List<Move> solve(Puzzle8 goal) {
|
||||||
if(!this.isSolvable(goal)) return null;
|
if(!this.isSolvable(goal)) return null;
|
||||||
|
|
||||||
var aStar = new AStar<Puzzle8, Move>(Puzzle8::availableMoves, (p, m) -> new Puzzle8(p, m));
|
var aStar = new AStar<Puzzle8, Move>(Puzzle8::availableMoves, Puzzle8::new);
|
||||||
aStar.setHeuristic(HEURISTIC_MANHATTAN);
|
aStar.setHeuristic(HEURISTIC_MANHATTAN);
|
||||||
|
|
||||||
return aStar.solve(this, Objects.requireNonNull(goal));
|
return aStar.solve(this, Objects.requireNonNull(goal));
|
||||||
|
|||||||
@@ -126,11 +126,8 @@ public class TestPuzzle {
|
|||||||
public void testSolve() {
|
public void testSolve() {
|
||||||
var puzzle = new Puzzle8(3,5,6,1,2,4,0,7,8);
|
var puzzle = new Puzzle8(3,5,6,1,2,4,0,7,8);
|
||||||
var puzzleGoal = new Puzzle8(1,2,3,4,5,6,7,8,0);
|
var puzzleGoal = new Puzzle8(1,2,3,4,5,6,7,8,0);
|
||||||
var solution = new Puzzle8.Move[] {RIGHT, UP, RIGHT, UP, LEFT, LEFT, DOWN, RIGHT, DOWN, RIGHT, UP, UP, LEFT, DOWN, RIGHT, DOWN};
|
|
||||||
var actual = puzzle.solve(puzzleGoal).toArray(new Puzzle8.Move[0]);
|
var actual = puzzle.solve(puzzleGoal).toArray(new Puzzle8.Move[0]);
|
||||||
|
|
||||||
assertArrayEquals(solution, actual);
|
|
||||||
|
|
||||||
for(var move : actual) puzzle.move(move);
|
for(var move : actual) puzzle.move(move);
|
||||||
assertEquals(puzzleGoal, puzzle);
|
assertEquals(puzzleGoal, puzzle);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user