跳到内容

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;

对于小型模型,两种方法之间的性能差异可以忽略不计,但对于大型模型,差异可能很大。下表总结了每种方法的相对优势

专用约束 变量界限
  • 可能更容易理解
  • 对偶值可用于分析
  • 由于减少了约束方程的数量,因此速度加快
  • 更少的内存消耗
1.^ 有一个建议,要向 GLPK 预处理器添加此功能 [1].
华夏公益教科书