1

我用 MathProg 语言写了一个问题来检查我对某些混合整数问题的理解是否正确。过了一会儿,我能够弄清楚,我可以假设这个解决方案是正确的。

GLPK Simplex Optimizer, v4.45
37 rows, 30 columns, 97 non-zeros
      0: obj =  -1.300000000e+01  infeas =  1.300e+01 (0)
*    10: obj =   7.677248677e+00  infeas =  0.000e+00 (0)
*    14: obj =   5.925925926e-01  infeas =  7.889e-31 (0)
OPTIMAL SOLUTION FOUND
Integer optimization begins...
+    14: mip =     not found yet >=              -inf        (1; 0)
+    15: >>>>>   5.925925926e-01 >=   5.925925926e-01   0.0% (2; 0)
+    15: mip =   5.925925926e-01 >=     tree is empty   0.0% (0; 3)
INTEGER OPTIMAL SOLUTION FOUND
Time used:   0.0 secs
Memory used: 0.2 Mb (204010 bytes)
...
Model has been successfully processed

但我真正需要的是在 C++ 代码中实现的相同例程。我花了一些时间用 GLPK C API 重写问题,但在单元测试期间我发现 C++ 版本没有返回解决方案,因为没有可行的解决方案。

GLPK Simplex Optimizer, v4.45
37 rows, 30 columns, 10 non-zeros
      0: obj =   0.000000000e+00  infeas =  2.000e+00 (16)
PROBLEM HAS NO FEASIBLE SOLUTION

显然我犯了一些错误,我需要找到哪里。

是否有一些调试或预览方法可用于,例如,查看由我的 C++ 代码和 MathProg 模型生成的模型来比较它们?简单地遍历所有我可能搞砸的地方将是一些解决方案,但非常无效。

4

1 回答 1

0

过了一会儿,我想出了一个方法来逐步修复我的程序。

首先像这样运行一个 MathProg 程序:

glpsol -m model.mod -d data.dat --output solution.txt --wglp glp.mod

然后运行损坏的 C++ 例程,然后gtl_simplex运行以下命令:

glp_print_mip(problem, "broken_solution.txt");
glp_write_prob(problem, 0, "broken_glp.mod");

从我可以找出列和行约束定义之间的区别solution.txtbroken_solution.txt当我们创建与成本函数相等的模拟第一行时,它会有所帮助,并使用自由变量作为约束。通过旋转行和列定义,我们可以确保两个文件将具有它们各自的行和列定义以相同的顺序。

一旦这些约束得到修复,我们就可以开始修复实际数据。glp.mod并且broken_glp.mod都将包含每个约束的定义以及每一行和每一列的值。它们是 1 索引的,0 行是成本函数因子。

如果在 C++ 程序中我们已经有与 MathProg 生成模型中相同顺序的行和列,我们可以轻松地比较两个文件 - 但首先对它们进行排序,例如sort glp.mod > glp.sorted- 即使我们定义了行,每行/列的值也可能以不同的顺序出现和列的顺序与 MathProg 文件中的顺序相同。

过了一会儿,我能够修复我的程序以执行与 MathProg 相同的例程。唯一的区别是显示的准确性,但这只是输出格式的问题。

于 2014-02-13T19:50:00.850 回答