【问题标题】:Add many quadratic terms in Gurobi objective function在 Gurobi 目标函数中添加许多二次项
【发布时间】:2019-08-07 12:02:00
【问题描述】:

我有一个包含许多决策变量的大目标函数。即$$\sum_{i=0}^100 Z_i^2$$。我想知道是否有一种有效的方法可以在目标函数中添加多个二次项,或者有效地构造具有多个项的二次表达式,例如用于线性约束的内置方法 addConstrs()。

在下面的example 中,只添加了几个二次项。直接的扩展是运行一个循环来一项一项地添加二次项。

【问题讨论】:

  • 我认为我的回答回答了这个问题,或者至少接近了。仅供参考,有一个stackexchange site for OR,以防您将来对 Gurobi 有更多疑问。
  • @brentertainer 我同意。我认为使用 quicksum 函数的方法可能是我正在寻找的方法,除非 Gurobi 支持系数矩阵的输入。感谢您提醒我有关 OR 部分。
  • 种方法可以做到这一点(例如使用 numpy)。你用什么类型的对象来存储你的系数?
  • 我使用 numpy 多维数组来存储我的系数。你问的是这个吗?
  • 好的,谢谢。请参阅我的答案中的编辑。

标签: python gurobi


【解决方案1】:

gurobipy 包通常与 Python 的理解语法和内置函数配合得很好,变量集是字典的实例。所以你可以这样做:

model = gurobipy.Model()
x = model.addVars(100)
model.update()
obj = sum(variable * variable for variable in x.values())

obj = sum(x[i] * x[i] for i in x.keys())

或者(如果你真的有很多很多很多变量):

obj = gurobipy.quicksum(x[i] * x[i] for i in x.keys())

编辑

如果您需要合并 numpy 数组中的系数,以下是如何完成此操作的示例。关键是首先为您的变量创建一个符合 numpy 的容器。然后可以应用大多数算术numpy操作。

model = gurobipy.Model()
x = model.addVars(100)
model.update()

# make numpy-compliant container for x
x_np = np.array([x[i] for i in range(100)])

# 2-D matrix of random coefficients
Q = np.random.random(size=(100, 100))

# 1-D vector of random coefficients
c = np.random.random(size=100)

# x^T * Q * x
expr = np.sum(Q * np.outer(x_np, x_np))

# (diagonal of Q) * x
expr = np.dot(Q.diagonal(), x_np)

# c * x
expr = np.dot(c, x_np)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-09
    • 2019-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多