@@ -166,6 +166,94 @@ def test_csp_conflicted_vars():
166
166
assert (conflicted_vars == ['B' , 'C' ] or conflicted_vars == ['C' , 'B' ])
167
167
168
168
169
+ def test_revise ():
170
+ neighbors = parse_neighbors ('A: B; B: ' )
171
+ domains = {'A' : [0 ], 'B' : [4 ]}
172
+ constraints = lambda X , x , Y , y : x % 2 == 0 and (x + y ) == 4
173
+
174
+ csp = CSP (variables = None , domains = domains , neighbors = neighbors , constraints = constraints )
175
+ csp .support_pruning ()
176
+ Xi = 'A'
177
+ Xj = 'B'
178
+ removals = []
179
+
180
+ assert revise (csp , Xi , Xj , removals ) is False
181
+ assert len (removals ) == 0
182
+
183
+ domains = {'A' : [0 , 1 , 2 , 3 , 4 ], 'B' : [0 , 1 , 2 , 3 , 4 ]}
184
+ csp = CSP (variables = None , domains = domains , neighbors = neighbors , constraints = constraints )
185
+ csp .support_pruning ()
186
+
187
+ assert revise (csp , Xi , Xj , removals ) is True
188
+ assert removals == [('A' , 1 ), ('A' , 3 )]
189
+
190
+
191
+ def test_AC3 ():
192
+ neighbors = parse_neighbors ('A: B; B: ' )
193
+ domains = {'A' : [0 , 1 , 2 , 3 , 4 ], 'B' : [0 , 1 , 2 , 3 , 4 ]}
194
+ constraints = lambda X , x , Y , y : x % 2 == 0 and (x + y ) == 4 and y % 2 != 0
195
+ removals = []
196
+
197
+ csp = CSP (variables = None , domains = domains , neighbors = neighbors , constraints = constraints )
198
+
199
+ assert AC3 (csp , removals = removals ) is False
200
+
201
+ constraints = lambda X , x , Y , y : (x % 2 ) == 0 and (x + y ) == 4
202
+ removals = []
203
+ csp = CSP (variables = None , domains = domains , neighbors = neighbors , constraints = constraints )
204
+
205
+ assert AC3 (csp , removals = removals ) is True
206
+ assert (removals == [('A' , 1 ), ('A' , 3 ), ('B' , 1 ), ('B' , 3 )] or
207
+ removals == [('B' , 1 ), ('B' , 3 ), ('A' , 1 ), ('A' , 3 )])
208
+
209
+
210
+ def test_first_unassigned_variable ():
211
+ map_coloring_test = MapColoringCSP (list ('123' ), 'A: B C; B: C; C: ' )
212
+ assignment = {'A' : '1' , 'B' : '2' }
213
+ assert first_unassigned_variable (assignment , map_coloring_test ) == 'C'
214
+
215
+ assignment = {'B' : '1' }
216
+ assert (first_unassigned_variable (assignment , map_coloring_test ) == 'A' or
217
+ first_unassigned_variable (assignment , map_coloring_test ) == 'C' )
218
+
219
+
220
+ def test_num_legal_values ():
221
+ map_coloring_test = MapColoringCSP (list ('123' ), 'A: B C; B: C; C: ' )
222
+ map_coloring_test .support_pruning ()
223
+ var = 'A'
224
+ assignment = {}
225
+
226
+ assert num_legal_values (map_coloring_test , var , assignment ) == 3
227
+
228
+ map_coloring_test = MapColoringCSP (list ('RGB' ), 'A: B C; B: C; C: ' )
229
+ assignment = {'A' : 'R' , 'B' : 'G' }
230
+ var = 'C'
231
+
232
+ assert num_legal_values (map_coloring_test , var , assignment ) == 1
233
+
234
+
235
+ def test_mrv ():
236
+ neighbors = parse_neighbors ('A: B; B: C; C: ' )
237
+ domains = {'A' : [0 , 1 , 2 , 3 , 4 ], 'B' : [4 ], 'C' : [0 , 1 , 2 , 3 , 4 ]}
238
+ constraints = lambda X , x , Y , y : x % 2 == 0 and (x + y ) == 4
239
+ csp = CSP (variables = None , domains = domains , neighbors = neighbors , constraints = constraints )
240
+ assignment = {'A' : 0 }
241
+
242
+ assert mrv (assignment , csp ) == 'B'
243
+
244
+ domains = {'A' : [0 , 1 , 2 , 3 , 4 ], 'B' : [0 , 1 , 2 , 3 , 4 ], 'C' : [0 , 1 , 2 , 3 , 4 ]}
245
+ csp = CSP (variables = None , domains = domains , neighbors = neighbors , constraints = constraints )
246
+
247
+ assert (mrv (assignment , csp ) == 'B' or
248
+ mrv (assignment , csp ) == 'C' )
249
+
250
+ domains = {'A' : [0 , 1 , 2 , 3 , 4 ], 'B' : [0 , 1 , 2 , 3 , 4 , 5 , 6 ], 'C' : [0 , 1 , 2 , 3 , 4 ]}
251
+ csp = CSP (variables = None , domains = domains , neighbors = neighbors , constraints = constraints )
252
+ csp .support_pruning ()
253
+
254
+ assert mrv (assignment , csp ) == 'C'
255
+
256
+
169
257
def test_backtracking_search ():
170
258
assert backtracking_search (australia )
171
259
assert backtracking_search (australia , select_unassigned_variable = mrv )
0 commit comments