我用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++版本没有返回一个解决方案,因为没有一个可行的解决方案。
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模型生成的模型来比较它们?简单地看一遍我可能搞砸的所有地方,也许是一些解决办法,但却是相当无效的。
发布于 2014-02-13 19:50:00
过了一会儿,我想出了一种方法来一步一步地修复我的程序。
首先运行这样的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.txt和broken_solution.txt可以看出列约束定义和行约束定义之间的区别。当我们使用空闲变量作为约束创建模拟第一行等于成本函数时,它会有所帮助。通过旋转行和列定义,我们可以确保两个文件都以相同的顺序拥有它们各自的行和列定义。
一旦这些约束被修复,我们就可以开始修复实际的数据。glp.mod和broken_glp.mod都将包含每个约束的定义以及每一行和每列的值。它们是1索引的,0行是成本函数因子.
如果在C++程序中,我们已经按照与MathProg生成的模型相同的顺序排列行和列,那么我们可以很容易地比较这两个文件--但是首先对它们进行排序,比如sort glp.mod > glp.sorted --即使我们以与MathProg文件相同的顺序定义行和列,它们的值也可能以不同的顺序出现。
过了一段时间,我能够修复我的程序,以执行与MathProg 1相同的例程。唯一的区别是显示的准确性,但这只是一个输出格式的问题。
https://stackoverflow.com/questions/21736964
复制相似问题