Добавление ограничений в gurobi с помощью getVarByName () - PullRequest
0 голосов
/ 26 июня 2018

Я прошу прощения за вопрос, но я новичок и в питоне, и в 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 решил LP с дополнительным ограничением x1 = 0.

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Почему бы не использовать addVars вместо этого, чтобы вы могли получить доступ к нужной переменной через ее индекс? После этого вы можете позвонить в BB ([1,0]), не вызывая функцию update для модели.

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]
0 голосов
/ 27 июня 2018

После того, как вы добавите все переменные и ограничения, вы должны вызвать 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')`}
...