在cplex中使用for循环策略创建一个数组

时间:2019-05-17 17:14:27

标签: arrays csv for-loop cplex opl

我知道我问了很多有关读取CSV文件并在CPLEX中编码的问题。但是现在我的问题是关于策略。如前所述,我有一个CSV文件,我想在CPLEX中读取它。这次我的问题是:我想使用一个for循环从CSV文件在CPLEX中创建一个数组,但我不知道如何?这次我需要使用for循环,而不是其他任何方法,并且我想知道是否可能: 到目前为止,我的代码是:

range demand = 1..10;
int index[demand];
 int weight[demand];
execute {

  var f = new IloOplInputFile("weight.csv");
  var data = f.readline();
  while (!f.eof) {
   var data = f.readline().split(",");
   if (data.length == 2)
   for (var i=1; i<=demand.length; i++){
     index[i].add(Opl.intValue(data[0]));
     weight[i].add(Opl.intValue(data[1]));

  }   
    writeln(index);
    writeln(weight);
}
}

问题是索引和权重都得到[00..0]值。 重量文件如图所示: weight file

我需要问很多关于这个问题的问题,但是这次我需要使用for循环而不定义任何元组。我想分别定义每个数组。

1 个答案:

答案 0 :(得分:2)

您的代码中有一个错误。如果代码没有执行您想要的操作,则可能会添加writeln(...)语句来跟踪代码实际在做什么。然后,您可以自己弄清楚这些事情。

您遇到的问题很多:

  1. 您正在尝试使用属性demand.length,但该属性未定义。您可以通过在代码中添加writeln(demand.length)来查看。因此,条件i<=demand.length永远不会为真,并且永远不会执行该循环。
  2. 尽管CSV中的每一行在数组中仅提供一个条目,但您仍在i上执行了CSV文件中的每一行的循环。 / li>
  3. 即使您的循环可以正常工作,您也尝试在纯整数上调用函数add()(数组中的每个条目都是整数)。整数没有这种属性。因此,您的循环会引发错误。

从CSV读取数组的正确代码是:

range demand = 1..10;
int index[demand];
int weight[demand];

execute {

  var f = new IloOplInputFile("weight.csv");
  var data = f.readline();
  var i = 1;
  while (!f.eof) {
    var data = f.readline().split(",");
    if (data.length == 2) {
      index[i] = Opl.intValue(data[0]);
      weight[i] = Opl.intValue(data[1]);
      i = i + 1;
    }
  }
  writeln(index);
  writeln(weight);
}