我知道我问了很多有关读取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循环而不定义任何元组。我想分别定义每个数组。
答案 0 :(得分:2)
您的代码中有一个错误。如果代码没有执行您想要的操作,则可能会添加writeln(...)
语句来跟踪代码实际在做什么。然后,您可以自己弄清楚这些事情。
您遇到的问题很多:
demand.length
,但该属性未定义。您可以通过在代码中添加writeln(demand.length)
来查看。因此,条件i<=demand.length
永远不会为真,并且永远不会执行该循环。i
上执行了CSV文件中的每一行的循环。 / li>
从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);
}