示例#1
0
def assign_days(Day_arrangement, cursor):
    global Subs
    global crsr
    crsr = cursor
    cursor.execute('''
    	select sname,count(roll) from Classes,Subjects 
    	where Classes.class=Subjects.class 
    	group by sname 
    	''')
    subs = cursor.fetchall()
    Subs = []
    for i in subs:
        #print(i)
        Subs.append(i[0])
    Arrangement = dict((sub, [1, 2, 3, 4, 5, 6, 7]) for sub in Subs)
    #print(Arrangement)
    Constraints = [(Subs, day_check)]
    Problem = CspProblem(Subs, Arrangement, Constraints)
    output = backtrack(Problem)
    #print(output)
    print()
    for y, z in output.items():
        print('Day ', z, '==>', y)
        if z not in Day_arrangement:
            Day_arrangement[z] = []
        Day_arrangement[z].append(y)
示例#2
0
def resolver(metodo_busqueda, iteraciones):
    #problema = CspProblem(variables, dominios, restricciones)
    if metodo_busqueda == 'backtrack':
        return backtrack(CspProblem(variables, dominios, restricciones))
    if metodo_busqueda == 'min_conflicts':
        return min_conflicts(CspProblem(variables, dominios, restricciones),
                             iterations_limit=iteraciones)
def resolver(metodo_busqueda, iteraciones):
    problema = CspProblem(slots, dominios, restricciones)
    if metodo_busqueda == "backtrack":
        resultado = backtrack(problema)
        return resultado
    if metodo_busqueda == "min_conflicts":
        return min_conflicts(problema, iterations_limit=iteraciones)
示例#4
0
def solve_sudoku(board):
    variables = [(row, col)
                 for row in range(9)
                 for col in range(9)]

    domains = {variable: list(range(1, 10))
               for variable in variables}

    for cell, number in board.items():
        domains[cell] = [number, ]

    constraints = []

    for cell1, cell2 in itertools.combinations(variables, 2):
        row1, col1 = cell1
        row2, col2 = cell2

        if (row1 == row2) or (col1 == col2) or (big_square_of(cell1) == big_square_of(cell2)):
            constraints.append(((cell1, cell2), different))

    problem = CspProblem(variables, domains, constraints)
    result = backtrack(problem,
                       variable_heuristic=MOST_CONSTRAINED_VARIABLE,
                       inference=True)

    return result
def resolver(metodo_busqueda):
    problem = CspProblem(variables, dominios, restricciones)
    if metodo_busqueda == "backtrack":
        r = backtrack(problem, value_heuristic=LEAST_CONSTRAINING_VALUE, variable_heuristic=MOST_CONSTRAINED_VARIABLE, inference=True)
    else:
        r = min_conflicts(problem, iterations_limit=1000)
    return r
def resolver(metodo_busqueda, iteraciones):
	problem = CspProblem(variables, dominios, restricciones)

	if metodo_busqueda == 'backtrack':
		result = backtrack(problem, variable_heuristic=MOST_CONSTRAINED_VARIABLE, value_heuristic=LEAST_CONSTRAINING_VALUE)
	else:
		result = min_conflicts(problem, iterations_limit=iteraciones)

	return result
示例#7
0
def resolver(metodo_busqueda, iteraciones):
    problema = generar_problema_entrega2()

    if metodo_busqueda == "backtrack":
        resultado = backtrack(problema)

    elif metodo_busqueda == "min_conflicts":
        resultado = min_conflicts(problema, iterations_limit=iteraciones)

    return resultado
示例#8
0
def resolver(metodo_busqueda, iteraciones):
    if metodo_busqueda == "backtrack":
        resultado = backtrack(CspProblem(slots, dominios, restricciones), MOST_CONSTRAINED_VARIABLE, LEAST_CONSTRAINING_VALUE)
    if metodo_busqueda == "min_conflicts":
        resultado = min_conflicts(CspProblem(slots, dominios, restricciones), iterations_limit = iteraciones)

    result = {}
    for key, value in resultado.items():
        result[key] = modulos[value]
    return result
