有条件地将元组写回excel(仅值> 0)

时间:2019-06-17 10:22:22

标签: tuples cplex opl

我正试图将一个元组写回excel。但是,由于Xbiedt的许多值均为0,因此b,i,e,d和t的组合使其输出超过1,300,000行。 Excel无法处理那么多行。因此,我想只限制输出Xbiedt> 0的t值。下面是代码的一部分。

tuple SolXbiedt{
int b;
int i;
int e;
int d;
int t;
float x_value;
}


{SolXbiedt} solXbiedt    = {<b,i,e,d,t, Xbiedt[b][i][e][d][t] > | b in PitBlocks, i in PitExits, e in DumpEntries, d in DumpBlocks, t in TimePeriods};

请期待帮助。

在dat文件中,我有以下一行

solXbiedt to SheetWrite(sheet,"Result!H3:M4000000");

运行模型时出现的错误如下: IBM ILOG Concert的例外情况:Excel范围未知。

我还尝试将dat文件更改为如下所示,以将Excel中的限制减少到一百万行之内。

solXbiedt to SheetWrite(sheet,"Result!H3:M1000000");

然后我得到以下信息: IBM ILOG Concert的例外情况:excel:范围大小不足以容纳元组集:缺少行。

1 个答案:

答案 0 :(得分:0)

让我为您的两个问题举两个例子。

1)首先,您只想存储部分结果。

假设您想知道一个范围内的哪些整数值可以除以3。您可以编写

range r=1..10;


dvar int y[r];
dvar int z[r] in 0..2;

minimize sum(i in r) z[i];
subject to
{
forall(i in r) i==3*y[i]+z[i];
}

{int} x={i | i in r:z[i]==0};
execute
{
writeln(z);
writeln(x);
}

给出

[1 2 0 1 2 0 1 2 0 1]
{3 6 9}

z会提醒您,而x则更紧凑,因为您只获得可以除以3的值。我们称该操作为切片。

2)然后,您需要使用一个范围取决于某些值的SheetWrite。

.mod

int n=10;

dvar int x;
string SheetWriteConnectionString;

maximize x;
subject to {
          x<=2;
}

int y[i in 1..n+1+x]=2;

execute
{
    writeln("y= ",x);
    SheetWriteConnectionString="A1:A"+n+1+x;
}

.dat

SheetConnection s("output.xlsx");
y to SheetWrite(s,SheetWriteConnectionString);

将实现这一目标。