2016-04-15 401 views
0

我有一个文件quadratic_obj.lp,内容如下:如何导出cplex的解决方案?

Minimize 
obj: a + b + [ a^2 + 4 a * b + 7 b^2 ]/2 
Subject To 
c1: a + b >= 10 
End 

在交互式会话CPLEX,我使用read读取文件中,我使用进行优化optimize。然后我就可以利用显示

display solution variables - 

这给了我

Variable Name   Solution Value 
a       10.000000 
b        0.000000 

有没有办法来此管道输出的解决方案?因此,在一个理想的世界里会是这样的:

display solution variables - -> myoutput.csv 

我用write但文件类型选项有不是我寻找。例如。 sol作为xml返回,我必须再次解析。

是否有办法将变量及其值输出到例如一个制表符或逗号分隔的文件?

回答

4

没有从互动做自动的方式。如果你做的东西像下面,它可以让你接近:

./cplex -c "read quadratic_obj.lp" "opt" "set logfile tmp.log" "display solution variables -" "quit" 

这将输出放到一个文件名为tmp.log,但仍存在有一些额外的东西,你需要进行后用脚本处理(或类似的东西)。有关此技术的更多信息,请参阅this链接(适用于版本12.6.3)。

另一种选择是使用API's。然后,您可以完全控制输出。例如,使用Python API,您可以执行如下操作:

import cplex 

cpx = cplex.Cplex() 
cpx.read('quadratic_obj.lp') 
cpx.solve() 
# Check solution status here via cpx.solution.get_status() 
for name, value in zip(cpx.variables.get_names(), 
         cpx.solution.get_values()): 
    print name, value 
+1

运行良好(Python API版本;没有尝试另一个) - 谢谢!我现在对它进行了升级,稍后可能会接受它,具体取决于其他答案的质量。 – Cleb

1

你可以做内CPLEX与OPL:

dvar float+ a; 
dvar float+ b; 

minimize a + b + (a*a + 4 *a * b + 7 *b*b)/2; 
subject to 
{ 
c1: a + b >= 10; 
} 

execute 
{ 
var f=new IloOplOutputFile("res.csv"); 
f.writeln(a); 
f.writeln(b); 
f.close(); 
} 

,这将创建一个CSV文件res.csv 问候

+0

不幸的是,这对我不起作用。它要么抱怨乘法(CPLEX Error 1607:Line 4:Expected'+'或' - ',找到'*'。'),如果我回到原始定义,它会抱怨大括号('CPLEX Error 1608:第10行:预期'+',' - '或感觉,找到'{'.'),没有它们我得到'CPLEX错误1608:第10行:期望'+',' - '或感觉,找到'v '。任何想法? – Cleb

+0

你应该使用我在一个文件model.mod中写的内容,然后在命令行中执行oplrun model.mod –

+0

然后我得到:'Command'oplrun'不存在。键入命令列表'help'。 – Cleb