📗 Enter your ID (the wisc email ID without @wisc.edu) here: and click (or hit enter key) 1,2,3,4,5,6,7,8,9,10p5
📗 The official deadline is August 8, but you can submit or resubmit without penalty until August 15.
📗 The same ID should generate the same set of questions. Your answers are not saved when you close the browser. You could either copy and paste or load your program outputs into the text boxes for individual questions or print all your outputs to a single text file and load it using the button at the bottom of the page.
📗 Please do not refresh the page: your answers will not be saved.
📗 You should implement the algorithms using the mathematical formulas from the slides. You can use packages and libraries to preprocess and read the data and format the outputs. It is not recommended that you use machine learning packages or libraries, but you will not lose points for doing so.
📗 (Introduction) In this programming homework, you create a random maze and compare multiple uninformed and informed search algorithms.
📗 (Part 1) Create a \(h\) = ? by \(w\) = ? (height by width) rectangular orthogonal maze by parsing an image from the the Maze Generator: Link. You can also generate a random maze yourself using Recursive Backtracker or one of the Minimum Spanning Tree algorithms (Kruskal or Prim): Wikipedia or Link. Make sure you enter from the center square of the top row and exit from the center square of the bottom row.
📗 (Part 1) Plot the maze using | for vertical walls and -- for horizontal walls and + for intersections. Use @ to highlight the solution (not #). Below is an 15 by 15 example of such plot and the solution.
Example:
Solution:
📗 (Part 1) Use BFS and DFS to get the solution of the maze. Keep track of the squares you searched (expanded, or checked goal on).
📗 (Part 2) Use A* with the heuristic of Manhattan distance to the goal and Euclidean distance to the goal. Keep track of the squares you searched (expanded, or checked goal on).
📗 [5 points] Enter the successor matrix of the maze (\(h\) lines, each line containing \(w\) strings, comma separated, each string represents the list of possible successors, a subset of the characters "U" "D" "L" "R").
Hint
📗 For each square \(\left(i, j\right)\) centered at \(\left(2 i + 1, 3 j + 1\right)\) and \(\left(2 i + 1, 3 j + 2\right)\) (i is the line index, j is the character index in the line), start with "": if \(\left(2 i, 3 j + 1\right)\) is " ", add "U", if \(\left(2 i + 2, 3 j + 1\right)\) is " ", add "D", if \(\left(2 i + 1, 3 j\right)\) is " ", add "L"; if \(\left(2 i + 1, 3 j + 3\right)\) is " ", add "R".
📗 You should use the successor matrix to solve the maze instead of the plot.
📗 [5 points] Enter the list of squares searched by BFS (\(h\) lines, each line containing \(w\) integers either 0 or 1, 1 means searched, comma separated).
Hint
📗 Use a Queue of pairs of numbers as the Queue. You can use an array or list too, but you have to implement the "enQueue" and "deQueue" operations first.
📗 Start by putting the entry square (center square of the top row) in the Queue.
📗 DeQueue \(\left(i, j\right)\) and find the string of the \(\left(i, j\right)\) element of the successor matrix: if it contains "U", enQueue \(\left(i - 1, j\right)\), if it contains "D", enQueue \(\left(i + 1, j\right)\), if it contains "L", enQueue \(\left(i, j - 1\right)\); if it contains "R", enQueue \(\left(i, j + 1\right)\).
📗 Repeat until the exit square (center square of the bottom row) is deQueued.
📗 [5 points] Enter the list of squares searched by DFS (\(h\) lines, each line containing \(w\) integers either 0 or 1, 1 means searched, comma separated).
Hint
📗 Use a Stack of pairs of numbers as the Stack. You can use an array or list too, but you have to implement the "Pop" and "Push" operations first.
📗 Start by putting the entry square (center square of the top row) in the Stack.
📗 Pop \(\left(i, j\right)\) and find the string of the \(\left(i, j\right)\) element of the successor matrix: if it contains "U", push \(\left(i - 1, j\right)\), if it contains "D", push \(\left(i + 1, j\right)\), if it contains "L", push \(\left(i, j - 1\right)\); if it contains "R", push \(\left(i, j + 1\right)\).
📗 Repeat until the exit square (center square of the bottom row) is popped.
📗 [5 points] Enter the Manhattan distances to the goal for each square in the maze (\(h\) lines, each line containing \(w\) integers, comma separated).
Hint
📗 The Manhattan distance between \(\left(i, j\right)\) and \(\left(i', j'\right)\) is \(\left| i - i' \right| + \left| j - j' \right|\).
📗 [5 points] Enter the list of squares searched by A* with Manhattan distance to the goal as the heuristic (\(h\) lines, each line containing \(w\) integers either 0 or 1, 1 means searched, comma separated).
Hint
📗 Use a PriorityQueue of pairs of numbers as the Queue. You can use an array or list too, but you have to implement the "enQueue" and "deQueue" operations first. Since the mazes are relatively small, you do not have to implement efficient PriorityQueue algorithms.
📗 Start by putting the entry square (center square of the top row) with priority = cost + heuristic, where the cost is \(g = 0\) and the heuristic is \(h = H\left(i, j\right)\) (\(H\) is the matrix from the previous question) in the Queue.
📗 DeQueue \(\left(i, j\right)\) with cost \(c\) and find the string of the \(\left(i, j\right)\) element of the successor matrix: if it contains "U", enQueue \(\left(i - 1, j\right)\) with and , if it contains "D", enQueue \(\left(i + 1, j\right)\) with and , if it contains "L", enQueue \(\left(i, j - 1\right)\) with and ; if it contains "R", enQueue \(\left(i, j + 1\right)\) with and .
📗 Repeat until the exit square (center square of the bottom row) is deQueued.
📗 [5 points] Enter the list of squares searched by A* with Euclidean distance to the goal as the heuristic (\(h\) lines, each line containing \(w\) integers either 0 or 1, 1 means searched, comma separated).
Hint
📗 Replace the Manhattan distance by Euclidean distance \(\sqrt{\left(i - i'\right)^{2} + \left(j - j'\right)^{2}}\).
📗 [1 points] Please enter any comments and suggestions including possible mistakes and bugs with the questions and the auto-grading, and materials relevant to solving the question that you think are not covered well during the lectures. If you have no comments, please enter "None": do not leave it blank.
📗 Please do not modify the content in the above text field: use the "Grade" button to update.
📗 Warning: grading may take around 10 to 20 seconds. Please be patient and do not click "Grade" multiple times.
📗 You could submit multiple times (but please do not submit too often): only the latest submission will be counted.
📗 Please also save the text in the above text box to a file using the button or copy and paste it into a file yourself . Please submit the resulting file with your code on Canvas Assignment P5.
📗 You could load your answers from the text (or txt file) in the text box below using the button . The first two lines should be "##p: 5" and "##id: your id", and the format of the remaining lines should be "##1: your answer to question 1" newline "##2: your answer to question 2", etc. Please make sure that your answers are loaded correctly before submitting them.
📗 Saving and loading may take around 10 to 20 seconds. Please be patient and do not click "Load" multiple times.
📗 The sample solution in Java and Python will be posted around the deadline. You are allowed to copy and use parts of the solution without attribution. You are allowed to use code from other people and from the Internet, but you must give proper attribution at the beginning of the your code. MOSS will be used for code plagiarism check: blocks of copied code without attribution will result in a zero for the whole assignment.
📗 Sample solution from last year: 2020 P5. The homework is slightly different, please use with caution.
📗 Sample solution: TBA.
📗 Sample solution:
Java: File
Python: File
The Python code for printing the maze is posted on Piazza.
You have to modify the code of BFS and A* Manhattan distance to do DFS and A* Euclidean.
📗 You can get help on understanding the algorithm from any of the office hours. To get help with debugging code in Java, please come during the Monday to Friday 2:00 to 3:00 Zoom office hours or Saturday to Sunday 2:00 to 3:00 (I can stay for a few hours after 3:00 by appointment) in-person office hours. To get help with debugging code in Python, please come during the Tuesday 3:00 to 5:00 in-person office hours or the Thursday 3:00 to 5:00 Zoom office hours. You are encouraged to work with other students, but if you use their code, you must give attribution at the beginning of your code.