Models

Aquest exemple mínim presenta un model d’optimització binària, el converteix a una forma de penalització QUBO i exporta el Hamiltonian corresponent:

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)

Objectius i restriccions

Cada Model consta de:

Objectiu

El Objective defineix la funció que el model pretén minimitzar o maximitzar. Exemple:

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)

Sortida:

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

Les restriccions de codificació s’afegeixen automàticament per a les variables contínues acotades. Cada restricció té un multiplicador de Lagrange associat, que determina la penalització per violar-la.

Podeu actualitzar el multiplicador de la manera següent:

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

Sortida:

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

Restriccions

Es poden afegir Restriccions addicionals per limitar l’espai de solucions:

from qilisdk.core import LT

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

Sortida:

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

Avaluar un model

Per avaluar un Model, proporcioneu valors per a totes les variables implicades:

model.evaluate({
    x: 1.4
})

Sortida:

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

L’avaluació retorna un diccionari amb valors per a l’objectiu i les restriccions. Una restricció retorna 0.0 si es satisfà, o el seu multiplicador de Lagrange si es viola.

Per exemple:

model.evaluate({
    x: 2
})

Sortida:

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