仅使用$实用工具编写if语句

时间:2019-05-15 12:32:51

标签: gams-math

如何在GAMS中对这种“如果”条件进行编码?

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)。那么Set 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。

是否可以仅通过$ Utility编写此'if then'语句?  谢谢

1 个答案:

答案 0 :(得分:2)

在评论之后,我认为这应该对您有用。

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

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

具有循环和if / else:

创建参数R(s)。然后,遍历s,从集合A中选取b(s,A)的最小值,如果b(s,A)的总和不为零(即,如果集合之一不为b,则定义了b(s,A)) -零。否则,将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