gurobipy.MVar#

class MVar#

Gurobi矩阵变量对象。一个MVar是Gurobi变量的NumPy ndarray。变量总是与特定模型相关联。您通常使用Model.addMVar创建这些对象。

MVar类的许多概念、属性和方法都借鉴了NumPy的ndarray类中的等效内容。对于形状、维度或广播等概念的解释,我们建议您参考NumPy文档。

你通常使用MVar对象来构建矩阵表达式,通常使用重载运算符。你可以构建线性 矩阵 表达式二次 矩阵 表达式

expr1 = A @ x
expr2 = A @ x + B @ y + z
expr3 = x @ A @ x + y @ B @ y

前两个表达式是线性的,而第三个是二次的。

在上面的例子中(以及一般情况下),\(A\)\(B\) 可以是 NumPy ndarray 对象或 SciPy.sparse 中定义的任何稀疏矩阵类。操作数的维度必须兼容,这是 Python 矩阵乘法运算符的常规意义。例如,在表达式 \(A @ x\) 中,\(A\)\(x\) 都必须至少有一个维度,并且它们的最内层维度必须一致。有关形状兼容性规则的完整描述,请参阅 Python 的文档

一个表达式通常会被传递给 setObjective(用于设置优化目标)或 addConstr(用于添加约束)。

MVar 对象支持标准的 NumPy 索引和切片。大小为 \(1\) 的 MVar 可以在所有接受 gurobipy Var 对象的地方使用。

变量对象具有许多属性。完整列表可以在本文档的属性部分找到。一些变量属性只能查询,而其他属性也可以设置。请记住,Gurobi优化器采用延迟更新方法,因此对属性的更改在下次调用Model.updateModel.optimizeModel.write之前不会生效。

我们应该指出一些关于变量属性的注意事项。考虑lb属性。它的值可以使用mvar.lb来查询。Gurobi库在属性名称中忽略字母大小写,因此它也可以作为var.LB来查询。属性值以NumPy的ndarray形式返回,其形状与mvar相同,其中每个元素包含MVar对象相应元素的属性值。可以使用标准赋值语句(例如,var.lb = l)来设置属性,其中l可以是具有适当形状的ndarray,也可以是应用于所有相关变量的标量。然而,如前所述,属性修改是以惰性方式完成的,因此您不会立即看到更改的效果。并且某些属性无法设置(例如,x属性),因此尝试为它们分配新值将引发异常。

你也可以使用MVar.getAttr/ MVar.setAttr来访问属性。属性 名称可以作为字符串传递给这些例程,或者你可以使用 GRB.Attr类中定义的常量(例如, GRB.Attr.LB)。

copy()#

创建此MVar的副本。

Returns:

新对象。

Example:
orig = model.addMVar(3)
copy = orig.copy()
diagonal(offset=0, axis1=0, axis2=1)#

创建一个与此MVar指定对角线上的变量相对应的MVar。

Parameters:
  • offset – (可选) 对角线相对于主对角线的偏移量。值 >0 表示在主对角线之上,值 <0 表示在主对角线之下

  • axis1 – (可选)用作二维子MVar的第一轴的轴,应从该轴中提取对角线。默认为0。仅当MVar对象的维度超过2时,才需要考虑此参数。

  • axis2 – (可选) 用作二维子MVar的第二轴,从中提取对角线。默认为1。仅当MVar对象的维度超过2时,才需要考虑此参数。

Returns:

一个表示此MVar请求对角线的MVar。

Example:
x = model.addMVar((8, 8))
diag_main = x.diagonal()  # The main diagonal of x
diag_sup = x.diagonal(1)  # The first superdiagonal of x
diag_sup = x.diagonal(-2)  # The second subdiagonal of x
adiag_main = x[:, ::-1].diagonal()  # The main anti-diagonal of x
fromlist(varlist)#

将变量列表转换为MVar对象。形状是从列表内容推断出来的 - 一个Var对象列表生成一个一维MVar对象,一个Var对象列表的列表生成一个二维MVar对象,依此类推。

Parameters:

varlist – 用于填充返回的MVar的Var对象列表。

Returns:

与输入变量对应的MVar对象。

Example:
x0 = model.addVar()
x1 = model.addVar()
x2 = model.addVar()
x3 = model.addVar()
x_1d = MVar.fromlist([x0, x1, x2, x3])  # 1-D MVar
x_2d = MVar.fromlist([[x0, x1], [x2, x3]])  # 2-D MVar
fromvar(var)#

将Var对象转换为0维MVar对象。

Parameters:

var – 用于填充返回的MVar的变量对象。

Returns:

与输入变量对应的MVar对象。

Example:
x = model.addVar()
x_as_mvar = MVar.fromvar(x)
getAttr(attrname)#

查询矩阵变量的属性值。完整的可用属性列表可以在属性部分找到。

