如何使用数组或用户定义元组的元组在 CPLEX OPL 中将单个数据集拆分为多个集合

How to create split single dataset into multiple sets in CPLEX OPL using array or tuple of user-defined tuples

我有一个包含多个时间段的 model,我收到了一些具有时间维度的元组格式的数据。因此,原始元组集是每个时间段所需的元组集的超集。我还有一个代表时间段的整数数组。在预处理中,我需要迭代这些数据并分别分析每个时间段。我相信我可以通过将原始元组集拆分为其基于时间段的子集,然后在预处理期间独立地迭代每个子集来显着减少预处理时间。

在数据文件中:

timeSet = {1 2};
dataset = {
//<attribute1, attribut2, timePeriod>
<a,b,1>
<a,c,1>
<a,b,2>
<a,b,2>
};

在 mod 文件中:

{int} timeSet = ...;
tuple data {string attribOne; string attribTwo; int time;};
{data} dataset = ...;

我不知道会有多少个时间段,所以如果我不能即时拆分元组集,那么我需要做这样的事情:

execute{
   for(var t in timeSet) {
      for(var r in dataSet) {
         if(r.Time == t) {
            //call a function that executes on r
         }
      }
   }
}

但是,我想避免使用上面的代码,因为它需要在 timeSet 中每次迭代整个数据集。如果我可以根据时间字段的值将 dataSet 拆分成多个元组或数组,那么我可以将上面的内容替换为如下内容:

 execute{
   for(var t in timeSet) {
      for(var r in dataSetsCollection[t]) {
         //call a function that executes on r
      }
   }
}

是否可以从上面的代码中创建诸如 dataSetsCollection 之类的项目?我试图用元组这样做:

tuple TdataSetsCollection {data row;};
{TdataSetsCollection} dataSetsCollection = {<ds> | ds in dataset : ds.Time = t};

和一个数组:

tuple TdataSetsCollection {data row;};
TdataSetsCollection DataSetsArr[t in TimeSet] = [t : ds | ds in datasets, t in TimeSet : ds.Time == t];

以上都不起作用,所以我目前被卡住了。

我有 cross-posted this question.

您可以使用切片:

.mod

{int} timeSet = ...;
tuple data {string attribOne; string attribTwo; int time;};
{data} dataset = ...;

{int} computedTimeSet={d.time | d in dataset};
{data} dataSetPerTime[t in computedTimeSet]={d | d in dataset : d.time==t};

execute
{
  writeln(dataSetPerTime);
}

.dat

timeSet = {1 2};
dataset = {

<a,b,1>
<a,c,1>
<a,b,2>
<a,d,2>
};

给予

 [{<"a" "b" 1> <"a" "c" 1>} {<"a" "b" 2> <"a" "d" 2>}]