Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Cplex中读取CSV文件_Csv_Cplex_Opl - Fatal编程技术网

在Cplex中读取CSV文件

在Cplex中读取CSV文件,csv,cplex,opl,Csv,Cplex,Opl,我的问题与我先前的问题有关。我应该在代码中做一些更改。在CSV文件中,我有许多介于1到100之间的节点。我创建了另一个CSV文件,在100个节点之间生成20个随机数,并称之为需求点。每个需求点都有特定的需求,这些需求是在1到10之间随机生成的数字。我想阅读这个需求点(索引)及其权重。这是我问题的第一部分?我怎么看这个? 之后,我需要在每个需求点和所有节点之间有一个距离。我不知道如何读取需求点的索引并计算它们与所有节点之间的距离。 根据我提供的代码,我需要很多地方的需求点索引。我的主要问题是,我不

我的问题与我先前的问题有关。我应该在代码中做一些更改。在CSV文件中,我有许多介于1到100之间的节点。我创建了另一个CSV文件,在100个节点之间生成20个随机数,并称之为需求点。每个需求点都有特定的需求,这些需求是在1到10之间随机生成的数字。我想阅读这个需求点(索引)及其权重。这是我问题的第一部分?我怎么看这个? 之后,我需要在每个需求点和所有节点之间有一个距离。我不知道如何读取需求点的索引并计算它们与所有节点之间的距离。 根据我提供的代码,我需要很多地方的需求点索引。我的主要问题是,我不知道如何通过CSV文件在Cplex中获取这些索引。 需求点及其需求图片为:

我尝试了以下代码来阅读需求点:

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])