From 5c2fde6c698f7ad351b8b0c866c400d7a32bed6f Mon Sep 17 00:00:00 2001 From: Jonathan Turner Date: Sun, 11 Feb 2024 00:37:10 -0500 Subject: [PATCH] Modified project files and structure to fit with Maven for JavaFX support. --- .idea/compiler.xml | 13 ++ .idea/encodings.xml | 7 + .idea/jarRepositories.xml | 20 +++ .idea/misc.xml | 9 + CS3642-Artificial_Intelligence.iml | 9 +- pom.xml | 17 ++ src/Assignments/A1/Driver.java | 115 ------------ src/main/java/Assignments/A1/Driver.java | 167 ++++++++++++++++++ .../java}/Assignments/A1/models/Board.java | 0 .../Assignments/A1/models/BoardGenerator.java | 0 .../Assignments/A1/models/BoardNode.java | 6 +- .../java}/Assignments/A1/models/Move.java | 0 .../java}/Assignments/A1/models/Pair.java | 0 .../java}/Assignments/A1/models/Piece.java | 0 .../Assignments/A1/performance_stats/BFS.txt | 0 .../Assignments/A1/performance_stats/DFS.txt | 0 .../Assignments/A1/resources/Parameters.java | 0 .../A1/solving_algorithms/AStar.java | 8 +- .../A1/solving_algorithms/BFS.java | 0 .../A1/solving_algorithms/DFS.java | 1 - .../A1/solving_algorithms/UCS.java | 4 +- 21 files changed, 247 insertions(+), 129 deletions(-) create mode 100644 .idea/compiler.xml create mode 100644 .idea/encodings.xml create mode 100644 .idea/jarRepositories.xml create mode 100644 pom.xml delete mode 100644 src/Assignments/A1/Driver.java create mode 100644 src/main/java/Assignments/A1/Driver.java rename src/{ => main/java}/Assignments/A1/models/Board.java (100%) rename src/{ => main/java}/Assignments/A1/models/BoardGenerator.java (100%) rename src/{ => main/java}/Assignments/A1/models/BoardNode.java (93%) rename src/{ => main/java}/Assignments/A1/models/Move.java (100%) rename src/{ => main/java}/Assignments/A1/models/Pair.java (100%) rename src/{ => main/java}/Assignments/A1/models/Piece.java (100%) rename src/{ => main/java}/Assignments/A1/performance_stats/BFS.txt (100%) rename src/{ => main/java}/Assignments/A1/performance_stats/DFS.txt (100%) rename src/{ => main/java}/Assignments/A1/resources/Parameters.java (100%) rename src/{ => main/java}/Assignments/A1/solving_algorithms/AStar.java (84%) rename src/{ => main/java}/Assignments/A1/solving_algorithms/BFS.java (100%) rename src/{ => main/java}/Assignments/A1/solving_algorithms/DFS.java (96%) rename src/{ => main/java}/Assignments/A1/solving_algorithms/UCS.java (89%) diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..87f9aa1 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..aa00ffa --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..712ab9d --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index ca950ab..e5d6295 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,13 @@ + + + + + diff --git a/CS3642-Artificial_Intelligence.iml b/CS3642-Artificial_Intelligence.iml index 8e1b626..fbabc09 100644 --- a/CS3642-Artificial_Intelligence.iml +++ b/CS3642-Artificial_Intelligence.iml @@ -1,12 +1,9 @@ - - - + + + - - - \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..593a0a3 --- /dev/null +++ b/pom.xml @@ -0,0 +1,17 @@ + + + 4.0.0 + + edu.jturn.cs3642 + CS3642-Artificial_Intelligence + 1.0 + + + 19 + 19 + UTF-8 + + + \ No newline at end of file diff --git a/src/Assignments/A1/Driver.java b/src/Assignments/A1/Driver.java deleted file mode 100644 index c35a5ff..0000000 --- a/src/Assignments/A1/Driver.java +++ /dev/null @@ -1,115 +0,0 @@ -package Assignments.A1; - -// Potentially will be changed to an UI Implementation with JavaFX if time permits. - -import Assignments.A1.models.Board; -import Assignments.A1.models.BoardGenerator; -import Assignments.A1.models.BoardNode; -import Assignments.A1.solving_algorithms.BFS; - -import java.util.ArrayList; -import java.util.Date; -import java.util.PriorityQueue; - -/** - * Board will be used to save locations in a 2D array. - *

