Still development of DFS, nonfunctional. Pushing to access on other device.
This commit is contained in:
parent
41c04cacec
commit
d8bea791fb
@ -2,13 +2,13 @@ package Assignments.A1;
|
|||||||
|
|
||||||
// Potentially will be changed to an UI Implementation with JavaFX if time permits.
|
// Potentially will be changed to an UI Implementation with JavaFX if time permits.
|
||||||
|
|
||||||
|
|
||||||
import Assignments.A1.models.BoardGenerator;
|
|
||||||
import Assignments.A1.models.Board;
|
import Assignments.A1.models.Board;
|
||||||
import Assignments.A1.models.Piece;
|
import Assignments.A1.models.BoardGenerator;
|
||||||
import Assignments.A1.solving_algorithms.DFS;
|
import Assignments.A1.solving_algorithms.DFS;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Board will be used to save locations in a 2D array.
|
* Board will be used to save locations in a 2D array.
|
||||||
@ -24,16 +24,29 @@ import java.util.ArrayList;
|
|||||||
public class Driver {
|
public class Driver {
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
DFS solver = new DFS();
|
ArrayList<Long> timer = new ArrayList<>();
|
||||||
|
int successes = 0;
|
||||||
|
for (int run = 0; run < 100; run++) {
|
||||||
Board board = BoardGenerator.generateBoard();
|
Board board = BoardGenerator.generateBoard();
|
||||||
boolean result = solver.traverse(board);
|
DFS solver = new DFS();
|
||||||
int count = 0;
|
Date start = new Date();
|
||||||
while (count != 100 || !result) {
|
Board result = solver.dfs(board,0);
|
||||||
result = solver.traverse(board);
|
Date end = new Date();
|
||||||
System.out.println(count);
|
if (result != null) {
|
||||||
count++;
|
System.out.println("solved");
|
||||||
board = BoardGenerator.generateBoard();
|
long runtime = end.getTime() - start.getTime();
|
||||||
|
timer.add(runtime);
|
||||||
|
successes++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
long total = 0;
|
||||||
|
for (int i = 0; i < timer.size(); i++) {
|
||||||
|
total += timer.get(i);
|
||||||
|
System.out.println("Run " + (i+1) + ": " + timer.get(i));
|
||||||
|
}
|
||||||
|
long average = total / (long) timer.size();
|
||||||
|
System.out.println("Average Runtime: " + average);
|
||||||
|
System.out.println("Number of successful solves: " + successes + "/100");
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -21,12 +21,14 @@ public class BoardGenerator {
|
|||||||
public static Board generateBoard() {
|
public static Board generateBoard() {
|
||||||
Board ideal = new Board();
|
Board ideal = new Board();
|
||||||
Random random = new Random();
|
Random random = new Random();
|
||||||
int numOfMoves = random.nextInt(30,50);
|
do {
|
||||||
|
int numOfMoves = random.nextInt(100, 150);
|
||||||
for (int i = 0; i < numOfMoves; i++) {
|
for (int i = 0; i < numOfMoves; i++) {
|
||||||
List<Move> moves = ideal.getMoves();
|
List<Move> moves = ideal.getMoves();
|
||||||
Move randomMove = moves.get(random.nextInt(moves.size()));
|
Move randomMove = moves.get(random.nextInt(moves.size()));
|
||||||
ideal.swap(randomMove);
|
ideal.swap(randomMove);
|
||||||
}
|
}
|
||||||
|
} while (ideal.equals(new Board()));
|
||||||
return ideal;
|
return ideal;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -43,68 +43,29 @@ public class DFS {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean traverse(Board root) {
|
public Board dfs(Board root, int depth) {
|
||||||
BoardNode current = new BoardNode(root);
|
counter++;
|
||||||
Stack<BoardNode> lvr = new Stack<>();
|
Stack<Board> stack = new Stack<>();
|
||||||
lvr.push(current);
|
stack.push(root);
|
||||||
while (!lvr.isEmpty()) {
|
|
||||||
BoardNode curr = lvr.pop();
|
|
||||||
if (curr.board.equals(solved)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
List<Move> moves = curr.board.getMoves();
|
|
||||||
for (Move move : moves) {
|
|
||||||
Board child = new Board(curr.board);
|
|
||||||
child.swap(move);
|
|
||||||
if (!curr.hasAncestor(child)) {
|
|
||||||
BoardNode childNode = new BoardNode(child, curr);
|
|
||||||
curr.addChild(childNode);
|
|
||||||
lvr.add(childNode);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
|
|
||||||
|
while (!stack.isEmpty()) {
|
||||||
|
Board current = stack.pop();
|
||||||
|
if (current.equals(solved)) {
|
||||||
|
return current;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (depth == Parameters.MAX_DEPTH || tried.contains(current.toString())) {
|
||||||
|
continue;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
tried.add(current.toString());
|
||||||
|
|
||||||
class BoardNode {
|
List<Move> moves = current.getMoves();
|
||||||
|
for (Move next : moves) {
|
||||||
public Board board;
|
Board child = next.getBoard();
|
||||||
public BoardNode parent;
|
child.swap(next);
|
||||||
public List<BoardNode> children;
|
stack.push(child);
|
||||||
|
|
||||||
public BoardNode(Board child, BoardNode parent) {
|
|
||||||
this.board = child;
|
|
||||||
this.parent = parent;
|
|
||||||
this.children = new ArrayList<>();
|
|
||||||
}
|
|
||||||
|
|
||||||
public BoardNode (Board child) {
|
|
||||||
this.board = child;
|
|
||||||
this.parent = null;
|
|
||||||
this.children = new ArrayList<>();
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean hasAncestor(Board board) {
|
|
||||||
BoardNode current = this;
|
|
||||||
while (current.parent != null) {
|
|
||||||
current = current.parent;
|
|
||||||
if (current.board.equals(board)) {
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return null;
|
||||||
}
|
|
||||||
|
|
||||||
public void addChild(BoardNode child) {
|
|
||||||
if (child != null) {
|
|
||||||
children.add(child);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
|
Loading…
Reference in New Issue
Block a user