gurobipy.GurobiError: Constraint has no bool value (are you trying "lb <= expr <= ub"?)
AnsweredHi, I am new with Gurobi. I have faced some problems recently when programming my models. It would be grateful if get your professional advice.Thanks.
An error occurred after running the following code：
TS_i = model.addVars(n, vtype=GRB.INTEGER, name="TS_i")
TE_i = model.addVars(n, vtype=GRB.INTEGER, name="TE_i")
lambda_i_p = {}
for i in V:
for p in P:
lambda_i_p[i, p] = model.addVar(vtype=GRB.CONTINUOUS, name=f"lambda_i_p_{i}_{p}")
# Create constraints to represent the relationship between lambda_ip and TE_i, TS_i
for i in V:
for p in P:
if TS_i[i] <= p and p<= TE_i[i]:
model.addConstr(lambda_i_p[i, p]* (TE_i[i]  TS_i[i] + 1)== D_i[i] , name=f"constraint_lambda_ip_{i}_{p}")
Here is the details about the error：
Traceback (most recent call last):
File "D:\pythonproject\lib\sitepackages\IPython\core\interactiveshell.py", line 3505, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipythoninput255c84a859894>", line 1, in <module>
runfile('D:\\PyCharm Pro 2023.2\\pythonProject\\9.5 test大规模+双目标.py', wdir='D:\\PyCharm Pro 2023.2\\pythonProject')
File "D:\PyCharm Pro 2023.2\plugins\python\helpers\pydev\_pydev_bundle\pydev_umd.py", line 198, in runfile
pydev_imports.execfile(filename, global_vars, local_vars) # execute the script
File "D:\PyCharm Pro 2023.2\plugins\python\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile
exec(compile(contents+"\n", file, 'exec'), glob, loc)
File "D:\PyCharm Pro 2023.2\pythonProject\9.5 test大规模+双目标.py", line 112, in <module>
if TS_i[i] <= p and p<= TE_i[i]:
File "src\gurobipy\tempconstr.pxi", line 57, in gurobipy.TempConstr.__bool__
gurobipy.GurobiError: Constraint has no bool value (are you trying "lb <= expr <= ub"?)
I think the problem should occur in this line of code.
if TS_i[i] <= p and p<= TE_i[i]:
because TS_i andTE_i here is thedecision variable , but I don’t know how to modify it.

Hi Qiuyan,
It is not possible to use Gurobi variable objects in ifclauses because there is no value associated with them to be used in comparison. The reason for the error you see is wellexplained in the article Constraint has no bool value (are you trying "lb <= expr <= ub"?). Please check the cause number 3).
I assume you would like to model the following constraint:
\[\mbox{if}~~ TS_i \leq p ~\mbox{and}~ TE_i \geq p \rightarrow \lambda_{ip} (TE_i  TS_i + 1) = D_i \]
To implement the above constraint, you need to use three binary auxiliary variables to model the relationships below:
 \(\mbox{if}~~ TS_i \leq p \rightarrow x_i = 1 \)
 \(\mbox{if}~~ TE_i \geq p \rightarrow y_i = 1 \)
 \(\mbox{if}~~ x_i = 1 ~\mbox{and}~ y_i= 1 \rightarrow z_i = 1 \)
 \(\mbox{if}~~ z_i = 1 \rightarrow \lambda_{ip} (TE_i  TS_i + 1) = D_i \)
You can use Gurobi Python APIs for the Indicator constraint to implement the above relationships.
Best regards,
Maliheh
1 
Hello，Maliheh,Thanks for your advice,it's helpful.I tried to modeling the constraint using the method above.However, the value of variable: lambda_i_p[i, p] all become 0.And I check the code，I think the problem may still lie in this section of the code.Which part do you think the problem occurred?
# Define the lambda_i_p derived variables
lambda_i_p = {}
for i in V:
for p in P:
lambda_i_p[i, p] = model.addVar(vtype=GRB.CONTINUOUS, name=f"lambda_i_p_{i}_{p}")
# Add auxiliary variables x, y, and z
x = {}
y = {}
z = {}
for i in V:
for p in P:
x[i, p] = model.addVar(vtype=GRB.BINARY, name=f"x_{i}{p}")
y[i, p] = model.addVar(vtype=GRB.BINARY, name=f"y_{i}{p}")
z[i, p] = model.addVar(vtype=GRB.BINARY, name=f"z_{i}{p}")
# Add constraints: x[i]=1 if and only if TS_i[i] <= p
# Add constraints: y[i]=1 if and only if TE_i[i] >= p
# Add constraints: z[i]=1 if and only if x[i]=1 and y[i]=1
# Add constraint: lambda_i_p[i, p] * (TE_i[i]  TS_i[i] + 1) == D_i[i] when z[i]=1 holds
for i in V:
for p in P:
model.addConstr((x[i, p] == 1) >> (TS_i[i] <= p), name=f"constraint_x_{i}_{p}")
model.addConstr((y[i, p] == 1) >> (p <= TE_i[i]), name=f"constraint_y_{i}_{p}")
model.addConstr(z[i, p] == x[i, p] * y[i, p], name=f"constraint_z_{i}{p}")
model.addConstr(lambda_i_p[i, p] * (TE_i[i]  TS_i[i] + 1) == D_i[i] * z[i, p], name=f"constraint_lambda_ip_{i}_{p}")0 
Do you get an error? Or do you mean that having all \(\lambda_{ip}\) assigned to 0 is not what you expect to see in the optimal solution?
Please note that you have modelled different relationships. In your implementation version below, if \(z_i = 0\), the expression \(\lambda_{ip}(TE_i  TS_i +1)\) must be 0 then. However, in the constraint \(\mbox{if}~ z_i = 1 ~ \rightarrow ~ \lambda_{ip} (TE_i  TS_i +1) = D_i\), we do not impose any constraint on the value of \(\lambda_{ip} (TE_i  TS_i +1)\) if \(z_i = 0\).
model.addConstr(lambda_i_p[i, p] * (TE_i[i]  TS_i[i] + 1) == D_i[i] * z[i, p], name=f"constraint_lambda_ip_{i}_{p}")
The same is true for all the other constraints you have implemented.
 The constraint \(\mbox{if}~~ TS_i \leq p \rightarrow x_i = 1 \) is different from the constraint \(\mbox{if}~~ x_i = 1 \rightarrow TS_i \leq p \). To model the former relationship using Gurobi Python API for indicator constraints, you can implement its equivalent logical contrapositive in the form \(\mbox{if}~~ x_i \neq 1 \rightarrow TS_i \nleq p \) which is \(\mbox{if}~~ x_i = 0 \rightarrow TS_i \geq p + \epsilon \).
 The constraint \(\mbox{if}~~ TE_i \geq p \rightarrow y_i = 1 \) is different from the constraint \(\mbox{if}~~ y _i = 1 \rightarrow TE_i \geq p\) (see above).
 The constraint \(\mbox{if}~~ x_i = 1 ~\mbox{and}~ y_i= 1 \rightarrow z_i = 1 \) is different from \(z_i = x_i y_i\). In the former version, we are not imposing any constraint on the value of \(z_i\) if, for example, \(x_i = 0\) and \(y_i = 1\).
Best regards,
Maliheh
0
Please sign in to leave a comment.
Comments
3 comments