在GAMS中编写循环并将结果打印在一个excel文件上



我正在GAMS中求解一个模型,它是一个大模型,称之为"利润";,但在其中我希望改变一个特定的参数,称之为阿尔法(j(,其中阿尔法表示在集合"j"的不同值上定义的参数,然后看看关键变量的结果如何随它而变化

调用循环索引"i",我希望通过从全向量alpha(j(的初始值每次增加0.05来运行模型,然后看看变量X和Y是如何变化的:

Set        i          / 1*20/  ;

*在上面的文章中,我将索引从1设置为20,然后将第一次迭代的alpha初始值设置为0。

*然后我写循环

loop(i, alpha(j,i+1)  =alpha(j)+0.05
solve mymodel using lp maximizing profit;
);

*然后我希望将结果写入一个excel GDX文件。

*基线

execute_unload "resultsloop.gdx"
X Y ; 
execute 'gdxxrw.exe resultsloop.gdx var=XXX rng=XXX   !a1'
execute 'gdxxrw.exe resultsloop.gdx var=X.L rng=X!a1'
execute 'gdxxrw.exe resultsloop.gdx var=Y.L rng=Y!a1'
;

这有两个问题——一个我有,另一个我可以预见。

  1. 第一个问题是我得到了一个错误"维度不同-符号用更多/更少的索引引用,如声明的";。我不知道如何解决这个问题。

  2. 第二个问题(我可以预见(是excel结果的编写。理想情况下,我希望每个变量的结果按循环数堆叠在一列中。按照目前的情况,我只会得到一个excel文件,只有与循环结束相对应的结果。

非常感谢在这方面的任何帮助!!

关于第一个问题:这个问题可能是由赋值alpha(j,i+1) =alpha(j)+0.05引起的。正如错误消息所说,对于alpha,您在左侧引用两个维度(j,i+1(,在右侧引用一个维度(alpha(j)(。其中一个肯定是错的。将其与您的声明进行比较(您没有在此处分享(。

关于第二个问题:我会在GAMS中的一个参数中收集结果,并在最后将其一次性写入Excel,就像在这个伪代码中一样:

parameter profitI(i)
someIndexedOverJVarI(i,j);
loop(i, 
alpha(j)  =alpha(j)+0.05;
solve mymodel using lp maximizing profit;
profitI(i) = profit.l;
someIndexedOverJVarI(i,j) = someIndexedOverJVar.l(j);
);
execute_unload "results.gdx" profitI;
execute 'gdxxrw.exe results.gdx par=profitI rng=XXX!a1';

相关内容

最新更新