- * The design of the board locations will be numbered like so: - * 0 1 2 - * 3 4 5 - * 6 7 8 - *

- * 1 2 3 - * 8 0 4 - * 7 6 5 - *

- * The values will be specified with an int. Must be between (inclusive) 1-8. - * The empty spot will be represented with null. - */ -public class Driver { - - public static void main(String[] args) { - ArrayList timer = new ArrayList<>(); - int successes = 0; - int runs = 1; - BoardNode node = null; - for (int run = 0; run < runs; run++) { - Board board = BoardGenerator.generateBoard(); -// DFS solver = new DFS(); - BFS solver = new BFS(); -// UCS solver = new UCS(); - Date start = new Date(); - BoardNode result = solver.traverse(board); - Date end = new Date(); - if (result.board != null) { - long runtime = end.getTime() - start.getTime(); - timer.add(runtime); - successes++; - node = result; - } - } - 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 + "/" + runs); - - String result = printTotalHierarchy(node); - System.out.println(result); - - } - - -// public static void main(String[] args) { -// int[] values = {1, 2, 3, 8, 0, 5, 4, 7, 6}; -// BoardNode node = new BoardNode(new Board(values), null); -// System.out.println(node.heuristic); -// } - - - private static String printTotalHierarchy(BoardNode root, int depth, boolean hasMoreChildren) { - String result = ""; - for (int i = 0; i < depth - 1; i++) { - result += "│ "; - } - if (hasMoreChildren) { - result += "├── " + root.board.toString() + System.lineSeparator(); - } else { - result += "└── " + root.board.toString() + System.lineSeparator(); - } - - for (int i = 0; i < root.children.size(); i++) { - if (i == root.children.size() - 1) { - result += printTotalHierarchy(root.children.get(i), depth+1, false); - } else { - result += printTotalHierarchy(root.children.get(i), depth+1, true); - } - } - return result; - } - - public static String printTotalHierarchy(BoardNode solved) { - BoardNode root = null; - while (solved.parent != null) { - solved = solved.parent; - } - root = solved; - - String result = root.board.toString() + System.lineSeparator(); - if (root.children.size() == 1) { - result += printTotalHierarchy(root.children.get(0), 1, false); - } else { - for (int i = 0; i < root.children.size(); i++) { - if (i == root.children.size() - 1) { - result += printTotalHierarchy(root.children.get(i), 1, false); - } else { - result += printTotalHierarchy(root.children.get(i), 1, true); - } - } - } - return result; - } -} diff --git a/src/main/java/Assignments/A1/Driver.java b/src/main/java/Assignments/A1/Driver.java new file mode 100644 index 0000000..2f3f895 --- /dev/null +++ b/src/main/java/Assignments/A1/Driver.java @@ -0,0 +1,167 @@ +package Assignments.A1; + +// Potentially will be changed to an UI Implementation with JavaFX if time permits. + +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 java.awt.*; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileWriter; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Date; +import java.util.PriorityQueue; + +/** + * Board will be used to save locations in a 2D array. + *

+ * The design of the board locations will be numbered like so: + * 0 1 2 + * 3 4 5 + * 6 7 8 + *

+ * 1 2 3 + * 8 0 4 + * 7 6 5 + *

+ * The values will be specified with an int. Must be between (inclusive) 1-8. + * The empty spot will be represented with null. + */ +public class Driver { + + public static void main(String[] args) { + ArrayList timer = new ArrayList<>(); + int successes = 0; + int runs = 1; + BoardNode node = null; + for (int run = 0; run < runs; run++) { + Board board = BoardGenerator.generateBoard(); +// DFS solver = new DFS(); +// BFS solver = new BFS(); +// UCS solver = new UCS(); + AStar solver = new AStar(); + Date start = new Date(); + BoardNode result = solver.traverse(board); + Date end = new Date(); + if (result.board != null) { + long runtime = end.getTime() - start.getTime(); + timer.add(runtime); + successes++; + node = result; + } + } + 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 + "/" + runs); + + StringBuffer result = printTotalHierarchy(node); + writeToFile("AStar", result); + } + + +// public static void main(String[] args) { +// int[] values = {1, 2, 3, 8, 0, 5, 4, 7, 6}; +// BoardNode node = new BoardNode(new Board(values), null); +// System.out.println(node.heuristic); +// } + + + private static StringBuffer printTotalHierarchy(BoardNode root, int depth, boolean hasMoreChildren) { + StringBuffer output = new StringBuffer(); + for (int i = 0; i < depth - 1; i++) { + output.append("│ "); + } + if (hasMoreChildren) { + output.append("├── ").append(root.board.toString()).append(System.lineSeparator()); + } else { + output.append("└── ").append(root.board.toString()).append(System.lineSeparator()); + } + + for (int i = 0; i < root.children.size(); i++) { + if (i == root.children.size() - 1) { + output.append(printTotalHierarchy(root.children.get(i), depth+1, false)); + } else { + output.append(printTotalHierarchy(root.children.get(i), depth+1, true)); + } + } + return output; + } + + public static StringBuffer printTotalHierarchy(BoardNode solved) { + BoardNode root = null; + while (solved.parent != null) { + solved = solved.parent; + } + root = solved; + + StringBuffer output = new StringBuffer(); + output.append(root.board.toString()).append(System.lineSeparator()); + if (root.children.size() == 1) { + output.append(printTotalHierarchy(root.children.get(0), 1, false)); + } else { + for (int i = 0; i < root.children.size(); i++) { + if (i == root.children.size() - 1) { + output.append(printTotalHierarchy(root.children.get(i), 1, false)); + } else { + output.append(printTotalHierarchy(root.children.get(i), 1, true)); + } + } + } + return output; + } + + private static void writeToFile(String name, StringBuffer values) { + File directory = new File("src/Assignments/A1/results"); + if (!directory.exists()) { + directory.mkdirs(); + System.out.println("Creating Directory: results"); + } + + File output = new File(directory, name + ".txt"); + + try { + if (!output.createNewFile()) { + System.out.println("File Already Exists: " + name + ".txt"); + } else { + System.out.println("File Created: " + name + ".txt"); + } + } catch (IOException e) { + System.err.println("Error creating file: " + e.getMessage()); + } + + try (FileWriter out = new FileWriter(output)) { + out.write(values.toString()); + System.out.println("Data written to file: " + name + ".txt"); + } catch (IOException e) { + System.err.println("Error writing to file: " + e.getMessage()); + } + + openDirectoryFile(output); + } + + private static void openDirectoryFile(File open) { + if (!Desktop.isDesktopSupported() || !Desktop.getDesktop().isSupported(Desktop.Action.OPEN)) { + System.out.println("Desktop is not supported"); + return; + } + Desktop desktop = Desktop.getDesktop(); + try { + desktop.open(open); + } catch (IOException e) { + e.printStackTrace(); + } + + } + +} diff --git a/src/Assignments/A1/models/Board.java b/src/main/java/Assignments/A1/models/Board.java similarity index 100% rename from src/Assignments/A1/models/Board.java rename to src/main/java/Assignments/A1/models/Board.java diff --git a/src/Assignments/A1/models/BoardGenerator.java b/src/main/java/Assignments/A1/models/BoardGenerator.java similarity index 100% rename from src/Assignments/A1/models/BoardGenerator.java rename to src/main/java/Assignments/A1/models/BoardGenerator.java diff --git a/src/Assignments/A1/models/BoardNode.java b/src/main/java/Assignments/A1/models/BoardNode.java similarity index 93% rename from src/Assignments/A1/models/BoardNode.java rename to src/main/java/Assignments/A1/models/BoardNode.java index 5c7d332..cf45344 100644 --- a/src/Assignments/A1/models/BoardNode.java +++ b/src/main/java/Assignments/A1/models/BoardNode.java @@ -6,8 +6,7 @@ import java.util.List; public class BoardNode implements Comparable { public BoardNode parent; - public int heuristic; - public int cost; + public int heuristic, cost, expected; public Board board; public List children; @@ -16,12 +15,13 @@ public class BoardNode implements Comparable { this.parent = parent; this.heuristic = this.getHeuristic(); this.cost = this.getActualCost(); + this.expected = this.cost + this.expected; this.children = new ArrayList<>(); } private int getActualCost() { if (this.parent != null) { - return this.parent.cost + 1; + return this.parent.cost + 10; } else { return 0; } diff --git a/src/Assignments/A1/models/Move.java b/src/main/java/Assignments/A1/models/Move.java similarity index 100% rename from src/Assignments/A1/models/Move.java rename to src/main/java/Assignments/A1/models/Move.java diff --git a/src/Assignments/A1/models/Pair.java b/src/main/java/Assignments/A1/models/Pair.java similarity index 100% rename from src/Assignments/A1/models/Pair.java rename to src/main/java/Assignments/A1/models/Pair.java diff --git a/src/Assignments/A1/models/Piece.java b/src/main/java/Assignments/A1/models/Piece.java similarity index 100% rename from src/Assignments/A1/models/Piece.java rename to src/main/java/Assignments/A1/models/Piece.java diff --git a/src/Assignments/A1/performance_stats/BFS.txt b/src/main/java/Assignments/A1/performance_stats/BFS.txt similarity index 100% rename from src/Assignments/A1/performance_stats/BFS.txt rename to src/main/java/Assignments/A1/performance_stats/BFS.txt diff --git a/src/Assignments/A1/performance_stats/DFS.txt b/src/main/java/Assignments/A1/performance_stats/DFS.txt similarity index 100% rename from src/Assignments/A1/performance_stats/DFS.txt rename to src/main/java/Assignments/A1/performance_stats/DFS.txt diff --git a/src/Assignments/A1/resources/Parameters.java b/src/main/java/Assignments/A1/resources/Parameters.java similarity index 100% rename from src/Assignments/A1/resources/Parameters.java rename to src/main/java/Assignments/A1/resources/Parameters.java diff --git a/src/Assignments/A1/solving_algorithms/AStar.java b/src/main/java/Assignments/A1/solving_algorithms/AStar.java similarity index 84% rename from src/Assignments/A1/solving_algorithms/AStar.java rename to src/main/java/Assignments/A1/solving_algorithms/AStar.java index 169081d..667148b 100644 --- a/src/Assignments/A1/solving_algorithms/AStar.java +++ b/src/main/java/Assignments/A1/solving_algorithms/AStar.java @@ -14,7 +14,7 @@ public class AStar { private final HashSet visited = new HashSet<>(); public BoardNode traverse(Board root) { - PriorityQueue boards = new PriorityQueue<>(new UCSPriority()); + PriorityQueue boards = new PriorityQueue<>(new AStarPriority()); boards.add(new BoardNode(root, null)); BoardNode node = null; Board current = new Board(root); @@ -29,7 +29,9 @@ public class AStar { for (Move move : children) { Board child = new Board(node.board); child.swap(move); - boards.add(new BoardNode(child, node)); + BoardNode childNode = new BoardNode(child, node); + boards.add(childNode); + node.addChild(childNode); } } return node; @@ -39,6 +41,6 @@ public class AStar { class AStarPriority implements Comparator { @Override public int compare(BoardNode o1, BoardNode o2) { - return Integer.compare(o2.cost, o1.cost); + return Integer.compare(o1.expected, o2.expected); } } diff --git a/src/Assignments/A1/solving_algorithms/BFS.java b/src/main/java/Assignments/A1/solving_algorithms/BFS.java similarity index 100% rename from src/Assignments/A1/solving_algorithms/BFS.java rename to src/main/java/Assignments/A1/solving_algorithms/BFS.java diff --git a/src/Assignments/A1/solving_algorithms/DFS.java b/src/main/java/Assignments/A1/solving_algorithms/DFS.java similarity index 96% rename from src/Assignments/A1/solving_algorithms/DFS.java rename to src/main/java/Assignments/A1/solving_algorithms/DFS.java index 643fff9..a79ec3d 100644 --- a/src/Assignments/A1/solving_algorithms/DFS.java +++ b/src/main/java/Assignments/A1/solving_algorithms/DFS.java @@ -5,7 +5,6 @@ import Assignments.A1.models.BoardGenerator; import Assignments.A1.models.Move; import Assignments.A1.models.Pair; import Assignments.A1.resources.Parameters; -import org.junit.experimental.theories.internal.ParameterizedAssertionError; import java.util.*; diff --git a/src/Assignments/A1/solving_algorithms/UCS.java b/src/main/java/Assignments/A1/solving_algorithms/UCS.java similarity index 89% rename from src/Assignments/A1/solving_algorithms/UCS.java rename to src/main/java/Assignments/A1/solving_algorithms/UCS.java index 5fd307a..d0a4cb9 100644 --- a/src/Assignments/A1/solving_algorithms/UCS.java +++ b/src/main/java/Assignments/A1/solving_algorithms/UCS.java @@ -29,7 +29,9 @@ public class UCS { for (Move move : children) { Board child = new Board(node.board); child.swap(move); - boards.add(new BoardNode(child, node)); + BoardNode childNode = new BoardNode(child, node); + boards.add(childNode); + node.addChild(childNode); } } return node;