示例#9
0
def resolver(metodo_busqueda, iteraciones):
    problema = csp_conferencia()

    if metodo_busqueda == "backtrack":
        resultado = backtrack(problema)
        #resultado = backtrack(problema, variable_heuristic=MOST_CONSTRAINED_VARIABLE, value_heuristic=LEAST_CONSTRAINING_VALUE)

    elif metodo_busqueda == "min_conflicts":
        resultado = min_conflicts(problema, iterations_limit=iteraciones)

    return resultado
示例#10
0
def resolver(metodo_busqueda, iteraciones):
    unary()
    problem = CspProblem(VARIABLES, DOMAINS, restricciones)
    if metodo_busqueda == 'backtrack':
        result = backtrack(problem,
                           value_heuristic=HIGHEST_DEGREE_VARIABLE,
                           variable_heuristic=MOST_CONSTRAINED_VARIABLE,
                           inference=False)
    if metodo_busqueda == 'min_conflicts':
        result = min_conflicts(problem, iterations_limit=iteraciones)
    return result
def resolver(metodo_busqueda, iteraciones):
    problem = CspProblem(variables, dominios, restricciones)
    if metodo_busqueda == 'backtrack':
        resultado = backtrack(problem=problem)
        grabar('1', resultado, iteraciones=iteraciones)
        return resultado
        #def backtrack(problem, variable_heuristic='', value_heuristic='', inference=True):
    if metodo_busqueda == 'min_conflicts':
        resultado = min_conflicts(problem=problem,
                                  iterations_limit=iteraciones)
        #print iteraciones, resultado
        grabar('2', resultado, iteraciones=iteraciones)
        return resultado
示例#12
0
    def matchMatrix(matrix):
        matrix = np.array(matrix, dtype=int)
        zero_indices = np.argwhere(matrix == 0)
        print zero_indices
        variables = list(np.unique(zero_indices[:, 0]))

        domains = {}
        for v in variables:
            domains[v] = list(zero_indices[zero_indices[:, 0] == v][:, 1])
        print domains
        constraints = [[variables, nonequal_constr]]

        csp = CspProblem(variables, domains, constraints)
        result = backtrack(csp)
        return result
示例#13
0
    def solve(self):

        print 'Please wait while AI is solving the puzzle'
        print
        print

        self.cellVariablesTuple, self.cellDomains, self.cellConstraints = convert_to_binary(self.cellVariablesTuple, self.cellDomains,
                                                                                self.cellConstraints) #convert fields to binary

        problem = CspProblem(self.cellVariablesTuple,self.cellDomains,self.cellConstraints) # initialize the csp problem
        self.solution = backtrack(problem) #solve the csp problem.
        print 'CSP Problem Is Solved'
        print
        self.printSolution() #print the solution

        return
示例#14
0
              if (x, y) not in arboles and tiene_vecinos((x, y), arboles)]

# los valores posibles para cada carpa, son las posiciones disponibles
domains = {variable: posiciones[:] for variable in variables}


def carpas_no_estan_vecinas(variables, values):
    # restriccion binaria, chequea dos carpas:
    # asegurarse de que no estan vecinas
    return not tiene_vecinos(values[0], (values[1], ))


def carpas_estan_en_diferentes_posiciones(variables, values):
    # restriccion binaria, chequea dos carpas:
    # asegurarse de que no estan en la misma posicion
    return values[0] != values[1]


constrains = []
for variable1, variable2 in combinations(variables, 2):
    # por cada par de carpas, hace falta mirar que no sean vecinas y que no
    # esten en la misma posicion
    constrains.append(
        ((variable1, variable2), carpas_estan_en_diferentes_posiciones))
    constrains.append(((variable1, variable2), carpas_no_estan_vecinas))

problema = CspProblem(variables, domains, constrains)
result = backtrack(problema)

print result
示例#15
0
# restricción: no podemos elegir el laboratorio de plantas y el físico al mismo tiempo

domains["mejora2"].remove(("exp_fisicos", 75, 300))
domains["mejora2"].remove(("exp_plantas", 80, 250))

domains["mejora3"].remove(("exp_fisicos", 75, 300))
domains["mejora3"].remove(("exp_plantas", 80, 250))

# restricción: si están las computadoras, necesitamos que estén las baterías


def computers_require_batteries(variables, values):
    has_computers = "computadoras" in [improv[0] for improv in values]
    has_batteries = "baterías" in [improv[0] for improv in values]

    if has_computers:
        return has_batteries
    else:
        return True


constraints.append((problem_variables, computers_require_batteries))

problem = CspProblem(problem_variables, domains, constraints)
solution = backtrack(problem,
                     variable_heuristic=HIGHEST_DEGREE_VARIABLE,
                     value_heuristic=LEAST_CONSTRAINING_VALUE)

print("Solution:")
print(solution)
示例#16
0
    if values[_values[0]][0] == values[_values[1]][0]:
        if set(variables[_variables[0]][3]).intersection(
                set(variables[_variables[1]][3])):
            return False
        elif (variables[_variables[0]][2] == variables[_variables[1]][2]):
            return False
    return True


constraints = [((i, j), const_different) for i in range(len(variables))
               for j in range(i, len(variables)) if i != j]

my_problem = CspProblem(variables.keys(), domains, constraints)

t1 = time.time()
res = backtrack(my_problem, variable_heuristic=MOST_CONSTRAINED_VARIABLE)
print('\n\n\n\nMinimum remaining value: {}s'.format(time.time() - t1))
pretty_print(res, variables, values)

t1 = time.time()
res = backtrack(my_problem, variable_heuristic=HIGHEST_DEGREE_VARIABLE)
print('\n\n\n\nDegree heuristic: {}s'.format(time.time() - t1))
pretty_print(res, variables, values)

t1 = time.time()
res = backtrack(my_problem, value_heuristic=LEAST_CONSTRAINING_VALUE)
print('\n\n\n\nLeast constraining value: {}s'.format(time.time() - t1))
pretty_print(res, variables, values)

t1 = time.time()
res = min_conflicts(my_problem)
示例#17
0
from simpleai.search import CspProblem, backtrack, min_conflicts, MOST_CONSTRAINED_VARIABLE, HIGHEST_DEGREE_VARIABLE, LEAST_CONSTRAINING_VALUE

variables = ('WA', 'NT', 'SA', 'Q', 'NSW', 'V', 'T')

domains = dict((v, ['red', 'green', 'blue']) for v in variables)

def const_different(variables, values):
    return values[0] != values[1]  # expect the value of the neighbors to be different

constraints = [
    (('WA', 'NT'), const_different),
    (('WA', 'SA'), const_different),
    (('SA', 'NT'), const_different),
    (('SA', 'Q'), const_different),
    (('NT', 'Q'), const_different),
    (('SA', 'NSW'), const_different),
    (('Q', 'NSW'), const_different),
    (('SA', 'V'), const_different),
    (('NSW', 'V'), const_different),
]

my_problem = CspProblem(variables, domains, constraints)

print backtrack(my_problem)
print backtrack(my_problem, variable_heuristic=MOST_CONSTRAINED_VARIABLE)
print backtrack(my_problem, variable_heuristic=HIGHEST_DEGREE_VARIABLE)
print backtrack(my_problem, value_heuristic=LEAST_CONSTRAINING_VALUE)
print backtrack(my_problem, variable_heuristic=MOST_CONSTRAINED_VARIABLE, value_heuristic=LEAST_CONSTRAINING_VALUE)
print backtrack(my_problem, variable_heuristic=HIGHEST_DEGREE_VARIABLE, value_heuristic=LEAST_CONSTRAINING_VALUE)
print min_conflicts(my_problem)
示例#18
0
    return constraints


def display_solution(sol):
    for i in uppercase[:9]:
        print(" ".join([str(sol["%s%d" % (i, j)]) for j in range(1, 10)]))


domains.update(parsepuzzle(sudoku))

# -- Hand made binary constraints --
constraints = mkconstraints()
start = time()
domains0 = deepcopy(domains)
my_problem = CspProblem(variables, domains0, constraints)
sol = backtrack(my_problem)
elapsed = time() - start
display_solution(sol)
print("Took %d seconds to finish using binary constraints" %
      elapsed)  # because of AC3 should be quick

# -- N-ary constraints made binary using hidden variables --
domains1 = deepcopy(domains)
start = time()
variables1, domains1, constraints = convert_to_binary(variables, domains1,
                                                      mknaryconstraints())
my_problem = CspProblem(variables1, domains1, constraints)
sol = backtrack(my_problem)
elapsed = time() - start
display_solution(sol)
print("Took %d seconds to finish using binary constraints (hidden variables)" %
示例#19
0
文件: sudoku.py 项目: ucse-ia/ucse_ia
domains[(0, 2)] = [
    3,
]  # porque la casilla A3 tiene el número 3

constraints = []


def cells_are_different(variables, values):
    digit1, digit2 = values
    return digit1 != digit2


for row in rows:
    cells_in_row = [(row, col) for col in columns]
    for cell1, cell2 in combinations(cells_in_row, 2):
        constraints.append(((cell1, cell2), cells_are_different))

for col in columns:
    cells_in_col = [(row, col) for row in rows]
    for cell1, cell2 in combinations(cells_in_col, 2):
        constraints.append(((cell1, cell2), cells_are_different))

# TODO 2:
# agregar todas las restricciones de que sean diferentes las celdas dentro de cada mega-cuadrado (de 3x3)

problem = CspProblem(problem_variables, domains, constraints)
solution = backtrack(problem)

print("Solution:")
print(solution)
示例#20
0
    arriba = (casilla[0]-1,casilla[1])
    if arriba[0]<0:
        arriba = (-1,-1)
    abajo = (casilla[0]+1, casilla[1])
    if abajo[0] >= largo:
        abajo = (-1,-1)
    derecha = (casilla[0], casilla[1]+1)
    if derecha[1] >= ancho:
        derecha = (-1,-1)
    izquierda = (casilla[0], casilla[1]-1)
    if izquierda[1] < 0:
        izquierda = (-1,-1)
    restricciones.append(((arriba, abajo, izquierda, derecha), no_adyacentes))

restricciones.append((variables,cantidad_valida))

def imprimir_tablero(resultado):
    print '-'*40
    for fila in range(largo):
        fila_print = ''
        for columna in range(ancho):
            fila_print += '|%i' %resultado[(fila, columna)]
        print fila_print

        print '\n'

print 'Backtrack'
imprimir_tablero(backtrack(CspProblem(variables,dominio,restricciones)))

print 'Min conflicts'
imprimir_tablero(min_conflicts(CspProblem(variables,dominio,restricciones), iterations_limit=5000))
    x_b, y_b = b
    return not (vals[0] == vals[1] and (x_a == x_b or y_a == y_b))

dominios = {(x, y): range(9) for x in range(9) for y in range(9)}

for valor, posiciones in enumerate(default):
    for pos in posiciones:
        dominios[pos] = [valor]

variables = dominios.keys()
restricciones = []

for par in itertools.combinations(variables, 2):
    restricciones.append((par, eq_fila_columna))
    restricciones.append((par, eq_cuadrante))

problem = CspProblem(variables, dominios, restricciones)

print "Inicio..."
print "Min conflicts"
r = min_conflicts(problem, iterations_limit=200)
tablero(r)

print "\n\n"
print "Backtrack"
r = backtrack(problem, value_heuristic=LEAST_CONSTRAINING_VALUE, variable_heuristic=MOST_CONSTRAINED_VARIABLE, inference=True)
tablero(r)



    for j in range(ci):
        yallah = []
        yallah.append('x' + str(i) + str(j))

        for a in range(len(cols[j])):
            yallah.append('c' + str(j) + str(a))

        yallah = tuple(yallah)
        constraints.append((yallah, side_const_c))

#binary problem convertion
variables, domains, constraints = convert_to_binary(variables, domains,
                                                    constraints)

#csp problem
my_problem = CspProblem(variables, domains, constraints)

#problem solved by backtrack
result = backtrack(my_problem,
                   variable_heuristic=MOST_CONSTRAINED_VARIABLE,
                   value_heuristic=LEAST_CONSTRAINING_VALUE)

#result output
for a in range(ri):
    for b in range(ci):
        if result['x' + str(a) + str(b)] == 1:
            print('X', end=' ')
        else:
            print('O', end=' ')
    print('\n')
示例#23
0

for esquina in ESQUINAS:
    scope = [esquina] + adyacentes_de(esquina)
    restricciones.append((scope, una_y_solo_una_pared))


def zona_segura_sin_zombies(variables, values):
    "La primer variable es la esquina, el resto son las casillas adyacentes a la misma"
    esquina, *adyacentes = values
    if esquina != 'zona_segura':
        return True
    for elemento in adyacentes:
        if elemento == 'zombie':
            return False
    return True


for esquina in ESQUINAS:
    scope = [esquina] + adyacentes_de(esquina)
    restricciones.append((scope, zona_segura_sin_zombies))


if __name__ == '__main__':
    invasion_problem = CspProblem(variables_problema, dominios, restricciones)
    inicio = datetime.now()
    solution = backtrack(invasion_problem, variable_heuristic=MOST_CONSTRAINED_VARIABLE)
    segundos = (datetime.now() - inicio).total_seconds()
    print(f"Tiempo total: {segundos}s")
    pprint(solution)
示例#24
0
def const_different(variables, values):
    return len(values) == len(set(values))  # remove repeated values and count

constraints = [
    (('F', 'T', 'U', 'W', 'R', 'O'), const_different),
    (('O', 'R', 'C_10'), lambda vars_, values: values[0] + values[0] == values[1] + 10 * values[2]),
    (('C_10', 'W', 'U', 'C_100'), lambda vars_, values: values[0] + values[1] + values[1] == values[2] + 10 * values[3]),
    (('C_100', 'T', 'O', 'C_1000'), lambda vars_, values: values[0] + values[1] + values[1] == values[2] + 10 * values[3]),
    (('C_1000', 'F'), lambda vars_, values: values[0] == values[1])
]

original_constraints = deepcopy(constraints)
original_domains = deepcopy(domains)

start = time()
problem = CspProblem(variables, original_domains, original_constraints)
result = backtrack(problem, variable_heuristic=MOST_CONSTRAINED_VARIABLE, value_heuristic=LEAST_CONSTRAINING_VALUE)
elapsed = time() - start
print result
print "Took %d seconds to finish using n-ary constraints" % elapsed


start = time()
variables, domains, constraints = convert_to_binary(variables, domains, constraints)
problem = CspProblem(variables, domains, constraints)
result = backtrack(problem, value_heuristic=LEAST_CONSTRAINING_VALUE)
elapsed = time() - start
print result
print "Took %d seconds to finish using binary constraints" % elapsed
示例#25
0
			G = G + tareas_aceleradora[var[index]]
		if a == 'B':
			B = B + tareas_aceleradora[var[index]]
	return T <= serv_aceleradora['T'] and G <= serv_aceleradora['G'] and B <= serv_aceleradora['B']

def todos(var, val):
	return len(set(val)) == 3

restricciones.append(((variables), procesadores))
restricciones.append(((variables), ram))
restricciones.append(((variables), aceleradora))
# Para que use todos los servidores, no hace falta.
#restricciones.append(((variables), todos))

problem = CspProblem(variables, dominios, restricciones)
resultado = backtrack(problem = problem)
print resultado

# --> Solución <--
# {'A': 'T', 'C': 'T', 'E': 'G', 'G': 'G', 'L': 'T', 'S': 'B'}

# G -> E, G    --- > 4 proc, 16 RAM, ag --- > 2 + 2, 14 + 2, 1
# T -> L, C, A --- > 8 proc, 32 RAM     --- > 2 + 5 + 1, 10 + 20 + 1
# B -> S    --- > 4 proc, 15 RAM        --- > 2, 8

# L: requiere 2 procesadores y 10 GB de RAM.
# C: requiere 5 procesadores y 20 GB de RAM.
# E: requiere 2 procesadores, 14 GB de RAM y una aceleradora gráfica.
# A: requiere 1 procesador y 1GB de RAM.
# G: requiere 2 procesadores y 2 GB de RAM.
# S: requiere 2 procesadores y 8 GB de RAM.
示例#26
0
def hide_system_and_motor(variables, values):
    return not ('motor de salto a velocidad de la luz' in values
                and 'sistema de ocultamiento' in values)


constraints.append((variables, hide_system_and_motor))


def lanzador_conexion(variables, values):
    p1, p2, p3 = values

    return ('lanzador de torpedos de protones' == p1
            or 'lanzador de torpedos de protones'
            == p2) and 'sistema de apuntamiento de armas' == p3


constraints.append((('p1', 'p2', 'p3'), lanzador_conexion))


def shield_and_communication(variables, values):
    return not (set(values) == set(
        ('escudo mejorado', 'sistema de comunicaciones')))


for interconect in INTERCONECTADAS:
    constraints.append((interconect, shield_and_communication))

result = backtrack(CspProblem(variables, domains, constraints))

print('Result: ')
print(result)
示例#27
0
                             LEAST_CONSTRAINING_VALUE, HIGHEST_DEGREE_VARIABLE)

