仅使用 $ 实用程序编写 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
如何在 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