在OPL过滤器中,从具有i,j,k的元组中读取k以获取i,j的集合

问题描述

我有一个模型,可以从excel文件中读取数据。下面是模型的一部分。

我使用以下代码读取数据,如下所示:

    tuple blockType {
        string id;
        int i;
        int j;
        int k;
     };
     
    
    
    {blockType} PitBlocksType = ...; // Read from excel table which contains several rows,a short example below

/*
Example below
Block Id    Bench(i)    Strip(j)    Block(k)
P1           1             1        1
P2           1             1        2
P3           1             1        3
P7           3             1        1
P8           3             1        2
P9           3             1        3
P10          1             2        1
P11          1             2        2
P12          1             2        3
P16          3             2        1   
P17          3             2        2
P18          3             2        3
P19          1             3        1
P20          1             3        2
P21          1             3        3
P22          2             3        1
P23          2             3        2
P24          2             3        3
P25          3             3        1
P26          3             3        2
P27          3             3        3    
    */

    tuple jk {
        string ids;
        int j;
        int k;
    }
    
    {jk} jks=...; // from the above table reading only the j,k : There are multiple occurrences of the same j,k - Not sure if this is the best method


    {int} BenchPerjk[jks]= ?????? ;   // Here I want to read all i for each set of jks

    //int succ3=next(BenchPerjk[<id,5,3>],3); // I want to use something like this below
    
    
    {blockType} OntopPit[b1 in PitBlocksType] =
         {b | b in PitBlocksType: b1.i == next(BenchPerjk[b.id,b.j,b.k],b.i) &&   // This is giving an error
                            ((b1.k  == b.k-1 ) ||
                             (b1.k  == b.k+1 ) ||
                             (b1.k  == b.k )  ) &&
                            ((b1.j  == b.j-1 ) ||
                             (b1.j  == b.j+1 ) ||
                             (b1.j  == b.j )  ) };
      

上面有2个问题-一个是如何通过过滤表中每组jk的数据来读取BenchPerjk [jks]。

第二个问题是代码中Next命令的实现-最佳方法是什么。

请期待您的帮助,

解决方法

您无法在阅读时过滤内容,因此您始终必须阅读所有内容。掌握所有内容后,您应该可以按照以下步骤提取jks

tuple jk {
  int j;
  int k;
}

{jk} jks = { <t.j,t.k> | t in PitBlocksType };

execute { writeln(jks); }

{int} BenchPerjk[v in jks] = { t.i | t in PitBlocksType : t.j == v.j && t.k == v.k };

execute { writeln(BenchPerjk); }