如果请求的属性不存在或无法查询,则引发AttributeError。如果MVar对象存在问题(例如,它已从模型中移除),则引发GurobiError

结果以与MVar对象相同形状的NumPy ndarray返回。

Parameters:

attrname – 被查询的属性。

Returns:

请求属性的当前值。

Example:
print(var.getAttr(GRB.Attr.X))
print(var.getAttr("x"))
item()#

对于一个包含单个元素的MVar,返回该元素的副本作为Var对象。在包含多个元素的MVar上调用此方法将引发ValueError。

Returns:

一个Var对象

Example:
x = model.addMVar((2, 2))
x_sub = x[0, 1]  # A 0-D MVar encapsulating one Var object
x_var = x[0, 1].item()  # The resident Var object itself
property ndim#

此矩阵变量中的维度数量。

Returns:

一个整数

Example:
x1 = model.addMVar((3,))
print(x1.ndim)  #  "1"
x2 = model.addMVar((1, 3))
print(x2.ndim)  #  "2"
reshape(shape, order='C')#

返回此MVar的副本,具有相同的变量,但具有新的形状。

Parameters:
  • shape – 一个整数或整数元组。新形状应与该MVar的形状兼容。可以在一个位置传递特殊值-1,然后从MVar中Var对象的总体数量和其他维度的提供长度推断该维度的长度。

  • order – (可选) 一个字符串 'C' 或 'F'。使用类似C语言('C')或类似Fortran语言('F')的顺序读取此MVar的元素,并按照此顺序将元素写入重塑后的数组。

Returns:

一个请求形状的MVar

Example:
x = model.addMVar((2, 2))
x_vec = x.reshape(-1, order='C')  # 1-D result, rows of x stacked
x_vec = x.reshape(-1, order='F')  # 1-D result, columns of x stacked
setAttr(attrname, newvalue)#

设置矩阵变量属性的值。

请注意,由于我们采用了延迟更新的方法,更改实际上不会生效,直到您更新模型(使用Model.update)、优化模型(使用Model.optimize)或将模型写入磁盘(使用Model.write)。

可用属性的完整列表可以在 属性 部分找到。

如果指定的属性不存在或无法设置,则引发AttributeError。如果MVar对象存在问题(例如,它已从模型中移除),则引发GurobiError

Parameters:
  • attrname – 正在修改的属性。

  • newvalue – 属性的期望新值。形状必须与MVar对象相同。或者,您可以传递一个标量参数,它将自动提升为正确的形状。

Example:
var.setAttr("ub", np.full((5,), 0)
var.setAttr(GRB.Attr.UB, 0.0)
var.setAttr("ub", 0.0)
property shape#

这个MVar的形状。

Returns:

一个整数元组

Example:
x1 = model.addMVar((3,))
print(x1.shape)  #  "(3,)"
x2 = model.addMVar((1, 3))
print(x2.shape)  #  "(1, 3)"
property size#

此矩阵变量中的元素总数。

Returns:

一个整数

Example:
x1 = model.addMVar((3,))
print(x1.size)  #  "3"
x2 = model.addMVar((2, 3))
print(x2.size)  #  "6"
sum(axis=None)#

对MVar的元素求和;返回一个MLinExpr对象。

Parameters:

axis – 一个整数,或 None。沿着指定的轴求和。如果设置为 None,则沿着此 MVar 的所有轴进行求和。

Returns:

表示总和的MLinExpr。

Example:
x = model.addMVar((2, 2))
sum_row = x.sum(axis=0)  # Sum along the rows of X
sum_col = x.sum(axis=1)  # Sum along the columns of X
sum_all = x.sum()  # Sum all variables in this MVar
property T#

转置的同义属性。

Example:
x = model.addMVar((4, 1))  # Resembles a "column vector"
x_t = x.T  # Same variables, but as a "row vector"
y = model.addMVar((3, 2))
y_t = x.T  # Has shape (2, 3)
tolist()#

返回与此矩阵变量相关的变量,作为单独的Var对象的列表。

Returns:

Var 对象的列表。

Example:
mvar = model.addMVar(5)
varlist = mvar.tolist()
# Do something with the Var corresponding to mvar[3]
print(varlist[3])
transpose()#

转置这个MVar;通过反转原始MVar的轴顺序创建一个新的MVar对象。对于一维MVar对象,此例程仅返回原始MVar的副本。

Returns:

表示转置的MVar对象。

Example:
x = model.addMVar((4, 1))  # Resembles a "column vector"
x_t = x.transpose()  # Same variables, but as a "row vector"
y = model.addMVar((3, 2))
y_t = x.transpose()  # Has shape (2, 3)
property nl#

返回一个表示此矩阵变量的MNLExpr。 使用此属性是一种高级技术,在绝大多数情况下并不需要。 有关更多详细信息,请参阅更多关于表达式创建的控制