GRBModel: feasRelax ()
GRBModel: feasRelax ()
修改GRBModel
对象创建可行性松弛。注意,您需要调用优化对结果进行了实际的松弛解计算。
可行性松弛是一种模型,当求解时,使解违反原模型的边界和线性约束的数量最小化。此方法提供了许多指定松弛的选项。
如果您指定relaxobjtype = 0
,可行性松弛的目标是使边界违例和约束违例的加权幅度和最小。的lbpen
,ubpen
,rhspen
参数分别指定下界、上界和线性约束中的单位违反成本。
如果您指定relaxobjtype = 1
,可行性松弛的目标是使有界违例和约束违例的平方和最小。的lbpen
,ubpen
,rhspen
参数分别指定下界、上界和线性约束违背的平方上的系数。
如果您指定relaxobjtype = 2
,可行性松弛的目标是最小化边界和约束违反的加权计数。的lbpen
,ubpen
,rhspen
参数分别指定违反下界、上界和线性约束的代价。
举个例子,如果一个约束rhspen
价值p
被2.0所违背,它会有贡献吗2 * p
以可行性放宽为目标relaxobjtype = 0
,它会有所贡献2 * 2 * p
为relaxobjtype = 1
,它会有所贡献p
为relaxobjtype = 2
.
的minrelax
参数是一个布尔值,它控制所创建的可行性松弛的类型。如果minrelax = false
,优化返回的模型提供了一个最小化违规成本的解决方案。如果minrelax = true
,优化返回的模型可以找到最小化原始目标的解决方案,但只能从最小化违规成本的解决方案中找到。请注意,feasRelax
必须解决一个优化问题,以找到最小可能的松弛minrelax = true
,这是相当昂贵的。
这个方法有两个签名。更复杂的是一个变量和约束的列表,以及与放松相应的下界、上界和约束相关联的惩罚。如果一个变量或约束没有包含在这些列表中,则不能违反相关的边界或约束。更简单的签名有一对布尔参数,vrelax
和crelax
,指示是否可以违反变量边界和/或约束。如果vrelax
/crelax
是真正的
,则每个约束/约束分别允许被违反,相关代价为1.0。
注意,这是一个破坏性方法:它修改调用它的模型。如果您不想修改您的原始模型,请使用GRBModel构造函数在调用此方法之前创建副本。
双 | feasRelax( | int | relaxobjtype, |
保龄球 | minrelax, | ||
int | vlen, | ||
const GRBVar * | var, | ||
const双* | lbpen, | ||
const双* | ubpen, | ||
int | clen, | ||
const GRBConstr * | 若干, | ||
const双* | rhspen) |
-
创建一个可行的放松模型。
参数:
relaxobjtype:寻找最小代价松弛时使用的代价函数。
minrelax:执行的可行性松弛类型。
vlen:允许违反边界的变量列表的长度。
var:允许违反其边界的变量。
lbpen:违反可变下限的惩罚。参数中的每个变量都有一个条目var.
ubpen:违反变量上限的惩罚。参数中的每个变量都有一个条目var.
clen:允许违反的线性约束列表的长度。
若干:允许违反的线性约束。
rhspen:违反线性约束的惩罚。参数中的每个变量都有一个条目若干.
返回值:
零,如果minrelax是假的。如果minrelax为true时,返回值为所执行松弛的客观值。如果该值小于0,则表示该方法创建可行性松弛失败。
双 | feasRelax( | int | relaxobjtype, |
保龄球 | minrelax, | ||
保龄球 | vrelax, | ||
保龄球 | crelax) |
-
建立可行性松弛模型的简化方法。
参数:
relaxobjtype:寻找最小代价松弛时使用的代价函数。
minrelax:执行的可行性松弛类型。
vrelax:指示是否可以放宽变量边界(任何违规的代价为1.0。
crelax:指示是否可以放松线性约束(任何违规的代价为1.0。
返回值:
零,如果minrelax是假的。如果minrelax为true时,返回值为所执行松弛的客观值。如果该值小于0,则表示该方法创建可行性松弛失败。