在 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(...)
语句以跟踪代码实际执行的操作可能会有所帮助。那么这些你自己大概就能搞清楚了。
你的情况有很多问题:
- 您正在尝试使用 属性
demand.length
但 属性 未定义。您可以通过在代码中添加 writeln(demand.length)
来查看。所以条件 i<=demand.length
永远不会为真,并且永远不会执行该循环。
- 虽然 CSV 文件中的每一行只给你 one[=29,但你对 CSV 文件中的 each 行执行循环
i
=]数组中的条目。
- 即使您的循环可以工作,您也在尝试对普通整数调用函数 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);
}
我知道我问了很多关于读取 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(...)
语句以跟踪代码实际执行的操作可能会有所帮助。那么这些你自己大概就能搞清楚了。
你的情况有很多问题:
- 您正在尝试使用 属性
demand.length
但 属性 未定义。您可以通过在代码中添加writeln(demand.length)
来查看。所以条件i<=demand.length
永远不会为真,并且永远不会执行该循环。 - 虽然 CSV 文件中的每一行只给你 one[=29,但你对 CSV 文件中的 each 行执行循环
i
=]数组中的条目。 - 即使您的循环可以工作,您也在尝试对普通整数调用函数 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);
}