使用getVarByName()向gurobi添加约束

时间:2018-06-26 19:46:01

标签: constraints gurobi

我很抱歉这个问题,但是我对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。

2 个答案:

答案 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]