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:
Un únic
ObjectiveZero o més instàncies de
Constraint
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
Constructors
En lloc de construir un model des de zero, també podeu construir-lo per a certs problemes predefinits:
Model.random_ising(num_variables, coefficient_range, label, seed)- Constructs a random Ising model with specified parameters.
Model.knapsack(values, weights, max_weight, label, lagrange_multiplier)- Construeix un problema de la motxilla amb els pesos, valors i capacitat donats.
Model.max_cut(edges, weights, label)- Construeix un problema de tall màxim per a un graf donat.
Model.graph_coloring(graph, num_colors, label, lagrange_multiplier)- Construeix un problema de coloració de grafs per a un graf i un nombre de colors donats.
Model.travelling_salesman(edges, distances, label, lagrange_multiplier)- Construeix un problema del viatjant de comerç per a una matriu de distàncies donada.
Model.factoring(n, label)- Construeix un problema de factorització per a un enter donat.
Per exemple, per crear un problema de la motxilla:
from qilisdk.core import Model
values = [10, 15, 40]
weights = [1, 2, 3]
max_weight = 6
knapsack_model = Model.knapsack(values, weights, max_weight)
print(knapsack_model)
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}