Problem with constraint in CQM
I'm having a quadratic objective function which needs to be minimized. I also need to enforce cardinality constraint on that objective function such that there must be at-least 'K' variables whose value should be non-zero.
The objective function and constraints are:
min_{x} x^T Q x
such that:
\sum_{i} x_{i} = 100
\sum_{i} z_{i} = 6
LB*z_{i} <= x_{i} <= UB*z_{i} for all i
where LB and UB are lower and upper bounds on variable x_{i} for all i.
I'm stuck on enforcing the 3rd constraint.
The code is written below:
cqm = ConstrainedQuadraticModel()
x = {} # weight variable
z = {} # Selection of variable
for i in range(10):
x[i] = Integer(label=f'x_{i}', lower_bound =lb, upper_bound=ub )
z[i] = Binary(label=f'z_{i}')
cqm.add_constraint(quicksum(z[i] for i in range(10))==6 , label = 'cardinality_cons')
cqm.add_constraint(quicksum(x[i] for i in range(10)) == 100, label = 'weights_cons')
for i in range(10):
cqm.add_constraint(lb*z[i] <= x[i]) # Setting cardinality constraint
cqm.add_constraint(x[i] <= ub*z[i])
obj = 0
for i in range(10):
for j in range(i,10):
obj += x[i]*x[j]*Q[i][j]
cqm.set_objective(obj) # Minimizing objective function x^T Q x
While running the code, I get the following error:
'<=' not supported between instances of 'BinaryQuadraticModel' and 'QuadraticModel'
Any hints on how to write the 3rd constraint?
Comments
I got the problem. The error was due to the variables being on both sides of the equation. They must be on same side of the equation. So the constraint must be like
LB*z_{i} - x_{i} <= 0 for all i
0 <= UB*z_{i} - x_{i} for all i
The code is:
That's great!
I was just about to post the following. Maybe the links will be helpful:
Hello,
It looks like you have an Integer on the right hand side of the comparison, which is causing the error. The Integer object is of type QuadraticModel, which explains:
The documentation for add_constraint_from_comparison under the comp parameter mentions that the right hand side must be of type integer or float, which refers to the primitive data types (i.e. int and float). It does seem a little confusing, so maybe this could be clarified in the documentation.
There are some examples showing how to use the Symbolic Math here:
https://docs.ocean.dwavesys.com/en/stable/docs_dimod/intro/intro_symbolic_math.html
You will note that all of the examples use int values on the right hand side of the comparison operators.
I hope this helps to explain the error you are seeing.
Please let us know if you have any questions.
Please sign in to leave a comment.