如何在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'语句? 谢谢
答案 0 :(得分:2)
在评论之后,我认为这应该对您有用。
(创建一个模拟变量增量的参数,仅用于演示:)
parameter delta(j);
delta('1') = 1;
delta('5') = 1;
创建参数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);
);
);
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