From d0fe31383a56231fd7d24881f1237bf0ade285ff Mon Sep 17 00:00:00 2001 From: fredrikr79 Date: Tue, 23 Sep 2025 15:04:02 +0200 Subject: [PATCH] backtracking search wip --- assignment2/csp.py | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) 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]]: