在 Gurobi objective 函数中添加多项二次项
Add many quadratic terms in Gurobi objective function
我有一个很大的 objective 函数,其中包含许多决策变量。即$$\sum_{i=0}^100Z_i^2$$。我想知道是否有一种有效的方法可以在objective函数中添加多个二次项,或者可以有效地构造一个包含许多项的二次表达式,例如线性约束的内置方法addConstrs()。
下面只加了几个二次项。直接的扩展是 运行 一个循环,一个一个地添加二次项。
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)
我有一个很大的 objective 函数,其中包含许多决策变量。即$$\sum_{i=0}^100Z_i^2$$。我想知道是否有一种有效的方法可以在objective函数中添加多个二次项,或者可以有效地构造一个包含许多项的二次表达式,例如线性约束的内置方法addConstrs()。
下面
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)