es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Escribir restricciones para casillas de rejilla en Python z3.

Estoy trabajando con Z3 en python y tengo que escribir restricciones/condiciones para un “cuadrado maravilloso” que es simplemente una cuadrícula de números. Las condiciones para un cuadrado maravilloso son:

  • Está lleno de todos los enteros desde 1 hasta n^2.
  • Cada fila en el cuadrado suma al mismo número t.
  • Cada columna en el cuadrado también suma a ese mismo número t.
  • Ambas diagonales suman ese mismo número t.

Usando las restricciones de lista, he sido capaz de hacer lo primero:

aGrid = [ [ Int("x%s%s" % (i+1, j+1)) for j in range(n) ] for i in range(n) ]

conditionOne = [ And(1 <= aGrid[i][j], aGrid[i][j] <= n**2) for i in range(n) for j in range(n) ]

Así que en la línea 1 creo la instancia para una cuadrícula de n por n. En la línea 2, creo la primera condición donde cada una de las entradas es de 1 a n al cuadrado.

El problema que tengo ahora es conseguir la suma de cada columna y fila y equipararlas al mismo valor en la misma restricción. Así como las restricciones diagonales. Tengo la sensación de que todo se hará en la misma restricción, pero la comprensión de lista es confusa.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Puede utilizar el siguiente código para crear las restricciones para el cuadrado maravilloso:

    “` 
    aGrid = [ [ Int(“x_%s_%s” % (i+1, j+1)) for j in range(n) ] for i in range(n) ]

    condiciónUno = [Y(1 ≤ aGrid[i][j], aGrid[i][j] ≤ n**2) for i in range(n) for j in range(n) ]

    La suma de cada fila es igual a t

    condiciónDos = [Suma(aGrid[i]) == t for i in range(n) ]

    La suma de cada columna es igual a t

    condiciónTres = [Suma([aGrid[i][j] para i in range(n)]) == t for j in range(n) ]

    La suma de ambas diagonales es igual a t

    condiciónCuatro = [Suma([aGrid[i][i] para i in range(n)]) == t, Suma([aGrid[i][n-i-1] para i in range(n)]) == t ]
    “`

    La primera línea crea una cuadrícula de n por n. La segunda línea crea la condición de que cada entrada sea del 1 al n al cuadrado. La tercera línea crea la condición de que la suma de cada fila sea igual a t. La cuarta línea crea la condición de que la suma de cada columna sea igual a t. La quinta línea crea la condición de que la suma de ambas diagonales sea igual a t.

Comments are closed.