我正试图将一个元组写回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:范围大小不足以容纳元组集:缺少行。
答案 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);
将实现这一目标。