跳轉至內容

GLPK/API 使用

來自華夏公益教科書

此頁面提供了 API 使用的示例,用於常見任務。


指定開始

[編輯 | 編輯原始碼]

可以使用以下 API 例程從檔案中讀取解決方案

  • glp_read_sol- 讀取基本解
  • glp_read_ipt- 讀取內點解
  • glp_read_mip- 讀取 MIP 解

使用glp_read_sol讀取的解決方案可以作為使用單純形演算法求解 LP 的初始基(這就是 glpsol 命令列引數--ini的作用)。

對於混合整數問題,可以使用 GLPK API 指定一個整數可行(但可能不是最優)的起始解(GLPSOL 不提供此功能)。


Clipboard

待辦

  • 以下回調指令需要檢查和/或完善
  • 一些更好的解析示例程式碼也很有用


整數求解器的回撥鉤子用於此目的。首先編寫一個自定義回撥例程,並使用 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 是原始問題物件中的列數。

Karush-Kuhn-Tucker 最優性條件(已過時)

[編輯 | 編輯原始碼]

請注意呼叫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,然後可以對其進行詢問。

華夏公益教科書