首页 > 解决方案 > 有条件地将元组写回excel(仅值> 0)

问题描述

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

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 中的限制减少到 100 万行以内。

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

然后我得到以下信息:IBM ILOG Concert 的异常:excel:范围大小对于一组元组来说不够宽:缺少行。

标签: tuplescplexopl

解决方案


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

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);

将实现这一目标。


推荐阅读