From 2da192b76dbc2206ef2c08e016e658b794ea23e9 Mon Sep 17 00:00:00 2001 From: Jonathan Turner Date: Sun, 11 Feb 2024 17:42:05 -0500 Subject: [PATCH] Finished designing and refractering code for GUI. --- src/main/java/Assignments/A1/Driver.java | 13 ++-- .../java/Assignments/A1/models/Board.java | 14 +--- .../Assignments/A1/models/BoardGenerator.java | 2 + .../java/Assignments/A1/models/BoardNode.java | 1 - .../A1/models/{ => helper}/Move.java | 4 +- .../A1/models/{ => helper}/Pair.java | 2 +- .../A1/models/{ => helper}/Piece.java | 4 +- .../A1/models/{ => helper}/Solver.java | 6 +- .../A1/solving_algorithms/BFS.java | 50 -------------- .../A1/solving_algorithms/DFS.java | 3 +- .../{AStar.java => PriorityTraversal.java} | 24 +++---- .../A1/solving_algorithms/UCS.java | 47 ------------- .../solving_algorithms/comparators/AStar.java | 13 ++++ .../solving_algorithms/comparators/BFS.java | 13 ++++ .../solving_algorithms/comparators/UCS.java | 12 ++++ .../A1/view/BoardViewCodeBehind.java | 4 ++ .../Assignments/A1/view/MainViewModel.java | 66 ++++++++++--------- 17 files changed, 112 insertions(+), 166 deletions(-) rename src/main/java/Assignments/A1/models/{ => helper}/Move.java (95%) rename src/main/java/Assignments/A1/models/{ => helper}/Pair.java (94%) rename src/main/java/Assignments/A1/models/{ => helper}/Piece.java (98%) rename src/main/java/Assignments/A1/models/{ => helper}/Solver.java (50%) delete mode 100644 src/main/java/Assignments/A1/solving_algorithms/BFS.java rename src/main/java/Assignments/A1/solving_algorithms/{AStar.java => PriorityTraversal.java} (72%) delete mode 100644 src/main/java/Assignments/A1/solving_algorithms/UCS.java create mode 100644 src/main/java/Assignments/A1/solving_algorithms/comparators/AStar.java create mode 100644 src/main/java/Assignments/A1/solving_algorithms/comparators/BFS.java create mode 100644 src/main/java/Assignments/A1/solving_algorithms/comparators/UCS.java diff --git a/src/main/java/Assignments/A1/Driver.java b/src/main/java/Assignments/A1/Driver.java index 03da119..e72f1e2 100644 --- a/src/main/java/Assignments/A1/Driver.java +++ b/src/main/java/Assignments/A1/Driver.java @@ -5,20 +5,17 @@ package Assignments.A1; import Assignments.A1.models.Board; import Assignments.A1.models.BoardGenerator; import Assignments.A1.models.BoardNode; -import Assignments.A1.solving_algorithms.AStar; -import Assignments.A1.solving_algorithms.BFS; -import Assignments.A1.solving_algorithms.UCS; +import Assignments.A1.solving_algorithms.DFS; +import Assignments.A1.solving_algorithms.comparators.AStar; import java.awt.*; import java.io.File; -import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; import java.net.URI; import java.net.URL; import java.util.ArrayList; import java.util.Date; -import java.util.PriorityQueue; /** * Board will be used to save locations in a 2D array. @@ -44,10 +41,10 @@ public class Driver { BoardNode node = null; for (int run = 0; run < runs; run++) { Board board = BoardGenerator.generateBoard(); -// DFS solver = new DFS(); + DFS solver = new DFS(); // BFS solver = new BFS(); // UCS solver = new UCS(); - AStar solver = new AStar(); +// AStar solver = new AStar(); Date start = new Date(); BoardNode result = solver.traverse(board); Date end = new Date(); @@ -125,7 +122,7 @@ public class Driver { } private static void writeToFile(String name, StringBuffer values) { - URL resourcePath = Driver.class.getResource("/A1/results/AStar.txt"); + URL resourcePath = Driver.class.getResource("/A1/results/" + name + ".txt"); URI resourceURI = URI.create(resourcePath.toString()); File resource = new File(resourceURI.getPath()); diff --git a/src/main/java/Assignments/A1/models/Board.java b/src/main/java/Assignments/A1/models/Board.java index 2b38fc8..83daad4 100644 --- a/src/main/java/Assignments/A1/models/Board.java +++ b/src/main/java/Assignments/A1/models/Board.java @@ -1,5 +1,8 @@ package Assignments.A1.models; +import Assignments.A1.models.helper.Move; +import Assignments.A1.models.helper.Pair; + import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -236,17 +239,6 @@ public class Board { * Specifies a way of printing out the board with its current state. * @return the current state formatted. */ -// @Override -// public String toString() { -// String result = ""; -// for (int i = 0; i < 9; i++) { -// result += pieces[i] + " "; -// if ((i+1) % 3 == 0) { -// result += "\n"; -// } -// } -// return result; -// } @Override public String toString() { String result = pieces[0] + " " + pieces[1] + " " + pieces[2] + "\n" diff --git a/src/main/java/Assignments/A1/models/BoardGenerator.java b/src/main/java/Assignments/A1/models/BoardGenerator.java index bc4babd..3c84968 100644 --- a/src/main/java/Assignments/A1/models/BoardGenerator.java +++ b/src/main/java/Assignments/A1/models/BoardGenerator.java @@ -1,5 +1,7 @@ package Assignments.A1.models; +import Assignments.A1.models.helper.Move; + import java.util.*; /** diff --git a/src/main/java/Assignments/A1/models/BoardNode.java b/src/main/java/Assignments/A1/models/BoardNode.java index 292d35b..08fe999 100644 --- a/src/main/java/Assignments/A1/models/BoardNode.java +++ b/src/main/java/Assignments/A1/models/BoardNode.java @@ -36,7 +36,6 @@ public class BoardNode implements Comparable { children.add(node); } - private int getHeuristic() { int cost = 0; for (int i = 0; i < 9; i++) { diff --git a/src/main/java/Assignments/A1/models/Move.java b/src/main/java/Assignments/A1/models/helper/Move.java similarity index 95% rename from src/main/java/Assignments/A1/models/Move.java rename to src/main/java/Assignments/A1/models/helper/Move.java index 4a2631a..b775371 100644 --- a/src/main/java/Assignments/A1/models/Move.java +++ b/src/main/java/Assignments/A1/models/helper/Move.java @@ -1,4 +1,6 @@ -package Assignments.A1.models; +package Assignments.A1.models.helper; + +import Assignments.A1.models.Board; /** * Used to keep track of moves in either a stack or queues. diff --git a/src/main/java/Assignments/A1/models/Pair.java b/src/main/java/Assignments/A1/models/helper/Pair.java similarity index 94% rename from src/main/java/Assignments/A1/models/Pair.java rename to src/main/java/Assignments/A1/models/helper/Pair.java index 93e7f0a..3c33cb7 100644 --- a/src/main/java/Assignments/A1/models/Pair.java +++ b/src/main/java/Assignments/A1/models/helper/Pair.java @@ -1,4 +1,4 @@ -package Assignments.A1.models; +package Assignments.A1.models.helper; /** * Used to pair two points for moves. diff --git a/src/main/java/Assignments/A1/models/Piece.java b/src/main/java/Assignments/A1/models/helper/Piece.java similarity index 98% rename from src/main/java/Assignments/A1/models/Piece.java rename to src/main/java/Assignments/A1/models/helper/Piece.java index c296c6d..2f70450 100644 --- a/src/main/java/Assignments/A1/models/Piece.java +++ b/src/main/java/Assignments/A1/models/helper/Piece.java @@ -1,4 +1,6 @@ -package Assignments.A1.models; +package Assignments.A1.models.helper; + +import Assignments.A1.models.Board; /** * This class allows for abstraction and proper representation of a piece of the 8 puzzle. diff --git a/src/main/java/Assignments/A1/models/Solver.java b/src/main/java/Assignments/A1/models/helper/Solver.java similarity index 50% rename from src/main/java/Assignments/A1/models/Solver.java rename to src/main/java/Assignments/A1/models/helper/Solver.java index 5285802..8ed5934 100644 --- a/src/main/java/Assignments/A1/models/Solver.java +++ b/src/main/java/Assignments/A1/models/helper/Solver.java @@ -1,9 +1,11 @@ -package Assignments.A1.models; +package Assignments.A1.models.helper; import Assignments.A1.models.Board; import Assignments.A1.models.BoardNode; +import java.util.Comparator; + public interface Solver { - BoardNode traverse(Board board); + BoardNode traverse(Board root); } diff --git a/src/main/java/Assignments/A1/solving_algorithms/BFS.java b/src/main/java/Assignments/A1/solving_algorithms/BFS.java deleted file mode 100644 index 8e97e4d..0000000 --- a/src/main/java/Assignments/A1/solving_algorithms/BFS.java +++ /dev/null @@ -1,50 +0,0 @@ -package Assignments.A1.solving_algorithms; - -import Assignments.A1.models.Board; -import Assignments.A1.models.BoardNode; -import Assignments.A1.models.Move; -import Assignments.A1.models.Solver; - -import java.util.Comparator; -import java.util.HashSet; -import java.util.List; -import java.util.PriorityQueue; - -public class BFS implements Solver { - - private final HashSet visited = new HashSet<>(); - private static final Board solved = new Board(); - - public BoardNode traverse(Board root) { - PriorityQueue boards = new PriorityQueue<>(new BFSPriority()); - HashSet visited = new HashSet<>(); - 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 children = node.board.getMoves(); - for (Move move : children) { - Board child = new Board(node.board); - child.swap(move); - BoardNode childNode = new BoardNode(child, node); - boards.add(childNode); - node.addChild(childNode); - } - } - return node; - } -} - -class BFSPriority implements Comparator { - @Override - public int compare(BoardNode o1, BoardNode o2) { - return Integer.compare(o1.heuristic, o2.heuristic); - } -} - diff --git a/src/main/java/Assignments/A1/solving_algorithms/DFS.java b/src/main/java/Assignments/A1/solving_algorithms/DFS.java index 66bd597..89b35a3 100644 --- a/src/main/java/Assignments/A1/solving_algorithms/DFS.java +++ b/src/main/java/Assignments/A1/solving_algorithms/DFS.java @@ -1,6 +1,8 @@ package Assignments.A1.solving_algorithms; import Assignments.A1.models.*; +import Assignments.A1.models.helper.Move; +import Assignments.A1.models.helper.Solver; import Assignments.A1.resources.Parameters; import java.util.*; @@ -16,7 +18,6 @@ public class DFS implements Solver { rootNode.setDepth(0); stack.push(rootNode); - while (!stack.isEmpty()) { BoardNode current = stack.pop(); diff --git a/src/main/java/Assignments/A1/solving_algorithms/AStar.java b/src/main/java/Assignments/A1/solving_algorithms/PriorityTraversal.java similarity index 72% rename from src/main/java/Assignments/A1/solving_algorithms/AStar.java rename to src/main/java/Assignments/A1/solving_algorithms/PriorityTraversal.java index d297b51..e62984d 100644 --- a/src/main/java/Assignments/A1/solving_algorithms/AStar.java +++ b/src/main/java/Assignments/A1/solving_algorithms/PriorityTraversal.java @@ -2,24 +2,31 @@ package Assignments.A1.solving_algorithms; import Assignments.A1.models.Board; import Assignments.A1.models.BoardNode; -import Assignments.A1.models.Move; -import Assignments.A1.models.Solver; +import Assignments.A1.models.helper.Move; +import Assignments.A1.models.helper.Solver; import java.util.Comparator; import java.util.HashSet; import java.util.List; import java.util.PriorityQueue; -public class AStar implements Solver { +public class PriorityTraversal implements Solver { + private final Board solved = new Board(); private final HashSet visited = new HashSet<>(); + private final Comparator comparator; + + public PriorityTraversal(Comparator type) { + this.comparator = type; + } + public BoardNode traverse(Board root) { - PriorityQueue boards = new PriorityQueue<>(new AStarPriority()); + PriorityQueue boards = new PriorityQueue<>(comparator); boards.add(new BoardNode(root, null)); BoardNode node = null; Board current = new Board(root); - while (!current.equals(solved)) { + while (!current.equals(solved) && !boards.isEmpty()) { node = boards.poll(); current = node.board; if (visited.contains(node.board)) { @@ -38,10 +45,3 @@ public class AStar implements Solver { return node; } } - -class AStarPriority implements Comparator { - @Override - public int compare(BoardNode o1, BoardNode o2) { - return Integer.compare(o1.expected, o2.expected); - } -} diff --git a/src/main/java/Assignments/A1/solving_algorithms/UCS.java b/src/main/java/Assignments/A1/solving_algorithms/UCS.java deleted file mode 100644 index 888cca2..0000000 --- a/src/main/java/Assignments/A1/solving_algorithms/UCS.java +++ /dev/null @@ -1,47 +0,0 @@ -package Assignments.A1.solving_algorithms; - -import Assignments.A1.models.Board; -import Assignments.A1.models.BoardNode; -import Assignments.A1.models.Move; -import Assignments.A1.models.Solver; - -import java.util.Comparator; -import java.util.HashSet; -import java.util.List; -import java.util.PriorityQueue; - -public class UCS implements Solver { - private final Board solved = new Board(); - private final HashSet visited = new HashSet<>(); - - public BoardNode traverse(Board root) { - PriorityQueue 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 children = node.board.getMoves(); - for (Move move : children) { - Board child = new Board(node.board); - child.swap(move); - BoardNode childNode = new BoardNode(child, node); - boards.add(childNode); - node.addChild(childNode); - } - } - return node; - } -} - -class UCSPriority implements Comparator { - @Override - public int compare(BoardNode o1, BoardNode o2) { - return Integer.compare(o1.cost, o2.cost); - } -} \ No newline at end of file diff --git a/src/main/java/Assignments/A1/solving_algorithms/comparators/AStar.java b/src/main/java/Assignments/A1/solving_algorithms/comparators/AStar.java new file mode 100644 index 0000000..f19375d --- /dev/null +++ b/src/main/java/Assignments/A1/solving_algorithms/comparators/AStar.java @@ -0,0 +1,13 @@ +package Assignments.A1.solving_algorithms.comparators; + +import Assignments.A1.models.Board; +import Assignments.A1.models.BoardNode; + +import java.util.Comparator; + +public class AStar implements Comparator { + @Override + public int compare(BoardNode o1, BoardNode o2) { + return Integer.compare(o1.expected, o2.expected); + } +} \ No newline at end of file diff --git a/src/main/java/Assignments/A1/solving_algorithms/comparators/BFS.java b/src/main/java/Assignments/A1/solving_algorithms/comparators/BFS.java new file mode 100644 index 0000000..54cf659 --- /dev/null +++ b/src/main/java/Assignments/A1/solving_algorithms/comparators/BFS.java @@ -0,0 +1,13 @@ +package Assignments.A1.solving_algorithms.comparators; + +import Assignments.A1.models.BoardNode; + +import java.util.Comparator; + +public class BFS implements Comparator { + @Override + public int compare(BoardNode o1, BoardNode o2) { + return Integer.compare(o1.heuristic, o2.heuristic); + } +} + diff --git a/src/main/java/Assignments/A1/solving_algorithms/comparators/UCS.java b/src/main/java/Assignments/A1/solving_algorithms/comparators/UCS.java new file mode 100644 index 0000000..57e3342 --- /dev/null +++ b/src/main/java/Assignments/A1/solving_algorithms/comparators/UCS.java @@ -0,0 +1,12 @@ +package Assignments.A1.solving_algorithms.comparators; + +import Assignments.A1.models.BoardNode; + +import java.util.Comparator; + +public class UCS implements Comparator { + @Override + public int compare(BoardNode o1, BoardNode o2) { + return Integer.compare(o1.cost, o2.cost); + } +} \ No newline at end of file diff --git a/src/main/java/Assignments/A1/view/BoardViewCodeBehind.java b/src/main/java/Assignments/A1/view/BoardViewCodeBehind.java index 0f2f418..79527ea 100644 --- a/src/main/java/Assignments/A1/view/BoardViewCodeBehind.java +++ b/src/main/java/Assignments/A1/view/BoardViewCodeBehind.java @@ -1,5 +1,6 @@ package Assignments.A1.view; +import Assignments.A1.models.Board; import Assignments.A1.models.BoardNode; import javafx.event.ActionEvent; import javafx.fxml.FXML; @@ -70,6 +71,8 @@ public class BoardViewCodeBehind { this.expanded.selectedProperty().bindBidirectional(viewModel.expandedProperty()); this.alg_speed.textProperty().bindBidirectional(viewModel.algSpeedProperty()); this.disclaimer.visibleProperty().bindBidirectional(viewModel.disclaimerProperty()); + + this.current_board.textProperty().setValue(new Board().toString()); } public void onGenerateBoard(ActionEvent actionEvent) { @@ -86,6 +89,7 @@ public class BoardViewCodeBehind { public void onSolveButton(ActionEvent actionEvent) { viewModel.solveBoard(); viewModel.updateDisplay(); + this.spanning_tree.setRoot(new TreeItem<>()); this.spanning_tree.setRoot(viewModel.getSolvedRootNode()); } diff --git a/src/main/java/Assignments/A1/view/MainViewModel.java b/src/main/java/Assignments/A1/view/MainViewModel.java index e17c0a3..6eeaa88 100644 --- a/src/main/java/Assignments/A1/view/MainViewModel.java +++ b/src/main/java/Assignments/A1/view/MainViewModel.java @@ -3,11 +3,12 @@ package Assignments.A1.view; import Assignments.A1.models.Board; import Assignments.A1.models.BoardGenerator; import Assignments.A1.models.BoardNode; -import Assignments.A1.models.Solver; -import Assignments.A1.solving_algorithms.AStar; -import Assignments.A1.solving_algorithms.BFS; +import Assignments.A1.models.helper.Solver; +import Assignments.A1.solving_algorithms.PriorityTraversal; +import Assignments.A1.solving_algorithms.comparators.AStar; +import Assignments.A1.solving_algorithms.comparators.BFS; import Assignments.A1.solving_algorithms.DFS; -import Assignments.A1.solving_algorithms.UCS; +import Assignments.A1.solving_algorithms.comparators.UCS; import javafx.beans.property.*; import javafx.scene.control.TreeItem; @@ -79,11 +80,11 @@ public class MainViewModel { if (DFS.getValue()) { solver = new DFS(); } else if (UCS.getValue()) { - solver = new UCS(); + solver = new PriorityTraversal(new UCS()); } else if (BFS.getValue()) { - solver = new BFS(); + solver = new PriorityTraversal(new BFS()); } else if (AStar.getValue()) { - solver = new AStar(); + solver = new PriorityTraversal(new AStar()); } Date start = new Date(); BoardNode solved = solver.traverse(this.current.board); @@ -136,32 +137,35 @@ public class MainViewModel { } private TreeItem rebuildTree(BoardNode root, boolean expanded) { - if (this.selectedAlg.equals("DFS")) { - Stack generations = new Stack<>(); - BoardNode temp = this.current; - while (temp != null) { - generations.push(temp); - temp = temp.parent; - } - TreeItem rootItem = new TreeItem<>(root); - TreeItem currItem = rootItem; - while (!generations.isEmpty()) { - TreeItem child = new TreeItem<>(generations.pop()); - currItem.getChildren().add(child); - currItem.setExpanded(expanded); - currItem = child; - } - return rootItem; - } else { - TreeItem treeItem = new TreeItem<>(root); - for (BoardNode child : root.children) { - TreeItem childItem = rebuildTree(child, expanded); - treeItem.getChildren().add(childItem); - } - treeItem.setExpanded(expanded); + if (this.selectedAlg != null) { + if (this.selectedAlg.equals("DFS")) { + Stack generations = new Stack<>(); + BoardNode temp = this.current; + while (temp != null) { + generations.push(temp); + temp = temp.parent; + } + TreeItem rootItem = new TreeItem<>(root); + TreeItem currItem = rootItem; + while (!generations.isEmpty()) { + TreeItem child = new TreeItem<>(generations.pop()); + currItem.getChildren().add(child); + currItem.setExpanded(expanded); + currItem = child; + } + return rootItem; + } else { + TreeItem treeItem = new TreeItem<>(root); + for (BoardNode child : root.children) { + TreeItem childItem = rebuildTree(child, expanded); + treeItem.getChildren().add(childItem); + } + treeItem.setExpanded(expanded); - return treeItem; + return treeItem; + } } + return new TreeItem<>(); }