变量属性#
这些是变量属性,意味着它们与模型中的特定变量相关联。您应该使用各种get例程之一来检索属性的值。这些在本节的开头有描述。对于面向对象的接口,变量属性通过在变量对象上调用get方法来检索。对于用户可以直接修改的属性,您可以使用各种set方法之一。
尝试查询一个不可用的属性将会产生一个错误。在C语言中,属性查询例程将返回一个DATA_NOT_AVAILABLE错误代码。面向对象的接口将会抛出一个异常。
LB#
类型:
double可修改:
Yes
变量下界。请注意,任何小于或等于
-1e20 的值都被视为负无穷大。
有关如何查询或修改属性的示例,请参阅我们的 属性示例。
UB#
类型:
double可修改:
Yes
变量上限。请注意,任何大于或等于1e20的值都被视为无限。
有关如何查询或修改属性的示例,请参阅我们的 属性示例。
对象#
类型:
double可修改:
Yes
线性目标系数。在我们的面向对象接口中,您通常使用setObjective方法来设置目标,但此属性提供了设置或修改线性目标项的替代方法。
请注意,此属性与我们的分段线性目标功能相互作用。如果您为变量设置了分段线性目标函数,这将自动将Obj属性设置为零。同样,如果您为变量设置了Obj属性,这将自动删除任何先前指定的分段线性目标。
有关如何查询或修改属性的示例,请参阅我们的 属性示例。
变量名#
类型:
string可修改:
Yes
变量名称。
有关如何查询或修改属性的示例,请参阅我们的 属性示例。
VTag#
类型:
string可修改:
Yes
变量的标签。
如果您将以JSON格式检索模型的解决方案,您可能会为计划检索解决方案信息的每个变量定义一个标签。每个变量标签必须是唯一的,如果使用了任何标签(变量标签、约束标签、二次约束标签),只有带标签的元素才会出现在JSON解决方案字符串中。标签必须由可打印的US-ASCII字符组成。使用扩展字符或转义字符将导致错误。标签的最大支持长度为10240个字符。
有关如何查询或修改属性的示例,请参阅我们的 属性示例。
VType#
类型:
char可修改:
Yes
变量类型('C' 表示连续型,'B' 表示二元型,'I' 表示
整数型,'S' 表示半连续型,或 'N' 表示半整数型)。
二元变量必须为0或1。整数变量可以取指定下限和上限之间的任何
整数值。半连续变量可以取指定下限和上限之间的任何值,或者取零值。
半整数变量可以取指定下限和上限之间的任何整数值,或者取零值。
有关变量类型的更多信息,请参阅本节。
有关如何查询或修改属性的示例,请参阅我们的 属性示例。
X#
类型:
double可修改:
No
当前解决方案中的变量值。
有关如何查询或修改属性的示例,请参阅我们的 属性示例。
Xn#
类型:
double可修改:
No
次优MIP解中的变量值。使用参数
SolutionNumber 来指示要检索的替代解。解按目标值恶化的顺序排序。因此,当
SolutionNumber 为1时,Xn 返回找到的次优解。当
SolutionNumber 等于其默认值0时,查询属性
Xn 等同于查询属性
X。
在MIP搜索过程中找到的次优解的数量将取决于几个参数的值。其中最重要的是PoolSolutions、PoolSearchMode和PoolGap。请参阅解决方案池部分以获取关于此主题的更详细讨论。
仅适用于MIP模型。
有关如何查询或修改属性的示例,请参阅我们的 属性示例。
RC#
类型:
double可修改:
No
当前解决方案中的降低的成本。仅适用于凸的、连续的模型。
有关如何查询或修改属性的示例,请参阅我们的 属性示例。
BarX#
类型:
double可修改:
No
最佳障碍迭代中的变量值(在交叉之前)。仅在选择了障碍算法时可用。
有关如何查询或修改属性的示例,请参阅我们的 属性示例。
开始#
类型:
double可修改:
Yes
当前的MIP起始向量。当可用时,MIP求解器将尝试从此向量构建初始解。请注意,起始向量可以部分填充——MIP求解器将尝试为缺失的起始值填充值。如果您希望将变量的起始值保持未定义状态,您可以避免为该变量设置Start属性,或者您可以将其设置为特殊的undefined值(在C和C++中为GRB_UNDEFINED,在Java、.NET和Python中为GRB.UNDEFINED)。
如果Gurobi MIP求解器日志显示您的MIP起始点没有产生新的当前最优解,请注意可能有多种解释。一种可能是您的MIP起始点不可行。另一种更常见的可能是Gurobi启发式算法找到了一个与MIP起始点产生的解一样好的解,因此MIP起始点解被截断。最后,如果您指定了一个部分MIP起始点,可能在这个部分起始点上进行的有限MIP探索不足以找到新的当前最优解。如果您希望Gurobi更努力地尝试完成部分起始点,可以尝试将StartNodeLimit参数设置为更大的值。
如果你解决了一系列模型,其中一个是通过修改前一个模型构建的,并且如果你没有提供MIP起始点,那么Gurobi将尝试从前一个模型的解自动构建一个起始点。如果你不希望它尝试这样做,你应该在开始后续求解之前重置模型。如果你提供了一个MIP起始点,但更希望使用前一个解作为起始点,你应该清除你的起始点(通过将所有变量的Start属性设置为undefined)。
如果您有多个起始向量,您可以通过使用Start属性与NumStart属性和StartNumber参数结合来提供给Gurobi。具体来说,使用NumStart属性来指示您将提供多少个起始向量。然后将StartNumber参数设置为0到NumStart-1之间的值,以指示您提供的是哪个起始向量。对于每个StartNumber的值,填充Start属性以提供该起始向量。Gurobi将使用所有提供的起始向量。作为替代方案,您可以通过将StartNumber参数设置为-1来将新的MIP起始向量附加到您的模型中。在这种情况下,每当您读取MIP起始向量或使用函数为一组变量设置MIP起始值时,将创建一个新的MIP起始向量,参数NumStart将增加,任何未指定的变量将保留为undefined。
如果你想诊断一个不可行的MIP起点,你可以尝试将模型中的变量固定为MIP起点中的值(通过设置它们的上下界属性)。如果生成的MIP模型不可行,你可以在这个模型上计算IIS以获得额外的信息,这些信息应该有助于识别不可行性的原因。
仅影响MIP模型。
有关如何查询或修改属性的示例,请参阅我们的 属性示例。
变量提示值#
类型:
double可修改:
Yes
一组用户提示。如果您知道某个变量在MIP模型的高质量解决方案中可能取特定值,您可以提供该值作为提示。您还可以(可选地)使用VarHintPri属性提供关于您对提示的置信度的信息。
Gurobi MIP求解器将以多种方式使用这些变量提示。提示将影响Gurobi用于寻找可行解决方案的启发式方法,以及Gurobi为探索MIP搜索树所做的分支决策。一般来说,高质量的提示应该能够更快地产生高质量的MIP解决方案。相反,低质量的提示会导致一些浪费的努力,但不应导致性能的显著下降。
变量提示和MIP起始点在概念上相似,但它们的行为方式非常不同。如果您指定了一个MIP起始点,Gurobi MIP求解器将尝试从提供的变量值集合中构建一个可行的解。如果您知道一个解,您应该使用MIP起始点将其提供给求解器。相比之下,变量提示为MIP求解器提供指导,影响整个求解过程。如果您对变量的可能值有一个大致的了解,您应该通过变量提示提供这些信息。
如果您希望将变量的提示值保留为未定义,您可以避免为该变量设置VarHintVal属性,或者将其设置为特殊的undefined值(在C和C++中为GRB_UNDEFINED,在Java、.NET和Python中为GRB.UNDEFINED,在R中为NA,在Matlab中为nan)。
请注意,从模型中删除变量将导致多个属性被丢弃(变量提示和分支优先级)。如果您希望它们保留,您的程序需要在删除变量并进行后续模型更新调用后重新填充它们。
仅影响MIP模型。
有关如何查询或修改属性的示例,请参阅我们的 属性示例。
变量提示优先级#
类型:
int可修改:
Yes
用户提示的优先级。在通过VarHintVal属性提供变量提示后,您还可以选择提供提示优先级,以表明您对提示的信心程度。
提示优先级是相对的。如果你对一个变量的提示值比另一个更有信心,你只需要为更可靠的提示设置一个更大的优先级值。变量的默认提示优先级为0。
请参考VarHintVal讨论以获取有关变量提示作用的更多详细信息。
仅影响MIP模型。
有关如何查询或修改属性的示例,请参阅我们的 属性示例。
分支优先级#
类型:
int可修改:
Yes
变量分支优先级。此属性的值用作在MIP搜索期间选择分支的分数变量的主要标准。具有较大值的变量总是优先于具有较小值的变量。使用标准分支变量选择标准来打破平局。默认的变量分支优先级值为零。
请注意,从模型中删除变量将导致多个属性被丢弃(变量提示和分支优先级)。如果您希望它们保持不变,您的程序需要在删除变量并进行后续模型更新调用后重新填充它们。
仅影响MIP模型。
有关如何查询或修改属性的示例,请参阅我们的 属性示例。
分区#
类型:
int可修改:
Yes
变量分区。MIP求解器可以使用用户提供的分区信息执行解决方案改进启发式算法。提供的分区号可以是正数,表示在解决相应编号的子MIP时应包括该变量,0表示该变量应包含在每个子MIP中,或-1表示该变量不应包含在任何子MIP中。未包含在子MIP中的变量将固定为其在当前最优解中的值。默认情况下,所有变量的初始值为-1。
举个例子,假设你正在解决一个有400个变量的模型,并且你将变量0-99的分区属性设置为-1,变量100-199设置为0,变量200-299设置为1,变量300-399设置为2。启发式算法将解决两个子MIP模型:子MIP 1将固定变量0-99和300-399为它们在当前解中的值,并解决其余部分,而子MIP 2将固定变量0-99和200-299。
使用PartitionPlace参数来控制分区启发式算法的运行位置。
仅影响MIP模型。
有关如何查询或修改属性的示例,请参阅我们的 属性示例。
VBasis#
类型:
int可修改:
Yes
给定变量在当前基中的状态。可能的值包括 0(基本),-1(在下界的非基本),-2(在上界的非基本), 和-3(超基本)。请注意,如果您希望指定一个高级 起始基,您必须为模型中的所有约束和变量设置基状态信息。仅适用于基本 解决方案。
请注意,如果您通过PStart、DStart或VBasis、CBasis提供了一个有效的起始极值点,那么默认情况下LP预解将被禁用。对于预解能显著减少问题规模的模型,这可能会影响性能。要启用预解,必须将参数LPWarmStart设置为2。
有关如何查询或修改属性的示例,请参阅我们的 属性示例。
PStart#
类型:
double可修改:
Yes
初始开始向量。
对于LP模型,这定义了当前的单纯形起始向量。如果你为模型中的每个变量设置了PStart值,并为每个约束设置了DStart值,那么单纯形将使用这些值来计算一个热启动基。请注意,如果你使用单纯形基(使用VBasis和CBasis)来热启动你的线性程序,你将获得更好的性能。PStart属性应该只在没有基或不想禁用预解的情况下使用。
对于非凸的(MI)QCP和(MI)NLP模型,这定义了某些原始启发式算法的起点。如果你为模型中的每个变量设置了PStart值,那么这些启发式算法更有可能在给定起点附近收敛到可行点。
对于其他问题类型,Pstart 值将被忽略。
如果你想为MIP、非凸(MI)QCP或(MI)NLP模型提供一个可行的初始解,你应该使用开始属性来输入它。
请注意,任何待处理或在设置PStart之后进行的模型修改(添加变量或约束、更改系数等)都将丢弃起始值。您应该在完成模型修改后再设置此属性。如果您想撤回之前指定的起始值,请将任何PStart值设置为GRB_UNDEFINED。
请注意,如果您通过PStart、DStart或VBasis、CBasis提供了一个有效的起始极值点,那么默认情况下LP预解将被禁用。对于预解能显著减少问题规模的模型,这可能会影响性能。要启用预解,必须将参数LPWarmStart设置为2。
有关如何查询或修改属性的示例,请参阅我们的 属性示例。
IISLB#
类型:
int可修改:
No
对于一个不可行的模型,指示下界是否参与计算不可约不一致子系统(IIS)。请注意,二进制变量的边界被视为变量类型中的隐含内容,永远不会参与IIS。
只有在您计算了IIS之后才可用。
有关如何查询或修改属性的示例,请参阅我们的 属性示例。
IISLBForce#
类型:
int可修改:
Yes
在计算不可行模型的不可约不一致子系统(IIS)时,指示是否应将变量下界包含在IIS中或从IIS中排除。
默认值-1让IIS算法决定。
如果属性设置为0,则该界限不符合包含在IIS中的条件。
如果属性设置为1,则边界包含在IIS中,并且IIS算法从不考虑移除它的可能性。
请注意,将此属性设置为0可能会使生成的子系统可行(或一致),这将使得无法构建IIS。无论如何尝试都会导致IIS_NOT_INFEASIBLE错误。同样,将此属性设置为1可能会导致IIS不可约。更准确地说,系统仅在具有-1或0强制值的模型元素方面才是不可约的。
有关更多详细信息,请参阅Model.computeIIS文档。
此属性对于LPs被忽略。
有关如何查询或修改属性的示例,请参阅我们的 属性示例。
IISUB#
类型:
int可修改:
No
对于一个不可行的模型,指示上界是否参与计算不可约不一致子系统(IIS)。请注意,二进制变量的边界被视为变量类型中的隐含内容,永远不会参与IIS。
只有在您计算了IIS之后才可用。
有关如何查询或修改属性的示例,请参阅我们的 属性示例。
IISUBForce#
类型:
int可修改:
Yes
在计算不可行模型的不可约不一致子系统(IIS)时,指示是否应将变量上限包含在IIS中或从IIS中排除。
默认值-1让IIS算法决定。
如果属性设置为0,则该界限不符合包含在IIS中的条件。
如果属性设置为1,则边界包含在IIS中,并且IIS算法从不考虑移除它的可能性。
请注意,将此属性设置为0可能会使生成的子系统可行(或一致),这将使得无法构建IIS。无论如何尝试都会导致IIS_NOT_INFEASIBLE错误。同样,将此属性设置为1可能会导致IIS不可约。更准确地说,系统仅在具有-1或0强制值的模型元素方面才是不可约的。
有关更多详细信息,请参阅Model.computeIIS文档。
此属性对于LPs被忽略。
有关如何查询或修改属性的示例,请参阅我们的 属性示例。
PoolIgnore#
类型:
int可修改:
Yes
在解决MIP模型时,Gurobi优化器会维护一个解决方案池,其中包含在搜索过程中找到的最佳解决方案。PoolIgnore属性允许你丢弃一些解决方案。具体来说,如果多个解决方案仅在PoolIgnore设置为1的变量上有所不同,则只有具有最佳目标的解决方案会保留在池中。该属性的默认值为0,意味着该变量应被用来区分解决方案。
当与PoolSearchMode参数结合使用时,此属性特别有用。通过识别那些不捕捉解决方案之间有意义的差异的变量,您可以确保池中包含一些有趣的多样性。
有关如何查询或修改属性的示例,请参阅我们的 属性示例。
PWLObjCvx#
类型:
int可修改:
No
指示变量是否具有凸分段线性目标。如果变量上的分段线性目标函数是非凸的,则返回0。如果函数是凸的,或者变量上的目标函数是线性的,则返回1。
此属性对于隔离导致具有分段线性目标函数的连续模型变为MIP的特定变量非常有用。
有关如何查询或修改属性的示例,请参阅我们的 属性示例。
SAObjLow#
类型:
double可修改:
No
目标系数敏感性信息:当前最优基保持最优的最小目标系数值。仅适用于基本解。
有关如何查询或修改属性的示例,请参阅我们的 属性示例。
SAObjUp#
类型:
double可修改:
No
目标系数敏感性信息:当前最优基保持最优的最大目标系数值。仅适用于基本解。
有关如何查询或修改属性的示例,请参阅我们的 属性示例。
SALBLow#
类型:
double可修改:
No
下界敏感性信息:当前最优基保持最优的最小下界值。仅适用于基本解。
请注意,如果变量是固定的,则没有可用的敏感性信息,此属性的值即为变量的值。
有关如何查询或修改属性的示例,请参阅我们的 属性示例。
SALBUp#
类型:
double可修改:
No
下界敏感性信息:当前最优基保持最优的最大下界值。仅适用于基本解。
请注意,如果变量是固定的,则没有可用的敏感性信息,此属性的值即为变量的值。
有关如何查询或修改属性的示例,请参阅我们的 属性示例。
SAUBLow#
类型:
double可修改:
No
上界敏感性信息:当前最优基保持最优的最小上界值。仅适用于基本解。
请注意,如果变量是固定的,则没有可用的敏感性信息,此属性的值即为变量的值。
有关如何查询或修改属性的示例,请参阅我们的 属性示例。
SAUBUp#
类型:
double可修改:
No
上界敏感性信息:当前最优基保持最优的最大上界值。仅适用于基本解。
请注意,如果变量是固定的,则没有可用的敏感性信息,此属性的值即为变量的值。
有关如何查询或修改属性的示例,请参阅我们的 属性示例。
UnbdRay#
类型:
double可修改:
No
无界射线(仅适用于无界线性模型)。提供一个向量,当将其添加到任何可行解时,会产生一个新的解,该解也是可行的,但改进了目标。仅当参数InfUnbdInfo设置为1时可用。
有关如何查询或修改属性的示例,请参阅我们的 属性示例。