如何使用数组或用户定义元组的元组在 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];
以上都不起作用,所以我目前被卡住了。
您可以使用切片:
.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>}]
我有一个包含多个时间段的 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];
以上都不起作用,所以我目前被卡住了。
您可以使用切片:
.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>}]