Как создать разделенный набор данных на несколько наборов в CPLEX OPL с использованием массива или кортежа определенных пользователем кортежей - PullRequest
0 голосов
/ 02 марта 2020

У меня есть модель с несколькими периодами времени, и я получаю некоторые данные в формате кортежа с измерением времени. Таким образом, исходный набор кортежей является надмножеством набора кортежей, требуемого для каждого периода времени. У меня также есть массив целых чисел, которые представляют периоды времени. При предварительной обработке мне нужно выполнить итерацию по этим данным и проанализировать каждый период времени отдельно. Я полагаю, что могу значительно сократить время предварительной обработки, разделив исходный набор кортежей на его подмножества на основе периодов времени, а затем итерируя каждый из них независимо во время предварительной обработки.

В файле данных:

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 = ...;

Я не знаю заранее, сколько будет временных периодов, поэтому, если я не могу разделить кортеж на лету, мне нужно будет сделать что-то вроде this:

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

Однако я хочу избежать вышеприведенного кода, потому что он требует итерации по всей совокупности dataSet для каждого временного набора. Если бы я мог разбить 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];

Ничего из вышеперечисленного не сработало, поэтому я в данный момент застрял.

У меня кросс-пост на этот вопрос .

1 Ответ

2 голосов
/ 02 марта 2020

Вы можете использовать нарезку:

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