在Gurobi目标函数中加入多个二次项

2024-07-03 06:38:20 发布

您现在位置:Python中文网/ 问答频道 /正文

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

在下面的example中,只添加了几个二次项。简单的扩展是运行一个循环来逐个添加二次项。你知道吗


Tags: 方法函数目标表达式example线性内置sum
1条回答
网友
1楼 · 发布于 2024-07-03 06:38:20

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)

相关问题 更多 >