Обратная запись кортежа, чтобы преуспеть условно (только значения> 0) - PullRequest
0 голосов
/ 17 июня 2019

Я пытаюсь написать кортеж обратно, чтобы преуспеть.Однако, поскольку многие значения для 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};

С нетерпением ждем помощи, пожалуйста.

В файле данных Iиметь следующую строку

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

Когда модель запускается, я получаю следующую ошибку: Исключение из IBM ILOG Concert: диапазон Excel неизвестен.

Я также пытался изменить файл данныхкак показано ниже, уменьшив ограничение до 1 миллиона строк в Excel.

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

Затем я получаю следующее: Исключение из IBM ILOG Concert: excel: размер диапазона недостаточно широк для набора кортежей: отсутствуетстроки.

1 Ответ

0 голосов
/ 17 июня 2019

Позвольте мне дать вам 2 примера для ваших 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);

достигнет этого.

...