@@ -74,10 +74,12 @@ def unassign(self, var, assignment):
7474
7575 def nconflicts (self , var , val , assignment ):
7676 """Return the number of conflicts var=val has with other variables."""
77+
7778 # Subclasses may implement this more efficiently
7879 def conflict (var2 ):
7980 return (var2 in assignment and
8081 not self .constraints (var , val , var2 , assignment [var2 ]))
82+
8183 return count (conflict (v ) for v in self .neighbors [var ])
8284
8385 def display (self , assignment ):
@@ -153,6 +155,7 @@ def conflicted_vars(self, current):
153155 return [var for var in self .variables
154156 if self .nconflicts (var , current [var ], current ) > 0 ]
155157
158+
156159# ______________________________________________________________________________
157160# Constraint Propagation with AC-3
158161
@@ -183,6 +186,7 @@ def revise(csp, Xi, Xj, removals):
183186 revised = True
184187 return revised
185188
189+
186190# ______________________________________________________________________________
187191# CSP Backtracking Search
188192
@@ -208,6 +212,7 @@ def num_legal_values(csp, var, assignment):
208212 return count (csp .nconflicts (var , val , assignment ) == 0
209213 for val in csp .domains [var ])
210214
215+
211216# Value ordering
212217
213218
@@ -221,6 +226,7 @@ def lcv(var, assignment, csp):
221226 return sorted (csp .choices (var ),
222227 key = lambda val : csp .nconflicts (var , val , assignment ))
223228
229+
224230# Inference
225231
226232
@@ -245,6 +251,7 @@ def mac(csp, var, value, assignment, removals):
245251 """Maintain arc consistency."""
246252 return AC3 (csp , {(X , var ) for X in csp .neighbors [var ]}, removals )
247253
254+
248255# The search, proper
249256
250257
@@ -274,6 +281,7 @@ def backtrack(assignment):
274281 assert result is None or csp .goal_test (result )
275282 return result
276283
284+
277285# ______________________________________________________________________________
278286# Min-conflicts hillclimbing search for CSPs
279287
@@ -302,6 +310,7 @@ def min_conflicts_value(csp, var, current):
302310 return argmin_random_tie (csp .domains [var ],
303311 key = lambda val : csp .nconflicts (var , val , current ))
304312
313+
305314# ______________________________________________________________________________
306315
307316
@@ -356,7 +365,7 @@ def build_topological(node, parent, neighbors, visited, stack, parents):
356365 visited [node ] = True
357366
358367 for n in neighbors [node ]:
359- if (not visited [n ]):
368+ if (not visited [n ]):
360369 build_topological (n , node , neighbors , visited , stack , parents )
361370
362371 parents [node ] = parent
@@ -366,9 +375,9 @@ def build_topological(node, parent, neighbors, visited, stack, parents):
366375def make_arc_consistent (Xj , Xk , csp ):
367376 """Make arc between parent (Xj) and child (Xk) consistent under the csp's constraints,
368377 by removing the possible values of Xj that cause inconsistencies."""
369- #csp.curr_domains[Xj] = []
378+ # csp.curr_domains[Xj] = []
370379 for val1 in csp .domains [Xj ]:
371- keep = False # Keep or remove val1
380+ keep = False # Keep or remove val1
372381 for val2 in csp .domains [Xk ]:
373382 if csp .constraints (Xj , val1 , Xk , val2 ):
374383 # Found a consistent assignment for val1, keep it
@@ -393,8 +402,9 @@ def assign_value(Xj, Xk, csp, assignment):
393402 # No consistent assignment available
394403 return None
395404
405+
396406# ______________________________________________________________________________
397- # Map- Coloring Problems
407+ # Map Coloring Problems
398408
399409
400410class UniversalDict :
@@ -446,27 +456,27 @@ def parse_neighbors(neighbors, variables=None):
446456 return dic
447457
448458
449- australia = MapColoringCSP (list ('RGB' ),
450- 'SA: WA NT Q NSW V; NT: WA Q; NSW: Q V; T: ' )
451-
452- usa = MapColoringCSP ( list ( 'RGBY' ),
453- """WA: OR ID; OR: ID NV CA; CA: NV AZ; NV: ID UT AZ; ID: MT WY UT ;
454- UT: WY CO AZ; MT: ND SD WY; WY: SD NE CO; CO: NE KA OK NM; NM: OK TX AZ ;
455- ND: MN SD; SD: MN IA NE; NE: IA MO KA; KA: MO OK; OK: MO AR TX ;
456- TX: AR LA; MN: WI IA; IA: WI IL MO; MO: IL KY TN AR; AR: MS TN LA ;
457- LA: MS; WI: MI IL; IL: IN KY; IN: OH KY; MS: TN AL; AL: TN GA FL;
458- MI: OH IN; OH: PA WV KY; KY: WV VA TN; TN: VA NC GA; GA: NC SC FL ;
459- PA: NY NJ DE MD WV; WV: MD VA; VA : MD DC NC; NC: SC; NY: VT MA CT NJ ;
460- NJ: DE; DE: MD; MD: DC; VT: NH MA; MA: NH RI CT; CT: RI; ME: NH;
461- HI: ; AK: """ )
462-
463- france = MapColoringCSP ( list ( 'RGBY' ),
464- """AL: LO FC; AQ: MP LI PC; AU: LI CE BO RA LR MP; BO: CE IF CA FC RA
465- AU; BR: NB PL; CA: IF PI LO FC BO; CE: PL NB NH IF BO AU LI PC; FC: BO
466- CA LO AL RA; IF: NH PI CA BO CE; LI: PC CE AU MP AQ; LO: CA AL FC; LR :
467- MP AU RA PA; MP: AQ LI AU LR; NB : NH CE PL BR; NH: PI IF CE NB; NO :
468- PI; PA: LR RA; PC: PL CE LI AQ; PI: NH NO CA IF; PL: BR NB CE PC; RA:
469- AU BO FC PA LR""" )
459+ australia_csp = MapColoringCSP (list ('RGB' ), """SA: WA NT Q NSW V; NT: WA Q; NSW: Q V; T: """ )
460+
461+ usa_csp = MapColoringCSP ( list ( 'RGBY' ),
462+ """WA: OR ID; OR: ID NV CA; CA: NV AZ; NV: ID UT AZ; ID: MT WY UT;
463+ UT: WY CO AZ; MT: ND SD WY; WY: SD NE CO; CO: NE KA OK NM; NM: OK TX AZ ;
464+ ND: MN SD; SD: MN IA NE; NE: IA MO KA; KA: MO OK; OK: MO AR TX ;
465+ TX: AR LA; MN: WI IA; IA: WI IL MO; MO: IL KY TN AR; AR: MS TN LA ;
466+ LA: MS; WI: MI IL; IL: IN KY; IN: OH KY; MS: TN AL; AL: TN GA FL ;
467+ MI: OH IN; OH: PA WV KY; KY: WV VA TN; TN: VA NC GA; GA: NC SC FL;
468+ PA: NY NJ DE MD WV; WV: MD VA; VA: MD DC NC; NC: SC; NY: VT MA CT NJ ;
469+ NJ: DE; DE : MD; MD: DC; VT: NH MA; MA: NH RI CT; CT: RI; ME: NH ;
470+ HI: ; AK: """ )
471+
472+ france_csp = MapColoringCSP ( list ( 'RGBY' ),
473+ """AL: LO FC; AQ: MP LI PC; AU: LI CE BO RA LR MP; BO: CE IF CA FC RA
474+ AU; BR: NB PL; CA: IF PI LO FC BO; CE: PL NB NH IF BO AU LI PC; FC: BO
475+ CA LO AL RA; IF: NH PI CA BO CE; LI: PC CE AU MP AQ; LO: CA AL FC; LR:
476+ MP AU RA PA; MP: AQ LI AU LR; NB: NH CE PL BR; NH: PI IF CE NB; NO :
477+ PI; PA: LR RA; PC: PL CE LI AQ; PI : NH NO CA IF; PL: BR NB CE PC; RA :
478+ AU BO FC PA LR""" )
479+
470480
471481# ______________________________________________________________________________
472482# n-Queens Problem
@@ -503,16 +513,16 @@ def __init__(self, n):
503513 CSP .__init__ (self , list (range (n )), UniversalDict (list (range (n ))),
504514 UniversalDict (list (range (n ))), queen_constraint )
505515
506- self .rows = [0 ]* n
507- self .ups = [0 ]* ( 2 * n - 1 )
508- self .downs = [0 ]* ( 2 * n - 1 )
516+ self .rows = [0 ] * n
517+ self .ups = [0 ] * ( 2 * n - 1 )
518+ self .downs = [0 ] * ( 2 * n - 1 )
509519
510520 def nconflicts (self , var , val , assignment ):
511521 """The number of conflicts, as recorded with each assignment.
512522 Count conflicts in row and in up, down diagonals. If there
513523 is a queen there, it can't conflict with itself, so subtract 3."""
514524 n = len (self .variables )
515- c = self .rows [val ] + self .downs [var + val ] + self .ups [var - val + n - 1 ]
525+ c = self .rows [val ] + self .downs [var + val ] + self .ups [var - val + n - 1 ]
516526 if assignment .get (var , None ) == val :
517527 c -= 3
518528 return c
@@ -560,6 +570,7 @@ def display(self, assignment):
560570 print (str (self .nconflicts (var , val , assignment )) + ch , end = ' ' )
561571 print ()
562572
573+
563574# ______________________________________________________________________________
564575# Sudoku
565576
@@ -646,9 +657,12 @@ def show_cell(cell): return str(assignment.get(cell, '.'))
646657
647658 def abut (lines1 , lines2 ): return list (
648659 map (' | ' .join , list (zip (lines1 , lines2 ))))
660+
649661 print ('\n ------+-------+------\n ' .join (
650662 '\n ' .join (reduce (
651663 abut , map (show_box , brow ))) for brow in self .bgrid ))
664+
665+
652666# ______________________________________________________________________________
653667# The Zebra Puzzle
654668
@@ -716,6 +730,7 @@ def zebra_constraint(A, a, B, b, recurse=0):
716730 (A in Smokes and B in Smokes )):
717731 return not same
718732 raise Exception ('error' )
733+
719734 return CSP (variables , domains , neighbors , zebra_constraint )
720735
721736
0 commit comments