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