diff --git a/assignment2/csp.py b/assignment2/csp.py index 53fe7d1..f01cc63 100644 --- a/assignment2/csp.py +++ b/assignment2/csp.py @@ -130,11 +130,32 @@ class CSP: A solution if any exists, otherwise None """ - def backtrack(assignment: dict[str, Any]): - # YOUR CODE HERE (and remove the assertion below) - assert False, "Not implemented" + return self._backtrack({}) - return backtrack({}) + def _select_unassigned_variable(self, assignment) -> str: + for v in self.variables: + if v not in assignment.keys(): + return v + return "this shouldn't happen" + + # TODO: may be wrong + def _order_domain_values(self, var, assignment) -> list[Any]: + """least constrained value""" + + def compare(value) -> int: + s = 0 + for neighbor in [ + b for (a, b) in self.binary_constraints.keys() if a == var + ]: + if neighbor in assignment.keys(): + continue + for neighbor_value in self.domains[neighbor]: + s += (value, neighbor_value) not in self.binary_constraints[ + (var, neighbor) + ] + return s + + return sorted(list(self.domains[var]), key=compare) def alldiff(variables: list[str]) -> list[tuple[str, str]]: