예제 #1
0
def prueba_reinas(n, metodo, tipo=1, traza=False):
    """
    Prueba una gráfica de restricciones o mínimos conflictos para resolver
    n reinas.

    @param metodo: Cadena que indica qué método probar. Puede ser "grafo" para
    gráficas de restricción o "minimos" para mínimos conflictos.
    @param tipo: Tipo de consistencia. Solo aplica para gráficas de restricción.
    @param traza: Indica si se imprime la traza de la asignación parcial. Solo aplica
    para gráficas de restricción.
    """
    print("\n" + '-' * 20 + '\n Para {} reinas\n'.format(n) + '_' * 20)
    g_r = Nreinas(n)

    if metodo == "grafo":
        t_inicial = time()
        asignacion = csp.asignacion_grafo_restriccion(g_r,
                                                      ap={},
                                                      consist=tipo,
                                                      traza=traza)
        t_final = time()
    elif metodo == "minimos":
        t_inicial = time()
        asignacion = csp.min_conflictos(g_r)
        t_final = time()
    else:
        raise ValueError("El método especificado no existe.")

    if asignacion is not None:
        if n < 20:
            Nreinas.muestra_asignacion(asignacion)
        else:
            print([asignacion[i] for i in range(n)])
        print("Se realizaron {} backtrackings.".format(g_r.backtracking))
        print("Y tardó {} segundos.".format(t_final - t_inicial))
    else:
        print("El algoritmo falló.")
        print("Y tardó {} segundos en fallar.".format(t_final - t_inicial))
예제 #2
0
    # Una forma de verificar si el código que escribiste es correcto
    # es verificando que la solución sea satisfactoria para estos dos
    # sudokus.
    # =========================================================================

    s1 = [
        0, 0, 3, 0, 2, 0, 6, 0, 0, 9, 0, 0, 3, 0, 5, 0, 0, 1, 0, 0, 1, 8, 0, 6,
        4, 0, 0, 0, 0, 8, 1, 0, 2, 9, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 6,
        7, 0, 8, 2, 0, 0, 0, 0, 2, 6, 0, 9, 5, 0, 0, 8, 0, 0, 2, 0, 3, 0, 0, 9,
        0, 0, 5, 0, 1, 0, 3, 0, 0
    ]

    imprime_sdk(s1)
    print("Solucionando un Sudoku dificil")
    sudoku1 = Sudoku(s1)
    sol1 = csp.asignacion_grafo_restriccion(sudoku1, consist=2)
    imprime_sdk(sol1)

    s2 = [
        4, 0, 0, 0, 0, 0, 8, 0, 5, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0,
        0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 8, 0, 4, 0, 0, 0, 0, 0,
        0, 1, 0, 0, 0, 0, 0, 0, 0, 6, 0, 3, 0, 7, 0, 5, 0, 0, 2, 0, 0, 0, 0, 0,
        1, 0, 4, 0, 0, 0, 0, 0, 0
    ]

    imprime_sdk(s2)
    sudoku2 = Sudoku(s2)
    print("Y otro tambien dificil")
    sol2 = csp.asignacion_grafo_restriccion(sudoku2, consist=2)
    imprime_sdk(sol2)
    # Una forma de verificar si el código que escribiste es correcto
    # es verificando que la solución sea satisfactoria para estos dos
    # sudokus.
    # =========================================================================

    s1 = [
        0, 0, 3, 0, 2, 0, 6, 0, 0, 9, 0, 0, 3, 0, 5, 0, 0, 1, 0, 0, 1, 8, 0, 6,
        4, 0, 0, 0, 0, 8, 1, 0, 2, 9, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 6,
        7, 0, 8, 2, 0, 0, 0, 0, 2, 6, 0, 9, 5, 0, 0, 8, 0, 0, 2, 0, 3, 0, 0, 9,
        0, 0, 5, 0, 1, 0, 3, 0, 0
    ]

    imprime_sdk(s1)
    print("Solucionando un Sudoku dificil")
    sudoku1 = Sudoku(s1)
    sol1 = csp.asignacion_grafo_restriccion(sudoku1)
    imprime_sdk(sol1)

    s2 = [
        4, 0, 0, 0, 0, 0, 8, 0, 5, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0,
        0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 8, 0, 4, 0, 0, 0, 0, 0,
        0, 1, 0, 0, 0, 0, 0, 0, 0, 6, 0, 3, 0, 7, 0, 5, 0, 0, 2, 0, 0, 0, 0, 0,
        1, 0, 4, 0, 0, 0, 0, 0, 0
    ]

    imprime_sdk(s2)
    sudoku2 = Sudoku(s2)
    print("Y otro tambien dificil")
    sol2 = csp.asignacion_grafo_restriccion(sudoku2)
    imprime_sdk(sol2)
예제 #4
0
    # es verificando que la solución sea satisfactoria para estos dos
    # sudokus.
    # =========================================================================

    s1 = [
        0, 0, 3, 0, 2, 0, 6, 0, 0, 9, 0, 0, 3, 0, 5, 0, 0, 1, 0, 0, 1, 8, 0, 6,
        4, 0, 0, 0, 0, 8, 1, 0, 2, 9, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 6,
        7, 0, 8, 2, 0, 0, 0, 0, 2, 6, 0, 9, 5, 0, 0, 8, 0, 0, 2, 0, 3, 0, 0, 9,
        0, 0, 5, 0, 1, 0, 3, 0, 0
    ]

    #imprime_sdk(s1)
    print("Solucionando un Sudoku dificil")
    sudoku1 = Sudoku(s1)

    sol1 = csp.asignacion_grafo_restriccion(sudoku1, ap={}, consist=2)
    #imprime_sdk(sol1)

    s2 = [
        4, 0, 0, 0, 0, 0, 8, 0, 5, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0,
        0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 8, 0, 4, 0, 0, 0, 0, 0,
        0, 1, 0, 0, 0, 0, 0, 0, 0, 6, 0, 3, 0, 7, 0, 5, 0, 0, 2, 0, 0, 0, 0, 0,
        1, 0, 4, 0, 0, 0, 0, 0, 0
    ]

    d1 = [
        6, 0, 0, 0, 0, 8, 9, 4, 0, 9, 0, 0, 0, 0, 6, 1, 0, 0, 0, 7, 0, 0, 4, 0,
        0, 0, 0, 2, 0, 0, 6, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 8, 9,
        0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 3, 0,
        8, 0, 0, 0, 0, 1, 6, 0, 0
    ]
