【问题标题】:Adding multiple quadratic terms to objective function in Gurobi Python在 Gurobi Python 中向目标函数添加多个二次项
【发布时间】:2019-03-26 16:57:09
【问题描述】:

我想在 Gurobi 中设置一个目标函数来最小化 x^2 + y^2。我已尽力在下面提供一个示例:

import gurobipy as gbPy

model = gbPy.Model()

A = [1, 2, 3, 4, 5]
B = [1, 2, 3]
x = model.addVars(5, lb = 0)
y = model.addVars(3, lb = 0)

for i in range(len(x)):
    model.addConstr(x[i] >= A[i])

for i in range(len(y)):
    model.addConstr(y[i] >= B[i])

objExp = gbPy.QuadExpr()

objExp.addTerms(???)
model.setObjective(objExp, gbPy.GRB.MINIMIZE)

但我不确定如何在 objExp.addTerms 行中指示我想要的表达式。 http://www.gurobi.com/documentation/8.1/refman/py_quadexpr_add.html提供了一个例子:

expr = x * x + 2 * y * y
expr.add(z * z, 3.0)

但我不明白它是在表达式中添加 3*z^2 还是 z^2 + 3。非常感谢任何解释语法的帮助!

【问题讨论】:

    标签: python gurobi


    【解决方案1】:

    我假设——在你的例子中——你想设置目标来最小化x[0]^2 + y[0]^2。如果您需要不同的目标,应该直接进行调整。

    有多种方法可以设定目标。

    你可以直接在setObjective里面定义:

    model.setObjective(x[0] * x[0] + y[0] * y[0])
    

    model.setObjective(x[0] * x[0] + y[0] * y[0], gbPy.GRB.MINIZE) # minimize is the default; so it is optional
    

    这是最简单的,除非您的目标表达非常冗长且笨拙,否则这是我推荐的。

    或者您可以先构建表达式。如果您有很多术语,这可以带来性能优势。

    # define the quadratic expression object
    objExp = gbPy.QuadExpr()
    
    # add single terms using add
    objExp.add(x[0] * x[0]) 
    objExp.add(y[0] * y[0])
    # you could also do this in one line adding x[0]*x[0] + y[0]*y[0]
    
    # or add multiple terms at once using addTerms
    #objExp.addTerms([1, 1], [x[0], y[0]], [x[0], y[0]])
    
    # set the objective
    model.setObjective(objExp, gbPy.GRB.MINIMIZE)
    

    请注意,在此示例中,addaddTerms 的两个部分都执行相同的操作。你只需要一个。

    add 方法将第一个参数中的表达式与(可选的)第二个参数相乘。您引用的示例首先定义表达式x^2 + y^2,然后添加3z^2

    【讨论】:

    • 非常感谢@Silke!为了确认我理解addTerms,你上面的表达是否返回1*x[0]*x[0] + 1*y[0]*y[0]
    • 是的!第一个数组包含系数,第二个包含第一个变量,第三个包含每个项的第二个变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-09
    • 1970-01-01
    • 1970-01-01
    • 2019-12-14
    • 1970-01-01
    • 1970-01-01
    • 2020-05-05
    相关资源
    最近更新 更多