Creating binary variables
AnsweredHello,
I am quite new to Gurobi and currently I am facing some issues regarding a binary variable, probably the answer to this question might be obvious but I've circled with the idea for a bit now.
I have a set of reactions an I want to add a constraint like the following
Vi >= LB*(1-Yi)
where Yi is the binary variable, 1 if the reaction i is removed and 0 otherwise
Can this be done my simply stating with
model.AddVar(vtype=GRB.BINARY) ?
-
Official comment
This post is more than three years old. Some information may not be up to date. For current information, please check the Gurobi Documentation or Knowledge Base. If you need more help, please create a new post in the community forum. Or why not try our AI Gurobot?. -
Hi Jose,
Yes, setting the vtype argument of Model.addVar() to GRB.BINARY will make sure the newly created variable is binary. In Python, the full construction of a single constraint of this form would look like:
import gurobipy as gp
m = gp.Model()
y = m.addVar(vtype=gp.GRB.BINARY, name="y")
v = m.addVar(name="v")
LB = 5
m.addConstr(v >= LB*(1 - y))I hope this helps. Thanks!
Eli
0 -
Hello, thanks for your help, I tried with the following syntax but I get this error, just for clarification reactions is a list and lb_reaction is a directory of reaction and its lower bound
--------------------------------------------------------------------------- KeyError Traceback (most recent call last) <ipython-input-58-a7b59fc1a1ac> in <module> 12 13 ---> 14 m.addConstrs(v[j]>=LB[i]*(1-y[j]) for j in reactions for i in lb_reaction) 15 16 m.addConstrs(v[j]<=UB[i]*(1-y[j]) for j in reactions for i in ub_reaction) model.pxi in gurobipy.Model.addConstrs() <ipython-input-58-a7b59fc1a1ac> in <genexpr>(.0) 12 13 ---> 14 m.addConstrs(v[j]>=LB[i]*(1-y[j]) for j in reactions for i in lb_reaction) 15 16 m.addConstrs(v[j]<=UB[i]*(1-y[j]) for j in reactions for i in ub_reaction) KeyError: 'ACALD'0 -
Hi Jose,
This error means that the key 'ACALD' was not defined for one of the variables or parameters used in that constraint family. Specifically, v['ACALD'], LB['ACALD'], or y['ACALD'] does not exist. Could you include the code that shows how you define the "reactions" and "lb_reaction" structures, as well as where you add the \( v \) and \( y \) variables to the model?
Also, I'm not entirely sure this constraint is correct. It seems like the keys for the lb_reaction dictionary should precisely correspond to the list of reactions, and only one of these constraints should be added for each reaction. I.e., the constraint should instead be:
$$\begin{align*} v_j &\geq LB_j (1 - y_j) \qquad \forall j \in N,\end{align*}$$
where \( N \) is the set of reactions. Right now, you are adding \( |N|^2 \) of these constraints rather than \( |N| \), and most of them are redundant.
Thanks!
Eli
0 -
Hello Elli,
Thanks so much for your help, this is the code to get all the list and dictionaries for the model,
metabolites = df_metabolites[' abbreviation '].tolist() #the list of metabolites for the variables
reactions = df_reactions['abbreviation'].tolist() #The list of reactions for the variables
UB = df_UB[0].tolist() #The list of the Upper Bounds
LB = df_LB[0].tolist() #The list of the Lower Bounds
matrixlist = []
for n in range (95): # The Smatrix converted to a list
reaction = df_smatrix[n].tolist()
matrixlist.extend(reaction)
reac_met = list(itertools.product(reactions,metabolites))
sreact_met = dict(zip(reac_met,matrixlist))
a = list()
for ele in sreact_met.keys():
a.append((ele[1], ele[0]))
smatr = dict(zip(a,matrixlist)) # dictionary (metabolite,reaction:coefficient)
lb_reaction = dict(zip(reactions,LB)) #This is the pair (reaction:bound)
ub_reaction = dict(zip(reactions,UB))
y = m.addVars(reactions, vtype=GRB.BINARY, name='y')
v = m.addVars(metabolites, name='v')
s = m.addVars(smatr, name='s')0 -
Hi Jose,
I wonder if this error is caused by these two lines:
v = m.addVars(metabolites, name='v')
m.addConstrs(v[j]>=LB[i]*(1-y[j]) for j in reactions for i in lb_reaction)The \( v \) variables are defined over the set of metabolites. However, In the constraints, \( v \) is indexed by the set of reactions. So I think this is a matter of making sure the indices on the variables match the indices in the constraints, though I am not familiar enough with your application to know what needs to be changed.
I hope this helps!
Eli
0 -
Thank you so much for taking the time to answer, it sure helped me a lot, it turned out to be a matter of indexing
0
Post is closed for comments.
Comments
7 comments