Esempio n. 1
0
def solve(assignment, domains):
    """Solve a CSP problem. Starts the backtrack process"""
    global backtracks, splits, constraints

    backtracks = splits = 0

    # Fast deepcopy the initial state
    new_domains = {k: [v for v in values] for k,values in domains.iteritems()}
    new_assignment = {k: v for k,v in assignment.iteritems()}
    
    # Use initial assignment to prune domains
    assigned_vars = assignment.keys()
    while assigned_vars != False and len(assigned_vars) > 0:
        assigned_vars = propagate(new_domains, new_assignment, constraints, assigned_vars)

    # Start the solver
    return bt(new_assignment, new_domains, [])
Esempio n. 2
0
def bt(assignment, domains, last_var):
    """Performs a CSP solving with the Backtrack algorithm"""
    global backtracks, splits, constraints

    # Fast deepcopy the CSP state
    new_domains = {k: [v for v in values] for k,values in domains.iteritems()}
    new_assignment = {k: v for k,v in assignment.iteritems()}


    # Prune the domains connected with the assigned variables
    assigned_vars = [last_var]
    while assigned_vars != False and len(assigned_vars) > 0:
        assigned_vars = propagate(new_domains, new_assignment, constraints, assigned_vars)

    # Check for inconsistency
    if (assigned_vars == False):
        return False

    # Pick the next variable
    var = hr.pick_variable(new_domains, constraints, method=variable_heuristic)
    #sudoku.print_board_domains(domains)

    # Check if a solution is found done
    if var == None:
        return new_assignment

    # Backtracking for each value
    values = hr.pick_values(var, domains, constraints, method=value_heuristic)
    for value in values:
        new_assignment[var] = value
        res = bt(new_assignment, new_domains, var)
        if res != False:
            return res
        backtracks += 1
        
    splits += 1
    return False