跳轉到內容

GLPK/終端輸出

來自華夏公益教科書,開放書籍,開放世界

預設情況下,GLPK 庫會定期列印到控制檯以指示**朝解決方案前進的進度**。輸出的確切形式取決於基礎問題是 LP 還是 MIP,在某些情況下,還取決於呼叫了哪個求解器方法。

相同的終端輸出來自 GLPSOL 實用程式和直接使用 GLPK API。因此,本頁的資訊對使用 MathProg 的建模者和使用 GLPK 可呼叫庫的程式設計師同樣具有重要意義。


控制終端輸出

[編輯 | 編輯原始碼]

GLPK 為建模者和程式設計師提供了對終端輸出的更多控制。

GLPSOL 的終端輸出可以使用命令列引數複製到文字檔案--log. 例如

glpsol --model examples/tsp.mod --log tsp.log

使用 GLPK API 的程式設計師可以透過呼叫glp_term_out. 來啟用和停用終端輸出。鉤子函式glp_term_hook可用於攔截終端輸出。還提供了更細粒度的輸出控制,但此處不作介紹 - 請參閱 GLPK API 手冊。

輸出縮放

[編輯 | 編輯原始碼]

縮放是將線性變換應用於問題約束矩陣以改善其數值特性的過程。有關技術細節,請參閱 GLPK 縮放 頁面。

GLPK 可能會在嘗試求解之前縮放問題,除非建模者明確停用了縮放。相反,建模者可以指示必須進行縮放,並且可以選擇指定要應用的哪種方法或方法。不幸的是,官方文件中沒有介紹縮放的終端輸出語法。

例如,呼叫glp_scale_prob在小型 MIP 問題上沒有顯式方法標誌,則會給出以下終端輸出

Scaling...
 A: min|aij| =  1.000e+00  max|aij| =  8.000e+05  ratio =  8.000e+05
GM: min|aij| =  5.494e-01  max|aij| =  1.820e+00  ratio =  3.312e+00
EQ: min|aij| =  3.096e-01  max|aij| =  1.000e+00  ratio =  3.230e+00

其中,通常

  • A 表示原始約束矩陣的條件,A = (aij)
  • GM 表示發生了幾何平均縮放
  • EQ 表示發生了均衡縮放
  • 2N 表示發生了將比例因子舍入到最接近的二的冪

請注意,問題首先被“取消縮放” - 意味著任何先前的縮放都被移除 - 然後報告原始約束矩陣的指標。之後是應用的任何縮放方法的結果,按照應用順序排列。

如果不需要縮放,您應該收到以下訊息

Scaling...
Problem data seem to be well scaled

在第一個示例中,GMEQ縮放已應用。該min|aij|max|aij|表示 A 的非零元素的最小和最大絕對值,以及它們的比率透過簡單的除法給出。

在 GLPSOL 中,縮放預設啟用,但可以使用命令列選項--noscale明確停用。

單純形法輸出

[編輯 | 編輯原始碼]

單純形法輸出語法在glp_simplex呼叫文件的“終端輸出”小節中進行了完整解釋doc/glpk.pdf(對於 GLPK 4.55,這是第 2.8.1 節)。

例如,以下行

* 1200: obj = 7.860174791e-03 infeas = 2.810e-29 (1)

表示由於星號 (*),求解器目前正在使用原始單純形法尋找最優解,已經完成了 1200 次迭代,當前目標值為 0.00786,當前原始或對偶不可行性的總和為 2.81×10−29(接近零),當前固定基本變數的數量為 1。

星號 (*) 也可以是空格 ( ),表示求解器正在使用原始單純形法尋找原始可行解,或者使用對偶單純形法尋找對偶可行解。或者是一個管道 (|),表示求解器正在使用對偶單純形法尋找最優解。

內點法輸出

[編輯 | 編輯原始碼]

內點法輸出語法在glp_interior呼叫文件的“終端輸出”小節中進行了完整解釋doc/glpk.pdf的“終端輸出”小節中進行了完整解釋

例如,以下行

19: obj = 5.522746942e+03; rpi = 2.2e-06; rdi = 4.0e-08; gap = 6.7e-03

(對於 GLPK 4.55,這是第 2.9.1 節)。

表示已經完成了 19 次迭代,當前目標值大約為 5523(在最大化的情況下,符號錯誤),當前相對原始不可行性為 0.0000022,當前相對對偶不可行性為 0.00000004,當前原始對偶間隙為 0.0067。

MIP 分支定界輸出

[編輯 | 編輯原始碼]MIP 分支定界輸出語法在呼叫文件的“終端輸出”小節中進行了完整解釋doc/glpk.pdfglp_intopt

例如,以下行

+ 73068: mip = -5.000000000e-001 <= -2.500000000e-001  50.0% (107; 10024)

(對於 GLPK 4.55,這是第 2.10.5 節)。表示分支定界樹中的 10024 個節點已被拒絕,還有 107 個未探索的節點可能導致 MIP 解的改進。迄今為止最好的解是 −0.50。沒有比 −0.25(導致 50% 的間隙)更好的解(LP 鬆弛),對於較大的值,該間隙不會列印。例程ios_relative_gap

將相對 mip 間隙計算為

迄今為止的單純形法迭代次數為 73068。加號 (+) 目前沒有任何意義。

對於相同的單純形法迭代,可能會出現額外的資訊行。此資訊目前沒有記錄。

數值不穩定警告

[編輯 | 編輯原始碼]

Warning: numerical instability (primal simplex, phase I)
Warning: numerical instability (primal simplex, phase II)
Warning: numerical instability (dual simplex, phase I)
Warning: numerical instability (dual simplex, phase II)

如果基本解在容差範圍內不是原始/對偶可行的,則會顯示以下警告訊息之一容差透過結構glp_smcp作為欄位tol_bndtol_dj

傳遞給單純形法求解器,這兩個欄位的預設值為 1.0e-07。使用者可以修改這些容差,但只有在完全理解其含義的情況下才能這樣做。

這些警告不是致命的 - 它們只是表明求解器即將改變其求解策略,並且在許多情況下,可以返回令人滿意的解。有關更多技術細節,請參閱有關 故障排除 的資料。

這種不穩定性可能是由縮放不良的模型造成的,例如,在使用大 M 方法時使用過大的 M 值。或者當自動模型生成過程中的舍入錯誤產生 接近零 的係數時。強烈建議查明縮放不良的根本原因並進行修復。

記憶體管理

[編輯 | 編輯原始碼]

Error: x memory block(s) were lost

獨立求解器 GLPSOL 會檢查在刪除環境之前是否已釋放所有記憶體塊。如果仍然存在未釋放的記憶體塊,則會發出以下錯誤訊息這可能表明 GLPK 庫內部存在錯誤。或者它可能是由客戶端程式呼叫非 API 函式glp_main

造成的 - 嚴格禁止使用該函式。
華夏公益教科書