1

我在使用流控制在 CPLEX opl 中进行编码时发现了一个错误。当我运行配置文件时,我遇到错误:数据元素“x”已被设置。(资源 = 2.dat)。我已经使用“main”块从共享数据中复制了查询,因为我正在尝试解决相同的错误。

我有问题清单:

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.数据

x = [218,60,156,221,211];
y = [0,0,0,0,0];

2.数据

 x = [218,60,156,221,211];
 y = [1,2,1,5,1];

3.数据

x = [218,60,156,221,211];
y = [2,3,5,2,6];
4

1 回答 1

0
  1. 如果您有多个具有相同名称的数据,那么 OPL 应该使用哪一个?第一个?第一个碰巧有正确类型的?最后一个?为了避免所有的歧义,触发错误是正确的做法。

  2. 如果您不提供您说要提供的所有数据,该程序将无能为力。所以你的问题2没有答案......

  3. 在 OPL 中根本不可能在使用变量之前不声明它们。该语言的设计并未考虑到这一点...

于 2019-03-26T12:41:17.667 回答