-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathProblemCannibals.java
More file actions
197 lines (159 loc) · 6.92 KB
/
ProblemCannibals.java
File metadata and controls
197 lines (159 loc) · 6.92 KB
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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
import java.util.HashSet;
import java.util.Set;
public class ProblemCannibals extends Problem {
static final int cannL = 0;
static final int missL = 1;
static final int boatL = 2;
static final int cannR = 3;
static final int missR = 4;
static final int boatR = 5;
boolean goal_test(Object state) {
StateCannibals can_state = (StateCannibals) state;
if (can_state.canArray[cannR] == 3 && can_state.canArray[missR] == 3 && can_state.canArray[boatR] == 1)
return true;
else
return false;
}
Set<Object> getSuccessors(Object state) {
Set<Object> set = new HashSet<Object>();
StateCannibals can_state = (StateCannibals) state;
// Let's create without any constraint, then remove the illegal ones
StateCannibals successor_state;
// one cannibal only from left to right
successor_state = new StateCannibals(can_state);
successor_state.canArray[cannL] -= 1;
successor_state.canArray[cannR] += 1;
successor_state.canArray[boatL] -= 1;
successor_state.canArray[boatR] += 1;
if (isValid(successor_state))
set.add(successor_state);
// one cannibal only from right to left
successor_state = new StateCannibals(can_state);
successor_state.canArray[cannL] += 1;
successor_state.canArray[cannR] -= 1;
successor_state.canArray[boatL] += 1;
successor_state.canArray[boatR] -= 1;
if (isValid(successor_state))
set.add(successor_state);
// two cannibals from left to right
successor_state = new StateCannibals(can_state);
successor_state.canArray[cannL] -= 2;
successor_state.canArray[cannR] += 2;
successor_state.canArray[boatL] -= 1;
successor_state.canArray[boatR] += 1;
if (isValid(successor_state))
set.add(successor_state);
// two cannibals from right to left
successor_state = new StateCannibals(can_state);
successor_state.canArray[cannL] += 2;
successor_state.canArray[cannR] -= 2;
successor_state.canArray[boatL] += 1;
successor_state.canArray[boatR] -= 1;
if (isValid(successor_state))
set.add(successor_state);
// one missionary only from left to right
successor_state = new StateCannibals(can_state);
successor_state.canArray[missL] -= 1;
successor_state.canArray[missR] += 1;
successor_state.canArray[boatL] -= 1;
successor_state.canArray[boatR] += 1;
if (isValid(successor_state))
set.add(successor_state);
// one missionary only from right to left
successor_state = new StateCannibals(can_state);
successor_state.canArray[missL] += 1;
successor_state.canArray[missR] -= 1;
successor_state.canArray[boatL] += 1;
successor_state.canArray[boatR] -= 1;
if (isValid(successor_state))
set.add(successor_state);
// two missionaries from left to right
successor_state = new StateCannibals(can_state);
successor_state.canArray[missL] -= 2;
successor_state.canArray[missR] += 2;
successor_state.canArray[boatL] -= 1;
successor_state.canArray[boatR] += 1;
if (isValid(successor_state))
set.add(successor_state);
// two missionaries from right to left
successor_state = new StateCannibals(can_state);
successor_state.canArray[missL] += 2;
successor_state.canArray[missR] -= 2;
successor_state.canArray[boatL] += 1;
successor_state.canArray[boatR] -= 1;
if (isValid(successor_state))
set.add(successor_state);
// one cannibal and one missionary from left to right
successor_state = new StateCannibals(can_state);
successor_state.canArray[cannL] -= 1;
successor_state.canArray[cannR] += 1;
successor_state.canArray[missL] -= 1;
successor_state.canArray[missR] += 1;
successor_state.canArray[boatL] -= 1;
successor_state.canArray[boatR] += 1;
if (isValid(successor_state))
set.add(successor_state);
// one cannibal and one missionary from right to left
successor_state = new StateCannibals(can_state);
successor_state.canArray[cannL] += 1;
successor_state.canArray[cannR] -= 1;
successor_state.canArray[missL] += 1;
successor_state.canArray[missR] -= 1;
successor_state.canArray[boatL] += 1;
successor_state.canArray[boatR] -= 1;
if (isValid(successor_state))
set.add(successor_state);
return set;
}
private boolean isValid(StateCannibals state) {
// Checking to see if any element of the array is negative
for (int i = 0; i < 6; i++)
if (state.canArray[i] < 0)
return false;
// Checking to see if the numbers of cannibals, missionaries, and boat
// are more then 3,3,1 respectively
if (state.canArray[cannL] + state.canArray[cannR] > 3 || state.canArray[missL] + state.canArray[missR] > 3
|| state.canArray[boatL] + state.canArray[boatR] > 1)
return false;
if (state.canArray[cannL] > 3 || state.canArray[missL] > 3 || state.canArray[boatL] > 1)
return false;
if (state.canArray[cannR] > 3 || state.canArray[missR] > 3 || state.canArray[boatR] > 1)
return false;
// Now, checking if cannibals out number missionaries
// if there are zero missionaries, then any number of cannibals is fine
if ((state.canArray[cannL] > state.canArray[missL]) && state.canArray[missL] > 0
|| (state.canArray[cannR] > state.canArray[missR] && state.canArray[missR] > 0))
return false;
return true;
}
double step_cost(Object fromState, Object toState) {
return 1;
}
//Use the below h in Uninformed search (Question 3)
public double h(Object state) { return 0; }
// Add heuristic function (2n-3) and use it for Informed search (Question 5)
// public double h(Object state) {
// StateCannibals st = (StateCannibals) state;
// return 2 * (st.canArray[cannL] + st.canArray[missL]) - 3;
// }
public static void main(String[] args) throws Exception {
ProblemCannibals problem = new ProblemCannibals();
int[] canArray = { 3, 3, 1, 0, 0, 0 };
problem.initialState = new StateCannibals(canArray);
Search search = new Search(problem);
System.out.println("\n\nQuestion #3: Cannibels Missionaries Problem - Uninformed Strategies\n");
System.out.println("BreadthFirstTreeSearch:\t\t" + search.BreadthFirstTreeSearch());
System.out.println("BreadthFirstGraphSearch:\t" + search.BreadthFirstGraphSearch());
System.out.println("\nDepthFirstTreeSearch:\t" + search.DepthFirstTreeSearch());
System.out.println("DepthFirstGraphSearch:\t" + search.DepthFirstGraphSearch());
System.out.println("\nUniformCostTreeSearch:\t" + search.UniformCostTreeSearch());
System.out.println("UniformCostGraphSearch:\t" + search.UniformCostGraphSearch());
System.out.println("\nIterativeDeepeningTreeSearch:\t" + search.IterativeDeepeningTreeSearch());
System.out.println("IterativeDeepeningGraphSearch:\t" + search.IterativeDeepeningGraphSearch());
System.out.println("\n\nQuestion #5: Cannibels Missionaries Problem - Heuristic function\n");
System.out.println("\nGreedyBestFirstTreeSearch:\t" + search.GreedyBestFirstTreeSearch());
System.out.println("\nGreedyBestFirstGraphSearch:\t" + search.GreedyBestFirstGraphSearch());
System.out.println("\nAstarTreeSearch:\t" + search.AstarTreeSearch());
System.out.println("\nAstarGraphSearch:\t" + search.AstarGraphSearch());
}
}