2014-02-12 31 views
1

我用MathProg語言編寫了一個問題來檢查我對某些混合整數問題的理解是否正確。過了一段時間,我才弄清楚了,我可以假設這個解決方案是正確的。MathProg轉換爲C++

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模型生成的模型,以比較它們?簡單地通過所有我可以搞砸的地方將是一些解決方案,但效果不佳。

回答

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.modbroken_glp.mod都將包含每個約束的定義以及每個行和列的值。它們是1索引的,0行是成本函數因子。

如果在C++程序中,我們已經有與MathProg生成的模型相同的行和列,我們可以輕鬆地比較這兩個文件 - 但首先將它們排序,例如如sort glp.mod > glp.sorted - 即使我們按照與MathProg文件中相同的順序定義了行和列,每個行/列的值也可能以不同的順序出現。

經過一段時間,我能夠修復我的程序以執行與MathProg相同的程序。唯一的區別是顯示的準確性,但這只是輸出格式的問題。