GLPK/建模上下界
外观
< GLPK
(从 GLPK/建模上下界 重定向)
GLPK 预处理器 (截至 4.45 版) 无法消除或合并重复行。1 因此,为了减少行数,从而减少求解时间,应该手动组合线性相关的 约束方程。例如
s.t. c1 : x + 2 * y <= 4; s.t. c2 : 2 * x + 4 * y >= 3;
可以替换为
s.t. c3 : 1.5 <= x + 2 * y <= 4;
对优化变量设置下界和/或上界,可以在定义时设置,也可以通过专用约束实现。请注意,MathProg 中的变量是无界的,除非随后进行限定或限制(与它们的 API 对应物不同,API 对应物默认情况下为零)。
可以使用专用约束轻松实现变量界限。
例如,一个斜坡变量,对称地受到max_ramp_rate参数
param max_ramp_rate; var ramp {I}; s.t. upper_feasible_ramp_rate {i in I}: ramp[i] <= max_ramp_rate; s.t. lower_feasible_ramp_rate {i in I}: ramp[i] >= −max_ramp_rate;
预处理器将自动消除仅包含一个变量的约束,并使用该信息来收紧该变量的界限 - 然而,在求解时,该过程会反转,并适当地确定原始约束的主值和对偶值。或者,如果没有部署预处理器,建议至少将双约束减少到单个约束,以减少模型大小。上面的例子可以改写为
param max_ramp_rate; var ramp {I}; s.t. feasible_ramp_rate {i in I}: −max_ramp_rate <= ramp[i] <= max_ramp_rate;
在定义相关变量时也可以设置变量界限。这通常是建模此类限制的首选方法。
前面的斜坡速率示例可以实现如下
param max_ramp_rate; var ramp {I}, >= −max_ramp_rate, <= max_ramp_rate;
对于小型模型,两种方法之间的性能差异可以忽略不计,但对于大型模型,差异可能很大。下表总结了每种方法的相对优势
专用约束 | 变量界限 |
---|---|
|
|