GAMS- 在循环中操纵表达式

GAMS- manipulating expression within a loop

我有一个维度为 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 之后,矩阵看起来相同。变化只发生一次(即,矩阵元素不会从前一个周期开始循环,而是只切换 once ,在周期 2 结束时,然后保持不变。

非常感谢任何帮助!

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

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