Какой самый эффективный порядок выставления в GAMS?

В документации предполагается, что наборы должны располагаться в одном порядке для повышения производительности. Если большинство наших переменных имеют общий набор, что лучше иметь общий набор первым или последним?

Т.е. что более эффективно?

  y[i,t] =E= a[t] * x[j,t];

or

  y[t,i] =E= a[t] * x[t,j];

person Martin Bonde    schedule 25.10.2019    source источник


Ответы (2)


Суть этого «того же порядка» в том, что наборы должны использоваться в том порядке, в котором они контролируются. Так

Equation1(t,i,j).. y[t,i] =E= a[t] * x[t,j];

должно быть лучше, чем

Equation2(i,j,t).. y[t,i] =E= a[t] * x[t,j];

Кроме этого, не так-то просто дать много общих правил. Если у вас также есть полный контроль над контрольными индексами, часто бывает полезно, если самый большой набор будет последним, поэтому если t >> i, то x[i,t] должно быть лучше, чем x[t,i]. Обычно параметр командной строки GAMS profile (https://www.gams.com/latest/docs/UG_GamsCall.html#GAMSAOprofile) очень полезен для проверки влияния различных формулировок вашего режима.

person Lutz    schedule 28.10.2019
comment
Спасибо! Имеет смысл, что контрольные индексы и размер наборов имеют значение. Подразумевает ли ваш ответ, что нет четкого правила, при котором должно быть быстрее: Equation1 (t, i, j) .. y [t, i] = E = a [t] * .. z [t] * х [t, j]; и Уравнение 2 (i, j, t) .. y [i, t] = E = a [t] * .. z [t] * x [j, t]; Учитывая, что наборы имеют одинаковый размер? Т.е. размещение набора, разделяемого большинством переменных, первым или последним (временной индекс в большой динамической модели). Профилировщик оказался очень полезным, но в этом случае для проверки потребуется существенная переработка формулировки. - person Martin Bonde; 29.10.2019
comment
Equation1 должно быть быстрее. Но не уверен, хотите ли вы сделать серьезную переформулировку этой разницы. Я провел тривиальный эксперимент (не могу полностью опубликовать его здесь, в комментарии): $set max 200 Set t / t1*t%max%/ i / i1*i%max%/ j / j1*j%max%/; ... Equation1(t,i,j).. y[t,i] =E= a[t] * a[t] *b[t] *c[t] *d[t] * z[t] * x[t,j]; Equation2(i,j,t).. yy[i,t] =E= a[t] * a[t] *b[t] *c[t] *d[t] * z[t] * xx[j,t]; Вот профиль на моей машине: 14.812sec Equation1 (8000000); 16.265sec Equation2 - person Lutz; 04.11.2019
comment
Очень интересно. Это достаточно важно, чтобы я попробовал изменить формулировку, когда у меня будет время. - person Martin Bonde; 05.11.2019

Если кто-то наткнется на это, контекст представляет собой большую динамическую экономическую модель.

Мы попытались переключить наш временной индекс с того, чтобы он всегда был последним, на всегда первый. Модель представляет собой квадратную систему примерно из 1m уравнений, 7m элементов Якоби, из которых 2m являются нелинейными.

Время решения с использованием CONOPT4 было значительно хуже после внесения изменений. Т.е. у нас лучшая производительность с последним, а не первым временным индексом, несмотря на то, что временной индекс является одним из самых больших наборов в модели. Результат, вероятно, не переносится на другие модели, но подтверждает, что нет тривиального ответа.

person Martin Bonde    schedule 09.12.2019