我一直在使用GLPK来解决一些混合整数规划问题。下面是一个MathProg格式的示例输入文件:
set REACTIONS;
set REACTANTS;
param Ys {i in REACTANTS, j in REACTIONS};
param Gamma {i in REACTANTS, j in REACTIONS};
param eps;
param delt;
var w {i in REACTANTS} >=-delt <=delt;
var R0 {i in REACTIONS} >=0 <=1, integer;
var Rn {i in REACTIONS} >=0 <=1, integer;
minimize z: sum{i in REACTIONS} -Rn[i];
s.t. const1{i in REACTIONS} : sum{k in REACTANTS} w[k]*Gamma[k,i] <= delt*(1-R0[i]);
s.t. const2{i in REACTIONS} : -sum{k in REACTANTS} w[k]*Gamma[k,i] <= delt*(1-R0[i]);
s.t. const3{i in REACTIONS} : Rn[i] <= 1-R0[i];
s.t. const5{i in REACTIONS} : sum{k in REACTANTS} w[k]*Gamma[k,i] <= delt*(1-Rn[i])-eps;
s.t. const6{i in REACTIONS, j in REACTIONS: i <> j} : sum{k in REACTANTS} w[k]*(Ys[k,i]-Ys[k,j]) <= delt*(1-Rn[i]+Rn[j]+R0[j]);
data;
set REACTIONS:= 1 2 3 4 5 6;
set REACTANTS:= 1 2 3 4 5 6;
param Ys: 1 2 3 4 5 6:=
1 1 0 0 0 0 0
2 1 0 0 0 0 0
3 0 1 1 0 0 0
4 0 0 0 1 0 0
5 0 0 0 1 0 0
6 0 0 0 0 1 1;
param Gamma: 1 2 3 4 5 6:=
1 -1 1 0 0 0 1
2 -1 1 1 0 0 0
3 1 -1 -1 0 0 0
4 0 0 1 -1 1 0
5 0 0 0 -1 1 1
6 0 0 0 1 -1 -1;
param eps:=0.1;
param delt:=10;
end;
我一直在这类更大的问题中遇到性能问题,由于SCIP声称比用于MIP的GLPK快几倍,因此似乎值得研究。然而,当涉及到输入文件格式时,我还不能弄清楚文档的头或尾。SCIP的主页上说它支持AMPL格式,GLPK的主页上说MathProg是AMPL的一个子集。试图通过scip -f file.nl
将上述文件输入到SCIP 3.1.0中会返回以下错误:
read problem <file.nl>
============
no reader for input file <file.nl> available
我不确定这是因为我没能用AMPL支持构建SCIP,还是别的什么。我找到了这篇关于用AMPL支持构建SCIP的博客文章,但是其中的说明似乎已经过时了,因为SCIP 3.1.0的源压缩包不包含interfaces
文件夹。
我有两个问题:
- 是否有可能让SCIP识别我的MathProg输入?
- 如果没有,谁能建议如何将其转换为可识别的格式?一个自动的方法会更好,因为我真的不想学习另一种格式,但一个手动的方法总比什么都没有好。
谢谢你的帮助,为我的无知道歉!
正如我在上面的评论中指出的,amp接口仍然包含在scip发行版中,您应该能够编译它并读取您的问题正如你引用的那篇优秀的博客文章所记载的那样。
如果你想尝试不同的文件格式,我为你提供了两个选择:
- 使用
glpk
将您的问题转换为SCIP可识别的文件格式。我找到了glp_write_mps()
和glp_write_lp
方法。SCIP可以同时读取.lp
和.mps
文件。请确保您使用的是这些文件扩展名,因为SCIP不识别.lp
-格式的文件,而是以.txt
结尾的文件。 - 用
Zimpl
来表述你的问题。Zimpl
和Ampl
的两种格式非常相似,请参阅文档中的示例和进一步参考。如果您使用默认的ZIMPL=true
-选项编译SCIP,则Zimpl
中的问题描述可以转换为.lp
-格式或由SCIP直接读取。