File io 如何导出cplex';解决方案

File io 如何导出cplex';解决方案,file-io,io,stdout,cplex,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

我有一个文件
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
返回,我必须再次解析它


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

您可以在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
关于

您可以在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

而言,没有自动的方式从交互界面执行此操作。如果您执行以下操作,它会让您接近:

./cplex -c "read quadratic_obj.lp" "opt" "set logfile tmp.log" "display solution variables -" "quit"
这将把输出放入一个名为tmp.log的文件中,但其中还有一些额外的内容,您需要使用脚本(或类似的东西)进行后期处理。有关此技术的更多信息,请参阅链接(12.6.3版)

另一种选择是使用。然后,您可以完全控制输出。例如,使用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

没有自动的方式从交互界面执行此操作。如果您执行以下操作,它会让您接近:

./cplex -c "read quadratic_obj.lp" "opt" "set logfile tmp.log" "display solution variables -" "quit"
这将把输出放入一个名为tmp.log的文件中,但其中还有一些额外的内容,您需要使用脚本(或类似的东西)进行后期处理。有关此技术的更多信息,请参阅链接(12.6.3版)

另一种选择是使用。然后,您可以完全控制输出。例如,使用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

不幸的是,这对我不起作用。它或者抱怨乘法(
CPLEX错误1607:第4行:应为“+”或“-”,找到“*”。
),如果我回到我的原始定义,它就会抱怨花括号(
CPLEX错误1608:第10行:应为“+”,“-”或sense,找到“{”。
)如果没有它们,我会得到
CPLEX错误1608:第10行:预期为“+”、“-”或感觉为“v”。
有什么想法吗?你应该使用我在文件model.mod中写的内容,然后在命令行中执行oplrun model.mod。然后我得到:
命令“oplrun”不存在。键入“help”以获取命令列表。
你使用哪个CPLEX版本?哪个平台?我不幸的是,在Ubuntu14.04和15.10上用12.2.和12.6.试过了。它对我不起作用。它要么抱怨乘法运算(
CPLEX错误1607:第4行:预期为“+”或“-”,发现为“*”。
),如果我回到最初的定义,它会抱怨花括号(
CPLEX错误1608:第10行:应为“+”、“-”或sense,应为“{”。
)如果没有它们,我会得到
CPLEX错误1608:第10行:预期为“+”、“-”或感觉为“v”。
有什么想法吗?你应该使用我在文件model.mod中写的内容,然后在命令行中执行oplrun model.mod。然后我得到:
命令“oplrun”不存在。键入“help”以获取命令列表。
你使用哪个CPLEX版本?哪个平台?我在Ubuntu 14.04和15.10上试用了12.2和12.6。效果很好(Python API版本;没有试用另一个版本)-谢谢!我现在投票,以后可能会接受,这取决于其他答案的质量。CPLEX 12.8添加了对Python 3.6的支持。请参阅详细的系统要求。效果很好(Python API版本;没有尝试另一个版本)-谢谢!我现在投票,以后可能会接受,这取决于其他答案的质量。CPLEX 12.8添加了对Python 3.6的支持。请参阅详细的系统要求。