예제 #5
0
    # Una forma de verificar si el código que escribiste es correcto
    # es verificando que la solución sea satisfactoria para estos dos
    # sudokus.
    # =========================================================================

    s1 = [
        0, 0, 3, 0, 2, 0, 6, 0, 0, 9, 0, 0, 3, 0, 5, 0, 0, 1, 0, 0, 1, 8, 0, 6,
        4, 0, 0, 0, 0, 8, 1, 0, 2, 9, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 6,
        7, 0, 8, 2, 0, 0, 0, 0, 2, 6, 0, 9, 5, 0, 0, 8, 0, 0, 2, 0, 3, 0, 0, 9,
        0, 0, 5, 0, 1, 0, 3, 0, 0
    ]

    imprime_sdk(s1)
    print("Solucionando un Sudoku dificil")
    sudoku1 = Sudoku(s1)
    sol1 = csp.asignacion_grafo_restriccion(sudoku1, ap={})
    imprime_sdk(sol1)

    s2 = [
        4, 0, 0, 0, 0, 0, 8, 0, 5, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0,
        0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 8, 0, 4, 0, 0, 0, 0, 0,
        0, 1, 0, 0, 0, 0, 0, 0, 0, 6, 0, 3, 0, 7, 0, 5, 0, 0, 2, 0, 0, 0, 0, 0,
        1, 0, 4, 0, 0, 0, 0, 0, 0
    ]

    imprime_sdk(s2)
    sudoku2 = Sudoku(s2)
    print("Y otro tambien dificil")
    sol2 = csp.asignacion_grafo_restriccion(sudoku2, ap={})
    imprime_sdk(sol2)
        9,
        0,
        0,
        5,
        0,
        1,
        0,
        3,
        0,
        0,
    ]

    print "Solucionando un Sudoku dificil"
    sudoku1 = Sudoku(s1)
    sudoku1.imprime_sdk(s1)
    sol1 = csp.asignacion_grafo_restriccion(sudoku1, ap={}, consist=1)
    sudoku1.imprime_sdk(sol1)

    s2 = [
        4,
        0,
        0,
        0,
        0,
        0,
        8,
        0,
        5,
        0,
        3,
        0,
    s1 = [0, 0, 3, 0, 2, 0, 6, 0, 0,
          9, 0, 0, 3, 0, 5, 0, 0, 1,
          0, 0, 1, 8, 0, 6, 4, 0, 0,
          0, 0, 8, 1, 0, 2, 9, 0, 0,
          7, 0, 0, 0, 0, 0, 0, 0, 8,
          0, 0, 6, 7, 0, 8, 2, 0, 0,
          0, 0, 2, 6, 0, 9, 5, 0, 0,
          8, 0, 0, 2, 0, 3, 0, 0, 9,
          0, 0, 5, 0, 1, 0, 3, 0, 0]

    print "Solucionando un Sudoku dificil"
    sudoku1 = Sudoku(s1)
    sudoku1.imprime_sdk(s1)
    # sol1 = csp.solucion_CSP_bin(sudoku1)
    sol1 = csp.asignacion_grafo_restriccion(sudoku1, consist = 2)
    sudoku1.imprime_sdk(sol1)


    s2 = [4, 0, 0, 0, 0, 0, 8, 0, 5,
          0, 3, 0, 0, 0, 0, 0, 0, 0,
          0, 0, 0, 7, 0, 0, 0, 0, 0,
          0, 2, 0, 0, 0, 0, 0, 6, 0,
          0, 0, 0, 0, 8, 0, 4, 0, 0,
          0, 0, 0, 0, 1, 0, 0, 0, 0,
          0, 0, 0, 6, 0, 3, 0, 7, 0,
          5, 0, 0, 2, 0, 0, 0, 0, 0,
          1, 0, 4, 0, 0, 0, 0, 0, 0]


    print "Y otro tambien dificil"
예제 #8
0
def prueba_reinas(n, metodo):
    print("\n" + '-' * 20 + '\n Para {} reinas\n'.format(n) + '_' * 20)
    g_r = Nreinas(n)
    asignación = metodo(g_r)
    if n < 20:
        Nreinas.muestra_asignación(asignación)
    else:
        print([asignación[i] for i in range(n)])
    print("Y se realizaron {} backtrackings".format(g_r.backtracking))


if __name__ == "__main__":
    # Utilizando 1 consistencia
    prueba_reinas(
        4,
        lambda gr: csp.asignacion_grafo_restriccion(gr, consist=1, traza=True))
    prueba_reinas(
        8,
        lambda gr: csp.asignacion_grafo_restriccion(gr, consist=1, traza=True))
    prueba_reinas(
        16,
        lambda gr: csp.asignacion_grafo_restriccion(gr, consist=1, traza=True))
    prueba_reinas(
        50, lambda gr: csp.asignacion_grafo_restriccion(
            gr, consist=1, traza=False))
    prueba_reinas(
        101, lambda gr: csp.asignacion_grafo_restriccion(
            gr, consist=1, traza=False))
    # Utilizando consistencia
    # =============================================================================
    # 25 puntos: Probar y comentar los resultados del métdo de arco consistencia
    s1 = [0, 0, 3, 0, 2, 0, 6, 0, 0,
          9, 0, 0, 3, 0, 5, 0, 0, 1,
          0, 0, 1, 8, 0, 6, 4, 0, 0,
          0, 0, 8, 1, 0, 2, 9, 0, 0,
          7, 0, 0, 0, 0, 0, 0, 0, 8,
          0, 0, 6, 7, 0, 8, 2, 0, 0,
          0, 0, 2, 6, 0, 9, 5, 0, 0,
          8, 0, 0, 2, 0, 3, 0, 0, 9,
          0, 0, 5, 0, 1, 0, 3, 0, 0]

    print "Solucionando un Sudoku dificil"
    sudoku1 = Sudoku(s1)
    sudoku1.imprime_sdk(s1)

    sol1= csp.asignacion_grafo_restriccion(sudoku1)
    #sol1 = csp.solucion_CSP_bin(sudoku1)
    sudoku1.imprime_sdk(sol1)


    s2 = [4, 0, 0, 0, 0, 0, 8, 0, 5,
          0, 3, 0, 0, 0, 0, 0, 0, 0,
          0, 0, 0, 7, 0, 0, 0, 0, 0,
          0, 2, 0, 0, 0, 0, 0, 6, 0,
          0, 0, 0, 0, 8, 0, 4, 0, 0,
          0, 0, 0, 0, 1, 0, 0, 0, 0,
          0, 0, 0, 6, 0, 3, 0, 7, 0,
          5, 0, 0, 2, 0, 0, 0, 0, 0,
          1, 0, 4, 0, 0, 0, 0, 0, 0]