我如何在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。
是否可以仅通过$ utility来编写这条‘if then’语句?谢谢
发布于 2019-05-16 05:02:24
在评论之后,我认为这对你应该是有效的。
(创建一个模拟您的变量delta值的参数,仅用于演示:)
parameter delta(j);
delta('1') = 1;
delta('5') = 1;With loop和if/else:
创建参数R(s)。然后,在s上循环,选取集合A上的最小值b(s,A),其中如果b(s,A)的和不为零(即,如果集合中的一个不为零,则定义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);
);
);仅使用$ command (注释中的@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.000https://stackoverflow.com/questions/56149456
复制相似问题