我很抱歉这个问题,但是我对python和gurobi都是新手。我有一个使用gurobi求解LP的函数,但我想以SET = [xi,xi上的相等约束值]的形式向该函数输入一些约束:
def BB(SET=[]):
try:
m = Model("mip1")
m.setParam('OutputFlag',False)
x1 = m.addVar( vtype = GRB.CONTINUOUS, name="x1")
x2 = m.addVar( vtype = GRB.CONTINUOUS, name="x2")
x3 = m.addVar( vtype = GRB.CONTINUOUS, name="x3")
x4 = m.addVar( vtype = GRB.CONTINUOUS, name="x4")
m.setObjective(9*x1+5*x2+6*x3+4*x4, GRB.MAXIMIZE)
m.addConstr(6*x1+3*x2+5*x3+2*x4<=10)
m.addConstr(x3+x4<=1)
m.addConstr(-x1+x3<=0)
m.addConstr(-x2+x4<=0)
m.addConstr(x1>=0)
m.addConstr(x1<=1)
m.addConstr(x2>=0)
m.addConstr(x2<=1)
m.addConstr(x3>=0)
m.addConstr(x3<=1)
m.addConstr(x4>=0)
m.addConstr(x4<=1)
if np.size(SET)!=0:
m.addConstr(m.getVarByName(SET[0]) == SET[1])
m.write("ADMODEL3.lp")
m.optimize()
except GurobiError:
print('Error reported')`}
因此,如果我调用BB([“ x1”,0]),我希望gurobi用附加约束x1 = 0来求解LP。
答案 0 :(得分:0)
添加所有变量和约束后,应在引用它们之前调用m.update()
。
def BB(SET=[]):
try:
m = Model("mip1")
m.setParam('OutputFlag',False)
x1 = m.addVar( vtype = GRB.CONTINUOUS, name="x1")
x2 = m.addVar( vtype = GRB.CONTINUOUS, name="x2")
x3 = m.addVar( vtype = GRB.CONTINUOUS, name="x3")
x4 = m.addVar( vtype = GRB.CONTINUOUS, name="x4")
m.setObjective(9*x1+5*x2+6*x3+4*x4, GRB.MAXIMIZE)
m.addConstr(6*x1+3*x2+5*x3+2*x4<=10)
m.addConstr(x3+x4<=1)
m.addConstr(-x1+x3<=0)
m.addConstr(-x2+x4<=0)
m.addConstr(x1>=0)
m.addConstr(x1<=1)
m.addConstr(x2>=0)
m.addConstr(x2<=1)
m.addConstr(x3>=0)
m.addConstr(x3<=1)
m.addConstr(x4>=0)
m.addConstr(x4<=1)
m.update() # Add this line
if np.size(SET)!=0:
m.addConstr(m.getVarByName(SET[0]) == SET[1])
m.write("ADMODEL3.lp")
m.optimize()
except GurobiError:
print('Error reported')`}
答案 1 :(得分:0)
为什么不使用addVars来通过变量索引访问所需的变量?然后,您可以调用BB([1,0]),而不必调用模型的更新。
def BB(SET=[]):
try:
m = Model("mip1")
m.setParam('OutputFlag',False)
vars = list(range(1,5))
x = m.addVars(vars, vtype=GRB.CONTINUOUS, name="x")
m.setObjective(9*x[1]+5*x[2]+6*x[3]+4*x[4], GRB.MAXIMIZE)
m.addConstr(6*x[1]+3*x[2]+5*x[3]+2*x[4]<=10)
m.addConstr(x[3]+x[4]<=1)
m.addConstr(-x[1]+x[3]<=0)
m.addConstr(-x[2]+x[4]<=0)
m.addConstr(x[1]>=0)
m.addConstr(x[1]<=1)
m.addConstr(x[2]>=0)
m.addConstr(x[2]<=1)
m.addConstr(x[3]>=0)
m.addConstr(x[3]<=1)
m.addConstr(x[4]>=0)
m.addConstr(x[4]<=1)
if np.size(SET)!=0:
m.addConstr(x[SET[0]] == SET[1])
m.write("ADMODEL3.lp")
m.optimize()
except GurobiError:
print('Error reported')`}
如果您不想像我在示例中那样更改所有约束,则可以将x1-x4映射到它们各自的x变量:
x1 = x[1]
x2 = x[2]
x3 = x[3]
x4 = x[4]