Skip to content

Commit 93af259

Browse files
committed
added map coloring SAT problem
1 parent ff8c411 commit 93af259

File tree

4 files changed

+242
-144
lines changed

4 files changed

+242
-144
lines changed

Diff for: csp.py

+44-29
Original file line numberDiff line numberDiff line change
@@ -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):
366375
def 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

400410
class 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

Comments
 (0)