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.update
、Model.optimize
或Model.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
。 使用此属性是一种高级技术,在绝大多数情况下并不需要。 有关更多详细信息,请参阅更多关于表达式创建的控制。