variables = list(range(8))
dominios = {n: list(range(8)) for n in range(8)}

restricciones = []


def no_en_misma_fila(variables, values):
    fila_1, fila_2 = values
    return fila_1 != fila_2


def no_en_diagonal(variables, values):
    col_1, col_2 = variables
    fila_1, fila_2 = values
    return abs(fila_1 - fila_2) != abs(col_1 - col_2)


for reina_1, reina_2 in itertools.combinations(variables, 2):
    restricciones.append(((reina_1, reina_2), no_en_misma_fila))
    restricciones.append(((reina_1, reina_2), no_en_diagonal))

problema = CspProblem(variables, dominios, restricciones)
resultado = backtrack(problema,
                      value_heuristic=LEAST_CONSTRAINING_VALUE,
                      variable_heuristic=MOST_CONSTRAINED_VARIABLE)
# resultado = min_conflicts(problema, iterations_limit=2)

print(resultado)
示例#28
0
def no_supera_3000(variables, valores):
    suma = 0
    for valor in valores:
        suma += equipamientos[valor][1]
    return suma < 3000


def no_armadura(variables, valores):
    suma1 = 0
    for valor in valores:
        if equipamientos[valor][0] == 1:
            suma1 += 1
    return suma1 == 1


def no_espadas(variables, valores):
    suma2 = 0
    for valor in valores:
        if equipamientos[valor][0] == 2:
            suma2 += 1
    return suma2 == 1


