【问题标题】:How to create split single dataset into multiple sets in CPLEX OPL using array or tuple of user-defined tuples如何使用用户定义元组的数组或元组在 CPLEX OPL 中将单个数据集拆分为多个集合
【发布时间】:2020-03-02 16:52:51
【问题描述】:

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

在 dat 文件中:

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

在模组文件中:

{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

【问题讨论】:

  • 一般来说,如果您将问题交叉发布到多个论坛,最好在每个位置声明所有副本。这使读者更容易确定问题是否已被回答,从而帮助他们避免重复工作。

标签: arrays tuples cplex opl ibm


【解决方案1】:

你可以使用切片:

.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>}]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-21
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    • 2016-08-05
    • 2011-09-10
    • 1970-01-01
    相关资源
    最近更新 更多