【问题标题】:Writing loop within GAMS and printing the results on one excel file在 GAMS 中编写循环并将结果打印在一个 excel 文件中
【发布时间】:2022-01-14 15:34:53
【问题描述】:

我正在求解 GAMS 中的一个模型,它是一个大型模型,称为“利润”,但我希望在其中更改特定参数,称为 alpha(j),其中 alpha 表示在不同值上定义的参数一个集合 `j',然后看看关键变量的结果如何随它变化。

调用循环索引'i',我希望通过将alpha(j)每次增加0.05来运行模型,从全向量alpha(j)的初始值开始,然后看看变量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. 第一个问题是我收到一个错误“维度不同 - 符号被声明的更多/更少索引引用”。我不确定如何解决这个问题。

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

非常感谢任何帮助!

【问题讨论】:

    标签: gams-math


    【解决方案1】:

    关于第一个问题:这个问题可能是由分配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';
    

    【讨论】:

    • 非常感谢!我应该更精确。在原始代码中。话虽如此 - 尽管您在此处提供的代码在将标量结果打印到 excel 时会产生奇迹(如 ProfitI),但它似乎不太适合在集合上定义的变量,例如 alpha(j)。在上面,所有打印的是每个循环值的标量利润值。我想说打印 alpha(j) 的值以及对此的任何想法都非常感谢:)
    • 这只是为了展示原理的示例,我将扩展我的回复以包括索引变量
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-07
    • 2020-04-18
    • 2010-12-21
    • 2017-05-20
    相关资源
    最近更新 更多