跳转至内容

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,然后可以对其进行询问。

华夏公益教科书