restricciones.append((variables, no_armadura))
restricciones.append((variables, no_espadas))
restricciones.append((variables, no_supera_3000))

print 'Backtrack', backtrack(CspProblem(variables, dominios, restricciones))
print 'Min Conflicts', min_conflicts(CspProblem(variables, dominios,
                                                restricciones),
                                     iterations_limit=10000)
示例#29
0
__author__ = 'nathaniel'

from simpleai.search import CspProblem, backtrack, min_conflicts, MOST_CONSTRAINED_VARIABLE

variables = ('one', 'two', 'three', 'four', 'five')

domains = dict((v, range(11)) for v in variables)

# print domains

def const_different(variables, values):
    return values[0] != values[1] and abs(values[0] - values[1]) < 11

constraints = []

for v in variables:
    for x in variables:
        if v != x:
            va = (v, x)
            constraint = (va, const_different)
            constraints.append(constraint)

print constraints

my_problem = CspProblem(variables, domains, constraints)

print backtrack(my_problem)
示例#30
0
variables = ('X1', 'X2', 'X3', 'X4', 'X5', 'X6')

domains = dict((v, [False, True]) for v in variables)

constraints = [
    (('X1', 'X2', 'X6'), lambda v, values: values[0] or values[1] or values[2]),
    (('X1', 'X3', 'X4'), lambda v, values: not values[0] or values[1] or values[2]),
    (('X4', 'X5', 'X6'), lambda v, values: not values[0] or not values[1] or values[2]),
    (('X2', 'X5', 'X6'), lambda v, values: values[0] or values[1] or not values[2]),
]

original_constraints = deepcopy(constraints)
original_domains = deepcopy(domains)

start = time()
problem = CspProblem(variables, original_domains, original_constraints)
result = backtrack(problem)
elapsed = time() - start
print result
print "Took %d seconds to finish using n-ary constraints" % elapsed


