我一直在使用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's homepage表示它支持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。我发现this blog post建立SCIP并支持AMPL,但由于SCIP 3.1.0的源zip文件不包含interfaces
文件夹,因此说明似乎已过时。
所以,我有两个问题:
感谢您对我的无知的任何帮助和道歉!
答案 0 :(得分:3)
正如我在上面的评论中指出的那样,Ampl-interface仍然包含在SCIP发行版中,你应该能够编译它并阅读你的问题 正如您引用的优秀博客文章中所述。
如果你想尝试不同的文件格式,我会看到两个选项:
glpk
将您的问题转换为SCIP可识别的file format。我找到了方法glp_write_mps()
和glp_write_lp
。 SCIP可以读取.lp
和.mps
个文件。确保您正好使用这些文件扩展名,因为SCIP无法识别.lp
- 格式的文件,而是以.txt
结尾。Zimpl
来制定您的问题。 Zimpl
和Ampl
两种格式非常相似,请参阅documentation示例和进一步参考。 Zimpl
中的问题描述可以翻译成.lp
- 格式或SCIP直接读取,如果您使用ZIMPL=true
- 选项编译SCIP,这是默认选项。