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;
對於小型模型,兩種方法之間的效能差異可以忽略不計,但對於大型模型,差異可能很大。下表總結了每種方法的相對優勢
| 專用約束 | 變數界限 |
|---|---|
|
|