在 CPLEX 中使用 for 循环策略创建数组



我知道我问了很多关于读取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] 值。 权重文件作为图片附上: 权重文件

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

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

在您的情况下,存在许多问题:

  1. 您正在尝试使用属性demand.length但该属性未定义。您可以通过向代码添加writeln(demand.length)来查看这一点。因此,条件i<=demand.length永远不会为真,并且该循环永远不会执行。
  2. 您可以对 CSV 文件中的每一行执行循环i,尽管 CSV 中的每一行只在数组中提供一个条目。
  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);
}

最新更新