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

create an array with for loop strategy in cplex

我知道我问了很多关于读取 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 循环而不定义任何元组。我想分别定义每个数组。

您的代码中存在错误。如果代码没有执行您想要的操作,添加 writeln(...) 语句以跟踪代码实际执行的操作可能会有所帮助。那么这些你自己大概就能搞清楚了。

你的情况有很多问题:

  1. 您正在尝试使用 属性 demand.length 但 属性 未定义。您可以通过在代码中添加 writeln(demand.length) 来查看。所以条件 i<=demand.length 永远不会为真,并且永远不会执行该循环。
  2. 虽然 CSV 文件中的每一行只给你 one[=29,但你对 CSV 文件中的 each 行执行循环 i =]数组中的条目。
  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);
}