-
Notifications
You must be signed in to change notification settings - Fork 0
/
BreathFirstSearch.java
146 lines (115 loc) · 3.74 KB
/
BreathFirstSearch.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
import java.util.ArrayList;
import java.util.List;
import components.queue.Queue;
import components.queue.Queue1L;
import components.set.Set;
import components.set.Set1L;
import components.simplereader.SimpleReader;
import components.simplereader.SimpleReader1L;
import components.simplewriter.SimpleWriter;
import components.simplewriter.SimpleWriter1L;
/**
* Class implementing the breadth first search algorithm.
*
* @author greedywind / James Archer
*
*/
public class BreadthFirstSearch extends NodeExpander {
public int PathCostToGoal;
/**
* Private constructor so this utility class cannot be instantiated.
*/
public BreadthFirstSearch() {
}
/**
*
* @param n
* Node of type n
* @param goalState
* The specified goalstate
* @return
*
*/
private static boolean isGoalStateOnExpansion(Node n,String goalState){
return n.getState().equals(goalState);
}
/**
* This method checks if a given node is in the frontier by traversing through
* it.
* @param node
* A node of type Node2
* @param Frontier
* A list of type Node2
* @return
* returns whether or not the given node is in the frontier
*/
private static boolean isInFrontier(Node node, Queue<Node>Frontier){
for(Node fn:Frontier){
if(fn.getState().equals(node.getState())){
return true;
}
}
return false;
}
/**
* This method prints the solution to a search from the given node to a goal node.
* @param node
* A node of type Node2
* @param explored
* The set of explored states during the search.
*/
private static void printSolution(Node node, List<String> explored){
SimpleWriter out=new SimpleWriter1L();
out.println("The explored set is: ");
for (String fn:explored){
out.print(fn+ "-->");
}
out.println();
out.println("The solution is: ");
for (Node fn:node.getPathFromRoot()){
out.print(fn.getState()+"-->");
}
out.println();
out.println("The pathcost is: "+ node.getPathCost());
out.close();
}
/**
* Main method.
*
* @param args
* the command line arguments
*/
public void BreadthFirstsearch(Node rootNode, String goalState ){
SimpleWriter out=new SimpleWriter1L();
Queue<Node> frontier=new Queue1L<>();
frontier.enqueue(rootNode);
List<String> explored=new ArrayList<>();
this.PathCostToGoal=0; // created for use later as an object parameter. not relevant to current problem.
if (isGoalStateOnExpansion(rootNode,goalState)){
printSolution(rootNode, explored);
return;
}
Node current=frontier.front();
while(frontier.length()>0){
current=frontier.dequeue();
List<Node> successorNodes=expandNode(current);
out.println("Current Expanded Node: " + current.getState());
explored.add(current.getState());
if (isGoalStateOnExpansion(current,goalState)){
out.println("Solution Reached!!!");
printSolution(current,explored);
this.PathCostToGoal=current.getPathCost();
return;
}
for(Node fn:successorNodes){
if (!(explored.contains(fn.getState()) || isInFrontier(fn,frontier))){
frontier.enqueue(fn);
}
}
}
out.println("Solution could not be found");
out.println("Search terminated at: " + current.getState());
out.println("Current Path Cost: "+ current.getPathCost());
out.close();
}
}