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.

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.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para agregar una restricción booleana compleja como:

    (a || b) && (d || e) == g
    

    puedes usar el método add() del modelo, junto con el método IsEquivalent() del solucionador. Aquí está el código para agregar esta restricción:

    clause1 = [a, b]
    clause2 = [d, e]
    
    # crea una variable booleana para almacenar el resultado de la restricción
    # el nombre de la variable es opcional, pero puede ayudar con la depuración
    # si tienes muchas variables en tu modelo
    g_expr = model.NewBoolVar("g_expr")
    
    # agrega la restricción al modelo
    model.add(
        solver.IsEquivalent(
            g_expr,
            solver.And(
                solver.Or([model.Not(x) for x in clause1 + clause2]), # Negación de (a or b) y (d or e)
                solver.Or([x for x in clause1]), # a or b
                solver.Or([x for x in clause2]), # d or e
            ),
        ),
    )
    

    En el código anterior, primero definimos dos cláusulas que queremos combinar usando los operadores booleanos OR y AND. Luego creamos una nueva variable booleana g_expr que almacenará el resultado de la restricción compleja. Finalmente, agregamos la restricción al modelo usando el método add(), y le pasamos el resultado de evaluar la expresión booleana compleja utilizando el método IsEquivalent() del solucionador.

    Nota que los métodos And() y Or() del solucionador pueden aceptar cualquier número de argumentos, por lo que puedes usarlos para combinar múltiples cláusulas y sub-expresiones.

Comments are closed.