如何导出cplex'解决方案?

时间:2016-04-15 07:47:49

标签: file-io io stdout cplex

我有一个文件quadratic_obj.lp,内容如下:

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返回,我将不得不再次解析。

有没有办法将变量及其值导出到例如制表符或逗号分隔文件?

2 个答案:

答案 0 :(得分: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 :(得分:1)

您可以使用OPL在CPLEX中执行此操作:

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 问候