Skip to content

Commit 6986247

Browse files
committed
added doctest in Sudoku for AC4 and and the possibility of choosing the constant propagation algorithm in mac inference
1 parent c0b8383 commit 6986247

2 files changed

Lines changed: 41 additions & 11 deletions

File tree

csp.py

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -290,9 +290,9 @@ def forward_checking(csp, var, value, assignment, removals):
290290
return True
291291

292292

293-
def mac(csp, var, value, assignment, removals):
293+
def mac(csp, var, value, assignment, removals, constraint_propagation=AC3):
294294
"""Maintain arc consistency."""
295-
return AC3(csp, {(X, var) for X in csp.neighbors[var]}, removals)
295+
return constraint_propagation(csp, {(X, var) for X in csp.neighbors[var]}, removals)
296296

297297

298298
# The search, proper
@@ -326,11 +326,11 @@ def backtrack(assignment):
326326

327327

328328
# ______________________________________________________________________________
329-
# Min-conflicts hillclimbing search for CSPs
329+
# Min-conflicts Hill Climbing search for CSPs
330330

331331

332332
def min_conflicts(csp, max_steps=100000):
333-
"""Solve a CSP by stochastic hillclimbing on the number of conflicts."""
333+
"""Solve a CSP by stochastic Hill Climbing on the number of conflicts."""
334334
# Generate a complete assignment for all variables (probably with conflicts)
335335
csp.current = current = {}
336336
for var in csp.variables:
@@ -532,7 +532,7 @@ def queen_constraint(A, a, B, b):
532532
return A == B or (a != b and A + a != B + b and A - a != B - b)
533533

534534

535-
class NQueensCSP(CSP):
535+
class NQueens(CSP):
536536
"""Make a CSP for the nQueens problem for search with min_conflicts.
537537
Suitable for large n, it uses only data structures of size O(n).
538538
Think of placing queens one per column, from left to right.
@@ -548,7 +548,7 @@ class NQueensCSP(CSP):
548548
a variable, and a best value for the variable, are each O(n).
549549
If you want, you can keep track of conflicted variables, then variable
550550
selection will also be O(1).
551-
>>> len(backtracking_search(NQueensCSP(8)))
551+
>>> len(backtracking_search(NQueens(8)))
552552
8
553553
"""
554554

@@ -673,7 +673,37 @@ class Sudoku(CSP):
673673
>>> h = Sudoku(harder1)
674674
>>> backtracking_search(h, select_unassigned_variable=mrv, inference=forward_checking) is not None
675675
True
676-
""" # noqa
676+
677+
>>> e = Sudoku(easy1)
678+
>>> e.display(e.infer_assignment())
679+
. . 3 | . 2 . | 6 . .
680+
9 . . | 3 . 5 | . . 1
681+
. . 1 | 8 . 6 | 4 . .
682+
------+-------+------
683+
. . 8 | 1 . 2 | 9 . .
684+
7 . . | . . . | . . 8
685+
. . 6 | 7 . 8 | 2 . .
686+
------+-------+------
687+
. . 2 | 6 . 9 | 5 . .
688+
8 . . | 2 . 3 | . . 9
689+
. . 5 | . 1 . | 3 . .
690+
>>> AC4(e); e.display(e.infer_assignment())
691+
True
692+
4 8 3 | 9 2 1 | 6 5 7
693+
9 6 7 | 3 4 5 | 8 2 1
694+
2 5 1 | 8 7 6 | 4 9 3
695+
------+-------+------
696+
5 4 8 | 1 3 2 | 9 7 6
697+
7 2 9 | 5 6 4 | 1 3 8
698+
1 3 6 | 7 9 8 | 2 4 5
699+
------+-------+------
700+
3 7 2 | 6 8 9 | 5 1 4
701+
8 1 4 | 2 5 3 | 7 6 9
702+
6 9 5 | 4 1 7 | 3 8 2
703+
>>> h = Sudoku(harder1)
704+
>>> backtracking_search(h, select_unassigned_variable=mrv, inference=forward_checking) is not None
705+
True
706+
"""
677707

678708
R3 = _R3
679709
Cell = _CELL

tests/test_csp.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -376,12 +376,12 @@ def test_min_conflicts():
376376

377377
australia_impossible = MapColoringCSP(list('RG'), 'SA: WA NT Q NSW V; NT: WA Q; NSW: Q V; T: ')
378378
assert min_conflicts(australia_impossible, 1000) is None
379-
assert min_conflicts(NQueensCSP(2), 1000) is None
380-
assert min_conflicts(NQueensCSP(3), 1000) is None
379+
assert min_conflicts(NQueens(2), 1000) is None
380+
assert min_conflicts(NQueens(3), 1000) is None
381381

382382

383383
def test_nqueens_csp():
384-
csp = NQueensCSP(8)
384+
csp = NQueens(8)
385385

386386
assignment = {0: 0, 1: 1, 2: 2, 3: 3, 4: 4}
387387
csp.assign(5, 5, assignment)
@@ -428,7 +428,7 @@ def test_nqueens_csp():
428428
assert 6 not in assignment
429429

430430
for n in range(5, 9):
431-
csp = NQueensCSP(n)
431+
csp = NQueens(n)
432432
solution = min_conflicts(csp)
433433
assert not solution or sorted(solution.values()) == list(range(n))
434434

0 commit comments

Comments
 (0)