start = time()
variables, domains, constraints = convert_to_binary(variables, domains, constraints)
problem = CspProblem(variables, domains, constraints)
result = backtrack(problem)
elapsed = time() - start
print result
print "Took %d seconds to finish using binary constraints" % elapsed
示例#31
0
    variables = ('John', 'Anna', 'Tom', 'Patricia')

    domains = {
        'John': [1, 2, 3],
        'Anna': [1, 3],
        'Tom': [2, 4],
        'Patricia': [2, 3, 4],
    }

    constraints = [(('John', 'Anna', 'Tom'), constraint_unique),
                   (('Tom', 'Anna'), constraint_bigger),
                   (('John', 'Patricia'), constraint_odd_even)]

    problem = CspProblem(variables, domains, constraints)

    print('\nSolutions:\n\nNormal:', backtrack(problem))

    print('\nMost constrained variable:',
          backtrack(problem, variable_heuristic=MOST_CONSTRAINED_VARIABLE))

    print('\nHighest degree variable:',
          backtrack(problem, variable_heuristic=HIGHEST_DEGREE_VARIABLE))

    print('\nLeast constraining value:',
          backtrack(problem, variable_heuristic=LEAST_CONSTRAINING_VALUE))

    print(
        '\nMost constrained variable and least constraining value:',
        backtrack(problem,
                  variable_heuristic=MOST_CONSTRAINED_VARIABLE,
                  value_heuristic=LEAST_CONSTRAINING_VALUE))
示例#32
0
    return constraints


def display_solution(sol):
    for i in uppercase[:9]:
        print " ".join([str(sol["%s%d" % (i, j)]) for j in xrange(1, 10)])


domains.update(parsepuzzle(sudoku))

# -- Hand made binary constraints --
constraints = mkconstraints()
start = time()
domains0 = deepcopy(domains)
my_problem = CspProblem(variables, domains0, constraints)
sol = backtrack(my_problem)
elapsed = time() - start
display_solution(sol)
print "Took %d seconds to finish using binary constraints" % elapsed  # because of AC3 should be quick


# -- N-ary constraints made binary using hidden variables --
domains1 = deepcopy(domains)
start = time()
variables1, domains1, constraints = convert_to_binary(variables, domains1, mknaryconstraints())
my_problem = CspProblem(variables1, domains1, constraints)
sol = backtrack(my_problem)
elapsed = time() - start
display_solution(sol)
print "Took %d seconds to finish using binary constraints (hidden variables)" % elapsed
示例#33
0
def no_en_diagonal(variables, valores):
    fila_a = valores[0]
    columna_a = int(variables[0][1])
    fila_b = valores[1]
    columna_b = int(variables[1][1])

    return abs(fila_a - fila_b) != abs(columna_a - columna_b)


restricciones = []

for reina_a, reina_b in itertools.combinations(variables, 2):
    restricciones.append(((reina_a, reina_b), distinta_fila))
    restricciones.append(((reina_a, reina_b), no_en_diagonal))

problem = CspProblem(variables, dominios, restricciones)

print 'backtrack:'
result = backtrack(problem,
                   variable_heuristic=MOST_CONSTRAINED_VARIABLE,
                   value_heuristic=LEAST_CONSTRAINING_VALUE,
                   inference=True)

print result

print 'min_conflicts:'
result = min_conflicts(problem, iterations_limit=100)

print result
示例#34
0
文件: coloring.py 项目: Fantomster/py
    constraints = [
        (('Mark', 'Julia'), constraint_func),
        (('Mark', 'Steve'), constraint_func),
        (('Julia', 'Steve'), constraint_func),
        (('Julia', 'Amanda'), constraint_func),
        (('Julia', 'Derek'), constraint_func),
        (('Julia', 'Brian'), constraint_func),
        (('Steve', 'Amanda'), constraint_func),
        (('Steve', 'Allan'), constraint_func),
        (('Steve', 'Michelle'), constraint_func),
        (('Amanda', 'Michelle'), constraint_func),
        (('Amanda', 'Joanne'), constraint_func),
        (('Amanda', 'Derek'), constraint_func),
        (('Brian', 'Derek'), constraint_func),
        (('Brian', 'Kelly'), constraint_func),
        (('Joanne', 'Michelle'), constraint_func),
        (('Joanne', 'Amanda'), constraint_func),
        (('Joanne', 'Derek'), constraint_func),
        (('Joanne', 'Kelly'), constraint_func),
        (('Derek', 'Kelly'), constraint_func),
    ]

    # Solve the problem
    problem = CspProblem(names, colors, constraints)

    # Print the solution
    output = backtrack(problem)
    print('\nColor mapping:\n')
    for k, v in output.items():
        print(k, '===>', v)
