在 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;
在给定 s
和 kk > 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=1
与 k=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
我无法在 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;
在给定 s
和 kk > 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=1
与 k=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