仅使用 $ 实用程序编写 if then 语句

Code if then statement by only using $ utility

如何在 GAMS 中编写这个 'if' 条件?

Set    j/1*10/ 
       S/1*6/;
   Parameter  
          b(s,j)    export this from excel
          U(s,j)    export  from excel 
          M(s)/1 100,2 250,3 140,4 120,5 132/    export from excel
    ;

table b(s,j)

    1   2   3   4   5   6    7   8    9    10
1   3   40  23  12  9   52   9   14   89   33  
2   0   0   42   0  11  32  11   15   3    7
3   10  20  12   9  5  30   14   5   14    5
4   0   0   0    9  0   3   8    0   13    5
5   0  10  11  32  11  0    3    1   12    1
6   12  20  2   9  15   3   14   5   14    5
;
 u(s,j)=0;
 u(s,j)$(b(s,j))=1;

  Variable delta(j);  "binary"

求解模型后我得到了delta的值(假设delta(1)=1,delta(5)=1)。那么A组就是

A(j)$(delta.l(j)=1)=Yes;  (A={1,5})

我想根据以下公式计算参数 R(s) :

 If  there is no j in A(j)  s.t.  j in u(s,j) then R(s)=M(s)
 Else if  there is a j in A(j) s.t. j in u(s,j) then R(s)=min{b(s,j): j in A(j) , j in u(s,j) }

则R(1)=3,R(2)=11,R(3)=5,R(4)=120,R(5)=11,R(6)=12.

是否可以仅通过 $ 实用程序编写此“if then”语句的代码? 谢谢

根据评论,我认为这对您有用。

(创建一个模拟您的变量 delta 的参数,仅用于演示:)

parameter delta(j);
delta('1') = 1;
delta('5') = 1;

有循环和if/else:

创建参数 R(s)。然后,遍历 s ,在集合 A 中选择 b(s,A) 的最小值,如果 b(s,A) 的总和不为零(即如果集合之一是 non-zero。否则,设置 R(s) 等于 M(s)。

请注意,循环是解决混合维度问题的一种方法。 $(b(s,A)) 需要在 smin(.) 的第一个参数上,而不是在第二个参数上。

parameter R(s);

loop(s,

    if (sum(A, b(s,A)) ne 0,

        R(s) = smin(A$b(s,A), b(s,A));

    else

        R(s) = M(s);
    );

);

仅使用 $ 命令(@Lutz 在评论中):

R(s)$(sum(A, b(s,A)) <> 0) = smin(A$b(s,A), b(s,A)); 
R(s)$(sum(A, b(s,A)) = 0) = M(s);

给出:

----     56 PARAMETER R  

1   3.000,    2  11.000,    3   5.000,    4 120.000,    5  11.000,    6  12.000