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

Writing loop within GAMS and printing the results on one excel file

我正在 GAMS 中解决一个模型,这是一个大型模型,称之为“利润”,但我希望在其中改变一个特定的参数,称之为 alpha(j),其中 alpha 代表定义在不同的参数一组“j”的值,然后查看关键变量的结果如何随其变化。

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

Set        i          / 1*20/  ;

*上面我设置了index从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. 第一个问题是我收到错误消息“维度不同 - 符号使用声明的 more/less 索引引用”。我不确定如何解决这个问题。

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

非常感谢任何帮助!!

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

关于第二个问题:我会在 GAMS 中将结果收集到一个参数中,并在最后一次将其全部写入 [​​=19=],就像在这个虚拟代码中一样:

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