在Cplex中读取CSV文件
我的问题与我先前的问题有关。我应该在代码中做一些更改。在CSV文件中,我有许多介于1到100之间的节点。我创建了另一个CSV文件,在100个节点之间生成20个随机数,并称之为需求点。每个需求点都有特定的需求,这些需求是在1到10之间随机生成的数字。我想阅读这个需求点(索引)及其权重。这是我问题的第一部分?我怎么看这个? 之后,我需要在每个需求点和所有节点之间有一个距离。我不知道如何读取需求点的索引并计算它们与所有节点之间的距离。 根据我提供的代码,我需要很多地方的需求点索引。我的主要问题是,我不知道如何通过CSV文件在Cplex中获取这些索引。 需求点及其需求图片为: 我尝试了以下代码来阅读需求点:在Cplex中读取CSV文件,csv,cplex,opl,Csv,Cplex,Opl,我的问题与我先前的问题有关。我应该在代码中做一些更改。在CSV文件中,我有许多介于1到100之间的节点。我创建了另一个CSV文件,在100个节点之间生成20个随机数,并称之为需求点。每个需求点都有特定的需求,这些需求是在1到10之间随机生成的数字。我想阅读这个需求点(索引)及其权重。这是我问题的第一部分?我怎么看这个? 之后,我需要在每个需求点和所有节点之间有一个距离。我不知道如何读取需求点的索引并计算它们与所有节点之间的距离。 根据我提供的代码,我需要很多地方的需求点索引。我的主要问题是,我不
tuple demands
{
int demandpoint;
int weight;
}
{demands} demand={};
execute
{
var f=new IloOplInputFile("weight.csv");
while (!f.eof)
{
var data = f.readline().split(",");
if (ar.length==2)
demand.add(Opl.intValue(ar[0]),Opl.intValue(ar[1]));
}
f.close();
}
execute
{
writeln(demand);
}
但这不是真的
int n=100;
int p=5;
tuple demands
{
int demandpointindex;
int weight;
}
{demands} demand={};
execute
{
var f=new IloOplInputFile("weight.csv");
while (!f.eof)
{
var data = f.readline().split(",");
if (ar.length==2)
demand.add(Opl.intValue(ar[0]),Opl.intValue(ar[1]));
}
f.close();
}
execute
{
writeln(demand);
}
float d[demandpointindexes][facilities];
execute {
var f = new IloOplInputFile("test1.csv");
while (!f.eof) {
var data = f.readline().split(",");
if (data.length == 3)
d[Opl.intValue(data[0])][Opl.intValue(data[1])] = Opl.floatValue(data[2]);
}
writeln(d);
}
dvar boolean x[demandpointindexe][facilities];
我希望你的解释是对的。假设您有一个文件
weight.csv
,如下所示:
1,2,
3,7,
4,9,
在这里,每行中的第一项是需求点的索引,第二项是其权重。然后,您可以像以前一样使用此脚本块来解析它:
tuple demandpoint {
int index;
int weight;
}
{demandpoint} demand={};
execute {
var f = new IloOplInputFile("weight.csv");
while (!f.eof) {
var data = f.readline().split(",");
if (data.length == 3)
demand.add(Opl.intValue(data[0]), Opl.intValue(data[1]));
}
writeln(demand);
}
接下来,您可以创建包含所有需求点索引的集合:
{int} demandpoints = { d.index | d in demand };
假设文件test1.csv如下所示
1,1,0,
1,2,5,
1,3,6,
1,4,7,
3,1,1,
3,2,1.5,
3,3,0,
3,4,3.5,
4,1,1,
4,2,1.5,
4,3,1.7,
4,4,0,
这里,第一项是需求点指数,第二项是设施指数,第三项是第一项和第二项之间的距离。请注意,没有以2开头的行,因为weight.csv
中没有索引为2的需求点。还要注意的是,我假设这里只有4个工具(以保持文件简短)。您可以读取需求点和设施之间的距离,如下所示:
range facilities = 1..4;
float d[demandpoints][facilities];
execute {
var f = new IloOplInputFile("test1.csv");
while (!f.eof) {
var data = f.readline().split(",");
if (data.length == 4)
d[Opl.intValue(data[0])][Opl.intValue(data[1])] = Opl.floatValue(data[2]);
}
writeln(d);
}
完整脚本(包括虚拟目标和约束,以便可以运行)看起来:
它打印
{<1 2> <3 7> <4 9>}
[[0 5 6 7]
[1 1.5 0 3.5]
[1 1.5 1.7 0]]
更新有关您在评论中给出的更详细规范:
为了处理您在注释中解释的test1.csv
,您可以定义一个新的元组:
tuple Distance {
int demandpoint;
int facility;
float distance;
}
{Distance} distances = {};
并像解析weight.csv
文件一样读取/解析该文件(当然,还有一个附加字段)。
然后可以创建距离矩阵,如下所示:
float d[i in I][j in J] = sum (dist in distances : dist.demandpoint == i && dist.facility == j) dist.distance;
这里,I
和J
分别是需求点和设施的集合或范围。请参见上文,了解如何获得元组集中定义的所有需求点集。创建的矩阵将为每个demandpoint/distance对提供一个条目。定义d
的诀窍在于有两种情况:
test1.csv
中定义了一对(i,j),那么总和将恰好匹配距离中的一个元素:定义两点之间距离的元素
test1.csv
中未定义对(i,j),则总和将不匹配任何内容,因此距离矩阵中的相应条目将为0我希望你的解释是对的。假设您有一个文件
weight.csv
,如下所示:
1,2,
3,7,
4,9,
在这里,每行中的第一项是需求点的索引,第二项是其权重。然后,您可以像以前一样使用此脚本块来解析它:
tuple demandpoint {
int index;
int weight;
}
{demandpoint} demand={};
execute {
var f = new IloOplInputFile("weight.csv");
while (!f.eof) {
var data = f.readline().split(",");
if (data.length == 3)
demand.add(Opl.intValue(data[0]), Opl.intValue(data[1]));
}
writeln(demand);
}
接下来,您可以创建包含所有需求点索引的集合:
{int} demandpoints = { d.index | d in demand };
假设文件test1.csv如下所示
1,1,0,
1,2,5,
1,3,6,
1,4,7,
3,1,1,
3,2,1.5,
3,3,0,
3,4,3.5,
4,1,1,
4,2,1.5,
4,3,1.7,
4,4,0,
这里,第一项是需求点指数,第二项是设施指数,第三项是第一项和第二项之间的距离。请注意,没有以2开头的行,因为weight.csv
中没有索引为2的需求点。还要注意的是,我假设这里只有4个工具(以保持文件简短)。您可以读取需求点和设施之间的距离,如下所示:
range facilities = 1..4;
float d[demandpoints][facilities];
execute {
var f = new IloOplInputFile("test1.csv");
while (!f.eof) {
var data = f.readline().split(",");
if (data.length == 4)
d[Opl.intValue(data[0])][Opl.intValue(data[1])] = Opl.floatValue(data[2]);
}
writeln(d);
}
完整脚本(包括虚拟目标和约束,以便可以运行)看起来:
它打印
{<1 2> <3 7> <4 9>}
[[0 5 6 7]
[1 1.5 0 3.5]
[1 1.5 1.7 0]]
更新有关您在评论中给出的更详细规范:
为了处理您在注释中解释的test1.csv
,您可以定义一个新的元组:
tuple Distance {
int demandpoint;
int facility;
float distance;
}
{Distance} distances = {};
并像解析weight.csv
文件一样读取/解析该文件(当然,还有一个附加字段)。
然后可以创建距离矩阵,如下所示:
float d[i in I][j in J] = sum (dist in distances : dist.demandpoint == i && dist.facility == j) dist.distance;
这里,I
和J
分别是需求点和设施的集合或范围。请参见上文,了解如何获得元组集中定义的所有需求点集。创建的矩阵将为每个demandpoint/distance对提供一个条目。定义d
的诀窍在于有两种情况:
test1.csv
中定义了一对(i,j),那么总和将恰好匹配距离中的一个元素:定义两点之间距离的元素
test1.csv
中未定义对(i,j),则总和将不匹配任何内容,因此距离矩阵中的相应条目将为0你能详细说明一下这里到底是什么问题吗?看起来你有读取CSV文件的代码,据我所知,这些代码应该可以工作。也许CSV的格式与您预期的不同?你能展示CSV文件、预期结果和你实际得到的结果吗?我有一个文件,其中包含20个需求点、它们的索引和它们的权重。我有另一个文件,它有100个节点和它们之间的距离。需求点从100个节点中选择。我不知道如何在需求点和所有节点之间建立距离矩阵。我应该获取需求点的索引,以便在节点中找到它们,并获取距离,但我不知道如何获取?int index[demandpoints];执行{var f=new IloOplInputFile(“weight.csv”);而(!f.eof){var data=f.readline().split(“,”);如果(data.length==3)索引[Opl.intValue(data[0])