【问题标题】:GAMS- manipulating expression within a loopGAMS——在循环中操纵表达式
【发布时间】:2021-04-26 22:07:11
【问题描述】:

我有一个维度为 i 行 j 列的矩阵,其中的一个特定元素称为 x(i,j),其中 i 是植物,j 是市场。在标准 GAMS 表示法中:

Sets
     i   canning plants   / seattle, san-diego /
     j   markets          / new-york, chicago, topeka / ;

现在,我还希望创建一个循环,随着时间的推移——持续 5 个周期。本质上,说我定义

设置t时间段

 /period1
  period2
  period3
  period4
  period5

            / ;

参数

time(t)
/ period1 1,
  period2 2,
  period3 3,
  period4 4,
  period5 5
               / ;

基本上,我想重新运行这个包含许多其他命令的循环,但我希望从第 2 阶段开始重新定义这个矩阵,看起来像这样:

x("seattle",j)=x("seattle",j)+s("new-york",j)
x("new-york",j)=0'

本质上,在循环中,我希望矩阵 x(i,j) 在第 2 期之后看起来有所不同,其中列 x("seattle",j) 被替换为以前的 x("seattle",j) +s("new-york",j) 列 x("new-york",j) 设置为 0。

循环开始如下:

loop
(t,
...

Option reslim = 20000 ;

option nlp = conopt3 ;

solve example using NLP maximizing VARIABLE ;

  )  ;
  

我不确定如何在循环中继续重新定义这个矩阵,每个周期>2。

请注意:在第 2 期之后,矩阵看起来相同。变化只发生一次(即,矩阵元素不会从前一个周期循环,而只是在周期 2 结束时切换 一次 ,然后在此后保持不变。

非常感谢您对此的任何帮助!

【问题讨论】:

    标签: gams-math


    【解决方案1】:

    您可以使用 $ 条件在循环中仅对 period2 进行此更改,如下所示:

    x("seattle",j)$sameAs(t,'period2')=x("seattle",j)+s("new-york",j);
    

    【讨论】:

    • 抱歉 - 只是跟进。假设我希望西雅图列中的每个元素相对于其上一时期的值加倍。会不会只是: x("seattle",j)=2*x("seattle",j) ? GAMS 会认识到这必须在每个时间段内重复吗?
    • 是的。如果您在循环中执行此操作,它将在每次迭代中重复(除非您使用 $ 条件来排除某些迭代)。只需执行“显示 x;”在分配后检查 lst 文件中的操作结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    • 2021-10-23
    相关资源
    最近更新 更多