跳到內容

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].
華夏公益教科書