gams задает сеть потока с большим количеством нулей (разреженная матрица)

Я попытался использовать гаммы, чтобы найти поток материала через сеть узлов. я определил

set edge(i,n,nn);
positive variable flux(i,n,nn);

y.up(i,n,nn)$( not edge(i,n,nn)) = 0;

Мое намерение состоит в том, чтобы определить трехмерную матрицу переменной для flux материала i от узла n до nn, а затем использовать набор edge, который указывает, какой из полных графов может иметь массу потока.

Это, по-видимому, работает, но когда я попытался сохранить y в файл gdx, у меня было много нулей. Мне нужно только подмножество y, где край (i, n, nn) ​​истинен.

Как я могу подставить y при сохранении файла gdx.

Спасибо!


person yosukesabai    schedule 31.08.2018    source источник


Ответы (1)


Вы можете хранить вещи в уменьшенном параметре:

Parameter yLevel(i,n,nn);
yLevel(i,n,nn)$edge(i,n,nn) = y.l(i,n,nn);
execute_unload 'result.gdx' yLevel;

Просто примечание: вам действительно нужно полное y (i, n, nn)? Это может быть огромным в зависимости от размера наборов индексации. Или вы могли бы в качестве альтернативы изменить свою модель, чтобы просто использовать y(i,n,nn)$edge(i,n,nn)?

person Lutz    schedule 31.08.2018
comment
Спасибо за ваш ответ, я попробую это. Что касается полной матрицы, то она совершенно не нужна. Я хочу сделать что-то более разреженное, но использование y.up=0 - это то, как я придумал... Одно из уравнений вычисляет, например, уравнение баланса массы имеет x(i,n) =e= sum(nn, y(i,n,nn)) + sum(nn,y(i,nn,n)) , что означает, что масса i втекает/вытекает из узла n рассчитываются по суммарному потоку y. Я думаю, я должен сказать sum(nn,y(i,nn,n)$edge(i,n,nn))? - person yosukesabai; 31.08.2018
comment
Да, я бы предложил использовать $edge(i,n,nn) везде, где вы используете y(i,n,nn). Таким образом, ненужные переменные вообще не будут генерироваться (и тогда вам больше не нужно хранить только их части в параметре). - person Lutz; 31.08.2018
comment
Рад, что вы упомянули об уменьшении размера проблемы! Это то, что мне было нужно! Большое тебе спасибо! - person yosukesabai; 31.08.2018
comment
Рад, что помогло! - person Lutz; 31.08.2018