this repo has no description
1.. _sec-sat:
2
3Modelado de la satisfacción Booleana en MiniZinc
4================================================
5
6MiniZinc puede usarse para modelar problemas de satisfaccion booleanos, donde las variables estan restringidas a ser booleano (:mzn:`bool`).
7MiniZinc se puede utilizar con solucionadores de satisfacción booleanos eficientes para resolver los modelos resultantes de manera eficiente.
8
9Modelando Enteros
10-----------------
11
12Muchas veces, aunque deseamos utilizar un solucionador de satisfaccion booleano, podriamos necesitar modelar algunas partes enteras de nuestro problema.
13
14Hay tres formas comunes de modelar variables enteras: :math:`I` en el rango de :math:`0 \dots m`, donde :math:`m = 2^{k}-1` utiliza variables booleanas.
15
16- Binary: :math:`I` es representado por :math:`k` variables binarias :math:`i_0, \ldots, i_{k-1}`, donde :math:`I = 2^{k-1} i_{k-1} + 2^{k-2} i_{k-2} + \cdots + 2 i_1 + i_0`.
17
18 Esto puede ser representado en MiniZinc como
19
20 .. code-block:: minizinc
21
22 array[0..k-1] of var bool: i;
23 var 0..pow(2,k)-1: I = sum(j in 0..k-1)(bool2int(i[j])*pow(2,j));
24
25- Unary: donde :math:`I` es representado por :math:`m` variables binarias :math:`i_1, \ldots, i_m` y :math:`i = \sum_{j=1}^m \mathtt{bool2int}(i_j)`. Como hay redundancia masiva en la representacion unaria, usualmente requerimos que :math:`i_j \rightarrow i_{j-1}, 1 < j \leq m`.
26
27 Esto puede ser representado en MiniZinc como
28
29 .. code-block:: minizinc
30
31 array[1..m] of var bool: i;
32 constraint forall(j in 2..m)(i[j] -> i[j-1]);
33 var 0..m: I = sum(j in 1..m)(bool2int(i[j]);
34
35- Value: donde :math:`I` es representado por :math:`m+1` variables binarias :math:`i_0, \ldots, i_m` donde :math:`i = k \Leftrightarrow i_k`, y como máximo uno de :math:`i_0, \ldots, i_m` es verdadero.
36
37 Esto puede ser representado en MiniZinc como
38
39 .. code-block:: minizinc
40
41 array[0..m] of var bool: i;
42 constraint sum(j in 0..m)(bool2int(i[j]) == 1;
43 var 0..m: I;
44 constraint foall(j in 0..m)(I == j <-> i[j]);
45
46Hay ventajas y desventajas para cada representación. Depende de qué operaciones en enteros se requieran en el modelo y cuál es preferible.
47
48Modelando Desigualdad
49---------------------
50
51Consideremos el modelado de un problema de cuadrados latinos. Un cuadrado latino es una matriz :math:`n \ times n` de números de :math:`1..n`, tal que cada número aparece exactamente una vez en cada fila y columna.
52Un modelo entero para cuadrados latinos se muestra en :numref:`ex-latin`.
53
54.. literalinclude:: examples/latin_es.mzn
55 :language: minizinc
56 :name: ex-latin
57 :caption: Modelo entero para los cuadrados latino (:download:`latin_es.mzn <examples/latin_es.mzn>`).
58
59La única limitación de los enteros es de hecho desigualdad, que se codifica en la restricción :mzn:`alldifferent`.
60La representación del valor es la mejor forma de representar la desigualdad.
61Un modelo solo booleano para cuadrados latinos se muestra en :numref:`ex-latinbool`.
62Tenga en cuenta cada elemento del conjunto de enteros :mzn:`a[i, j]` se reemplaza por un arreglo de booleanos.
63Utilizamos el predicado :mzn:`exactlyone` para codificar que cada valor se use exactamente una vez en cada fila y en cada columna, así como para codificar que exactamente uno de los Booleanos correspondiente al elemento de arreglo entero :mzn:`a[i, j]` es verdadero.
64
65.. literalinclude:: examples/latinbool_es.mzn
66 :language: minizinc
67 :name: ex-latinbool
68 :caption: Modelo booleano para los cuadrados latinos (:download:`latinbool_es.mzn <examples/latinbool_es.mzn>`).
69
70
71Modelando Cardinalidad
72----------------------
73
74Consideremos el modelado del rompecabezas de Light Up. El rompecabezas consiste en una cuadrícula rectangular de cuadrados que están en blanco, o llenos. Cada cuadrado lleno puede contener un número del 1 al 4, o puede no tener ningún número. El objetivo es colocar luces en los cuadrados en blanco para que
75
76- Cada casilla en blanco está "iluminada", es decir, puede ver una luz a través de una línea ininterrumpida de cuadrados en blanco.
77- No se pueden ver dos luces a si mismas.
78- El número de luces adyacentes a un cuadrado lleno numerado es exactamente el número en el cuadrado lleno.
79
80Un ejemplo de un rompecabezas de Light Up se muestra en :numref:`fig-lightup`
81con su solución en :numref:`fig-lightup-sol`.
82
83.. _fig-lightup:
84
85.. figure:: figures/lightup.*
86
87 Un ejemplo de un rompecabezas de Light Up
88
89.. _fig-lightup-sol:
90
91.. figure:: figures/lightup2.*
92
93 La solución completa del rompecabezas de Light Up
94
95Es natural modelar este problema usando variables booleanas para determinar qué cuadrados contienen una luz y cuáles no, pero hay algo de aritmética entera que considerar para los cuadrados llenos.
96
97.. literalinclude:: examples/lightup_es.mzn
98 :language: minizinc
99 :name: ex-lightup
100 :caption: Modelo SAT para el rompecabezas de Light Up (:download:`lightup_es.mzn <examples/lightup_es.mzn>`).
101
102A model for the problem is given in :numref:`ex-lightup`.
103A data file for the problem shown in :numref:`fig-lightup`
104is shown in :numref:`fig-lightupdzn`.
105
106Un modelo para el problema es dado en :numref:`ex-lightup`.
107Un archivo de datos para el problema :numref:`fig-lightup` se muestra en :numref:`fig-lightupdzn`.
108
109.. literalinclude:: examples/lightup_es.dzn
110 :language: minizinc
111 :name: fig-lightupdzn
112 :caption: El archivo de datos para la instancia del rompecabezas de Light Up se muestra en :numref:`fig-lightup`.
113
114El modelo hace uso de un predicado de suma booleana
115
116.. code-block:: minizinc
117
118 predicate bool_sum_eq(array[int] of var bool:x, int:s);
119
120que requiere que la suma de un arreglo de Boolean sea igual a un entero fijo. Existen varias formas de modelar tales restricciones de *cardinalidad* usando Booleanos.
121
122- Sumar redes: podemos usar una red de sumadores para construir una representación booleana binaria de la suma de los booleanos.
123- Redes de clasificación: podemos usar una red de clasificación para ordenar el arreglo de Booleanos para crear una representación unaria de la suma de los Booleanos.
124- Diagramas de decisiones binarias: podemos crear un diagrama de decisión binario (BDD) que codifica la restricción de cardinalidad.
125
126.. literalinclude:: examples/bboolsum_es.mzn
127 :language: minizinc
128 :name: ex-bboolsum
129 :caption: Restricciones de cardinalidad por las redes de sumador binarias (:download:`bboolsum_es.mzn <examples/bboolsum_es.mzn>`).
130
131.. literalinclude:: examples/binarysum_es.mzn
132 :language: minizinc
133 :name: ex-binarysum
134 :caption: Código para construir redes de adición binaria (:download:`binarysum_es.mzn <examples/binarysum_es.mzn>`).
135
136Podemos implementar :mzn:`bool_sum_eq` usando redes de sumador binarias usando el código que se muestra en :numref:`ex-bboolsum`.
137El predicado :mzn:`binary_sum` definido en :numref:`ex-binarysum` crea una representación binaria de la suma de :mzn:`x` al dividir la lista en dos, sumando cada mitad para crear una representación binaria y luego sumando estos dos números binarios usando :mzn:`binary_add`.
138Si la lista :mzn:`x` es impar, el último bit se guarda para usar como un complemento a la adición binaria
139
140.. \pjs{Add a picture of an adding network}
141
142.. literalinclude:: examples/uboolsum_es.mzn
143 :language: minizinc
144 :name: ex-uboolsum
145 :caption: Restricciones de Cardinalidad Clasificando Redes (:download:`uboolsum_es.mzn <examples/uboolsum_es.mzn>`).
146
147.. literalinclude:: examples/oesort_es.mzn
148 :language: minizinc
149 :name: ex-oesort
150 :caption: Odd-even Fusionar Redes de Clasificación (:download:`oesort_es.mzn <examples/oesort_es.mzn>`).
151
152Podemos implementar :mzn:`bool_sum_eq` utilizando redes de clasificación unaria utilizando el código que se muestra en :numref:` ex-uboolsum`.
153La restricción de cardinalidad se define expandiendo la entrada :mzn:`x` para tener una longitud de una potencia de 2 y clasificar los bits resultantes utilizando una red de clasificación de combinación de pares impares.
154El clasificador de combinación impar-par que se muestra en :mzn:`ex-oesort` funciona recursivamente mediante la divición de la lista de entrada en 2, ordenando cada lista y combinando las dos listas ya ordenadas.
155
156.. \pjs{Add much more stuff on sorting networks}
157
158
159
160.. \pjs{Add a picture of an adding network}
161
162.. literalinclude:: examples/bddsum_es.mzn
163 :language: minizinc
164 :name: ex-bddsum
165 :caption: Restricciones de cardinalidad por diagramas de decisión binarios (:download:`bddsum_es.mzn <examples/bddsum_es.mzn>`).
166
167Nosotros podemos implementar :mzn:`bool_sum_eq` usando diagramas de decición binaria usando el codigo que se muestra en :mzn:`ex:bddsum`.
168La restricción de cardinalidad se divide en dos casos: ya sea en el primer elemento :mzn:`x[1]` es :mzn:`true`, y la suma de los bits restantes es :mzn:`s-1`, o :mzn:`x[1]` es :mzn:`false` y la suma de los bits restantes es :mzn:`s`. Por eficiencia, esto se basa en la eliminación de la subexpresión común para evitar crear muchas restricciones equivalentes.
169
170.. \pjs{Add a picture of a bdd network network}