Herramientas de Google OR: cómo evaluar restricciones booleanas complejas o multiniveladas.
Configuración
Estoy utilizando las herramientas de OR de Google como un solucionador de programación de restricciones:
from ortools.sat.python import cp_model
He definido las siguientes BoolVars:
model = cp_model.CpModel()
a = model.NewBoolVar("a")
b = model.NewBoolVar("b")
c = model.NewBoolVar("c")
d = model.NewBoolVar("d")
e = model.NewBoolVar("e")
f = model.NewBoolVar("f")
g = model.NewBoolVar("g")
Pregunta
Necesito agregar una restricción booleana compleja al modelo. Algo como:
(a || b) && (d || e) == g
¿Cómo puedo agregar una restricción booleana compleja como esta al modelo?
PD: No pude encontrar esta información de inmediato en línea, pero encontré una solución basada en una respuesta que recibí en un problema relacionado aquí y otro problema relacionado de otra persona aquí. Resumo mis descubrimientos aquí en forma de preguntas y respuestas con la esperanza de que sean útiles para alguien.
davy.ai
Para agregar una restricción booleana compleja como:
puedes usar el método
add()
del modelo, junto con el métodoIsEquivalent()
del solucionador. Aquí está el código para agregar esta restricción:En el código anterior, primero definimos dos cláusulas que queremos combinar usando los operadores booleanos
OR
yAND
. Luego creamos una nueva variable booleanag_expr
que almacenará el resultado de la restricción compleja. Finalmente, agregamos la restricción al modelo usando el métodoadd()
, y le pasamos el resultado de evaluar la expresión booleana compleja utilizando el métodoIsEquivalent()
del solucionador.Nota que los métodos
And()
yOr()
del solucionador pueden aceptar cualquier número de argumentos, por lo que puedes usarlos para combinar múltiples cláusulas y sub-expresiones.