我在使用流控制在CPLEX opl中编码时发现错误。当我运行配置文件时,我遇到错误:数据元素" x"已经确定了。 (资源= 2.dat)。我已经从Sharing data on multiple models using "main" block复制了查询,因为我正在尝试解决相同的错误。
我有一系列问题:
1 即可。如果模型中有一个已定义的变量(例如" int x = 1;")并使用相同的变量加载外部数据(带.dat文件或addDataSource())则他/她会收到错误"数据元素" x"已经确定了。"。如何指示OPL忽略此类情况,或者替代地覆盖x的现有值。我只是希望代码不要退出。
2 即可。如果模型中有一个" int x = ...;"并且外部数据源不提供它然后一个得到错误"外部数据元素" x"没有定义。"在生成步骤。如何忽略这样的错误?看起来它可以被视为" int x;"如果没有外部数据提供。
第3 即可。如果模型中没有变量的任何定义,但外部数据确实有变量,则会引发错误"元素" x"没有定义。"。同样的问题,如何忽略这些错误,避免退出。
我会感谢你的帮助。下面是我的小示例代码和.dat文件说明。
int a = 5;
range g1 = 1..a;
int x[g1] = ...;
int y[g1] = ...;
minimize sum (i in g1) 3*x[i];
subject to {
forall (i in g1)
3*x[i] + 4*y[i] <= 300;
}
main{
var iteration=1;
var piece = 5;
while(iteration<=3)
{
var src = new IloOplModelSource("practice.mod");
var def = new IloOplModelDefinition(src);
var opl = new IloOplModel(def,cplex);
var filename=iteration;
var data = new IloOplDataSource(filename+".dat");
opl.addDataSource(data);
var details=opl.dataElements;
opl.generate();
if(cplex.solve())
{
writeln(filename+"->"+1);
}
else
{
writeln(filename+"->"+0);
}
iteration++;
}
}
数据文件是:
1.dat
x = [218,60,156,221,211];
y = [0,0,0,0,0];
2.dat
x = [218,60,156,221,211];
y = [1,2,1,5,1];
3.DAT
x = [218,60,156,221,211];
y = [2,3,5,2,6];
答案 0 :(得分:0)
如果您有多个同名数据,OPL应该使用哪个数据?第一个?第一个碰巧具有正确的类型?最后一个?为了避免所有歧义,触发错误是正确的做法。
如果您不提供您要提供的所有数据,程序将无法完成很多工作。所以你的问题2没有答案...
在OPL中根本不可能在变量使用前不声明变量。语言的设计没有考虑到这一点...