查找OPL中的下一组编号

问题描述

我有2套如下

jks - {<1 1> <1 2> <1 3> <2 1> <2 2> <2 3> <3 1> <3 2> <3 3>} 
benchPerjk - [{1 3} {1 3} {1 3} {1 3} {1 3} {1 3} {1 2 3} {1 2 3} {1 2 3}] 

我现在想在BenchPerjk中找到某个jks的下一个数字

代码如下

tuple jk {
  int j;
  int k;
}

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

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

PitBlocksType来自以下数据:


 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    (i)       (j)      (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    
    */

之所以要这样做,是因为我想使用BenchPerjk查找下一个i。在下面的代码中代替b.i + 1

如果i是连续的并且对于任何j,k集都存在所有i,则b.i + 1会很好地工作。这意味着Benchperjk是否会

benchPerjk-[{1 2 3} {1 2 3} {1 2 3} {1 2 3} {1 2 3} {1 2 3} {1 2 3} {1 2 3} {1 2 3 }]

但这不是我的数据。

{blockType} OntopPit[b1 in PitBlocksType] =
     {b | b in PitBlocksType: b1.i == b.i +1 &&
                        ((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 )  ) };

请提出建议。

我尝试了以下代码,但出现错误

{blockType} OntopPit[b1 in PitBlocksType] =
      {b | b in PitBlocksType: b1.i == next(BenchPerjk[< b.j,b.k>],b.i) &&
                        ((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 )  ) };

但是出现了两行错误 “ b.i”:next()元素不存在。 数组项的无效初始化表达式:OntopPit []

解决方法

您可以使用下一个:

tuple jk {
  int j;
  int k;
}

{jk} jks = {<1,1>,<1,2>,3>,<2,<3,3>};

{int} BenchPerjk[jks] = [{1,3},{1,2,3}];

// Now suppose you want to get the next after 1 for <j,k> = <2,1>

int res=next(BenchPerjk[<2,1>],1);

execute
{
  writeln(res);
}

给予3

后来需要更通用的东西:

tuple jk {
  int j;
  int k;
}

{jk} jks = {<1,1);

execute
{
  writeln(res);
}

// And now as a generic function

{int} benches=union (jk in jks) BenchPerjk[jk];

int nextone[jk in jks][i in benches]=(i in BenchPerjk[jk])?((i!=last(BenchPerjk[jk]))?next(BenchPerjk[jk],i):-2):-1;



int res2=nextone[<2,1>][1];

execute
{
  writeln(res2);
}

给予

3 3