Modelos

Este ejemplo mínimo presenta un modelo de optimización binaria, lo convierte a la forma de penalización QUBO y exporta el Hamiltonian correspondiente:

from qilisdk.core import BinaryVariable, LEQ, Model, ObjectiveSense
from qilisdk.core.model import QUBO

x0, x1 = BinaryVariable("x0"), BinaryVariable("x1")

model = Model("toy")
model.set_objective(-2 * x0 - 3 * x1 + 4 * x0 * x1,
                    label="energy",
                    sense=ObjectiveSense.MINIMIZE)
model.add_constraint("budget", LEQ(x0 + x1, 1), lagrange_multiplier=5)

qubo = model.to_qubo()
print(qubo.qubo_objective)

ham = qubo.to_hamiltonian()
print(ham)

Objetivos y Restricciones

Cada Model consta de:

Objetivo

El Objective define la función que el modelo trata de minimizar o maximizar. Ejemplo:

from qilisdk.core.model import Model, ObjectiveSense
from qilisdk.core.variables import Variable, Domain, Bitwise
model = Model("example_model")
x = Variable("x", domain=Domain.REAL, bounds=(1, 2), encoding=Bitwise, precision=1e-1)
model.set_objective(2*x + 3, label="obj", sense=ObjectiveSense.MINIMIZE)
print(model)

Salida:

Model name: example_model
objective (obj):
    minimize :
    (2) * x + (3)

subject to the encoding constraint/s:
    x_upper_bound_constraint: x <= (2)
    x_lower_bound_constraint: x >= (1)

With Lagrange Multiplier/s:
    x_upper_bound_constraint : 100
    x_lower_bound_constraint : 100

Las restricciones de codificación se añaden automáticamente para variables continuas acotadas. Cada restricción tiene un multiplicador de Lagrange asociado que determina la penalización por violarla.

Puede actualizar el multiplicador de la siguiente manera:

model.set_lagrange_multiplier("x_upper_bound_constraint", 1)
print(model)

Salida:

Model name: example_model
objective (obj):
    minimize :
    (2) * x + (3)

subject to the encoding constraint/s:
    x_upper_bound_constraint: x <= (2)
    x_lower_bound_constraint: x >= (1)

With Lagrange Multiplier/s:
    x_upper_bound_constraint : 1
    x_lower_bound_constraint : 100

Restricciones

Se pueden añadir Restricciones adicionales para acotar el espacio de soluciones:

from qilisdk.core import LT

model.add_constraint("test_constraint", LT(x, 1.5), lagrange_multiplier=10)
print(model)

Salida:

Model name: example_model
objective (obj):
    minimize :
    (2) * x + (3)

subject to the constraint/s:
    test_constraint: x < (1.5)

subject to the encoding constraint/s:
    x_upper_bound_constraint: x <= (2)
    x_lower_bound_constraint: x >= (1)

With Lagrange Multiplier/s:
    x_upper_bound_constraint : 1
    x_lower_bound_constraint : 100
    test_constraint : 10

Evaluar un Modelo

Para evaluar un Model, proporcione valores para todas las variables implicadas:

model.evaluate({
    x: 1.4
})

Salida:

{'obj': 5.8, 'test_constraint': 0.0}

La evaluación devuelve un diccionario con valores para el objetivo y las restricciones. Una restricción devuelve 0.0 si se satisface, o su multiplicador de Lagrange si se viola.

Por ejemplo:

model.evaluate({
    x: 2
})

Salida:

{'obj': 7.0, 'test_constraint': 10.0}