在 GAMS 中比较两个参数是否相同

comparing two paramter are same together in GAMS

我无法在 GAMS 中对这个术语进行编码

if there exist 
k'<k s.t. for all s ,  b(s,k')=b(s,k)  then   b(s,k)=(b(s,k-1)+b(s,k-2))/2;
else  do not Change  b(s,k)  

         loop(k1$(k1.val<k.val ),
                 loop(s,
                         if( (B(s,k1)<>B(s,k1)),
                              Break;
                         else   b(s,k1)= (B(s,k1)+B(s,k1-1))/2  ;
                            );
                    );
             );

我不知道我必须把 Break 放在哪里。在 s 上使用循环是否必要?这是更好的编码方式吗?

示例:在下面的情况下,对于 s=1 和 s=4 ,存在 b(s,k=1)=b(s,k=4) 那么我们必须更新 b(s,'4' )=(b(s,'3')+b(s,'4') )/2

iter=k=4, k'={1,2,3}, s={1,2,3};

b(1,1)=3, b(2,1)=7, b(3,1)=9,

b(1,2)=2, b(2,2)=4, b(3,2)=11,

b(1,3)=5, b(2,3)=12, b(3,3)=8,

b(1,4)=3, b(2,4)=7, b(3,4)=9,

我也使用了 sameAs 命令,但是,当我使用 sameAs(b(s,k'),b(s,k)) (在 k1 的循环中)时,我得到了错误 121!

以下内容可能对您有用。请注意,它依赖于匹配对。但是考虑到更新规则独立于相等条件,这里应该无关紧要。


别名k。 (为了清楚起见,我还显示了 b。)

alias(k,kk);

table b(s,k)

      1     2   3   4
1     3     2   5   3
2     7     4   12  7
3     9     11  8   9

;

s, k, kk 上定义一个集合 Z。这可以在 k 中挑选出匹配项。如果 k 是一个子集,那么您需要在最上面的父级及其别名中定义 Z

set Z(s,k,kk);
Z(s,k,kk) = no;

在给定 skk > k.

k 中存在相等值时,将元组包含在集合 Z
Z(s,k,kk) = yes$((b(s,k) eq b(s,kk)) and (kk.val gt k.val));

option Z:1:1:2;
display Z;

这定义了匹配存在的位置。例如。对于 s=1(行),k=1k=4(列)匹配。

----     26 SET Z  

          1.4

1         YES
2         YES
3         YES

然后我们更新 b 定义 Z 的地方。

loop(k,
    b(s,kk)$Z(s,k,kk) = (b(s,kk) + b(s,kk-1))/2;);

display b;

这给了我:

----     31 PARAMETER b  

            1           2           3           4

1       3.000       2.000       5.000       4.000
2       7.000       4.000      12.000       9.500
3       9.000      11.000       8.000       8.500