示例#35
0
    for v2 in adyacentes_de(variable):
        restricciones_eficientes.append(
            ((variable, v2), no_nidos_y_vereda_o_juego_juntos))
        restricciones_eficientes.append(
            ((variable, v2), contenido_distinto_en_adyacentes))

    # para el caso de los arboles y veredas solo debemos generar los pares donde las casillas
    # estan adyacentes verticalmente. Lo podemos lograr agregando la variable y la que esta debajo
    # total la restriccion contempla el ambos ordenes
    if variable[0] < 4:  # evitamos la ultima fila
        variable_al_sur = (variable[0] + 1, variable[1])
        restricciones_eficientes.append(
            ((variable, variable_al_sur), arboles_al_norte_de_vereda))

if __name__ == '__main__':
    # probamos con las restricciones menos eficientes y mas eficientes para comparar
    nagai_problem = CspProblem(variables_problema, dominios, restricciones)
    inicio = datetime.now()
    solution = backtrack(nagai_problem,
                         variable_heuristic=MOST_CONSTRAINED_VARIABLE)
    segundos = (datetime.now() - inicio).total_seconds()
    imprimir_solucion(solution, "no eficiente", segundos)

    alecto_problem = CspProblem(variables_problema, dominios,
                                restricciones_eficientes)
    inicio = datetime.now()
    solution = backtrack(alecto_problem,
                         variable_heuristic=MOST_CONSTRAINED_VARIABLE)
    segundos = (datetime.now() - inicio).total_seconds()
    imprimir_solucion(solution, "eficiente", segundos)
示例#36
0
def diferentes(variables, valores):
    fila0, fila1 = valores

    return fila0 != fila1


def no_en_diagonal(variables, valores):
    fila0, fila1 = valores
    columna0, columna1 = [int(reina[1]) for reina in variables]

    dif_col = abs(columna0 - columna1)
    dif_fil = abs(fila0 - fila1)

    return dif_col != dif_fil


restricciones = []

for par in itertools.combinations(variables, 2):
    restricciones.append((par, diferentes))
    restricciones.append((par, no_en_diagonal))

csp = CspProblem(variables, dominios, restricciones)

resultado = backtrack(csp,
                      inference=True,
                      variable_heuristic=MOST_CONSTRAINED_VARIABLE,
                      value_heuristic=LEAST_CONSTRAINING_VALUE)

print resultado
示例#37
0
def const_different(variables, values):
    return values[0] != values[
        1]  # expect the value of the neighbors to be different


constraints = [
    (('WA', 'NT'), const_different),
    (('WA', 'SA'), const_different),
    (('SA', 'NT'), const_different),
    (('SA', 'Q'), const_different),
    (('NT', 'Q'), const_different),
    (('SA', 'NSW'), const_different),
    (('Q', 'NSW'), const_different),
    (('SA', 'V'), const_different),
    (('NSW', 'V'), const_different),
]

my_problem = CspProblem(variables, domains, constraints)

print backtrack(my_problem)
print backtrack(my_problem, variable_heuristic=MOST_CONSTRAINED_VARIABLE)
print backtrack(my_problem, variable_heuristic=HIGHEST_DEGREE_VARIABLE)
print backtrack(my_problem, value_heuristic=LEAST_CONSTRAINING_VALUE)
print backtrack(my_problem,
                variable_heuristic=MOST_CONSTRAINED_VARIABLE,
                value_heuristic=LEAST_CONSTRAINING_VALUE)
print backtrack(my_problem,
                variable_heuristic=HIGHEST_DEGREE_VARIABLE,
                value_heuristic=LEAST_CONSTRAINING_VALUE)
print min_conflicts(my_problem)
示例#38
0
    return len(values) == len(set(values))  # remove repeated values and count


# a constraint that expects one variable to be bigger than other
def const_one_bigger_other(variables, values):
    return values[0] > values[1]


# a constraint thet expects two variables to be one odd and the other even,
# no matter which one is which type
def const_one_odd_one_even(variables, values):
    if values[0] % 2 == 0:
        return values[1] % 2 == 1  # first even, expect second to be odd
    else:
        return values[1] % 2 == 0  # first odd, expect second to be even


constraints = [
    (('A', 'B', 'C'), const_different),
    (('A', 'C'), const_one_bigger_other),
    (('A', 'C'), const_one_odd_one_even),
]

my_problem = CspProblem(variables, domains, constraints)

from simpleai.search import backtrack

# my_problem = ... (steps from the previous section)

result = backtrack(my_problem)