GLPK/API 使用
外觀
< GLPK
此頁面提供了 API 使用的示例,用於常見任務。
可以使用以下 API 例程從檔案中讀取解決方案
- glp_read_sol- 讀取基本解
- glp_read_ipt- 讀取內點解
- glp_read_mip- 讀取 MIP 解
使用glp_read_sol讀取的解決方案可以作為使用單純形演算法求解 LP 的初始基(這就是 glpsol 命令列引數--ini的作用)。
對於混合整數問題,可以使用 GLPK API 指定一個整數可行(但可能不是最優)的起始解(GLPSOL 不提供此功能)。
整數求解器的回撥鉤子用於此目的。首先編寫一個自定義回撥例程,並使用 MIP 控制引數結構在 MIP 求解器中註冊它glp_iocp和欄位cb_func.
然後呼叫glp_ios_reason從你的回撥例程中,如果GLP_IHEUR返回,設定並求解你想要的起始解,如下所示
- 預設tree->mip
- 中的整數變數預設初始化引數結構parm透過呼叫
- glp_init_smcp(&parm)重置引數結構欄位,如下所示
- parm.meth = GLP_DUALP求解 LP
- int ret = glp_simplex(tree->mip, &parm)透過呼叫函式傳遞所有變數
glp_ios_heur_sol這篇文章執行緒 這裡 和 這裡 包含相關資訊和以下程式碼片段(注意使用void*不是好的風格)。
// caution: this code is buggy and will be
// updated as soon as a solution is found
void callback(glp_tree* tree, void* info)
{
if (glp_ios_reason(tree) == GLP_IHEUR && glp_ios_curr_node(tree) == 1)
{
glp_ios_heur_sol(tree, solution);
}
}
其中solution是一個const double陣列,它包含所有變數的原始值,位於x[1],...,x[n]中,其中 n 是原始問題物件中的列數。
請注意呼叫lpx_check_ktt已升級為glp_check_ktt版本 4.49。結構體LPXKKT不再使用。
GLPK 提供了lpx_check_ktt例程來檢查基本解的 KKT 最優性條件。函式簽名是
void lpx_check_kkt(glp_prob *lp, // GLPK problem object pointer
int scaled, // 0 = use unscaled, non-zero = use internally scaled
LPXKKT *kkt) // LPXKKT C struct pointer (meaning address)
引數scaled可以設定為 0 來檢查原始未縮放問題,或者設定為非零值來檢查內部縮放問題。典型的呼叫可能是
LPXKKT kkt; // declaration of a suitable C struct
lpx_check_kkt(lp, 1, &kkt); // fill call, note the address-of operator
此呼叫填充結構體kkt,然後可以對其進行詢問。
