How to define the constraints with accumulation of one index?
AnsweredWe conduct a constraint below:
where the variables in red are decision variables, others are known constants. how do i define this constraint? I tried to write it, but I couldn't achieve accumulate the index i.
for v in range(1,3):
model.addConstr(e[v,0] == E,"l7a")
for m in range(1,3):
name = 'l7_' + str(v) + '0' + str(m)
model.addConstr(th[v,0,m] == 0, name=name) #gurantee thv0m=0
for j in range(1,4):
for i in range(3):
if i < j:
model.addGenConstrAnd(sth,[s[v, i, j],th[v, i, m]],'andconstr') # s and th are both decision variables
expr = QuadExpr((E-e[v,i])*sth+(e[v,i]-Econsumption[j])*s[v,i,j]) # e is also a decision variable
model.addConstr(expr == e[v,j],"l7")
-
Official comment
This post is more than two 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 try Gurobot, our chatbot interface offering instant, expert-level support. -
Hi Yaoyao,
I think you've got the right idea, which is to introduce an auxiliary variable for the multiplication of s and theta variables.
\[z^v_{ijm} = s^{v}_{ij}\theta^v_{im}\]
\[e^v_j = \sum_{i \in S_0} Ez^v_{ijm} + s^{v}_{ij}e^v_i - e^v_iz^v_{ijm} - u_j\]The And constraint would only work if s and th are binary variables, which I'll assume they are and also define sth as binary, but I'd suggest an equality constraint linking the sth with the multiplication of s and th is more readable.
V = range(1,3) F = range(1,3) S = range(1,4)
for v in V:
for m in F:
for j in S:
expr = gp.QuadExpr()
for i in S:
if i != j:
sth = model.addVar(vtype="B")
model.addConstr(sth == s[v, i, j]*th[v, i, m])
expr += E*sth + e[v,i]*s[v,i,j] + e[v,i]*sth - Econsumption[j]
model.addConstr(expr == e[v,j],"l7")You could also structure this slightly differently, so that the code is not as nested, with the help of itertools.product:
from itertools import product
V = range(1,3)
F = range(1,3)
S = range(1,4)
model.addConstrs((e[v,0] == E for v in V),"l7a")
model.addConstrs((th[v,0,m] == 0 for v, m in product(V,F)), name="l7_")
z_indices = [(v,i,j,m) for v,i,j,m in product(V, S, S, F) if i != j]
z = model.addVars(z_indices, vtype="B")
model.addConstrs(z[v,i,j,m] == s[v, i, j]*th[v, i, m] for v,i,j,m in z_indices)
for v,m,j in product(V,F,S):
m.addConstr(e[v,j] == gp.quicksum(
E*z[v,i,j,m] + e[v,i]*s[v,i,j] + e[v,i]*z[v,i,j,m] - Econsumption[j]
for i in S if i != j
))- Riley
0 -
Thanks, Riley. I got it!
0 -
Hi, Riley:
I'm sorry to bother you, I met problems again. when i want to introduce another auxiliary variable rth[v,i,j,m]for the multiplication of r[v,j] and (1-th[v,i,m]) variables, i try the structure you proposed, but as the index of the product is same to sth, it outputs "KeyError: 'Duplicate keys in Model.addVars()'".
The code of defining rth is as follow. How can i deal with the definition of sth and rth?
rth_indices = [(v,i,j,m) for v,i,j,m in product(range(1,V+1), range(S), range(1,S+1),range(1,F+1)) if i < j]
rth = model.addVars(rth_indices, vtype=GRB.BINARY, name='rth')
model.addConstrs(rth[v,i,j,m] == r[v, j] * (1-th[v, i, m]) for v,i,j,m in rth_indices)
for m in vrange(1,F+1):
for v in range(1, V + 1):
for i in range(S):
for j in range(i+1,S+1):
name = 'C16_mvij' + str(m) + str(v) + str(i) + str(j)
model.addConstr(st[i] + RT[i] + t + th[d,i,m] * q * (E - e[v,i]) + rth[v,i,j,m]*h[v,j] <= st[j] + BigM * (1 - s[v,i,j]), name=name)0 -
And how can i continue calling sth as an auxiliary variable in another constraint, it seems to be wrong as well, which also outputs"KeyError: 'Duplicate keys in Model.addVars()'"?
0 -
Hi Ariel,
No problem, can you show me the values of V, S, F, and paste the full error message including stacktrace?
- Riley
0 -
Difinitely! The values of V,S,F are the same as above.
V = range(1,3) F = range(1,3) S = range(1,4)
The full error message is as follow, the definition of sth referred to your answer about 'product' structure:
Traceback (most recent call last):
File "D:\Python_installment\Pythoncode\Research\writing2\Driver_bind_VehicleMode\Model1_Driver_bind_VehicleMode.py", line 183, in <module>
sth = model.addVars(sth_indices, vtype=GRB.BINARY, name='sth')
File "src\gurobipy\model.pxi", line 2991, in gurobipy.Model.addVars
KeyError: 'Duplicate keys in Model.addVars()'
Set parameter IntegralityFocus to value 1Thanks, Riley!
0 -
Hi Ariel,
Any chance it's V,F,S = 3,3,4? The code you pasted is incompatible with the ranges. I.e. this doesn't work
V = range(1,3)
...
range(1,V+1)Since the stack trace is pointing to the definition of the sth variables we'll need you to paste the code for that, not the rth variables.
- Riley
0 -
Sorry, Riley. Waste your time. When I just revisited my code, I found typo. It can work with two similar index. Thank you!
0 -
No worries, good luck!
0
Post is closed for comments.
Comments
10 comments